GithubHelp home page GithubHelp logo

Biblioteca de testes about egua HOT 10 OPEN

Andre0n avatar Andre0n commented on June 3, 2024
Biblioteca de testes

from egua.

Comments (10)

Andre0n avatar Andre0n commented on June 3, 2024 1

Valeu! Ainda tem bastante coisa para fazer, mas é basicamente isso. Vou tentar seguir lógica de ser um instrumento de aprendizagem.

from egua.

lucaspompeun avatar lucaspompeun commented on June 3, 2024

Olá @Andre0n.
A sua ideia seria criar uma biblioteca de testes em égua para reescrever os testes do arquivo /tests/tests.egua?

from egua.

Andre0n avatar Andre0n commented on June 3, 2024

Sim! Hoje o arquivo tests.egua contém muitas linhas, muitas delas são chamadas da função escreva(), fora que saída não é exatamente clara.
A minha proposta é construir uma biblioteca para gerenciar esses testes, como no exemplo acima, permitindo uma melhora na escrita dos testes e clareza nos resultados. Já estou trabalhando nisso, o código acima é baseado na implementação que fiz, mas acho que é bom discutir e avaliar outras soluções para esse problema.

from egua.

lucaspompeun avatar lucaspompeun commented on June 3, 2024

Então, essa parte dos testes tem como propósito testar a linguagem após alguma alteração, pra ter certeza que nada além do que foi alterado teve impacto. Em resumo ele substitui, de uma forma burra, os testes unitários. A ideia é realmente ele apenas rodar, de maneira crua, tudo que a linguagem faz, pra garantir que o interpretador não quebrou em algum lugar.
A construção de uma biblioteca de testes em égua não seria o suficiente para testar o interpretador da linguagem em si, pelo menos não consigo enxergar isso, no entanto seria interessante para o ensino de testes unitários. Adorei a ideia, mas o propósito precisa ser alinhado.
Pra que a linguagem consiga atender aos requisitos que você mostrou acima, como testes.novo_teste("Verifica se 1 != 2").esperado_que(1 == 2).seja_falso();, creio (posso estar errado) que seja necessário a inferência de tipos, coisa que a linguagem não suporta hoje em dia. Ademais, como está a sua implementação? Você está fazendo algo no sentido da inferência de tipos? Ou adotou outra estratégia?

from egua.

Andre0n avatar Andre0n commented on June 3, 2024

Entendi, implementação inicial que fiz foi em javascript mesmo e está disponível aqui: https://github.com/Andre0n/egua/tree/bib_testes/src/lib/testes

A implementação é um pouco extensa, mas acho que dá para pegar a ideia com os códigos abaixo:

Basicamante ele composta de alguns módulos:

  • index.js
  • conjunto.js
  • correspondencias.js
  • saida_testes.js

No módulo index (o que fica disponível na linguagem):

const StandardFn = require("../../structures/standardFn");
const { novo_conjunto } = require("./conjunto");
const { correspondencias } = require("./correspondencias");
const { novo_erro } = require("./erro");

let conjunto_atual = null;

const esperado_que = (obtido) => {
    return correspondencias(obtido, conjunto_atual);
};

module.exports.novo_conjunto = function (descricao = "") {
    if (typeof descricao !== "string") {
        novo_erro(this.token, "A descrição do conjunto deve ser um texto");
    }
    if (descricao === "") {
        novo_erro(this.token, "A descrição do conjunto não pode ser vazia");
    }
    conjunto_atual = novo_conjunto(descricao, this.token);
};

module.exports.novo_teste = function (descricao = "") {
    if (typeof descricao !== "string") {
        novo_erro(this.token, "A descrição  do teste deve ser um texto");
    }
    if (descricao === "") {
        novo_erro(this.token, "A descrição  do teste não pode ser vazia");
    }
    conjunto_atual.teste_atual = descricao;
    conjunto_atual.token = this.token;
    return {
        esperado_que: new StandardFn(0, esperado_que),
    };
};

module.exports.resultados = function () {
    if (conjunto_atual == null) {
        novo_erro(this.token, "O conjunto de testes não foi descrito");
    }
    const resumo = conjunto_atual.resumo();
    conjunto_atual = null;
    return resumo;
};

No módulo do conjunto temos a função novo conjunto que retorna um objeto:

const novo_conjunto = (descricao) => {
    return {
        descricao: descricao,
        total_passou: 0,
        total_falhou: 0,
        teste_atual: "",
        resultados: [],
        token_atual: null,
        // Lista de funções auxiliares
        ...
};
module.exports.novo_conjunto = novo_conjunto;

No módulo de correspondencias temos a função novo conjunto que retorna um objeto:

const correspondencias = (obtido, conjuto_testes) => {
    conjunto_atual = conjuto_testes;
    return {
        seja: new StandardFn(1, (esperado) => {
            if (Object.is(obtido, esperado)) {
                conjuto_testes.teste_passou();
                return;
            }
            conjuto_testes.teste_falhou("seja", obtido, esperado);
        }),
        // Outras funções omitidas...
        // Código baseado na biblioteca Jest
        seja_proximo: new StandardFn(1, (esperado, precisao = 0.1) => {
            if (typeof esperado !== "number") {
                conjuto_testes.erro("`esperado` precisa ser do tipo número");
            }
            if (typeof obtido !== "number") {
                conjuto_testes.erro("`obtido` precisa ser do tipo número");
            }

            let passou;
            if (obtido === Infinity && esperado === Infinity) {
                passou = true;
            } else if (obtido === -Infinity && esperado === -Infinity) {
                passou = true;
            } else {
                let dif_esperado = Math.pow(10, -precisao) / 2;
                let dif_obtido = Math.abs(esperado - obtido);
                passou = dif_obtido < dif_esperado;
            }

            if (passou) {
                conjuto_testes.teste_passou();
                return;
            }
            conjuto_testes.teste_falhou("seja_proximo", obtido, esperado);
        }),
        // Outras funções omitidas...
    };
};

module.exports.correspondencias = correspondencias;

E o módulo saida_testes basicamente mostra o resultado dos testes.

const reporta_seja = (esperado, obtido) => {
    let menssagem =
        "\tesperado_que(obtido).seja(esperado) //Object.is igualdade";
    menssagem += `\n\tEsperado: ${esperado}\n\tObtido: ${obtido}`;
    return menssagem;
};
// Outras implementações do tipo reporta_algo
const novo_resultado = (
    passou,
    nome_teste,
    nome_conjunto,
    onde,
    obtido,
    esperado
) => {
    let resultado = `  ${passou ? "✔" : "✖"}  ${nome_teste}`;

    if (passou) {
        return resultado;
    }

    resultado += `\n\t ● ${nome_conjunto} > ${nome_teste}  \n`;

    switch (onde) {
        case "seja":
            resultado += reporta_seja(esperado, obtido);
            break;
        // Outros cases...
    }
    return resultado;
};
module.exports.novo_resultado = novo_resultado;

from egua.

lucaspompeun avatar lucaspompeun commented on June 3, 2024

Hm... Interessante. Retornar a chamada de outra função tem sido suficiente pra permitir o uso de testes.novo_teste("Verifica se 1 != 2").esperado_que(1 == 2).seja_falso();?

from egua.

Andre0n avatar Andre0n commented on June 3, 2024

Bom, não sei se foi isso que quis dizer:

var testes = importar("testes");

var retorna_1 = função(){
    retorna 1;
};

var testes_chamada = função(){

  testes.novo_conjunto("Testes função");

  testes.novo_teste("Verifica se a função retorna_1 retorna 1").esperado_que(retorna_1() == 1).seja_verdadeiro();
  escreva(testes.resultados());
};

testes_chamada();

A saída foi:

Testes função -- PASSOU
  ✔  Verifica se a função retorna_1 retorna 1
Testes: 1 passou, 0 falhou, 1 total

from egua.

lucaspompeun avatar lucaspompeun commented on June 3, 2024

Era isso mesmo, está ficando sensacional.

from egua.

lucaspompeun avatar lucaspompeun commented on June 3, 2024

Pretendo, em breve, escrever testes unitários pro interpretador pra poder excluir o arquivo teste.egua.

from egua.

Andre0n avatar Andre0n commented on June 3, 2024

É uma boa ideia! Eu estava cogitando a ideia de abrir uma issue em relação a isso, mas achei que os testes fossem ficar escritos na linguagem mesmo. Bom era isso, vou terminar de implementar e documentar o código e subir uma PR em breve. Valeu!

from egua.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.