Repository: DesignLiquido/delegua
Pull request #353 (2023-05-05 14:06:26)

Birl

github-actions[bot]: <!-- jest coverage report action for options with hash 781087021f8e6c43aac1e668f4520603 -->

## Coverage report 



| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | Category   | Percentage                                                     | Covered / Total |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :--------- | :------------------------------------------------------------- | :-------------: |
|                                                                           🟡                                                                           | Statements | <div title="Base coverage is: 73.74%">73.81% (+0.07% 🔼)</div> |    5639/7640    |
|                                                                           🟡                                                                           | Branches   | <div title="Base coverage is: 62.39%">62.23% (-0.17% 🔻)</div> |    1784/2867    |
|                                                                           🟡                                                                           | Functions  | <div title="Base coverage is: 73.59%">73.74% (+0.14% 🔼)</div> |     831/1127    |
|                                                                           🟡                                                                           | Lines      | <div title="Base coverage is: 74.22%">74.28% (+0.06% 🔼)</div> |    5490/7391    |


<details><summary>Show files with reduced coverage 🔻</summary>
<br/>

| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | File                                                                                                | Statements                                                     | Branches                                                       | Functions                                                      | Lines                                                          |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------- | :------------------------------------------------------------- | :------------------------------------------------------------- | :------------------------------------------------------------- | :------------------------------------------------------------- |
|                                                                           🟢                                                                           | <div title="avaliador-sintatico/avaliador-sintatico.ts">`...` / avaliador-sintatico.ts</div>        | <div title="Base coverage is: 93%">93.19% (+0.19% 🔼)</div>    | <div title="Base coverage is: 82.35%">82.71% (+0.35% 🔼)</div> | <div title="Base coverage is: 94.34%">94.12% (-0.22% 🔻)</div> | <div title="Base coverage is: 93.08%">93.27% (+0.19% 🔼)</div> |
|                                                                           🟡                                                                           | <div title="interpretador/interpretador-base.ts">`...` / interpretador-base.ts</div>                | <div title="Base coverage is: 75.43%">74.2% (-1.23% 🔻)</div>  | <div title="Base coverage is: 68.83%">66.11% (-2.72% 🔻)</div> | <div title="Base coverage is: 86.89%">86.67% (-0.22% 🔻)</div> | <div title="Base coverage is: 74.95%">73.64% (-1.31% 🔻)</div> |
|                                                                           🟢                                                                           | <div title="tradutores/tradutor-javascript.ts">`...` / tradutor-javascript.ts</div>                 | <div title="Base coverage is: 96.83%">96.79% (-0.05% 🔻)</div> | 82.31%                                                         | <div title="Base coverage is: 97.67%">97.62% (-0.06% 🔻)</div> | <div title="Base coverage is: 97.11%">97.07% (-0.04% 🔻)</div> |
|                                                                           🟢                                                                           | <div title="tradutores/tradutor-reverso-javascript.ts">`...` / tradutor-reverso-javascript.ts</div> | <div title="Base coverage is: 99.07%">99.03% (-0.04% 🔻)</div> | <div title="Base coverage is: 95.24%">94.83% (-0.41% 🔻)</div> | 100%                                                           | <div title="Base coverage is: 99.53%">99.51% (-0.02% 🔻)</div> |

</details>

## Test suite run success
400 tests passing in 35 suites.

<p align="right">Report generated by <a href="https://github.com/ArtiomTr/jest-coverage-report-action">🧪jest coverage report action</a> from 6672a31565874a9f994cfcbdd1631d83bb888d4b</p>
<!-- Sticky Pull Request Comment -->

Patch:
diff --git a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
index e903d0b7..a9c4cb30 100644
--- a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
+++ b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
@@ -4,6 +4,7 @@ import {
     Agrupamento,
     AtribuicaoSobrescrita,
     Atribuir,
+    Chamada,
     DefinirValor,
     FuncaoConstruto,
     Literal,
@@ -355,6 +356,9 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
             );
             let valorInicializacao = 0x00;
             if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.IGUAL)) {
+                if (this.verificarTipoSimboloAtual(tiposDeSimbolos.AJUDA)) {
+                    valorInicializacao = this.declaracao();
+                }
                 if (this.verificarTipoSimboloAtual(tiposDeSimbolos.IDENTIFICADOR)) {
                     valorInicializacao = this.declaracao();
                 } else if (this.verificarTipoSimboloAtual(tiposDeSimbolos.NUMERO)) {
@@ -587,7 +591,7 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
             this.hashArquivo,
             Number(parenteseEsquerdo.linha),
             paramentros,
-            corpo.filter(c => c)
+            corpo.filter((c) => c)
         );
     }
 
@@ -665,6 +669,32 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
         return new FuncaoDeclaracao(nomeFuncao, this.corpoDaFuncao(tipo), tipoRetorno);
     }
 
+    declaracaoChamaFuncao(): Chamada {
+
+        const declaracaoInicio = this.consumir(tiposDeSimbolos.AJUDA, 'Esperado expressão `AJUDA`.');
+        this.consumir(tiposDeSimbolos.O, 'Esperado expressão `O` após `AJUDA`.');
+        this.consumir(tiposDeSimbolos.MALUCO, 'Esperado expressão `MALUCO` após `O`.');
+        this.consumir(tiposDeSimbolos.TA, 'Esperado expressão `TA` após `MALUCO`.');
+        this.consumir(tiposDeSimbolos.DOENTE, 'Esperado expressão `DOENTE` após `TA`.');
+        let expressao = this.primario();
+        this.consumir(tiposDeSimbolos.PARENTESE_ESQUERDO, 'Esperado parêntese esquerdo após `DOENTE`.');
+
+        const paramentros = [];
+        while (!this.verificarTipoSimboloAtual(tiposDeSimbolos.PARENTESE_DIREITO)) {
+            paramentros.push(this.declaracao());
+            if (this.verificarTipoSimboloAtual(tiposDeSimbolos.VIRGULA)) {
+                this.avancarEDevolverAnterior();
+            }
+        }
+
+        this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, 'Esperado parêntese direito após lista de parâmetros.');
+        this.consumir(tiposDeSimbolos.PONTO_E_VIRGULA, 'Esperado ponto e vírgula após a chamada de função.');
+
+
+
+        return new Chamada(declaracaoInicio.hashArquivo, expressao, null, paramentros);
+    }
+
     declaracao(): any {
         const simboloAtual = this.simbolos[this.atual];
         switch (simboloAtual.tipo) {
@@ -694,7 +724,7 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
             case tiposDeSimbolos.OH:
                 return this.funcao('funcao');
             case tiposDeSimbolos.AJUDA:
-            // Retornar uma declaração de chamar funcao
+                return this.declaracaoChamaFuncao();
             case tiposDeSimbolos.CE:
                 return this.declaracaoEscreva();
             case tiposDeSimbolos.PONTO_E_VIRGULA:
diff --git a/fontes/bibliotecas/primitivas-vetor.ts b/fontes/bibliotecas/primitivas-vetor.ts
index 04d4b2fb..40b5048c 100644
--- a/fontes/bibliotecas/primitivas-vetor.ts
+++ b/fontes/bibliotecas/primitivas-vetor.ts
@@ -3,6 +3,9 @@ export default {
         vetor.push(elemento);
         return vetor;
     },
+    concatenar: (vetor: Array<any>, outroVetor: Array<any>) => {
+        return vetor.concat(outroVetor)
+    },
     empilhar: (vetor: Array<any>, elemento: any) => {
         vetor.push(elemento);
         return vetor;


Test patch:
diff --git a/testes/birl/avaliador-sintatico.test.ts b/testes/birl/avaliador-sintatico.test.ts
index 7c2ae06d..f2e22732 100644
--- a/testes/birl/avaliador-sintatico.test.ts
+++ b/testes/birl/avaliador-sintatico.test.ts
@@ -12,9 +12,8 @@ import {
     Var,
 } from '../../fontes/declaracoes';
 import { LexadorBirl } from '../../fontes/lexador/dialetos';
-import { RetornoLexador } from '../../fontes/interfaces/retornos/retorno-lexador';
-import { Simbolo } from '../../fontes/lexador';
-import { FuncaoConstruto, Variavel } from '../../fontes/construtos';
+import { Chamada, FuncaoConstruto } from '../../fontes/construtos';
+import { ErroAvaliadorSintatico } from '../../fontes/avaliador-sintatico/erro-avaliador-sintatico';
 
 describe('Avaliador Sintático Birl', () => {
     describe('analisar()', () => {
@@ -323,9 +322,88 @@ describe('Avaliador Sintático Birl', () => {
                 expect(funcao.corpo[1]).toBeInstanceOf(Retorna);
                 expect(funcao.corpo[0]).toBeInstanceOf(Array<Var>);
             });
+
+            it('Sucesso - declaração - chamarFuncao', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '   MONSTRO primeiro = 5;\n',
+                    '   MONSTRO segundo = 10;\n',
+                    '   MONSTRO resultado = AJUDA O MALUCO TA DOENTE SOMAR(primeiro, segundo);\n',
+                    'BIRL\n',
+                ]);
+
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+                expect(retornoAvaliadorSintatico).toBeTruthy();
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
+                const declaracao3 = retornoAvaliadorSintatico.declaracoes[2] as unknown as Array<Var>;
+                expect(declaracao3[0].tipo).toBe('numero');
+                expect(declaracao3[0].assinaturaMetodo).toBe('<principal>');
+                expect(declaracao3[0].inicializador.valor).toBeInstanceOf(Chamada);
+            });
+        });
+        describe('Cenários de erro', () => {
+            it('Falha - Programa vazio', () => {
+                expect(() => avaliadorSintatico.analisar({ erros: [], simbolos: [] }, -1)).toThrow(
+                    ErroAvaliadorSintatico
+                );
+                expect(() => {
+                    avaliadorSintatico.analisar({ erros: [], simbolos: [] }, -1);
+                }).toThrow(
+                    expect.objectContaining({
+                        message: 'Esperado expressão `HORA DO SHOW` para iniciar o programa',
+                    })
+                );
+            });
+
+            it('Falha - declaração - variavel = "=" no lugar do identificador', () => {
+                const retornoLexador = lexador.mapear(['HORA DO SHOW \n', '   MONSTRO =;\n', 'BIRL\n']);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: "Esperado identificador após palavra reservada 'MONSTRO'.",
+                    })
+                );
+            });
+
+            it('Falha - declaração - variavel - sem identificador', () => {
+                const retornoLexador = lexador.mapear(['HORA DO SHOW \n', '   MONSTRO \n', 'BIRL\n']);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: "Esperado identificador após palavra reservada 'MONSTRO'.",
+                    })
+                );
+            });
+
+            it('Falha - declaração - Escreva - com falha na expressão', () => {
+                const retornoLexador = lexador.mapear(
+                    [
+                        'HORA DO SHOW',
+                        '  CE QUER VER ESSA ? ("Hello, World! Porra!\n");',
+                        '  BORA CUMPADE 0;',
+                        'BIRL',
+                    ],
+                    -1
+                );
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: 'Esperado expressão `PORRA` após `ESSA` para escrever mensagem.',
+                    }))
+            });
+
+            it.skip('Falha - declaração - Variavel - numero recebendo string', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '  MONSTRINHO M1 = "Teste"; \n',
+                    '  CE QUER VER ESSA PORRA? (M1); \n',
+                    '  BORA CUMPADE 0; \n',
+                    'BIRL \n',
+                ]);
+
+                console.log(avaliadorSintatico.analisar(retornoLexador, -1));
+            })
         });
-        // describe('Cenários de erro', () => {
-        //     it('Falha - ')
-        // })
     });
 });
diff --git a/testes/birl/lexador.test.ts b/testes/birl/lexador.test.ts
index ce2b0915..93c7195a 100644
--- a/testes/birl/lexador.test.ts
+++ b/testes/birl/lexador.test.ts
@@ -39,13 +39,16 @@ describe('Lexador (BIRL)', () => {
                 expect(resultado.erros).toHaveLength(0);
             });
             it('Sucesso - Ler da tela', () => {
-                const resultado = lexador.mapear([
-                    'HORA DO SHOW \n',
-                    'MONSTRO? X;',
-                    'QUE QUE CE QUER MONSTRAO? ("%d", &X);',
-                    'BORA CUMPADE 1;',
-                    'BIRL \n'
-                ], -1)
+                const resultado = lexador.mapear(
+                    [
+                        'HORA DO SHOW \n',
+                        'MONSTRO? X;',
+                        'QUE QUE CE QUER MONSTRAO? ("%d", &X);',
+                        'BORA CUMPADE 1;',
+                        'BIRL \n',
+                    ],
+                    -1
+                );
 
                 expect(resultado).toBeTruthy();
                 expect(resultado.simbolos).toHaveLength(32);
@@ -69,151 +72,213 @@ describe('Lexador (BIRL)', () => {
                 expect(resultado.erros).toHaveLength(0);
             });
             it('Sucesso - Loop - For', () => {
-                const resultado = lexador.mapear([
-                    'HORA DO SHOW \n',
-                    'MONSTRO M;',
-                    'MAIS QUERO MAIS (M = 0; M < 5; M++)',
-                    '   CE QUER VER ESSA PORRA? ("%d", M);',
-                    'BIRL',
-                    'BORA CUMPADE? 0; \n',
-                    'BIRL \n',
-                ], -1)
+                const resultado = lexador.mapear(
+                    [
+                        'HORA DO SHOW \n',
+                        'MONSTRO M;',
+                        'MAIS QUERO MAIS (M = 0; M < 5; M++)',
+                        '   CE QUER VER ESSA PORRA? ("%d", M);',
+                        'BIRL',
+                        'BORA CUMPADE? 0; \n',
+                        'BIRL \n',
+                    ],
+                    -1
+                );
 
                 expect(resultado).toBeTruthy();
                 expect(resultado.simbolos).toHaveLength(51);
                 expect(resultado.erros).toHaveLength(0);
-            })
+            });
             it('Sucesso - Loop - While', () => {
-                const resultado = lexador.mapear([
-                    'HORA DO SHOW \n',
-                    'MONSTRO X = 5;',
-                    'NEGATIVA BAMBAM (X > 2)',
-                    '   CE QUER VER ESSA PORRA? ("%d", X);',
-                    '   X--;',
-                    'BIRL',
-                    'BORA CUMPADE? 0; \n',
-                    'BIRL \n',
-                ], -1)
+                const resultado = lexador.mapear(
+                    [
+                        'HORA DO SHOW \n',
+                        'MONSTRO X = 5;',
+                        'NEGATIVA BAMBAM (X > 2)',
+                        '   CE QUER VER ESSA PORRA? ("%d", X);',
+                        '   X--;',
+                        'BIRL',
+                        'BORA CUMPADE? 0; \n',
+                        'BIRL \n',
+                    ],
+                    -1
+                );
 
                 expect(resultado).toBeTruthy();
                 expect(resultado.simbolos).toHaveLength(49);
                 expect(resultado.erros).toHaveLength(0);
-            })
+            });
             it('Sucesso - Condição - If', () => {
-                const resultado = lexador.mapear([
-                    'HORA DO SHOW \n',
-                    'ELE QUE A GENTE QUER? (3 > 2)',
-                    '   CE QUER VER ESSA PORRA? ("%d", 3);',
-                    'BIRL',
-                    'BORA CUMPADE? 0; \n',
-                    'BIRL \n',
-                ], -1)
+                const resultado = lexador.mapear(
+                    [
+                        'HORA DO SHOW \n',
+                        'ELE QUE A GENTE QUER? (3 > 2)',
+                        '   CE QUER VER ESSA PORRA? ("%d", 3);',
+                        'BIRL',
+                        'BORA CUMPADE? 0; \n',
+                        'BIRL \n',
+                    ],
+                    -1
+                );
 
                 expect(resultado).toBeTruthy();
                 expect(resultado.simbolos).toHaveLength(42);
                 expect(resultado.erros).toHaveLength(0);
-            })
+            });
             it('Sucesso - Condição - If Else', () => {
-                const resultado = lexador.mapear([
-                    'HORA DO SHOW \n',
-                    'ELE QUE A GENTE QUER? (3 > 2)',
-                    '   CE QUER VER ESSA PORRA? ("%d", 3);',
-                    'NAO VAI DAR NAO',
-                    '   CE QUER VER ESSA PORRA? ("%d", 2);',
-                    'BIRL',
-                    'BORA CUMPADE? 0; \n',
-                    'BIRL \n',
-                ], -1)
+                const resultado = lexador.mapear(
+                    [
+                        'HORA DO SHOW \n',
+                        'ELE QUE A GENTE QUER? (3 > 2)',
+                        '   CE QUER VER ESSA PORRA? ("%d", 3);',
+                        'NAO VAI DAR NAO',
+                        '   CE QUER VER ESSA PORRA? ("%d", 2);',
+                        'BIRL',
+                        'BORA CUMPADE? 0; \n',
+                        'BIRL \n',
+                    ],
+                    -1
+                );
 
                 expect(resultado).toBeTruthy();
                 expect(resultado.simbolos).toHaveLength(60);
                 expect(resultado.erros).toHaveLength(0);
-            })
+            });
             it('Sucesso - Condição - If Else If', () => {
-                const resultado = lexador.mapear([
-                    'HORA DO SHOW \n',
-                    'ELE QUE A GENTE QUER? (3 > 2)',
-                    '   CE QUER VER ESSA PORRA? ("%d", 3);',
-                    'ELE NAO VAI DAR O QUE? (3 > 2)',
-                    '   CE QUER VER ESSA PORRA? ("%d", 2);',
-                    'NAO VAI DAR NAO',
-                    '   CE QUER VER ESSA PORRA? ("%d", 1);',
-                    'BIRL',
-                    'BORA CUMPADE? 0; \n',
-                    'BIRL \n',
-                ], -1)
+                const resultado = lexador.mapear(
+                    [
+                        'HORA DO SHOW \n',
+                        'ELE QUE A GENTE QUER? (3 > 2)',
+                        '   CE QUER VER ESSA PORRA? ("%d", 3);',
+                        'ELE NAO VAI DAR O QUE? (3 > 2)',
+                        '   CE QUER VER ESSA PORRA? ("%d", 2);',
+                        'NAO VAI DAR NAO',
+                        '   CE QUER VER ESSA PORRA? ("%d", 1);',
+                        'BIRL',
+                        'BORA CUMPADE? 0; \n',
+                        'BIRL \n',
+                    ],
+                    -1
+                );
 
                 expect(resultado).toBeTruthy();
                 expect(resultado.simbolos).toHaveLength(86);
                 expect(resultado.erros).toHaveLength(0);
             });
             it('Sucesso - Condição - BREAK/CONTINUE', () => {
-                const resultado = lexador.mapear([
-                    'HORA DO SHOW \n',
-                    'MONSTRO M = 0;',
-                    'MAIS QUERO MAIS (M = 0; M < 5; M++)',
-                    '   ELE QUE A GENTE QUER? (M == 3)',
-                    '   VAMO MONSTRO;',
-                    '   SAI FILHO DA PUTA;',
-                    'BIRL',
-                    'BORA CUMPADE? 0; \n',
-                    'BIRL \n',
-                ], -1);
+                const resultado = lexador.mapear(
+                    [
+                        'HORA DO SHOW \n',
+                        'MONSTRO M = 0;',
+                        'MAIS QUERO MAIS (M = 0; M < 5; M++)',
+                        '   ELE QUE A GENTE QUER? (M == 3)',
+                        '   VAMO MONSTRO;',
+                        '   SAI FILHO DA PUTA;',
+                        'BIRL',
+                        'BORA CUMPADE? 0; \n',
+                        'BIRL \n',
+                    ],
+                    -1
+                );
 
                 expect(resultado).toBeTruthy();
                 expect(resultado.simbolos).toHaveLength(62);
                 expect(resultado.erros).toHaveLength(0);
-            })
+            });
             it('Sucesso - Declaração de Função', () => {
-                const resultado = lexador.mapear([
-                    'HORA DO SHOW \n',
-                    'OH O HOME AI PO (MONSTRO NOMEFUNC(MONSTRO A, MONSTRO B))',
-                    '   CE QUER VER ESSA PORRA? ("%d", A + B);',
-                    '   BORA CUMPADE? 1; \n',
-                    'BIRL',
-                    'BORA CUMPADE? 0; \n',
-                    'BIRL \n',
-                ], -1);
+                const resultado = lexador.mapear(
+                    [
+                        'HORA DO SHOW \n',
+                        'OH O HOME AI PO (MONSTRO NOMEFUNC(MONSTRO A, MONSTRO B))',
+                        '   CE QUER VER ESSA PORRA? ("%d", A + B);',
+                        '   BORA CUMPADE? 1; \n',
+                        'BIRL',
+                        'BORA CUMPADE? 0; \n',
+                        'BIRL \n',
+                    ],
+                    -1
+                );
 
                 expect(resultado).toBeTruthy();
                 expect(resultado.simbolos).toHaveLength(56);
                 expect(resultado.erros).toHaveLength(0);
-            })
+            });
             it('Sucesso - Chamada de função', () => {
-                const resultado = lexador.mapear([
-                    'HORA DO SHOW \n',
-                    'MONSTRO A = 5;',
-                    'MONSTRO B = 8;',
-                    'MONSTRO C = AJUDA O MALUCO TA DOENTE SOMAR(A, B);'
-                ], -1)
+                const resultado = lexador.mapear(
+                    [
+                        'HORA DO SHOW \n',
+                        'MONSTRO A = 5;',
+                        'MONSTRO B = 8;',
+                        'MONSTRO C = AJUDA O MALUCO TA DOENTE SOMAR(A, B);',
+                    ],
+                    -1
+                );
 
                 expect(resultado).toBeTruthy();
                 expect(resultado.simbolos).toHaveLength(33);
                 expect(resultado.erros).toHaveLength(0);
             });
             it('Sucesso - EXEMPLO DESCENDENTE', () => {
-                const resultado = lexador.mapear([
-                    'OH O HOME AI PO (MONSTRO SOMAR(MONSTRO A, MONSTRO B))',
-                    '   BORA CUMPADE A + B;',
-                    'BIRL',
-                    'HORA DO SHOW \n',
-                    '   MONSTRO A, B, RES;',
-                    '   CE QUER VER ESSA PORRA? ("Entra com a e b ai cumpade!!\n");',
-                    '   QUE QUE CE QUER MONSTRAO? ("%d %d", &A, &B);',
-                    '   RES = AJUDA O MALUCO TA DOENTE SOMAR(A, B);',
-                    '   CE QUER VER ESSA PORRA? ("Oh o resultado ai po: %d\n", RES);',
-                    '   ELE QUE A GENTE QUER? (RES == 37)',
-                    '       CE QUER VER ESSA PORRA? ("É 37 anos caralho!\n");',
-                    '   NAO VAI DAR NAO',
-                    '       CE QUER VER ESSA PORRA? ("Manda o double biceps!\n");',
-                    '   BIRL',
-                    '   BORA CUMPADE 0;',
-                    'BIRL'
-                ], -1)
+                const resultado = lexador.mapear(
+                    [
+                        'OH O HOME AI PO (MONSTRO SOMAR(MONSTRO A, MONSTRO B))',
+                        '   BORA CUMPADE A + B;',
+                        'BIRL',
+                        'HORA DO SHOW \n',
+                        '   MONSTRO A, B, RES;',
+                        '   CE QUER VER ESSA PORRA? ("Entra com a e b ai cumpade!!\n");',
+                        '   QUE QUE CE QUER MONSTRAO? ("%d %d", &A, &B);',
+                        '   RES = AJUDA O MALUCO TA DOENTE SOMAR(A, B);',
+                        '   CE QUER VER ESSA PORRA? ("Oh o resultado ai po: %d\n", RES);',
+                        '   ELE QUE A GENTE QUER? (RES == 37)',
+                        '       CE QUER VER ESSA PORRA? ("É 37 anos caralho!\n");',
+                        '   NAO VAI DAR NAO',
+                        '       CE QUER VER ESSA PORRA? ("Manda o double biceps!\n");',
+                        '   BIRL',
+                        '   BORA CUMPADE 0;',
+                        'BIRL',
+                    ],
+                    -1
+                );
 
                 expect(resultado).toBeTruthy();
                 expect(resultado.simbolos).toHaveLength(143);
                 expect(resultado.erros).toHaveLength(0);
+            });
+        });
+        describe('Cenário de Erros', () => {
+            it('Error - texto sem fim', () => {
+                const resultado = lexador.mapear([`"texto sem fim`], -1);
+                expect(resultado).toBeTruthy();
+                expect(resultado.simbolos).toHaveLength(0);
+                expect(resultado.erros).toHaveLength(1);
+                expect(resultado.erros[0]).toEqual({
+                    linha: 2,
+                    caractere: '\n',
+                    mensagem: 'Caractere não finalizado',
+                });
+            });
+            it('Error - texto sem inicio', () => {
+                const resultado = lexador.mapear([`texto sem inicio"`], -1);
+                expect(resultado).toBeTruthy();
+                expect(resultado.simbolos).toHaveLength(3);
+                expect(resultado.erros).toHaveLength(1);
+                expect(resultado.erros[0]).toEqual({
+                    linha: 2,
+                    caractere: '\n',
+                    mensagem: 'Caractere não finalizado',
+                });
+            })
+            it('Error - caractere inesperado', () => {
+                const resultado = lexador.mapear(['平']);
+                expect(resultado).toBeTruthy();
+                expect(resultado.simbolos).toHaveLength(1);
+                expect(resultado.erros).toHaveLength(1);
+                expect(resultado.erros[0]).toEqual({
+                    linha: 1,
+                    caractere: '平',
+                    mensagem: 'Caractere inesperado.',
+                });
             })
         });
     });
diff --git a/testes/primitivas/primitivas-vetor.test.ts b/testes/primitivas/primitivas-vetor.test.ts
index 379a89d0..fd6a0414 100644
--- a/testes/primitivas/primitivas-vetor.test.ts
+++ b/testes/primitivas/primitivas-vetor.test.ts
@@ -43,6 +43,13 @@ describe('Primitivas de vetor', () => {
         });
     });
 
+    describe('concatenar()', () => {
+        it('Trivial', () => {
+            const resultado = primitivasVetor.concatenar([1, 2, 3], [4, 5, 6]);
+            expect(resultado).toStrictEqual([1, 2, 3, 4, 5, 6]);
+        });
+    });
+
     describe('ordenar()', () => {
         it('Trivial', () => {
             const resultado = primitivasVetor.ordenar([3, 2, 7, 1, 5]);