import copy import io import unittest import zipfile from lxml import etree from docx import Document from docx.oxml import parse_xml from docx.oxml.ns import qn from docx.enum.text import WD_ALIGN_PARAGRAPH from unittest.mock import patch from document.equations import cost_equations, depreciation_equations from document.generator import LaudoGenerator from document.public_text import public_text from document.footnotes import add_footnote, add_first_footnote from document.formatters import add_body_text from test_evolutivo_documento import fixture,resolved class DepreciationEquationTests(unittest.TestCase): def test_cost_formulas_preserve_percentage_conversion_and_first_occurrence_note(self): doc=Document();cost_equations(doc) formulas=list(doc.element.body.iter(qn('m:oMath'))) self.assertEqual(len(formulas),2) self.assertEqual([''.join(t.text or '' for t in m.iter(qn('m:t'))) for m in formulas], ['CUNIT = CUB × % CUB100','VC = A × CUNIT × (1 + BDI100) × Kd']) self.assertEqual(len(list(formulas[0].iter(qn('m:f')))),1) self.assertEqual(len(list(formulas[1].iter(qn('m:f')))),1) expression_xml=etree.tostring(formulas[0]) add_first_footnote(doc,r'%\s+CUB','Percentual de adequação do CUB.') self.assertEqual(etree.tostring(formulas[0]),expression_xml) self.assertEqual(len(list(doc.paragraphs[0]._p.iter(qn('w:footnoteReference')))),1) self.assertEqual(len(list(doc.paragraphs[1]._p.iter(qn('w:footnoteReference')))),0) for index in (1,3): self.assertEqual({r.font.size.pt for r in doc.paragraphs[index].runs},{8}) def test_editable_equations_keep_fraction_power_subscript_and_small_legends(self): doc=Document();depreciation_equations(doc) stream=io.BytesIO();doc.save(stream);stream.seek(0) reopened=Document(stream) math=list(reopened.element.body.iter(qn('m:oMath'))) self.assertEqual(len(math),3) self.assertEqual(len(list(math[0].iter(qn('m:f')))),1) self.assertEqual(len(list(math[0].iter(qn('m:sSup')))),1) self.assertEqual(len(list(math[2].iter(qn('m:sSub')))),1) texts=[''.join(t.text or '' for t in formula.iter(qn('m:t'))) for formula in math] self.assertEqual(texts,['Ross = q + q22','K = 1 − (1 − Ross) × (1 − H)','Kd = R + (1 − K) × (1 − R)']) self.assertEqual(len(reopened.paragraphs),6) for index in (0,2,4): self.assertEqual(reopened.paragraphs[index].alignment,WD_ALIGN_PARAGRAPH.CENTER) self.assertTrue(reopened.paragraphs[index].paragraph_format.keep_with_next) legend=reopened.paragraphs[index+1] self.assertEqual({r.font.size.pt for r in legend.runs},{8}) self.assertIn('dividindo o percentual',reopened.paragraphs[1].text) self.assertIn('estado de conservação',reopened.paragraphs[3].text) self.assertIn('percentual ÷ 100',reopened.paragraphs[5].text) def test_internal_references_stay_out_of_body_tables_and_footnotes(self): imported=resolved(fixture((2021,))) row=imported['avaliacoes'][0] row['observacoes']='Resultados preservados no MESA.' row['complementos']={'justificativa_fc':'Condição registrada no modelo MESA.'} original=copy.deepcopy(imported) doc=Document() with patch('document.evolutivo.matching_local',return_value=(None,'')): LaudoGenerator()._gerar_corpo(doc,{'avaliacoes_importadas':imported},{}) LaudoGenerator()._gerar_cabecalho(doc,{'modelo_avaliacao':'modelo MESA'}) add_footnote(doc,add_body_text(doc,'Referência técnica'),'Coeficientes da MESA preservados na avaliação.') stream=io.BytesIO();doc.save(stream) with zipfile.ZipFile(stream) as archive: for name in ['word/document.xml','word/footnotes.xml']: root=parse_xml(archive.read(name)) text=' '.join(t.text or '' for t in root.iter(qn('w:t'))) self.assertNotIn('MESA',text) self.assertNotIn('versão documental',text) self.assertNotIn('catálogo sincronizado',text) self.assertEqual(imported,original) def test_public_wording_preserves_technical_names_and_ordinary_words(self): self.assertEqual(public_text('Método de Ross-Heidecke; ABNT NBR 14653-2; CUB.'),'Método de Ross-Heidecke; ABNT NBR 14653-2; CUB.') self.assertEqual(public_text('modelo MESA'),'modelo estatístico') self.assertEqual(public_text('salvo no MESA'),'salvo na avaliação de origem') self.assertEqual(public_text('mesa de apoio'),'mesa de apoio') if __name__=='__main__': unittest.main()