UNPKG

silegismg-editor-articulacao

Version:
440 lines (383 loc) 19.8 kB
/* Copyright 2017 Assembleia Legislativa de Minas Gerais * * This file is part of Editor-Articulacao. * * Editor-Articulacao is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, version 3. * * Editor-Articulacao is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Editor-Articulacao. If not, see <http://www.gnu.org/licenses/>. */ 'use strict'; describe('Parser de articulação', function () { var parser = window.interpretadorArticulacao; function novo(tipo, obj) { if (obj instanceof Array) { return obj.map(o => novo(tipo, o)); } else { var novoObj = new tipo(obj.numero, obj.descricao); (obj.incisos || []).forEach(i => novoObj.adicionar(novo(parser.Inciso, i))); (obj.paragrafos || []).forEach(i => novoObj.adicionar(novo(parser.Paragrafo, i))); (obj.alineas || []).forEach(i => novoObj.adicionar(novo(parser.Alinea, i))); (obj.itens || []).forEach(i => novoObj.adicionar(novo(parser.Item, i))); return novoObj; } } it('Interpretação de articulação', function () { var texto = 'Art. 1º - Teste 1:\nI - inciso do artigo;\nII - segundo inciso:\na) alínea do inciso:\n1) item da alínea;\n2) outro item.\nb) outra alínea;\nc) cê\nd) dê.\nIII - último inciso.\nParágrafo Único - Parágrafo:\nI - inciso do parágrafo.\nArt. 2º - Outro artigo.'; expect(parser.interpretar(texto, 'json')).toEqual({ textoAnterior: '', articulacao: novo(parser.Artigo, [ { numero: '1', descricao: 'Teste 1:', incisos: [ { numero: 'I', descricao: 'inciso do artigo;' }, { numero: 'II', descricao: 'segundo inciso:', alineas: [ { numero: 'a', descricao: 'alínea do inciso:', itens: [{ numero: '1', descricao: 'item da alínea;' }, { numero: '2', descricao: 'outro item.' }] }, { numero: 'b', descricao: 'outra alínea;' }, { numero: 'c', descricao: 'cê' }, { numero: 'd', descricao: 'dê.' } ] }, { numero: 'III', descricao: 'último inciso.' } ], paragrafos: [ { numero: 'Parágrafo único', descricao: 'Parágrafo:', incisos: [ { numero: 'I', descricao: 'inciso do parágrafo.' } ] } ] }, { numero: '2', descricao: 'Outro artigo.', incisos: [], paragrafos: [] } ]) }); }); it('Interpretação de articulação para o formato LexML', function () { var texto = 'Art. 1º - Teste 1.\nI - Inciso do artigo;\nII - Segundo inciso:\na) Alínea do inciso;\nb) Outra alínea.\nIII - Último inciso.\nParágrafo Único - Parágrafo.\nI - Inciso do parágrafo.\nArt. 2º - Outro artigo.'; var fragmento = parser.interpretar(texto, 'lexml'); var container = document.createElement('div'); container.appendChild(fragmento); expect(container.innerHTML).toEqual('<articulacao xmlns="http://www.lexml.gov.br/1.0"><artigo id="art1"><rotulo>Art. 1º –</rotulo><caput id="art1_cpt"><p>Teste 1.</p><inciso id="art1_cpt_inc1"><rotulo>I</rotulo><p>Inciso do artigo;</p></inciso><inciso id="art1_cpt_inc2"><rotulo>II</rotulo><p>Segundo inciso:</p><alinea id="art1_cpt_inc2_ali1"><rotulo>a</rotulo><p>Alínea do inciso;</p></alinea><alinea id="art1_cpt_inc2_ali2"><rotulo>b</rotulo><p>Outra alínea.</p></alinea></inciso><inciso id="art1_cpt_inc3"><rotulo>III</rotulo><p>Último inciso.</p></inciso></caput><paragrafo id="art1_par1"><rotulo>Parágrafo único –</rotulo><p>Parágrafo.</p><inciso id="art1_par1_inc1"><rotulo>I</rotulo><p>Inciso do parágrafo.</p></inciso></paragrafo></artigo><artigo id="art2"><rotulo>Art. 2º –</rotulo><caput id="art2_cpt"><p>Outro artigo.</p></caput></artigo></articulacao>'); }); it('Interpretação de articulação para o formato LexML em String', function () { var texto = 'Art. 1º - Teste 1.\nI - Inciso do artigo;\nII - Segundo inciso:\na) Alínea do inciso;\nb) Outra alínea.\nIII - Último inciso.\nParágrafo Único - Parágrafo.\nI - Inciso do parágrafo.\nArt. 2º - Outro artigo.'; var lexml = parser.interpretar(texto, 'lexmlString'); expect(lexml).toEqual('<Articulacao xmlns="http://www.lexml.gov.br/1.0"><Artigo id="art1"><Rotulo>Art. 1º –</Rotulo><Caput id="art1_cpt"><p>Teste 1.</p><Inciso id="art1_cpt_inc1"><Rotulo>I</Rotulo><p>Inciso do artigo;</p></Inciso><Inciso id="art1_cpt_inc2"><Rotulo>II</Rotulo><p>Segundo inciso:</p><Alinea id="art1_cpt_inc2_ali1"><Rotulo>a</Rotulo><p>Alínea do inciso;</p></Alinea><Alinea id="art1_cpt_inc2_ali2"><Rotulo>b</Rotulo><p>Outra alínea.</p></Alinea></Inciso><Inciso id="art1_cpt_inc3"><Rotulo>III</Rotulo><p>Último inciso.</p></Inciso></Caput><Paragrafo id="art1_par1"><Rotulo>Parágrafo único –</Rotulo><p>Parágrafo.</p><Inciso id="art1_par1_inc1"><Rotulo>I</Rotulo><p>Inciso do parágrafo.</p></Inciso></Paragrafo></Artigo><Artigo id="art2"><Rotulo>Art. 2º –</Rotulo><Caput id="art2_cpt"><p>Outro artigo.</p></Caput></Artigo></Articulacao>'); }); it('Interpretar corretamente artigo inciso e parágrafo', function () { var texto = 'Art. 103 – Teste:\n' + 'I – teste.\n' + 'Parágrafo único – Teste.'; expect(parser.interpretar(texto, 'json')).toEqual({ textoAnterior: '', articulacao: novo(parser.Artigo, [ { numero: '103', descricao: 'Teste:', incisos: [ { numero: 'I', descricao: 'teste.' } ], paragrafos: [ { numero: 'Parágrafo único', descricao: 'Teste.', incisos: [] } ] } ]) }); }); it('Deve suportar texto antes do artigo', function () { var texto = 'continuação do artigo.\n' + 'Art. 2 - Final.'; expect(parser.interpretar(texto, 'json')).toEqual({ textoAnterior: 'continuação do artigo.', articulacao: novo(parser.Artigo, [ { numero: '2', descricao: 'Final.' } ]) }); }); it('Deve suportar texto antes do artigo', function () { var texto = 'Um texto simples.'; expect(parser.interpretar(texto, 'json')).toEqual({ textoAnterior: 'Um texto simples.', articulacao: [] }); }); it('Deve suportar texto com quebra de linha', function () { var texto = 'linha 1\nlinha 2'; expect(parser.interpretar(texto, 'json')).toEqual({ textoAnterior: 'linha 1\nlinha 2', articulacao: [] }); }); it('Deve suportar título, capítulo, seção e subseção', function () { var texto = `TÍTULO I DISPOSIÇÕES PRELIMINARES Art. 1º – O Estado de Minas Gerais integra, com autonomia político-administrativa, a República Federativa do Brasil. TÍTULO II DO ESTADO CAPÍTULO I DA ORGANIZAÇÃO DO ESTADO Seção I Disposições Gerais Subseção I Teste Art. 2º – São Poderes do Estado, independentes e harmônicos entre si, o Legislativo, o Executivo e o Judiciário.`; expect(parser.interpretar(texto, 'json')).toEqual({ textoAnterior: '', articulacao: [ novo(parser.Titulo, { numero: 'I', descricao: 'DISPOSIÇÕES PRELIMINARES' }), novo(parser.Artigo, { numero: '1', descricao: 'O Estado de Minas Gerais integra, com autonomia político-administrativa, a República Federativa do Brasil.' }), novo(parser.Titulo, { numero: 'II', descricao: 'DO ESTADO' }), novo(parser.Capitulo, { numero: 'I', descricao: 'DA ORGANIZAÇÃO DO ESTADO' }), novo(parser.Secao, { numero: 'I', descricao: 'Disposições Gerais' }), novo(parser.Subsecao, { numero: 'I', descricao: 'Teste' }), novo(parser.Artigo, { numero: '2', descricao: 'São Poderes do Estado, independentes e harmônicos entre si, o Legislativo, o Executivo e o Judiciário.' }) ] }); }); it('Deve suportar artigo por extenso', function () { var texto = 'Artigo 1º - Primeiro.\nArtigo 2º - Segundo.'; expect(parser.interpretar(texto, 'json')).toEqual({ textoAnterior: '', articulacao: novo(parser.Artigo, [ { numero: '1', descricao: 'Primeiro.', }, { numero: '2', descricao: 'Segundo.' } ]) }); }); it('Deve suportar apenas o parágrafo, sem artigo.', function () { var texto = 'Parágrafo único. Teste.'; expect(parser.interpretar(texto, 'json')).toEqual({ textoAnterior: '', articulacao: novo(parser.Artigo, [ { numero: '', descricao: '', incisos: [], paragrafos: [{ numero: 'Parágrafo único', descricao: 'Teste.', incisos: [] }] } ]) }); }); it('Não deve permitir citação em parágrafo ao exportar para editor.', function () { var texto = 'Art. 1º - Artigo 1.\nParágrafo único - Teste.\nContinuação.'; var fragmento = parser.interpretar(texto, 'json').articulacao[0].paraEditor(); expect(fragmento.children.length).toEqual(2); expect(fragmento.children[1].outerHTML).toEqual('<p data-tipo="paragrafo" class="unico">Teste. Continuação.</p>'); }); it('Deve permitir citação em artigo ao exportar para editor.', function () { var texto = 'Art. 1º - Artigo 1.\nContinuação.\nParágrafo único - Teste.'; var fragmento = parser.interpretar(texto, 'json').articulacao[0].paraEditor(); expect(fragmento.children.length).toEqual(3); expect(fragmento.children[0].outerHTML).toEqual('<p data-tipo="artigo">Artigo 1.</p>'); expect(fragmento.children[1].outerHTML).toEqual('<p data-tipo="continuacao">Continuação.</p>'); expect(fragmento.children[2].outerHTML).toEqual('<p data-tipo="paragrafo" class="unico">Teste.</p>'); }); it('Deve permitir inserir inciso, omitindo artigo.', function () { var texto = 'I - Teste.'; expect(parser.interpretar(texto, 'json')).toEqual({ textoAnterior: '', articulacao: novo(parser.Artigo, [ { numero: '', descricao: '', incisos: [{ numero: 'I', descricao: 'Teste.', alineas: [] }] }]) }); }); it('Deve permitir inserir alínea, omitindo artigo e inciso.', function () { var texto = 'a) Teste.'; expect(parser.interpretar(texto, 'json')).toEqual({ textoAnterior: '', articulacao: novo(parser.Artigo, [ { numero: '', descricao: '', incisos: [{ numero: '', descricao: '', alineas: [{ numero: 'a', descricao: 'Teste.', itens: [] }] }] }]) }); }); it('Deve permitir inserir item, omitindo artigo, inciso e alínea.', function () { var texto = '1. Item.'; expect(parser.interpretar(texto, 'json')).toEqual({ textoAnterior: '', articulacao: novo(parser.Artigo, [ { numero: '', descricao: '', incisos: [{ numero: '', descricao: '', alineas: [{ numero: '', descricao: '', itens: [{ numero: '1', descricao: 'Item.' }] }] }] }]) }); }); it('Deve permitir inserir parágrafo com item, omitindo artigo, inciso e alínea.', function () { var texto = 'Parágrafo único - Os cidadãos:\n1. Devem ser legais.'; expect(parser.interpretar(texto, 'json')).toEqual({ textoAnterior: '', articulacao: novo(parser.Artigo, [ { numero: '', descricao: '', incisos: [], paragrafos: [{ numero: 'Parágrafo único', descricao: 'Os cidadãos:', incisos: [{ numero: '', descricao: '', alineas: [{ numero: '', descricao: '', itens: [{ numero: '1', descricao: 'Devem ser legais.' }] }] }] }] } ]) }); }); it('Deve escapar entidades html', function () { var texto = '<P>Art. 1&#176; &#8211; Fica declarado de utilidade p&#250;blica o treste &#160;asdf asd f &#160; &#160;asd, com sede no Munic&#237;pio de Abadia dos Dourados.</P><P>Art. 2&#176; &#8211; Esta lei entra em vigor na data de sua publica&#231;&#227;o.</P>'; var lexml = parser.interpretar(texto, 'lexml-string', 'html'); expect(lexml).toEqual('<Articulacao xmlns="http://www.lexml.gov.br/1.0"><Artigo id="art1"><Rotulo>Art. 1º –</Rotulo><Caput id="art1_cpt"><p>Fica declarado de utilidade pública o treste  asdf asd f    asd, com sede no Município de Abadia dos Dourados.</p></Caput></Artigo><Artigo id="art2"><Rotulo>Art. 2º –</Rotulo><Caput id="art2_cpt"><p>Esta lei entra em vigor na data de sua publicação.</p></Caput></Artigo></Articulacao>'); }); describe('transfomarQuebrasDeLinhaEmP', function () { var transformarQuebrasDeLinhaEmP = window.interpretadorArticulacao.transformarQuebrasDeLinhaEmP; it('Deve envolver única linha', function () { var fragmento = transformarQuebrasDeLinhaEmP('linha única'); expect(fragmento.childNodes.length).toBe(1); expect(fragmento.firstChild.outerHTML).toBe('<p>linha única</p>'); }); it('Deve separar duas linhas', function () { var fragmento = transformarQuebrasDeLinhaEmP('linha 1\nlinha 2'); expect(fragmento.childNodes.length).toBe(2); expect(fragmento.firstChild.outerHTML).toBe('<p>linha 1</p>'); expect(fragmento.lastChild.outerHTML).toBe('<p>linha 2</p>'); }); it('Deve separar três linhas', function () { var fragmento = transformarQuebrasDeLinhaEmP('linha 1\nlinha 2\nlinha 3'); expect(fragmento.childNodes.length).toBe(3); expect(fragmento.firstChild.outerHTML).toBe('<p>linha 1</p>'); expect(fragmento.childNodes[1].outerHTML).toBe('<p>linha 2</p>'); expect(fragmento.lastChild.outerHTML).toBe('<p>linha 3</p>'); }); it('Deve ignorar linhas vazias', function () { var fragmento = transformarQuebrasDeLinhaEmP('linha 1\n\nlinha 2\n\n\nlinha 3'); expect(fragmento.childNodes.length).toBe(3); expect(fragmento.firstChild.outerHTML).toBe('<p>linha 1</p>'); expect(fragmento.childNodes[1].outerHTML).toBe('<p>linha 2</p>'); expect(fragmento.lastChild.outerHTML).toBe('<p>linha 3</p>'); }); }); it('Interpretação de diferentes formas de parágrafo', function () { var texto = 'Art. 1º - Teste 1.\n§ 1º - P1.\n§ 2º - P2.\nParágrafo 3º - P3\nParagrafo 4ª - P4\nParágrafo quinto - P5\nArt. 2º - Outro artigo.'; var fragmento = parser.interpretar(texto, 'lexml'); var container = document.createElement('div'); container.appendChild(fragmento); expect(container.innerHTML).toEqual('<articulacao xmlns="http://www.lexml.gov.br/1.0"><artigo id="art1"><rotulo>Art. 1º –</rotulo><caput id="art1_cpt"><p>Teste 1.</p></caput><paragrafo id="art1_par1"><rotulo>§1º –</rotulo><p>P1.</p></paragrafo><paragrafo id="art1_par2"><rotulo>§2º –</rotulo><p>P2.</p></paragrafo><paragrafo id="art1_par3"><rotulo>§3º –</rotulo><p>P3</p></paragrafo><paragrafo id="art1_par4"><rotulo>§4º –</rotulo><p>P4</p></paragrafo><paragrafo id="art1_par5"><rotulo>§5º –</rotulo><p>P5</p></paragrafo></artigo><artigo id="art2"><rotulo>Art. 2º –</rotulo><caput id="art2_cpt"><p>Outro artigo.</p></caput></artigo></articulacao>'); }); });