Browse Source

Implement LozalizedStrings error messages during parsing

-Refactor ivprogParser to call the SyntaxErrorFactory
-Implement SyntaxErrorFactory and refactor the SyntaxError class
-Refactor test cases removing unused imports
Lucas de Souza 6 years ago
parent
commit
5ea39722ce

+ 13 - 2
i18n/pt/error.json

@@ -1,3 +1,14 @@
 {
-  
-}
+  "token_missing_one": "Erro de sintaxe: Espera-se $0, mas encontrou-se $1 na linha:$2, coluna:$3",
+  "token_missing_two": "Erro de sintaxe: Esperava-se $0 ou $1 mas encontrou-se $2 na liha:$3, coluna: $4",
+  "eos_missing": "Falta uma nova linha ou ; na linha: $0, coluna: $1",
+  "invalid_type": "$0 na linha: $1, coluna: $2 é um tipo inválido. Os tipos válidos são: $3",
+  "invalid_array_dimension": "A dimensão inválida na linha: $0, coluna: $1. Insira um $2 ou identificador válido do mesmo tipo.",
+  "invalid_array_size": "O tamnho do vetor/matriz excede o máximo de 2 na linha $0",
+  "extra_lines": "Nenhum texto é permitido após '}' em 'programa {...}'",
+  "invalid_main_return": "A função $0 deve retornar $1 na linha $2",
+  "invalid_var_declaration": "Erro na linha $0. Variáveis só podem ser declarados no corpo principal da função e de preferência nas primeiras linhas.",
+  "invalid_break_command": "Erro na linha $0. O comando $1 não pode ser usado fora de uma estrutura de repetição ou 'escolha...caso'",
+  "invalid_terminal": "Não é possível utilizar $0 na expressão da linha: $1, coluna: $2. Tente um valor númerico, variável ou chamada de função.",
+  "id_missing": "Esperava-se um identificador, mas encontrou-se $0 na linha: $1, coluna: $2"
+}

+ 23 - 22
i18n/pt/ui.json

@@ -1,25 +1,26 @@
 {
-  "function": "function",
-  "btn_function": "Function",
-  "start": "start",
-  "void": "void",
-  "integer": "integer",
+  "function": "funcao",
+  "btn_function": "Função",
+  "start": "inicio",
+  "void": "vazio",
+  "integer": "inteiro",
   "real": "real",
-  "program": "program",
-  "text": "text",
-  "boolean": "boolean",
-  "true": "true",
-  "false": "false",
-  "variable": "Variable",
-  "command": "Command",
-  "new_parameter": "new_parameter",
-  "new_variable": "new_variable",
-  "new_global": "new_global",
-  "new_function": "new_function",
-  "vector": "vector",
-  "text_comment_start": "Initial comment of function...",
-  "text_comment_main": "This is the main function...",
-  "text_read_var": "Reading data",
-  "text_write_var": "Writing data",
-  "text_comment": "Comment"
+  "program": "programa",
+  "text": "cadeia",
+  "boolean": "logico",
+  "true": "verdadeiro",
+  "false": "fals0",
+  "variable": "Variável",
+  "command": "Comando",
+  "new_parameter": "novo_parametro",
+  "new_variable": "nova_variavel",
+  "new_global": "nova_global",
+  "new_function": "nova_funcao",
+  "vector": "vetor",
+  "text_comment_start": "Comentário inicial da função...",
+  "text_comment_main": "Esta é a função principal...",
+  "text_read_var": "Leitura de dados",
+  "text_write_var": "Escrita de dados",
+  "text_comment": "Comentário",
+  "join_or": "ou"
 }

+ 0 - 16
js/ast/SyntaxError.js

@@ -1,16 +0,0 @@
-export class SyntaxError extends Error {
-
-  static createError (msg, token) {
-    const val = SyntaxError.getErrorString(msg, token);
-    return new SyntaxError(val);
-  }
-
-  static getErrorString (symbol, token) {
-    return `Syntax error: Expecting '${symbol}' but found '${token.text}' at line:${token.line}, column:${token.column}`;
-  }
-
-  constructor (...msg) {
-    super(...msg);
-    Error.captureStackTrace(this, SyntaxError);
-  }
-}

+ 8 - 0
js/ast/error/SyntaxError.js

@@ -0,0 +1,8 @@
+export class SyntaxError extends Error {
+
+  constructor (...msg) {
+    super(...msg);
+    if(Error.captureStackTrace)
+      Error.captureStackTrace(this, SyntaxError);
+  }
+}

+ 51 - 0
js/ast/error/syntaxErrorFactory.js

@@ -0,0 +1,51 @@
+import { LocalizedStrings } from './../../services/localizedStringsService';
+import { SyntaxError } from './SyntaxError';
+
+export const SyntaxErrorFactory = Object.freeze({
+  extra_lines: () => new SyntaxError(LocalizedStrings.getError("extra_lines")),
+  token_missing_one: (expected, token) => {
+    const context = [expected, token.text, token.line, token.column];
+    return new SyntaxError(LocalizedStrings.getError("token_missing_one", context));
+  },
+  token_missing_list: (expectedList, token) => {
+    const line = expectedList.join(LocalizedStrings.getOR());
+    return SyntaxErrorCodes.token_missing_one(line, token);
+  },
+  id_missing: (token) => {
+    const context = [token.text, token.line, token.column];
+    return new SyntaxError(LocalizedStrings.getError("id_missing", context));
+  },
+  eos_missing: (token) => {
+    const context = [token.line, token.column];
+    return new SyntaxError(LocalizedStrings.getError("eos_missing", context));
+  },
+  invalid_array_dimension: (typeName, token) => {
+    const context = [token.line, token.column, typeName];
+    return new SyntaxError(LocalizedStrings.getError("invalid_array_dimension", context));
+  },
+  invalid_array_size: (token) => {
+    const context = [token.line];
+    return new SyntaxError(LocalizedStrings.getError("invalid_array_size", context));
+  },
+  invalid_main_return: (name, typeName, token) => {
+    const context = [name, typeName, token.line];
+    return new SyntaxError(LocalizedStrings.getError("invalid_main_return", context));
+  },
+  invalid_var_declaration: (token) => {
+    const context = [token.line];
+    return new SyntaxError(LocalizedStrings.getError("invalid_var_declaration", context));
+  },
+  invalid_break_command: (cmdName, token) => {
+    const context = [token.line, cmdName];
+    return new SyntaxError(LocalizedStrings.getError("invalid_break_command", context));
+  },
+  invalid_terminal: () => {
+    const context = [token.text, token.line, token.column];
+    return new SyntaxError(LocalizedStrings.getError('invalid_terminal', context));
+  },
+  invalid_type: (list, token) => {
+    const line = list.join(LocalizedStrings.getOR());
+    const context = [token.text, token.line, token.column, line]
+    return new SyntaxError(LocalizedStrings.getError("invalid_type", context));
+  }
+});

+ 36 - 37
js/ast/ivprogParser.js

@@ -3,7 +3,7 @@ import * as Expressions from './expressions/';
 import * as Commands from './commands/';
 import { Types, toInt, toString } from './types';
 import { convertFromString } from './operators';
-import { SyntaxError } from './SyntaxError';
+import { SyntaxErrorFactory } from './error/syntaxErrorFactory';
 import { NAMES } from './../processor/definedFunctions';
 
 export class IVProgParser {
@@ -96,11 +96,11 @@ export class IVProgParser {
       this.pos++;
       this.consumeNewLines();
       if(!this.isEOF()) {
-        throw new Error("No extra characters are allowed after 'program {...}'");
+        throw SyntaxErrorFactory.extra_lines();
       }
       return {global: globalVars, functions: functions};
     } else {
-      throw SyntaxError.createError(this.lexer.literalNames[this.lexerClass.RK_PROGRAM], token);
+      throw SyntaxErrorFactory.token_missing_one(this.lexer.literalNames[this.lexerClass.RK_PROGRAM], token);
     }
   }
 
@@ -108,7 +108,7 @@ export class IVProgParser {
     const token = this.getToken();
     if(this.lexerClass.OPEN_CURLY !== token.type){
       if(!attempt)
-        throw SyntaxError.createError('{', token);
+        throw SyntaxErrorFactory.token_missing_one('{', token);
       else
         return false;
     }
@@ -119,7 +119,7 @@ export class IVProgParser {
     const token = this.getToken();
     if(this.lexerClass.CLOSE_CURLY !== token.type){
       if(!attempt)
-        throw SyntaxError.createError('}', token);
+        throw SyntaxErrorFactory.token_missing_one('}', token);
       else
         return false;
     }
@@ -138,7 +138,7 @@ export class IVProgParser {
     const token = this.getToken();
     if(this.lexerClass.OPEN_BRACE !== token.type){
       if (!attempt) {
-        throw SyntaxError.createError('[', token);
+        throw SyntaxErrorFactory.token_missing_one('[', token);
       } else {
         return false;
       }
@@ -150,7 +150,7 @@ export class IVProgParser {
     const token = this.getToken();
     if(this.lexerClass.CLOSE_BRACE !== token.type){
       if (!attempt) {
-        throw SyntaxError.createError(']', token);
+        throw SyntaxErrorFactory.token_missing_one(']', token);
       } else {
         return false;
       }
@@ -162,7 +162,7 @@ export class IVProgParser {
     const token = this.getToken();
     if(this.lexerClass.OPEN_PARENTHESIS !== token.type){
       if (!attempt) {
-        throw SyntaxError.createError('(', token);
+        throw SyntaxErrorFactory.token_missing_one('(', token);
       } else {
         return false;
       }
@@ -174,7 +174,7 @@ export class IVProgParser {
     const token = this.getToken();
     if(this.lexerClass.CLOSE_PARENTHESIS !== token.type){
       if (!attempt) {
-        throw SyntaxError.createError(')', token);
+        throw SyntaxErrorFactory.token_missing_one(')', token);
       } else {
         return false;
       }
@@ -186,7 +186,7 @@ export class IVProgParser {
     const eosToken = this.getToken();
     if (eosToken.type !== this.lexerClass.EOS) {
       if (!attempt)
-        throw SyntaxError.createError('new line or \';\'', eosToken);
+        throw SyntaxErrorFactory.eos_missing(eosToken);
       else
         return false;
     }
@@ -199,7 +199,7 @@ export class IVProgParser {
       this.pos++;
       return;  
     }
-    throw SyntaxError.createError(';', eosToken);
+    throw SyntaxErrorFactory.token_missing_one(';', eosToken);
   }
 
   parseGlobalVariables () {
@@ -225,7 +225,8 @@ export class IVProgParser {
       const typeString = this.parseType();
       return this.parseDeclaration(typeString);
     } else {
-      throw SyntaxError.createError(this.lexer.literalNames[this.lexerClass.RK_CONST] + ' or ' + this.getTypesAsString(), constToken);
+      throw SyntaxErrorFactory.token_missing_list(
+        [this.lexer.literalNames[this.lexerClass.RK_CONST]].concat(this.getTypeArray()), constToken);
     }
 
   }
@@ -272,7 +273,6 @@ export class IVProgParser {
     }
     const commaToken = this.getToken();
     if(commaToken.type === this.lexerClass.COMMA) {
-      console.log("comma found");
       this.pos++;
       this.consumeNewLines();
       return [declaration]
@@ -309,7 +309,7 @@ export class IVProgParser {
       this.pos++;
       return this.parseVariable(dimToken);
     } else {
-      throw SyntaxError.createError('int or ID', dimToken);
+      throw SyntaxErrorFactory.invalid_array_dimension(this.lexer.literalNames[this.lexerClass.RK_INTEGER], dimToken);
     }
   }
 
@@ -342,7 +342,7 @@ export class IVProgParser {
     const beginArray = this.getToken();
     if (this.parsingArrayDimension >= 2) {
       // TODO: better error message
-      throw new Error(`Array dimensions exceed maximum size of 2 at line ${beginArray.line}`);
+      throw SyntaxErrorFactory.token_missing_list(`Array dimensions exceed maximum size of 2 at line ${beginArray.line}`);
     }
     this.pos++;
     this.parsingArrayDimension++;
@@ -402,7 +402,9 @@ export class IVProgParser {
     const func = new Commands.Function(functionID, returnType, formalParams, commandsBlock);
     if (functionID === null && !func.isMain) {
       // TODO: better error message
-      throw new Error(`Function ${this.lexerClass.MAIN_FUNCTION_NAME} must return void (line ${token.line})`);
+      throw SyntaxErrorFactory.invalid_main_return(this.lexerClass.MAIN_FUNCTION_NAME,
+        this.lexer.literalNames[this.lexerClass.RK_VOID],
+        token.line);
     }
     this.popScope();
     return func;
@@ -443,7 +445,7 @@ export class IVProgParser {
   parseID () {
     const token = this.getToken();
     if(token.type !== this.lexerClass.ID) {
-      throw SyntaxError.createError('ID', token);
+      throw SyntaxErrorFactory.id_missing(token);
     } 
     this.pos++;
     if (this.insideScope(IVProgParser.FUNCTION)) {
@@ -477,7 +479,7 @@ export class IVProgParser {
       }
     }
     
-    throw SyntaxError.createError(this.getTypesAsString(), token);
+    throw SyntaxErrorFactory.invalid_type(this.getTypeArray(), token);
   }
 
   parseCommandBlock (optionalCurly = false) {
@@ -516,7 +518,7 @@ export class IVProgParser {
     if (this.isVariableType(token)) {
       if(!this.insideScope(IVProgParser.FUNCTION)) {
         // TODO better error message
-        throw new Error(`Cannot declare variable here (line ${token.line})`);
+        throw SyntaxErrorFactory.invalid_var_declaration(token.line);
       }
       this.pushScope(IVProgParser.BASE);
       const varType = this.parseType();
@@ -536,7 +538,10 @@ export class IVProgParser {
     } else if (token.type === this.lexerClass.RK_BREAK ) {
       if(!this.insideScope(IVProgParser.BREAKABLE)) {
         // TODO better error message
-        throw new Error("Break cannot be used outside of a loop.");
+        throw SyntaxErrorFactory.invalid_break_command(
+          this.lexer.literalNames[this.lexerClass.RK_BREAK],
+          token
+        );
       }
       return this.parseBreak();
     } else if (token.type === this.lexerClass.RK_SWITCH) {
@@ -585,7 +590,7 @@ export class IVProgParser {
     this.consumeNewLines(); //Maybe not...
     const whileToken = this.getToken();
     if (whileToken.type !== this.lexerClass.RK_WHILE) {
-      throw SyntaxError.createError(this.lexer.literalNames[this.lexerClass.RK_WHILE], whileToken);
+      throw SyntaxErrorFactory.token_missing_one(this.lexer.literalNames[this.lexerClass.RK_WHILE], whileToken);
     }
     this.pos++;
     this.checkOpenParenthesis();
@@ -629,7 +634,7 @@ export class IVProgParser {
         elseBlock = this.parseIfThenElse();
       } else {
         // TODO better error message
-        throw SyntaxError.createError(`${this.lexer.literalNames[this.lexerClass.RK_IF]} or {`, maybeIf);
+        throw SyntaxErrorFactory.token_missing_list([this.lexer.literalNames[this.lexerClass.RK_IF], '{'], maybeIf);
       }
       return new Commands.IfThenElse(logicalExpression, cmdBlocks, elseBlock);
     }
@@ -677,7 +682,7 @@ export class IVProgParser {
     this.pos++;
     this.checkEOS();
     this.pos++;
-    return (new Commands.Break());
+    return new Commands.Break();
   }
 
   parseReturn () {
@@ -706,7 +711,7 @@ export class IVProgParser {
       this.pos++;
       return funcCall;
     } else {
-      throw SyntaxError.createError("= or (", equalOrParenthesis);
+      throw SyntaxErrorFactory.token_missing_list(['=','('], equalOrParenthesis);
     }
   }
 
@@ -719,7 +724,7 @@ export class IVProgParser {
     const id = this.parseID();
     const equal = this.getToken();
     if (equal.type !== this.lexerClass.EQUAL) {
-      throw SyntaxError.createError('=', equal);
+      throw SyntaxErrorFactory.token_missing_one('=', equal);
     }
     this.pos++
     const exp = this.parseExpressionOR();
@@ -732,7 +737,7 @@ export class IVProgParser {
   parseCases () {
     const token = this.getToken();
     if(token.type !== this.lexerClass.RK_CASE) {
-      throw SyntaxError.createError(this.lexer.literalNames[this.lexerClass.RK_CASE], token);
+      throw SyntaxErrorFactory.token_missing_one(this.lexer.literalNames[this.lexerClass.RK_CASE], token);
     }
     this.pos++;
     const nextToken = this.getToken();
@@ -740,7 +745,7 @@ export class IVProgParser {
       this.pos++;
       const colonToken = this.getToken();
       if (colonToken.type !== this.lexerClass.COLON) {
-        throw SyntaxError.createError(':', colonToken);
+        throw SyntaxErrorFactory.token_missing_one(':', colonToken);
       }
       this.pos++;
       this.consumeNewLines();
@@ -752,7 +757,7 @@ export class IVProgParser {
       const exp = this.parseExpressionOR();
       const colonToken = this.getToken();
       if (colonToken.type !== this.lexerClass.COLON) {
-        throw SyntaxError.createError(':', colonToken);
+        throw SyntaxErrorFactory.token_missing_one(':', colonToken);
       }
       this.pos++;
       this.consumeNewLines();
@@ -888,7 +893,7 @@ export class IVProgParser {
       case this.lexerClass.OPEN_PARENTHESIS:
         return this.parseParenthesisExp();
       default:
-        throw SyntaxError.createError('Terminal', token);
+        throw SyntaxErrorFactory.invalid_terminal(token);
     }
   }
 
@@ -982,14 +987,8 @@ export class IVProgParser {
     return list;
   }
 
-  getTypesAsString () {
+  getTypeArray () {
     const types = this.insideScope(IVProgParser.FUNCTION) ? this.functionTypes : this.variableTypes;
-    return types.map( x => this.lexer.literalNames[x])
-      .reduce((o, n) => {
-        if (o.length <= 0)
-          return n;
-        else
-          return o + ", " + n;
-      }, '');
+    return types.map( x => this.lexer.literalNames[x]);
   }
 }

+ 7 - 20
js/main.js

@@ -1,25 +1,12 @@
-import {
-    InputStream,
-    CommonTokenStream
-} from 'antlr4/index';
-import * as Commands from './ast/commands';
 import { IVProgParser } from './ast/ivprogParser';
-import Lexers from '../grammar/';
 import { IVProgProcessor } from './processor/ivprogProcessor';
 import {DOMInput} from './io/domInput';
 import {DOMOutput} from './io/domOutput';
+import { LanguageService } from './services/languageService';
+import { LocalizedStrings } from './services/localizedStringsService';
 
-const lang = 'pt_br';
-
-const ivprogLexer = Lexers[lang];
-
-const input = `programa {
-             
-  funcao inicio() {
-     inteiro a[2] = {1,2}
-  }
-
-}`;
+const ivprogLexer = LanguageService.getCurrentLexer();
+console.log(LocalizedStrings.getUI('start'));
 
 // const lexer = new ivprogLexer(new InputStream(input));
 // const stream = new CommonTokenStream(lexer);
@@ -32,9 +19,9 @@ const input = `programa {
 //     i++;
 // }
 // const anaSin = new IVProgParser(input, ivprogLexer);
-const editor = new JsonEditor('#json-renderer', {});
-const domIn = new DOMInput('#dom-in');
-const domOut = new DOMOutput('#dom-out');
+//const editor = new JsonEditor('#json-renderer', {});
+//const domIn = new DOMInput('#dom-in');
+//const domOut = new DOMOutput('#dom-out');
 // proc.interpretAST().then( sto => {
 //   console.log(sto.applyStore('a'));
 // }).catch(e => console.log(e));

+ 5 - 5
js/services/languageService.js

@@ -1,14 +1,14 @@
 import Lexers from './../../grammar/';
-import { isNullOrUndefined } from 'util';
 
-const DEFAULT_LANG = 'pt';
+const DEFAULT_LANG = "pt";
 
-export const LanguageService  = ({
+export const LanguageService  = Object.freeze({
 
   getLang: () => {
     const lang = localStorage.getItem('ivprog.lang');
-    if (lang === null) {
-      throw new Error("Internal Error. User language information has not been set");
+    if (lang === null || lang === undefined) {
+      console.warn("Internal Error. User language information has not been set. Returning default...");
+      return LanguageService.getDefaultLang();
     }
     return lang;
   },

+ 8 - 5
js/services/localizedStringsService.js

@@ -2,9 +2,9 @@ import { LanguageService } from "./languageService";
 import Langs from './../../i18n';
 
 export const StringTypes = Object.freeze({
-  ERROR: 'error',
-  MESSAGE: 'message',
-  UI: 'ui'
+  ERROR: "error",
+  MESSAGE: "message",
+  UI: "ui"
 });
 
 export const LocalizedStrings = Object.freeze({
@@ -12,17 +12,20 @@ export const LocalizedStrings = Object.freeze({
   getString: (id, type) => {
     let i18nObj = Langs[LanguageService.getLang()];
     if(!!!i18nObj) {
+      console.warn(`Internal Error. The language set at ivprog.lang is not valid: ${LanguageService.getLang()}`);
       i18nObj = Langs[LanguageService.getDefaultLang()];
     }
     if(!!!i18nObj[type]) {
       return "{MISSING_I18N_TYPE_IDENTIFIER}";
-    } else if (i18nObj[type][id]) {
-      return "{MISSING_I18N_TYPE_IDENTIFIER}";
+    } else if (!!!i18nObj[type][id]) {
+      return "{MISSING_I18N_IDENTIFIER}";
     } else {
       return i18nObj[type][id];
     }
   },
 
+  getOR: () => LocalizedStrings.getUI('join_or'),
+
   getError: (id, context = []) => {
     const text = LocalizedStrings.getString(id, StringTypes.ERROR);
     return LocalizedStrings.processString(text, context)

+ 0 - 1
tests/test01.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { LanguageService } from './../js/services/languageService';
 

+ 0 - 1
tests/test02.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';

+ 0 - 1
tests/test03.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';

+ 0 - 1
tests/test04.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';

+ 0 - 1
tests/test07.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';

+ 0 - 4
tests/test08.spec.js

@@ -1,10 +1,6 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';
-import {
-    SyntaxError
-} from './../js/ast/SyntaxError';
 import { LanguageService } from '../js/services/languageService';
 
 describe('Break command inside a loop', () => {

+ 0 - 1
tests/test09.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';

+ 0 - 4
tests/test10.spec.js

@@ -1,10 +1,6 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';
-import {
-    SyntaxError
-} from './../js/ast/SyntaxError';
 import { LanguageService } from '../js/services/languageService';
 
 describe('IfThenElseIfThenElse command chain', () => {

+ 0 - 4
tests/test11.spec.js

@@ -1,10 +1,6 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';
-import {
-    SyntaxError
-} from './../js/ast/SyntaxError';
 import { LanguageService } from '../js/services/languageService';
 
 describe('DoWhile command', () => {

+ 0 - 1
tests/test12.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';

+ 0 - 1
tests/test13.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';

+ 0 - 1
tests/test14.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';

+ 0 - 1
tests/test15.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';

+ 0 - 1
tests/test16.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';

+ 0 - 1
tests/test17.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import * as Expressions from './../js/ast/expressions/';
 import * as Commands from './../js/ast/commands/';
 import { Operators } from './../js/ast/operators';

+ 0 - 4
tests/test18.spec.js

@@ -1,7 +1,3 @@
-import Lexers from './../grammar/';
-import * as Expressions from './../js/ast/expressions/';
-import * as Commands from './../js/ast/commands/';
-import {Types} from './../js/ast/types';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';

+ 0 - 2
tests/test19.spec.js

@@ -1,5 +1,3 @@
-import Lexers from './../grammar/';
-import {Types} from './../js/ast/types';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 2
tests/test20.spec.js

@@ -1,5 +1,3 @@
-import Lexers from './../grammar/';
-import {Types} from './../js/ast/types';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 2
tests/test21.spec.js

@@ -1,5 +1,3 @@
-import Lexers from './../grammar/';
-import {Types} from './../js/ast/types';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 1
tests/test22.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 1
tests/test23.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import {
     IVProgParser
 } from './../js/ast/ivprogParser';

+ 0 - 1
tests/test24.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 2
tests/test25.spec.js

@@ -1,5 +1,3 @@
-import Lexers from './../grammar/';
-import {Types} from './../js/ast/types';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 2
tests/test26.spec.js

@@ -1,5 +1,3 @@
-import Lexers from './../grammar/';
-import {Types} from './../js/ast/types';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 2
tests/test27.spec.js

@@ -1,5 +1,3 @@
-import Lexers from './../grammar/';
-import {Types} from './../js/ast/types';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 2
tests/test28.spec.js

@@ -1,5 +1,3 @@
-import Lexers from './../grammar/';
-import {Types} from './../js/ast/types';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 2
tests/test29.spec.js

@@ -1,5 +1,3 @@
-import Lexers from './../grammar/';
-import {Types} from './../js/ast/types';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 2
tests/test30.spec.js

@@ -1,5 +1,3 @@
-import Lexers from './../grammar/';
-import {Types} from './../js/ast/types';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 2
tests/test31.spec.js

@@ -1,5 +1,3 @@
-import Lexers from './../grammar/';
-import {Types} from './../js/ast/types';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 1
tests/test35.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { LanguageService } from '../js/services/languageService';

+ 0 - 1
tests/test37.spec.js

@@ -1,4 +1,3 @@
-import Lexers from './../grammar/';
 import { IVProgParser } from './../js/ast/ivprogParser';
 import { IVProgProcessor} from './../js/processor/ivprogProcessor'
 import { InputTest } from './../js/util/inputTest';

+ 1 - 0
tests/test39.spec.js

@@ -6,4 +6,5 @@ describe('LanguageService.getLang() ', function () {
   it("should return the value associated to the key ivprog.lang, inside localStorage", function () {
     expect(LanguageService.getLang()).toEqual('pt_br');
   });
+  afterEach(() => localStorage.removeItem('ivprog.lang'));
 });

+ 1 - 0
tests/test40.spec.js

@@ -23,6 +23,7 @@ describe('The LanguageService', function () {
     exec.registerOutput(output);
     exec.interpretAST().then(sto => {
       expect(output.list).toEqual(['8.01']);
+      localStorage.removeItem('ivprog.lang');
       done();
     }).catch( err => done(err));
   });

+ 8 - 0
tests/test41.spec.js

@@ -0,0 +1,8 @@
+import { LocalizedStrings } from '../js/services/localizedStringsService';
+
+describe('The LocalizedStrings services', function () {
+
+  it(`should provide the corret message for the type and id given`, function () {
+    expect(LocalizedStrings.getUI('start')).toEqual('inicio');
+  });
+});