UNPKG

@designliquido/delegua

Version:

Linguagem de programação simples e moderna usando português estruturado.

179 lines 8.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.construirModuloDeTestes = construirModuloDeTestes; const erro_de_assertiva_1 = require("../../excecoes/erro-de-assertiva"); const funcao_padrao_1 = require("../../interpretador/estruturas/funcao-padrao"); const modulo_1 = require("../../interpretador/estruturas/modulo"); const modulo_afirmar_1 = require("./modulo-afirmar"); function simboloAtual(interpretador) { return { hashArquivo: interpretador.hashArquivoDeclaracaoAtual, linha: interpretador.linhaDeclaracaoAtual, }; } function construirModuloDeTestes(interpretador, registro) { const modulo = new modulo_1.DeleguaModulo('testes'); modulo.componentes['afirmar'] = (0, modulo_afirmar_1.construirModuloAfirmar)(); async function executarTeste(nome, fn) { const inicio = Date.now(); const emDeclaracaoTenteAnterior = interpretador.emDeclaracaoTente; interpretador.emDeclaracaoTente = true; for (const escopo of registro.pilhaEscopos) { for (const h of escopo.antesDeCada) { await h.chamar(interpretador, [], null); } } try { await fn.chamar(interpretador, [], null); registro.resultados.push({ nomeSuite: registro.suiteAtual, nomeTeste: nome, status: 'passou', tempoMs: Date.now() - inicio, }); } catch (e) { registro.resultados.push({ nomeSuite: registro.suiteAtual, nomeTeste: nome, status: 'falhou', mensagemErro: e.mensagem || e.message || String(e), tempoMs: Date.now() - inicio, }); } finally { for (const escopo of [...registro.pilhaEscopos].reverse()) { for (const h of escopo.depoisDeCada) { await h.chamar(interpretador, [], null); } } interpretador.emDeclaracaoTente = emDeclaracaoTenteAnterior; } } async function executarGrupo(nome, fn) { const suiteAnterior = registro.suiteAtual; registro.suiteAtual = suiteAnterior ? `${suiteAnterior} > ${nome}` : nome; const escopo = { antesDeCada: [], antesDeTodos: [], depoisDeCada: [], depoisDeTodos: [], itensColetados: [], temApenas: false, }; registro.pilhaEscopos.push(escopo); const modoColetarAnterior = registro.modoColeta; registro.modoColeta = true; const emDeclaracaoTenteAnterior = interpretador.emDeclaracaoTente; interpretador.emDeclaracaoTente = true; try { await fn.chamar(interpretador, [], null); registro.modoColeta = modoColetarAnterior; for (const h of escopo.antesDeTodos) { await h.chamar(interpretador, [], null); } for (const item of escopo.itensColetados) { if (escopo.temApenas && !item.apenas) continue; if (item.pular) { if (item.tipo === 'teste') { registro.resultados.push({ nomeSuite: registro.suiteAtual, nomeTeste: item.nome, status: 'pulado', tempoMs: 0, }); } continue; } if (item.tipo === 'teste') { await executarTeste(item.nome, item.fn); } else { await executarGrupo(item.nome, item.fn); } } for (const h of escopo.depoisDeTodos) { await h.chamar(interpretador, [], null); } } finally { registro.pilhaEscopos.pop(); registro.modoColeta = modoColetarAnterior; registro.suiteAtual = suiteAnterior; interpretador.emDeclaracaoTente = emDeclaracaoTenteAnterior; } } function coletarOuExecutar(tipo, nome, fn, pular, apenas) { if (registro.modoColeta && registro.pilhaEscopos.length > 0) { const escopoAtual = registro.pilhaEscopos[registro.pilhaEscopos.length - 1]; if (apenas) escopoAtual.temApenas = true; escopoAtual.itensColetados.push({ tipo, nome, fn, pular, apenas }); return Promise.resolve(); } if (pular) { if (tipo === 'teste') { registro.resultados.push({ nomeSuite: registro.suiteAtual, nomeTeste: nome, status: 'pulado', tempoMs: 0, }); } return Promise.resolve(); } return tipo === 'teste' ? executarTeste(nome, fn) : executarGrupo(nome, fn); } const grupoFn = new funcao_padrao_1.FuncaoPadrao(2, async function (_visitante, nomeRaw, funcaoRaw) { const nome = interpretador.resolverValor(nomeRaw); const fn = interpretador.resolverValor(funcaoRaw); return coletarOuExecutar('grupo', nome, fn, false, false); }); grupoFn['pular'] = new funcao_padrao_1.FuncaoPadrao(2, async function (_visitante, nomeRaw, funcaoRaw) { const nome = interpretador.resolverValor(nomeRaw); const fn = interpretador.resolverValor(funcaoRaw); return coletarOuExecutar('grupo', nome, fn, true, false); }); grupoFn['apenas'] = new funcao_padrao_1.FuncaoPadrao(2, async function (_visitante, nomeRaw, funcaoRaw) { const nome = interpretador.resolverValor(nomeRaw); const fn = interpretador.resolverValor(funcaoRaw); return coletarOuExecutar('grupo', nome, fn, false, true); }); modulo.componentes['grupo'] = grupoFn; const testeFn = new funcao_padrao_1.FuncaoPadrao(2, async function (_visitante, nomeRaw, funcaoRaw) { const nome = interpretador.resolverValor(nomeRaw); const fn = interpretador.resolverValor(funcaoRaw); return coletarOuExecutar('teste', nome, fn, false, false); }); testeFn['pular'] = new funcao_padrao_1.FuncaoPadrao(2, async function (_visitante, nomeRaw, funcaoRaw) { const nome = interpretador.resolverValor(nomeRaw); const fn = interpretador.resolverValor(funcaoRaw); return coletarOuExecutar('teste', nome, fn, true, false); }); testeFn['apenas'] = new funcao_padrao_1.FuncaoPadrao(2, async function (_visitante, nomeRaw, funcaoRaw) { const nome = interpretador.resolverValor(nomeRaw); const fn = interpretador.resolverValor(funcaoRaw); return coletarOuExecutar('teste', nome, fn, false, true); }); modulo.componentes['teste'] = testeFn; function registrarHook(campo) { return new funcao_padrao_1.FuncaoPadrao(1, function (_visitante, funcaoRaw) { const fn = interpretador.resolverValor(funcaoRaw); if (registro.pilhaEscopos.length > 0) { registro.pilhaEscopos[registro.pilhaEscopos.length - 1][campo].push(fn); } return Promise.resolve(null); }); } modulo.componentes['antesDeCada'] = registrarHook('antesDeCada'); modulo.componentes['antesDeTodos'] = registrarHook('antesDeTodos'); modulo.componentes['depoisDeCada'] = registrarHook('depoisDeCada'); modulo.componentes['depoisDeTodos'] = registrarHook('depoisDeTodos'); modulo.componentes['lancarErro'] = new funcao_padrao_1.FuncaoPadrao(1, function (_visitante, mensagemRaw) { const mensagem = interpretador.resolverValor(mensagemRaw); return Promise.reject(new erro_de_assertiva_1.ErroDeAssertiva(simboloAtual(interpretador), String(mensagem))); }); return modulo; } //# sourceMappingURL=modulo-testes.js.map