Repository: DesignLiquido/delegua
Pull request #193 (2022-12-09 03:29:31)

Testes se e senão e vários ajustes

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

## 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: 66.87%">66.99% (+0.12% 🔼)</div> |    3249/4850    |
|                                                                           🔴                                                                           | Branches   | <div title="Base coverage is: 58.4%">58.65% (+0.24% 🔼)</div>  |     970/1654    |
|                                                                           🟡                                                                           | Functions  | 65.26%                                                         |     464/711     |
|                                                                           🟡                                                                           | Lines      | <div title="Base coverage is: 67.1%">67.23% (+0.13% 🔼)</div>  |    3143/4675    |


## Test suite run success
188 tests passing in 18 suites.

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

Patch:
diff --git a/fontes/tradutores/index.ts b/fontes/tradutores/index.ts
index 72b40b8a..66e924ce 100644
--- a/fontes/tradutores/index.ts
+++ b/fontes/tradutores/index.ts
@@ -274,17 +274,16 @@ export class TradutorJavaScript implements TradutorInterface {
         if(declaracaoRetorna?.valor instanceof Binario){
             return resultado += this.traduzirConstrutoBinario(declaracaoRetorna?.valor)
         }
-        if((declaracaoRetorna?.valor as Literal)?.valor){
+        if(declaracaoRetorna?.valor instanceof Literal){
             const valor = this.traduzirConstrutoLiteral(declaracaoRetorna?.valor as Literal)
             if(typeof valor === 'string')
                 resultado += `'${valor}'`
             else if(typeof valor === 'number')
                 resultado += valor
+            else if(valor === null)
+                resultado += 'null'
             return resultado;
         }
-        if(!nomeConstrutor){
-            return resultado += "null";
-        }
         if (this.dicionarioConstrutos.hasOwnProperty(nomeConstrutor)) {
             resultado += this.dicionarioConstrutos[nomeConstrutor](declaracaoRetorna.valor.expressao);
         } else {
@@ -300,9 +299,27 @@ export class TradutorJavaScript implements TradutorInterface {
 
         resultado += condicao;
 
-        resultado += ') {';
+        resultado += ')';
         resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoEntao.constructor.name](declaracaoSe.caminhoEntao);
-        resultado += '}'
+
+        if(declaracaoSe.caminhoSenao !== null){
+            resultado += 'else '
+            const se = declaracaoSe?.caminhoSenao as Se;
+            if(se?.caminhoEntao){
+                resultado += 'if ('
+                resultado += this.dicionarioConstrutos[se.condicao.constructor.name](se.condicao);
+                resultado += ')'
+                resultado += this.dicionarioDeclaracoes[se.caminhoEntao.constructor.name](se.caminhoEntao);
+
+                if(se?.caminhoSenao){
+                    resultado += 'else '
+                    resultado += this.dicionarioDeclaracoes[se.caminhoSenao.constructor.name](se.caminhoSenao);
+                    return resultado;
+                }
+            }
+
+            resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoSenao.constructor.name](declaracaoSe.caminhoSenao);
+        }
 
         return resultado;
     }


Test patch:
diff --git a/testes/tradutores/tradutor-javascript.test.ts b/testes/tradutores/tradutor-javascript.test.ts
index 346330d4..1ff66664 100644
--- a/testes/tradutores/tradutor-javascript.test.ts
+++ b/testes/tradutores/tradutor-javascript.test.ts
@@ -37,6 +37,111 @@ describe("Tradutor Delégua -> JavaScript", () => {
             delegua = new Delegua('delegua');
         });
 
+        it("se -> if, código", () => {
+            const retornoLexador = delegua.lexador.mapear(
+                [
+                    "se (a == 1) {",
+                    "    escreva(10)",
+                    "}"
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico =
+                delegua.avaliadorSintatico.analisar(retornoLexador);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/if/i);
+            expect(resultado).toMatch(/a === 1/i);
+            expect(resultado).toMatch(/console\.log\(10\)/i);
+        });
+
+        it("senão -> else, código", () => {
+            const retornoLexador = delegua.lexador.mapear(
+                [
+                    "se (a == 1) {",
+                    "    escreva(10)",
+                    "} senão {",
+                    "   escreva(20)",
+                    "}"
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico =
+                delegua.avaliadorSintatico.analisar(retornoLexador);
+    
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/if/i);
+            expect(resultado).toMatch(/a === 1/i);
+            expect(resultado).toMatch(/console\.log\(10\)/i);
+            expect(resultado).toMatch(/else/i);
+            expect(resultado).toMatch(/console\.log\(20\)/i);
+        });
+
+        it("se senão 01 -> if else, código", () => {
+            const retornoLexador = delegua.lexador.mapear(
+                [
+                    "var a = 20",
+                    "se (a == 10) {",
+                    "   escreva(10)",
+                    "} senão se (a == 20) {",
+                    "   escreva(20)",
+                    "} senão {",
+                    "   escreva('Não é 10 e não é 20')",
+                    "}"
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico =
+                delegua.avaliadorSintatico.analisar(retornoLexador);
+    
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/if/i);
+            expect(resultado).toMatch(/a === 10/i);
+            expect(resultado).toMatch(/console\.log\(10\)/i);
+            expect(resultado).toMatch(/else if/i);
+            expect(resultado).toMatch(/a === 20/i);
+            expect(resultado).toMatch(/console\.log\(20\)/i);
+            expect(resultado).toMatch(/else/i);
+            expect(resultado).toMatch(/console\.log\('Não é 10 e não é 20'\)/i);
+        });
+
+        it("se senão 02 -> if else, código", () => {
+            const retornoLexador = delegua.lexador.mapear(
+                [
+                    "var a = 20",
+                    "se (a == 10) {",
+                    "   escreva(10)",
+                    "} senão se (a == 20) {",
+                    "   escreva(20)",
+                    "} senão se (a == 30) {",
+                    "   escreva(30)",
+                    "} senão {",
+                    "   escreva('Não é nenhum desses valores: 10, 20, 30')",
+                    "}"
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico =
+                delegua.avaliadorSintatico.analisar(retornoLexador);
+    
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/if/i);
+            expect(resultado).toMatch(/a === 10/i);
+            expect(resultado).toMatch(/console\.log\(10\)/i);
+            expect(resultado).toMatch(/else if/i);
+            expect(resultado).toMatch(/a === 20/i);
+            expect(resultado).toMatch(/console\.log\(20\)/i);
+            expect(resultado).toMatch(/else if/i);
+            expect(resultado).toMatch(/a === 30/i);
+            expect(resultado).toMatch(/console\.log\(30\)/i);
+            expect(resultado).toMatch(/else/i);
+            expect(resultado).toMatch(/console\.log\('Não é nenhum desses valores: 10, 20, 30'\)/i);
+        });
+
         it('escreva -> console.log', () => {
             const codigo = [
                 "var texto = 'Olá Mundo'",
@@ -51,6 +156,18 @@ describe("Tradutor Delégua -> JavaScript", () => {
             expect(resultado).toMatch(/console\.log\(texto\)/i);
         })
 
+        it('escreva -> console.log com operação lógica', () => {
+            const codigo = [
+                "escreva(1 == 2)"
+            ]
+            const retornoLexador = delegua.lexador.mapear(codigo, -1)
+            const retornoAvaliadorSintatico = delegua.avaliadorSintatico.analisar(retornoLexador);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/console\.log\(1 === 2\)/i);
+        })
+
         it('operadores lógicos', () => {
             const codigo = [
                 "var soma = 1 + 1",