@vibe2founder/tests2dialects 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/bun.lock +22 -0
  3. package/bunfig.toml +2 -0
  4. package/critica.md +77 -0
  5. package/docs/4-ideias.md +66 -0
  6. package/docs/api-api.md +93 -0
  7. package/docs/api-imperativo.md +125 -0
  8. package/docs/api-matematico.md +145 -0
  9. package/docs/api-narrativo.md +181 -0
  10. package/docs/guia-rapido.md +189 -0
  11. package/docs/whitepaper.md +21 -0
  12. package/examples/imperative.spec.ts +58 -0
  13. package/examples/math.spec.ts +52 -0
  14. package/examples/narrative.spec.ts +61 -0
  15. package/examples/polyglot-shopping-cart.spec.ts +212 -0
  16. package/examples/sanity.spec.ts +54 -0
  17. package/examples/showcase-api.spec.ts +70 -0
  18. package/examples/test-api.ts +36 -0
  19. package/infograficos/detalhado.png +0 -0
  20. package/infograficos/mobile.png +0 -0
  21. package/infograficos/normal.png +0 -0
  22. package/landing-page/README.md +38 -0
  23. package/landing-page/bun.lock +609 -0
  24. package/landing-page/eslint.config.js +23 -0
  25. package/landing-page/index.html +17 -0
  26. package/landing-page/package-lock.json +2962 -0
  27. package/landing-page/package.json +34 -0
  28. package/landing-page/postcss.config.js +6 -0
  29. package/landing-page/public/vite.svg +1 -0
  30. package/landing-page/src/App.tsx +358 -0
  31. package/landing-page/src/assets/react.svg +1 -0
  32. package/landing-page/src/index.css +34 -0
  33. package/landing-page/src/main.tsx +10 -0
  34. package/landing-page/tailwind.config.js +59 -0
  35. package/landing-page/tsconfig.app.json +28 -0
  36. package/landing-page/tsconfig.json +7 -0
  37. package/landing-page/tsconfig.node.json +26 -0
  38. package/landing-page/vite.config.ts +7 -0
  39. package/logo.png +0 -0
  40. package/output.log +60 -0
  41. package/package.json +36 -0
  42. package/packages/api-test-dialect/README.md +30 -0
  43. package/packages/api-test-dialect/index.ts +132 -0
  44. package/packages/api-test-dialect/openapi.json +64 -0
  45. package/packages/reqify/README.md +33 -0
  46. package/packages/reqify/index.ts +48 -0
  47. package/podcast/O_Matem/303/241tico,_o_Narrador_e_o_Engenheiro.json +0 -0
  48. package/podcast/O_Matem/303/241tico,_o_Narrador_e_o_Engenheiro.md +0 -0
  49. package/podcast/critica-Dialetos_de_teste__inova/303/247/303/243o_ou_fragmenta/303/247/303/243o_.json +0 -0
  50. package/podcast/critica-Dialetos_de_teste__inova/303/247/303/243o_ou_fragmenta/303/247/303/243o_.md +0 -0
  51. package/podcast/critica-Unificar_filosofia_e_pr/303/241tica_na_documenta/303/247/303/243o_(7_words__covers_t.md +1 -0
  52. package/podcast/critica-Unificar_filosofia_e_pr/303/241tica_na_documenta/303/247/303/243o__7_words__covers_t.ogg +0 -0
  53. package/podcast/critica2-Sil/303/252ncio_estrat/303/251gico_e_sobrecarga_em_READMEs.ogg +0 -0
  54. package/podcast/critica2.json +3191 -0
  55. package/podcast/critica2.md +1 -0
  56. package/podcast/debate-Dialetos_de_teste__inova/303/247/303/243o_ou_fragmenta/303/247/303/243o_.json +0 -0
  57. package/podcast/debate-Dialetos_de_teste__inova/303/247/303/243o_ou_fragmenta/303/247/303/243o_.md +0 -0
  58. package/readme.md +58 -0
  59. package/reports/01-01-2026_00-45.md +40 -0
  60. package/reports/01-01-2026_02-30.md +37 -0
  61. package/reports/03-02-2026_10-55.md +8 -0
  62. package/reports/03-02-2026_11-45.md +13 -0
  63. package/reports/03-02-2026_11-50.md +10 -0
  64. package/reports/26-01-2026_16-25.md +31 -0
  65. package/reports/26-01-2026_19-20.md +27 -0
  66. package/reports/31-12-2025_22-35.md +25 -0
  67. package/reports/31-12-2025_22-45.md +15 -0
  68. package/slides/Dialetos_de_Teste_Um_Executor_M/303/272ltiplos_Vocabul/303/241rios.pdf +0 -0
  69. package/src/cli.ts +445 -0
  70. package/src/index.ts +539 -0
  71. package/tabela.html +350 -0
  72. package/tsconfig.json +22 -0
  73. package/types/api-types.ts +11 -0
  74. package/www/index.html +1344 -0
@@ -0,0 +1,181 @@
1
+ # 📖 Dialeto Narrativo - API Completa
2
+
3
+ > **Filosofia:** BDD (Behavior Driven Development) e Storytelling.
4
+ >
5
+ > **Vibe:** Fluida, Humana, Descritiva.
6
+ >
7
+ > **Ideal para:** Designers, Product Managers, times ágeis, testes de fluxos de usuário (User Journeys).
8
+
9
+ ## Estrutura
10
+
11
+ | Função | Descrição | Equivalente Jest |
12
+ | -------------------- | ----------------------------------- | ---------------- |
13
+ | `intend(name, fn)` | Define a intenção do bloco | `describe` |
14
+ | `story(name, fn)` | Alias para agrupamento de histórias | `describe` |
15
+ | `detail(name, fn)` | Detalha um comportamento específico | `test` / `it` |
16
+ | `scenario(name, fn)` | Um cenário de uso | `test` / `it` |
17
+
18
+ ## Asserções
19
+
20
+ | Função | Descrição | Equivalente Jest |
21
+ | ------------------------- | ------------------------------ | ---------------------------------------- |
22
+ | `to(val).be(expected)` | "Para o valor ser..." | `expect(val).toBe(expected)` |
23
+ | `to(val).have(prop)` | Verifica posse de propriedade | `expect(val).toHaveProperty(prop)` |
24
+ | `to(val).wasCalled()` | Verifica se o ator foi chamado | `expect(val).toHaveBeenCalled()` |
25
+ | `to(val).received(args)` | Verifica o que foi recebido | `expect(val).toHaveBeenCalledWith(args)` |
26
+ | `to(val).called(n).times` | Contagem de chamadas | `expect(val).toHaveBeenCalledTimes(n)` |
27
+
28
+ ## Mocks (Dublês/Atores)
29
+
30
+ | Função | Descrição | Equivalente Jest |
31
+ | ---------------------------- | -------------------------------- | ------------------------- |
32
+ | `dummy()` | Um dublê (ator) no lugar do real | `jest.fn()` |
33
+ | `standIn()` | Alias para dummy | `jest.fn()` |
34
+ | `watch(obj, method)` | Observa um ator existente | `jest.spyOn(obj, method)` |
35
+ | `shadow(obj, method)` | Segue (shadows) um método | `jest.spyOn(obj, method)` |
36
+ | `actor.respondsWith(val)` | Define a resposta do ator | `mockReturnValue(val)` |
37
+ | `actor.eventuallyGives(val)` | Resposta futura (promessa) | `mockResolvedValue(val)` |
38
+ | `actor.actsLike(fn)` | Define como o ator deve agir | `mockImplementation(fn)` |
39
+
40
+ ## Lifecycle
41
+
42
+ | Função | Descrição | Equivalente Jest |
43
+ | ---------------- | ----------------------------- | ---------------- |
44
+ | `background(fn)` | Contexto de fundo da história | `beforeAll(fn)` |
45
+ | `before(fn)` | Antes de cada cena | `beforeEach(fn)` |
46
+ | `cleanup(fn)` | Limpeza após a história | `afterAll(fn)` |
47
+
48
+ ## Exemplo Completo
49
+
50
+ ```javascript
51
+ import {
52
+ intend,
53
+ story,
54
+ scenario,
55
+ detail,
56
+ to,
57
+ standIn,
58
+ dummy,
59
+ watch,
60
+ background,
61
+ before,
62
+ cleanup,
63
+ } from "@vibe2founder/tests2dialects";
64
+
65
+ intend("Fluxo de Autenticação do Usuário", () => {
66
+ const authService = standIn();
67
+ const database = standIn();
68
+ const emailSender = dummy();
69
+
70
+ background(() => {
71
+ // Configura o cenário de fundo para toda a história
72
+ authService.respondsWith({ token: "abc-123", expiresIn: 3600 });
73
+ database.respondsWith(true);
74
+ emailSender.respondsWith({ sent: true });
75
+ });
76
+
77
+ before(() => {
78
+ // Reset de estado antes de cada cena
79
+ });
80
+
81
+ scenario("Login com credenciais válidas deve retornar token", () => {
82
+ const response = authService.login("usuario", "senha_secreta");
83
+
84
+ to(response).have("token");
85
+ to(response.token).be("abc-123");
86
+ to(response).have("expiresIn");
87
+ });
88
+
89
+ scenario("Login deve registrar tentativa no banco de dados", () => {
90
+ authService.login("usuario", "senha_secreta");
91
+ database.logAttempt("usuario", "success");
92
+
93
+ to(database).wasCalled();
94
+ to(database).received("logAttempt", "usuario", "success");
95
+ });
96
+
97
+ scenario("Login bem-sucedido envia email de boas-vindas", () => {
98
+ authService.login("novo_usuario", "senha123");
99
+ emailSender.send("novo_usuario@email.com", "Bem-vindo!");
100
+
101
+ to(emailSender).wasCalled();
102
+ });
103
+
104
+ cleanup(() => {
105
+ console.log("Histórias de autenticação concluídas.");
106
+ });
107
+ });
108
+
109
+ story("Jornada de Compra do Usuário", () => {
110
+ const cart = standIn();
111
+ const user = standIn();
112
+ const paymentGateway = standIn();
113
+
114
+ background(() => {
115
+ cart.respondsWith({ items: [], total: 0 });
116
+ user.respondsWith({ name: "João", loggedIn: true });
117
+ paymentGateway.respondsWith({ status: "approved" });
118
+ });
119
+
120
+ scenario("Usuário adiciona primeiro produto ao carrinho", () => {
121
+ cart.add({ name: "Camiseta", price: 49.9, quantity: 1 });
122
+ cart.respondsWith({
123
+ items: [{ name: "Camiseta", price: 49.9, quantity: 1 }],
124
+ total: 49.9,
125
+ });
126
+
127
+ to(cart).wasCalled();
128
+ to(cart.items).have("length");
129
+ });
130
+
131
+ scenario("Usuário aplica cupom de desconto", () => {
132
+ const coupon = standIn();
133
+ coupon.respondsWith({ valid: true, discount: 15 });
134
+
135
+ cart.applyCoupon("DESCONTO15");
136
+ cart.respondsWith({ total: 42.42 }); // 49.9 - 15%
137
+
138
+ to(coupon).wasCalled();
139
+ to(cart.total).be(42.42);
140
+ });
141
+
142
+ detail("Carrinho vazio mostra mensagem amigável", () => {
143
+ cart.respondsWith({
144
+ items: [],
145
+ total: 0,
146
+ message: "Seu carrinho está vazio",
147
+ });
148
+
149
+ to(cart.message).be("Seu carrinho está vazio");
150
+ });
151
+
152
+ scenario("Usuário não logado tenta finalizar compra", () => {
153
+ user.respondsWith({ loggedIn: false });
154
+ const checkout = standIn();
155
+ checkout.respondsWith({ error: "LOGIN_REQUIRED", status: 401 });
156
+
157
+ to(checkout.status).be(401);
158
+ to(checkout.error).be("LOGIN_REQUIRED");
159
+ });
160
+
161
+ scenario("Pagamento aprovado finaliza a compra", () => {
162
+ cart.checkout();
163
+
164
+ to(paymentGateway.status).be("approved");
165
+ to(cart).wasCalled();
166
+ });
167
+ });
168
+ ```
169
+
170
+ ## Quando Usar
171
+
172
+ - ✅ Fluxos de usuário (User Journeys)
173
+ - ✅ Testes E2E legíveis
174
+ - ✅ Documentação viva para PMs
175
+ - ✅ Regras de negócio de alto nível
176
+ - ✅ Testes de aceitação
177
+
178
+ ## Quando NÃO Usar
179
+
180
+ - ❌ Algoritmos matemáticos puros → Use o [Dialeto Matemático](./api-matematico.md)
181
+ - ❌ Integrações técnicas com contratos rígidos → Use o [Dialeto Imperativo](./api-imperativo.md)
@@ -0,0 +1,189 @@
1
+ 🚀 Seu Guia de Início Rápido para o tests2dialects
2
+
3
+ Introdução: Cansado de "Descrever" Quando Você Quer "Provar"?
4
+
5
+ O tests2dialects nasce de uma frustração comum no mundo dos testes: usar o mesmo vocabulário para problemas fundamentalmente diferentes. Afinal, a linguagem importa. Ela molda o pensamento. A ferramenta padrão (describe, it, should) é excelente para descrever comportamentos, mas e quando você está provando um teorema matemático ou verificando a conformidade com um contrato de API?
6
+
7
+ Este framework oferece diferentes "dialetos" porque entende que testar um algoritmo de criptografia é uma tarefa fundamentalmente diferente de testar um fluxo de login de usuário. Ele oferece o vocabulário certo para cada trabalho.
8
+
9
+ One Runner to Rule Them All.
10
+
11
+ Esta abordagem é construída sobre uma filosofia fundamental que garante que a adoção da ferramenta seja suave e incremental, sem descartar seu trabalho existente.
12
+
13
+ A "Filosofia Aditiva": Seu Conhecimento Está Seguro
14
+
15
+ Uma das maiores barreiras para adotar uma nova ferramenta é o medo de ter que "jogar tudo fora e começar de novo". O tests2dialects foi projetado com o princípio oposto em mente.
16
+
17
+ O Que É a Filosofia Aditiva?
18
+
19
+ A Filosofia Aditiva significa que o tests2dialects funciona como um superset (superconjunto) do Jest. Ele não nega o passado; ele o expande. Se você tem milhares de testes escritos com a sintaxe padrão do Jest (describe, it), não precisa reescrever uma única linha. O framework entende nativamente o seu código legado.
20
+
21
+ Essa filosofia se manifesta em três benefícios principais:
22
+
23
+ - Seu código legado continua funcionando: Testes antigos que usam describe e it rodam nativamente no executor do tests2dialects. Seu conhecimento e seu código continuam 100% válidos.
24
+ - Você não precisa aprender tudo: A ideia não é que cada desenvolvedor se torne fluente em todos os dialetos. A proposta é a Especialização por Contexto: um cientista de dados pode usar apenas o dialeto Matemático, enquanto um engenheiro de backend foca no Imperativo. O framework é poliglota; você não precisa ser.
25
+ - Um único executor de testes: Unifique seu ciclo de vida de desenvolvimento e implantação. Um único comando npm test executa tanto os testes legados quanto os modernos, otimizando seu pipeline de CI/CD e consolidando todos os resultados em um único relatório autoritativo.
26
+
27
+ Agora que você entende a filosofia, vamos colocar a mão na massa e ver como é fácil começar.
28
+
29
+ Mão na Massa: Seu Primeiro Teste em 5 Minutos
30
+
31
+ Vamos rodar um teste real para ver o framework em ação antes de mergulharmos nos detalhes de cada dialeto.
32
+
33
+ Quick Start: Escrevendo um Teste Imperativo
34
+
35
+ Siga estes três passos simples para escrever e executar seu primeiro teste.
36
+
37
+ 1. Instale o pacote: Abra seu terminal e execute o seguinte comando para adicionar o tests2dialects ao seu projeto.
38
+ 2. Crie o arquivo api.spec.ts: Crie um novo arquivo de teste e cole o código abaixo. Este exemplo usa o dialeto Imperativo para garantir o comportamento de uma API.
39
+ 3. Execute o teste: Volte ao seu terminal e rode o executor do tests2dialects.
40
+
41
+ Pronto! Você acabou de rodar seu primeiro teste com o dialeto Imperativo. Agora, vamos explorar os diferentes dialetos para que você possa escolher o ideal para seus próprios projetos.
42
+
43
+ Escolhendo Seu Dialeto: Qual é o Ideal para Você?
44
+
45
+ Lembre-se: você não precisa aprender os três dialetos. A ideia é escolher aquele que melhor se encaixa no problema que você está resolvendo e ignorar o resto. Este fluxograma pode ajudar na sua decisão:
46
+
47
+ ┌─────────────────────────────────────────┐
48
+ │ O que você está testando? │
49
+ └───────────────────┬─────────────────────┘
50
+
51
+ ┌───────────────────────────────┼───────────────────────────────┐
52
+ │ │ │
53
+ ▼ ▼ ▼
54
+ ┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
55
+ │ Algoritmos puros, │ │ Fluxos de usuário, │ │ APIs, contratos, │
56
+ │ cálculos, regras │ │ regras de negócio │ │ integrações, │
57
+ │ matemáticas? │ │ legíveis por PMs? │ │ conformidade? │
58
+ └──────────┬───────────┘ └──────────┬───────────┘ └──────────┬───────────┘
59
+ │ │ │
60
+ ▼ ▼ ▼
61
+ ┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
62
+ │ 📐 MATEMÁTICO │ │ 📖 NARRATIVO │ │ 🛡️ IMPERATIVO │
63
+ │ axiom, proof, implies│ │ intend, scenario, to │ │ ensure, check, that │
64
+ └──────────────────────┘ └──────────────────────┘ └──────────────────────┘
65
+
66
+ As seções a seguir são projetadas para ser o seu guia. Para cada dialeto, vamos diagnosticar um ponto de dor específico comum no desenvolvimento de software, apresentar a solução linguística oferecida pelo tests2dialects e fornecer um tutorial prático. Preste muita atenção à seção "A Dor" — se ela ressoar com você, você provavelmente encontrou o seu dialeto.
67
+
68
+ O Dialeto Matemático (📐 MathDialect)
69
+
70
+ A Dor: Quando "should" soa informal demais
71
+
72
+ Imagine que você está testando uma função de criptografia pura ou um cálculo financeiro complexo. A sintaxe padrão de teste te força a escrever algo assim:
73
+
74
+ describe("SHA-256", () => {
75
+ it("should produce a valid hash", () => { ... });
76
+ });
77
+
78
+ Isso soa fraco e inadequado. Você não está "descrevendo um comportamento que deveria acontecer"; você está provando uma verdade matemática universal. A linguagem da ferramenta não reflete o rigor do seu código.
79
+
80
+ A Solução: Escrevendo Provas Axiomáticas
81
+
82
+ Com o dialeto Matemático, você escreve provas axiomáticas, usando um vocabulário que espelha a lógica formal. A linguagem agora reflete o que você está realmente fazendo: provar. Este não é apenas um teste; é uma prova axiomática formal, refletindo a vibe científica e imutável do código que valida.
83
+
84
+ import { axiom, proof, implies } from "@vibe2founder/tests2dialects";
85
+
86
+ axiom("Teoria de Hash SHA-256", () => {
87
+ proof("Hash de string vazia converge para constante conhecida", () => {
88
+ const sha256 = (str: string) => "e3b0c44..."; // Função de exemplo
89
+ implies(sha256("")).is("e3b0c44...");
90
+ });
91
+ });
92
+
93
+ Ideal para: Cientistas de dados, engenheiros de algoritmos, bibliotecas de utilitários, cálculos financeiros.
94
+
95
+ Seu Primeiro Teste Matemático
96
+
97
+ 1. Crie o arquivo calculo.spec.ts: Crie um novo arquivo de teste para abrigar suas provas matemáticas.
98
+ 2. Escreva sua prova: Cole o código abaixo. Ele prova duas verdades sobre uma função de juros compostos.
99
+ 3. Execute e veja a mágica: Rode o executor novamente. Ele encontrará e executará todos os seus arquivos de teste, incluindo o novo.
100
+
101
+ Este dialeto é perfeito para garantir a correção de algoritmos. A seguir, veremos um dialeto focado em comunicação e regras de negócio.
102
+
103
+ O Dialeto Narrativo (📖 NarrativeDialect)
104
+
105
+ A Dor: Quando seu PM não consegue ler seus testes
106
+
107
+ As regras de negócio cruciais do seu sistema estão validadas, mas estão escondidas dentro de testes técnicos que só os desenvolvedores entendem.
108
+
109
+ it("should return 403", () => { ... });
110
+
111
+ Para um Gerente de Produto (PM) ou Designer, isso é indecifrável. Cria-se uma barreira entre o time de produto e a engenharia, onde a confiança substitui a validação explícita.
112
+
113
+ A Solução: Testes como Documentação Viva
114
+
115
+ O dialeto Narrativo transforma o teste em uma história legível por humanos. Ele serve como um contrato vivo entre produto e engenharia. Agora, seu PM pode ler o teste e entender exatamente qual regra de negócio está sendo validada. Este código lê como uma história, cumprindo a vibe fluida, humana e descritiva do Behavior-Driven Development.
116
+
117
+ import { scenario, to } from "@vibe2founder/tests2dialects";
118
+
119
+ scenario("Usuário sem permissão tenta acessar o painel de Admin", () => {
120
+ const response = { status: 403 }; // Resposta de exemplo
121
+ to(response.status).be(403);
122
+ });
123
+
124
+ Ideal para: Designers, Product Managers, times ágeis, testes de fluxos de usuário (User Journeys).
125
+
126
+ Seu Primeiro Teste Narrativo
127
+
128
+ 1. Crie o arquivo auth.spec.ts: Crie um novo arquivo para descrever os fluxos de usuário do seu sistema.
129
+ 2. Escreva seu cenário: Cole o código abaixo, que descreve um cenário de login bem-sucedido.
130
+ 3. Execute e valide a história: Rode o executor de testes para garantir que seu cenário está funcionando como esperado.
131
+
132
+ Enquanto o Narrativo foca em clareza e comunicação, o próximo dialeto foca em rigor e conformidade técnica.
133
+
134
+ O Dialeto Imperativo (🛡️ ImperativeDialect)
135
+
136
+ A Dor: Quando "should" soa frágil demais
137
+
138
+ Você está testando a integração com um gateway de pagamento ou validando a conformidade com uma especificação de API com implicações legais. Num contexto de conformidade, should não é apenas uma sugestão; é um passivo. Representa uma falha semântica em impor um contrato não negociável.
139
+
140
+ describe("Payment Gateway", () => {
141
+ it("should return 200", () => { ... });
142
+ });
143
+
144
+ Você precisa de uma linguagem que imponha respeito e autoridade, garantindo que um contrato técnico está sendo cumprido.
145
+
146
+ A Solução: Garantindo Contratos com Autoridade
147
+
148
+ O dialeto Imperativo usa palavras de comando: Ensure, Verify, That. Essa linguagem muda completamente o peso do teste, tratando-o como um conjunto de verificações de conformidade. O vocabulário impositivo reforça a vibe técnica e rigorosa do Design by Contract, não deixando espaço para ambiguidades.
149
+
150
+ import { ensure, verify, that } from "@vibe2founder/tests2dialects";
151
+
152
+ ensure("Conformidade com Contrato PCI-DSS v4", () => {
153
+ verify("Dados sensíveis nunca trafegam em texto plano", () => {
154
+ const payload = "encrypted:a1b2c3d4"; // Payload de exemplo
155
+ that(payload).matches(/^encrypted:/);
156
+ });
157
+ });
158
+
159
+ Ideal para: Engenheiros de backend, DevOps, validação de APIs, drivers de banco de dados, conformidade (compliance).
160
+
161
+ Seu Primeiro Teste Imperativo
162
+
163
+ 1. Revisite o arquivo api.spec.ts: Você já escreveu seu primeiro teste imperativo na seção "Quick Start"! Vamos apenas revisá-lo para entender melhor suas partes.
164
+ 2. Entenda as partes: Aqui está o código novamente, com explicações sobre o papel de cada palavra-chave.
165
+ 3. Execute e garanta a conformidade: Rode o executor mais uma vez para ver todos os seus testes de todos os dialetos passando juntos.
166
+
167
+ Conclusão: Adotando o tests2dialects Gradualmente
168
+
169
+ A mensagem mais importante é que você não precisa parar tudo e reescrever seus testes existentes. Graças à Filosofia Aditiva, o tests2dialects coexiste perfeitamente com o Jest.
170
+
171
+ O código abaixo, com um teste legado e um teste novo no mesmo arquivo, é 100% válido e será executado pelo mesmo comando. Observe que este arquivo é 100% válido e executável pelo tests2dialects.
172
+
173
+ // ✅ Legado: Ninguém precisa mexer nisso
174
+ describe("Módulo de Login (Legacy)", () => {
175
+ it("deve validar senha", () => {
176
+ expect(validar("123")).toBe(true);
177
+ });
178
+ });
179
+
180
+ // ✅ Novo: Feature nova com dialeto novo
181
+ import { axiom, implies } from 'tests2dialects-tester';
182
+
183
+ axiom("Nova Criptografia SHA-256", () => {
184
+ implies(hash("123")).matches(/^[a-f0-9]{64}$/);
185
+ });
186
+
187
+ O tests2dialects não veio para substituir o que já funciona. Ele veio para dar o vocabulário certo para cada tarefa, tornando seus testes mais expressivos, precisos e valiosos. É uma ferramenta de adição, não de substituição, projetada para evoluir com você e sua equipe.
188
+
189
+ Próximos Passos: Para uma referência completa de todos os comandos e suas equivalências com o Jest, consulte a Tabela Rosetta (Comparativo Geral) na documentação principal do projeto. Ela é uma ferramenta fantástica para traduzir mentalmente os conceitos que você já conhece.
@@ -0,0 +1,21 @@
1
+ # Whitepaper
2
+
3
+ ## Introduction
4
+ This whitepaper outlines the key features and benefits of the vibe2founder One Proof for All.
5
+
6
+ ## Background
7
+ In the evolving landscape of blockchain technology, the need for a scalable and secure proof mechanism has never been more critical. This document discusses the architecture, protocol design, and operational specifics of the vibe2founder system.
8
+
9
+ ## System Overview
10
+ ### Core Components
11
+ - **Distributed Ledger:** A decentralized database ensuring transparency and security.
12
+ - **Consensus Mechanism:** Fast and energy-efficient protocol that validates transactions.
13
+ - **Application Layer:** Interfaces that facilitate interaction with end-users and applications.
14
+
15
+ ## Benefits
16
+ - **Scalability:** Designed to handle high volumes of transactions without compromising performance.
17
+ - **Security:** Robust security mechanisms that safeguard against common vulnerabilities.
18
+ - **User-friendly:** Simple interfaces for better user engagement.
19
+
20
+ ## Conclusion
21
+ The vibe2founder One Proof for All offers innovative solutions to the current challenges in the blockchain ecosystem and sets a benchmark for future developments. For more information, refer to our detailed documentation and user guides.
@@ -0,0 +1,58 @@
1
+ import { ImperativeDialect } from "../src/index.js";
2
+
3
+ const { ensure, check, that, stub, initAll } = ImperativeDialect;
4
+
5
+ ensure("Sistema de Segurança e Compliance", () => {
6
+ // Stubs de Infraestrutura
7
+ const firewall = stub();
8
+ const logger = stub();
9
+
10
+ initAll(() => {
11
+ // Configuração Hardened
12
+ firewall.forceReturn({ allowed: true, threatLevel: 0 });
13
+ });
14
+
15
+ check("Deve bloquear conexões de IPs na blacklist", () => {
16
+ const maliciousIp = "192.168.1.666";
17
+
18
+ // Reconfigurando stub para este caso
19
+ firewall.executes((ip: string) => {
20
+ return ip === maliciousIp ? { allowed: false } : { allowed: true };
21
+ });
22
+
23
+ const access = firewall(maliciousIp);
24
+
25
+ that(access.allowed).is(false);
26
+ that(firewall).triggered();
27
+ that(firewall).calledWith(maliciousIp);
28
+ });
29
+
30
+ check("Deve registrar auditoria para cada acesso", () => {
31
+ logger("Acesso admin iniciado");
32
+
33
+ that(logger).triggeredCount(1);
34
+ that(logger).calledWith("Acesso admin iniciado");
35
+ });
36
+ });
37
+
38
+ ensure("Validação Estrutural da API V2", () => {
39
+ const apiResponse = {
40
+ status: 200,
41
+ data: {
42
+ id: "uuid-1234",
43
+ role: "admin",
44
+ meta: { version: 2 },
45
+ },
46
+ };
47
+
48
+ check("Payload deve conter metadados corretos", () => {
49
+ that(apiResponse.status).is(200);
50
+ that(apiResponse.data.role).is("admin");
51
+ that(apiResponse.data.meta.version).is(2);
52
+ });
53
+
54
+ check("Campos obrigatórios devem existir", () => {
55
+ that(apiResponse.data).isOk();
56
+ that(apiResponse.data.id).matches(/^uuid-/);
57
+ });
58
+ });
@@ -0,0 +1,52 @@
1
+ import { MathDialect } from "../src/index.js";
2
+
3
+ const { axiom, proof, implies, arbitrary } = MathDialect;
4
+
5
+ // --- Domain Logic: Financial Calculation ---
6
+ const calculateInterests = (principal: number, rate: number, time: number) => {
7
+ return principal * Math.pow(1 + rate, time);
8
+ };
9
+
10
+ axiom("Teoria Financeira: Juros Compostos", () => {
11
+ proof("O capital deve crescer exponencialmente", () => {
12
+ const principal = 1000;
13
+ const rate = 0.05; // 5%
14
+ const time = 2; // anos
15
+
16
+ const result = calculateInterests(principal, rate, time);
17
+ // 1000 * (1.05)^2 = 1000 * 1.1025 = 1102.5
18
+
19
+ implies(result).is(1102.5);
20
+ });
21
+
22
+ proof("Taxa zero implica em imutabilidade do capital", () => {
23
+ const principal = 500;
24
+ const result = calculateInterests(principal, 0, 10);
25
+
26
+ implies(result).is(principal);
27
+ });
28
+ });
29
+
30
+ axiom("Álgebra Booleana: Leis de De Morgan", () => {
31
+ const A = true;
32
+ const B = false;
33
+
34
+ proof("A negação da disjunção é a conjunção das negações", () => {
35
+ const lhs = !(A || B);
36
+ const rhs = !A && !B;
37
+
38
+ implies(lhs).is(rhs);
39
+ });
40
+ });
41
+
42
+ axiom("Análise de Funções Recursivas", () => {
43
+ const factorial = arbitrary();
44
+
45
+ // Configurando comportamento axiomático
46
+ factorial.derive((n: number): number => (n <= 1 ? 1 : n * factorial(n - 1)));
47
+
48
+ proof("Fatorial de 5 converge para 120", () => {
49
+ const res = factorial(5);
50
+ implies(res).is(120);
51
+ });
52
+ });
@@ -0,0 +1,61 @@
1
+ import { NarrativeDialect } from "../src/index.js";
2
+
3
+ const { intend, detail, to, standIn, background, before } = NarrativeDialect;
4
+
5
+ intend("Jornada de Compra do Usuário", () => {
6
+ // Atores (Mocks)
7
+ const cart = standIn();
8
+ const paymentGateway = standIn();
9
+ const notificationService = standIn();
10
+
11
+ before(() => {
12
+ // Limpa estado para cada cena
13
+ cart.clear();
14
+ paymentGateway.clear();
15
+ notificationService.clear();
16
+ });
17
+
18
+ background(() => {
19
+ // Contexto: Carrinho tem itens e gateway está online
20
+ cart.getTotal.respondsWith(150.0); // Especifica o método
21
+ paymentGateway.process.respondsWith(true); // Especifica o método
22
+ });
23
+
24
+ detail("O cliente finaliza a compra com sucesso", () => {
25
+ // Ação: Usuário clica em 'Checkout'
26
+ const total = cart.getTotal();
27
+ const success = paymentGateway.process(total);
28
+
29
+ if (success) {
30
+ notificationService.sendEmail("Compra aprovada!");
31
+ }
32
+
33
+ // Expectativas narrativas
34
+ to(cart).wasCalled();
35
+ to(paymentGateway).uploaded(total); // Alias mental para 'received'
36
+ to(notificationService).received("Compra aprovada!");
37
+ });
38
+
39
+ detail("O sistema deve lidar com falha no pagamento", () => {
40
+ // Mudança de enredo: Gateway recusa
41
+ paymentGateway.process.respondsWith(false);
42
+
43
+ const success = paymentGateway.process(100);
44
+
45
+ to(success).be(false);
46
+ to(notificationService).not.wasCalled();
47
+ });
48
+ });
49
+
50
+ intend("Onboarding de Novos Membros", () => {
51
+ const database = standIn();
52
+
53
+ detail("Deve criar perfil padrão ao registrar", () => {
54
+ const newUser = { name: "Alice", email: "alice@wonder.land" };
55
+
56
+ // Simula o registro
57
+ database.save(newUser);
58
+
59
+ to(database).received(newUser);
60
+ });
61
+ });