@semacode/cli 0.8.8 → 1.0.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 (44) hide show
  1. package/README.md +11 -3
  2. package/dist/drift.d.ts +30 -1
  3. package/dist/drift.js +373 -17
  4. package/dist/drift.js.map +1 -1
  5. package/dist/index.js +828 -53
  6. package/dist/index.js.map +1 -1
  7. package/docs/AGENT_STARTER.md +10 -4
  8. package/docs/como-ensinar-a-sema-para-ia.md +17 -11
  9. package/docs/fluxo-pratico-ia-sema.md +42 -38
  10. package/docs/instalacao-e-primeiro-uso.md +189 -0
  11. package/docs/integracao-com-ia.md +228 -0
  12. package/docs/pagamento-ponta-a-ponta.md +155 -0
  13. package/docs/prompt-base-ia-sema.md +10 -3
  14. package/docs/sintaxe.md +267 -0
  15. package/exemplos/automacao.sema +107 -0
  16. package/exemplos/cadastro_usuario.sema +54 -0
  17. package/exemplos/calculadora.sema +78 -0
  18. package/exemplos/crud_simples.sema +89 -0
  19. package/exemplos/operacao_estrategia.sema +402 -0
  20. package/exemplos/pagamento.sema +222 -0
  21. package/exemplos/pagamento_dominio.sema +35 -0
  22. package/exemplos/testes_embutidos.sema +45 -0
  23. package/exemplos/tratamento_erro.sema +157 -0
  24. package/node_modules/@sema/gerador-dart/package.json +1 -1
  25. package/node_modules/@sema/gerador-python/package.json +1 -1
  26. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  27. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +14 -1
  28. package/node_modules/@sema/nucleo/dist/formatador/index.js +131 -22
  29. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
  30. package/node_modules/@sema/nucleo/dist/ir/conversor.js +546 -102
  31. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  32. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +83 -5
  33. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +1 -1
  34. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +1 -1
  35. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +10 -0
  36. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
  37. package/node_modules/@sema/nucleo/dist/parser/parser.js +230 -19
  38. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  39. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +6 -1
  40. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +269 -10
  41. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  42. package/node_modules/@sema/nucleo/package.json +1 -1
  43. package/node_modules/@sema/padroes/package.json +1 -1
  44. package/package.json +7 -6
@@ -0,0 +1,402 @@
1
+ module exemplos.operacao_estrategia {
2
+ docs {
3
+ resumo: "Referencia oficial de governanca operacional para strategy,slice,gate,discovery semanal e rollout de nova versao de modelo."
4
+ }
5
+
6
+ type JanelaDiscovery {
7
+ fields {
8
+ semana_referencia: Data
9
+ strategy_id: Id
10
+ versao_modelo_candidata: Texto
11
+ status_discovery: StatusDiscovery
12
+ }
13
+ invariants {
14
+ semana_referencia existe
15
+ strategy_id existe
16
+ versao_modelo_candidata existe
17
+ status_discovery em [ABERTA, EM_AVALIACAO, APROVADA, REJEITADA]
18
+ }
19
+ }
20
+
21
+ type ContextoQuarentena {
22
+ fields {
23
+ motivo: Texto
24
+ origem: Texto
25
+ desde: Data
26
+ }
27
+ invariants {
28
+ motivo existe
29
+ origem existe
30
+ desde existe
31
+ }
32
+ }
33
+
34
+ entity Strategy {
35
+ fields {
36
+ id: Id
37
+ versao_modelo_ativa: Texto
38
+ versao_modelo_candidata: Texto
39
+ status: StatusStrategy
40
+ gate_global: StatusGate
41
+ discovery_atual: JanelaDiscovery
42
+ ultima_quarentena: ContextoQuarentena
43
+ }
44
+ invariants {
45
+ id existe
46
+ versao_modelo_ativa existe
47
+ versao_modelo_candidata existe
48
+ status em [RASCUNHO, ATIVA, QUARENTENA, DESATIVADA]
49
+ gate_global em [ABERTO, FECHADO]
50
+ discovery_atual existe
51
+ ultima_quarentena existe
52
+ }
53
+ }
54
+
55
+ entity Slice {
56
+ fields {
57
+ id: Id
58
+ strategy_id: Id
59
+ status: StatusSlice
60
+ gate: StatusGate
61
+ versao_modelo_ativa: Texto
62
+ versao_modelo_candidata: Texto
63
+ motivo_quarentena: Texto
64
+ precision_observada: Decimal
65
+ }
66
+ invariants {
67
+ id existe
68
+ strategy_id existe
69
+ status em [ATIVO, QUARENTENA, DESLIGADO]
70
+ gate em [ABERTO, FECHADO]
71
+ versao_modelo_ativa existe
72
+ versao_modelo_candidata existe
73
+ motivo_quarentena existe
74
+ precision_observada existe
75
+ }
76
+ }
77
+
78
+ enum StatusStrategy {
79
+ RASCUNHO,
80
+ ATIVA,
81
+ QUARENTENA,
82
+ DESATIVADA
83
+ }
84
+
85
+ enum StatusSlice {
86
+ ATIVO,
87
+ QUARENTENA,
88
+ DESLIGADO
89
+ }
90
+
91
+ enum StatusGate {
92
+ ABERTO,
93
+ FECHADO
94
+ }
95
+
96
+ enum StatusDiscovery {
97
+ ABERTA,
98
+ EM_AVALIACAO,
99
+ APROVADA,
100
+ REJEITADA
101
+ }
102
+
103
+ state governanca_estrategia {
104
+ fields {
105
+ status: StatusStrategy
106
+ slice_status: StatusSlice
107
+ gate_global: StatusGate
108
+ gate_slice: StatusGate
109
+ discovery_status: StatusDiscovery
110
+ versao_modelo_ativa: Texto
111
+ versao_modelo_candidata: Texto
112
+ motivo_operacional: Texto
113
+ }
114
+ invariants {
115
+ status em [RASCUNHO, ATIVA, QUARENTENA, DESATIVADA]
116
+ slice_status em [ATIVO, QUARENTENA, DESLIGADO]
117
+ gate_global em [ABERTO, FECHADO]
118
+ gate_slice em [ABERTO, FECHADO]
119
+ discovery_status em [ABERTA, EM_AVALIACAO, APROVADA, REJEITADA]
120
+ versao_modelo_ativa existe
121
+ versao_modelo_candidata existe
122
+ motivo_operacional existe
123
+ }
124
+ transitions {
125
+ RASCUNHO -> ATIVA
126
+ ATIVA -> QUARENTENA
127
+ QUARENTENA -> ATIVA
128
+ ATIVA -> DESATIVADA
129
+ }
130
+ }
131
+
132
+ task registrar_discovery_semanal {
133
+ docs {
134
+ resumo: "Abre a janela semanal de discovery para uma strategy e marca a versao candidata que esta entrando em avaliacao."
135
+ }
136
+ input {
137
+ strategy_id: Id required
138
+ semana_referencia: Data required
139
+ versao_modelo_candidata: Texto required
140
+ }
141
+ output {
142
+ janela: JanelaDiscovery
143
+ discovery_registrada: Booleano
144
+ }
145
+ rules {
146
+ strategy_id existe
147
+ semana_referencia existe
148
+ versao_modelo_candidata existe
149
+ }
150
+ effects {
151
+ persistencia discovery_semanal criticidade = alta
152
+ auditoria strategy criticidade = alta
153
+ evento discovery_aberta criticidade = media
154
+ }
155
+ guarantees {
156
+ janela existe
157
+ discovery_registrada == verdadeiro
158
+ }
159
+ tests {
160
+ caso "abre discovery da semana" {
161
+ given {
162
+ strategy_id: "strategy_alpha"
163
+ semana_referencia: "2026-03-30"
164
+ versao_modelo_candidata: "modelo_2026_13"
165
+ }
166
+
167
+ expect {
168
+ sucesso: verdadeiro
169
+ }
170
+ }
171
+ }
172
+ }
173
+
174
+ task avaliar_slice_apos_discovery {
175
+ docs {
176
+ resumo: "Decide se um slice segue aberto,entra em quarentena ou precisa ficar bloqueado ate nova avaliacao."
177
+ }
178
+ input {
179
+ strategy_id: Id required
180
+ slice_id: Id required
181
+ precision_observada: Decimal required
182
+ precision_minima: Decimal required
183
+ risco_operacional: Texto required
184
+ }
185
+ output {
186
+ gate_slice: StatusGate
187
+ slice_status: StatusSlice
188
+ motivo_operacional: Texto
189
+ }
190
+ rules {
191
+ strategy_id existe
192
+ slice_id existe
193
+ precision_observada existe
194
+ precision_minima existe
195
+ risco_operacional existe
196
+ }
197
+ effects {
198
+ persistencia slice criticidade = alta
199
+ auditoria discovery_slice criticidade = alta
200
+ notificacao operacao criticidade = media
201
+ }
202
+ guarantees {
203
+ gate_slice existe
204
+ slice_status existe
205
+ motivo_operacional existe
206
+ }
207
+ tests {
208
+ caso "slice ruim fecha gate na avaliacao" {
209
+ given {
210
+ strategy_id: "strategy_alpha"
211
+ slice_id: "slice_under35_serie_a"
212
+ precision_observada: 0.49
213
+ precision_minima: 0.58
214
+ risco_operacional: "drawdown_excessivo"
215
+ }
216
+
217
+ expect {
218
+ sucesso: verdadeiro
219
+ }
220
+ }
221
+ }
222
+ }
223
+
224
+ task colocar_slice_em_quarentena {
225
+ docs {
226
+ resumo: "Transforma um problema de slice em acao operacional explicita,sem desligar a strategy inteira por reflexo idiota."
227
+ }
228
+ input {
229
+ strategy_id: Id required
230
+ slice_id: Id required
231
+ motivo: Texto required
232
+ origem: Texto required
233
+ data_referencia: Data required
234
+ }
235
+ output {
236
+ slice_status: StatusSlice
237
+ gate_slice: StatusGate
238
+ contexto: ContextoQuarentena
239
+ }
240
+ rules {
241
+ strategy_id existe
242
+ slice_id existe
243
+ motivo existe
244
+ origem existe
245
+ data_referencia existe
246
+ }
247
+ effects {
248
+ persistencia slice criticidade = alta
249
+ persistencia quarentena criticidade = alta
250
+ notificacao operacao criticidade = alta
251
+ auditoria quarentena criticidade = alta
252
+ }
253
+ state governanca_estrategia {
254
+ transitions {
255
+ ATIVA -> QUARENTENA
256
+ }
257
+ }
258
+ guarantees {
259
+ slice_status == QUARENTENA
260
+ gate_slice == FECHADO
261
+ contexto existe
262
+ }
263
+ tests {
264
+ caso "quarentena seletiva fecha so o slice afetado" {
265
+ given {
266
+ strategy_id: "strategy_alpha"
267
+ slice_id: "slice_under35_serie_a"
268
+ motivo: "llm_detectou_noticia_ruim"
269
+ origem: "monitoramento_live"
270
+ data_referencia: "2026-03-30"
271
+ }
272
+
273
+ expect {
274
+ sucesso: verdadeiro
275
+ }
276
+ }
277
+ }
278
+ }
279
+
280
+ task fechar_gate_global_strategy {
281
+ docs {
282
+ resumo: "Fecha o gate global quando a strategy inteira precisa parar de liberar sem apagar historico nem perder a trilha da versao ativa."
283
+ }
284
+ input {
285
+ strategy_id: Id required
286
+ motivo_operacional: Texto required
287
+ versao_modelo_ativa: Texto required
288
+ }
289
+ output {
290
+ strategy_status: StatusStrategy
291
+ gate_global: StatusGate
292
+ versao_modelo_ativa: Texto
293
+ }
294
+ rules {
295
+ strategy_id existe
296
+ motivo_operacional existe
297
+ versao_modelo_ativa existe
298
+ }
299
+ effects {
300
+ persistencia strategy criticidade = alta
301
+ notificacao operacao criticidade = alta
302
+ auditoria gate_global criticidade = alta
303
+ }
304
+ guarantees {
305
+ strategy_status == QUARENTENA
306
+ gate_global == FECHADO
307
+ versao_modelo_ativa existe
308
+ }
309
+ tests {
310
+ caso "fecha gate global sem perder versao ativa" {
311
+ given {
312
+ strategy_id: "strategy_alpha"
313
+ motivo_operacional: "sequencia_ruim_em_varias_ligas"
314
+ versao_modelo_ativa: "modelo_2026_12"
315
+ }
316
+
317
+ expect {
318
+ sucesso: verdadeiro
319
+ }
320
+ }
321
+ }
322
+ }
323
+
324
+ task ativar_strategy_com_nova_versao {
325
+ docs {
326
+ resumo: "Promove a versao candidata aprovada e reabre a strategy so quando houver aprovacao manual e gate global devidamente controlado."
327
+ }
328
+ input {
329
+ strategy_id: Id required
330
+ versao_modelo_ativa: Texto required
331
+ versao_modelo_candidata: Texto required
332
+ strategy_status_atual: StatusStrategy required
333
+ gate_global_atual: StatusGate required
334
+ aprovacao_manual: Booleano required
335
+ }
336
+ output {
337
+ strategy_status: StatusStrategy
338
+ gate_global: StatusGate
339
+ versao_modelo_ativa: Texto
340
+ }
341
+ rules {
342
+ strategy_id existe
343
+ versao_modelo_ativa existe
344
+ versao_modelo_candidata existe
345
+ strategy_status_atual em [RASCUNHO, QUARENTENA]
346
+ gate_global_atual == FECHADO
347
+ aprovacao_manual == verdadeiro
348
+ }
349
+ effects {
350
+ persistencia strategy criticidade = alta
351
+ evento strategy_ativada criticidade = alta
352
+ auditoria rollout criticidade = alta
353
+ }
354
+ state governanca_estrategia {
355
+ transitions {
356
+ QUARENTENA -> ATIVA
357
+ RASCUNHO -> ATIVA
358
+ }
359
+ }
360
+ guarantees {
361
+ strategy_status == ATIVA
362
+ gate_global == ABERTO
363
+ versao_modelo_ativa existe
364
+ }
365
+ tests {
366
+ caso "reativa strategy apos aprovacao do novo modelo" {
367
+ given {
368
+ strategy_id: "strategy_alpha"
369
+ versao_modelo_ativa: "modelo_2026_12"
370
+ versao_modelo_candidata: "modelo_2026_13"
371
+ strategy_status_atual: "QUARENTENA"
372
+ gate_global_atual: "FECHADO"
373
+ aprovacao_manual: verdadeiro
374
+ }
375
+
376
+ expect {
377
+ sucesso: verdadeiro
378
+ }
379
+ }
380
+ }
381
+ }
382
+
383
+ flow governanca_operacional {
384
+ strategy_id: Id
385
+ slice_id: Id
386
+ semana_referencia: Data
387
+ versao_modelo_ativa: Texto
388
+ versao_modelo_candidata: Texto
389
+ precision_observada: Decimal
390
+ precision_minima: Decimal
391
+ risco_operacional: Texto
392
+ motivo_operacional: Texto
393
+ strategy_status_atual: StatusStrategy
394
+ gate_global_atual: StatusGate
395
+ aprovacao_manual: Booleano
396
+ etapa discovery usa registrar_discovery_semanal com strategy_id = strategy_id, semana_referencia = semana_referencia, versao_modelo_candidata = versao_modelo_candidata
397
+ etapa avaliar_slice usa avaliar_slice_apos_discovery com strategy_id = strategy_id, slice_id = slice_id, precision_observada = precision_observada, precision_minima = precision_minima, risco_operacional = risco_operacional depende_de discovery
398
+ etapa quarentena_slice usa colocar_slice_em_quarentena com strategy_id = strategy_id, slice_id = slice_id, motivo = motivo_operacional, origem = risco_operacional, data_referencia = semana_referencia quando motivo_operacional existe depende_de avaliar_slice
399
+ etapa fechar_gate_global usa fechar_gate_global_strategy com strategy_id = strategy_id, motivo_operacional = motivo_operacional, versao_modelo_ativa = versao_modelo_ativa quando motivo_operacional existe depende_de quarentena_slice
400
+ etapa reativacao usa ativar_strategy_com_nova_versao com strategy_id = strategy_id, versao_modelo_ativa = versao_modelo_ativa, versao_modelo_candidata = versao_modelo_candidata, strategy_status_atual = strategy_status_atual, gate_global_atual = gate_global_atual, aprovacao_manual = aprovacao_manual quando aprovacao_manual == verdadeiro depende_de fechar_gate_global
401
+ }
402
+ }
@@ -0,0 +1,222 @@
1
+ module exemplos.pagamento {
2
+ docs {
3
+ resumo: "Vertical oficial de pagamento da Sema 0.5,usado como referencia de utilidade real controlada."
4
+ }
5
+
6
+ use exemplos.pagamento.dominio
7
+
8
+ task processar_pagamento {
9
+ input {
10
+ pagamento_id: Id required
11
+ valor: Decimal required
12
+ token: Texto required
13
+ }
14
+ output {
15
+ pagamento: Pagamento
16
+ status: StatusPagamento
17
+ }
18
+ rules {
19
+ valor > 0
20
+ token existe
21
+ token deve_ser valido
22
+ }
23
+ effects {
24
+ consulta gateway_pagamento criticidade = alta
25
+ persistencia Pagamento criticidade = alta
26
+ evento pagamento_autorizado criticidade = media
27
+ notificacao cliente comprovante_pagamento criticidade = media
28
+ auditoria pagamento criticidade = alta
29
+ }
30
+ state ciclo_pagamento {
31
+ transitions {
32
+ PENDENTE -> AUTORIZADO
33
+ AUTORIZADO -> PROCESSADO
34
+ }
35
+ }
36
+ guarantees {
37
+ pagamento existe
38
+ status em [AUTORIZADO, PROCESSADO]
39
+ pagamento.status == status
40
+ }
41
+ error {
42
+ autorizacao_negada: "A operacao foi recusada pelo gateway."
43
+ saldo_insuficiente: "O saldo nao cobre o valor da cobranca."
44
+ timeout_gateway: "O gateway nao respondeu em tempo habil."
45
+ }
46
+ tests {
47
+ caso "pagamento autorizado" {
48
+ given {
49
+ pagamento_id: "pag_1"
50
+ valor: 199.9
51
+ token: "tok_ok"
52
+ }
53
+
54
+ expect {
55
+ sucesso: verdadeiro
56
+ }
57
+ }
58
+ caso "pagamento recusado por autorizacao" {
59
+ given {
60
+ pagamento_id: "pag_erro"
61
+ valor: 10
62
+ token: "tok_recusado"
63
+ }
64
+
65
+ expect {
66
+ sucesso: falso
67
+ }
68
+
69
+ error {
70
+ tipo: "autorizacao_negada"
71
+ }
72
+ }
73
+ caso "pagamento falha por timeout" {
74
+ given {
75
+ pagamento_id: "pag_timeout"
76
+ valor: 10
77
+ token: "tok_timeout"
78
+ }
79
+
80
+ expect {
81
+ sucesso: falso
82
+ }
83
+
84
+ error {
85
+ tipo: "timeout_gateway"
86
+ }
87
+ }
88
+ }
89
+ }
90
+
91
+ task confirmar_pagamento {
92
+ input {
93
+ pagamento_id: Id required
94
+ }
95
+ output {
96
+ status: StatusPagamento
97
+ }
98
+ rules {
99
+ pagamento_id existe
100
+ }
101
+ effects {
102
+ consulta gateway_pagamento criticidade = alta
103
+ persistencia Pagamento criticidade = alta
104
+ evento pagamento_confirmado criticidade = media
105
+ auditoria conciliacao_pagamento criticidade = alta
106
+ }
107
+ state ciclo_pagamento {
108
+ transitions {
109
+ AUTORIZADO -> PROCESSADO
110
+ }
111
+ }
112
+ guarantees {
113
+ status == PROCESSADO
114
+ }
115
+ tests {
116
+ caso "confirma pagamento autorizado" {
117
+ given {
118
+ pagamento_id: "pag_1"
119
+ }
120
+
121
+ expect {
122
+ sucesso: verdadeiro
123
+ }
124
+ }
125
+ }
126
+ }
127
+
128
+ task notificar_falha_pagamento {
129
+ input {
130
+ pagamento_id: Id required
131
+ motivo: Texto required
132
+ }
133
+ output {
134
+ protocolo_notificacao: Id
135
+ }
136
+ effects {
137
+ notificacao cliente falha_pagamento criticidade = alta
138
+ auditoria falha_pagamento criticidade = media
139
+ }
140
+ guarantees {
141
+ protocolo_notificacao existe
142
+ }
143
+ tests {
144
+ caso "notifica falha por recusa" {
145
+ given {
146
+ pagamento_id: "pag_erro"
147
+ motivo: "autorizacao_negada"
148
+ }
149
+
150
+ expect {
151
+ sucesso: verdadeiro
152
+ }
153
+ }
154
+ }
155
+ }
156
+
157
+ task registrar_timeout_pagamento {
158
+ input {
159
+ pagamento_id: Id required
160
+ }
161
+ output {
162
+ auditoria_id: Id
163
+ }
164
+ effects {
165
+ auditoria timeout_gateway criticidade = alta
166
+ persistencia incidente_pagamento criticidade = media
167
+ }
168
+ guarantees {
169
+ auditoria_id existe
170
+ }
171
+ tests {
172
+ caso "registra timeout" {
173
+ given {
174
+ pagamento_id: "pag_timeout"
175
+ }
176
+
177
+ expect {
178
+ sucesso: verdadeiro
179
+ }
180
+ }
181
+ }
182
+ }
183
+
184
+ flow orquestracao_pagamento {
185
+ pagamento_id: Id
186
+ valor: Decimal
187
+ token: Texto
188
+ etapa autorizar usa processar_pagamento com pagamento_id = pagamento_id, valor = valor, token = token em_sucesso confirmar em_erro registrar_falha por_erro autorizacao_negada = notificar_falha, timeout_gateway = registrar_timeout
189
+ etapa confirmar usa confirmar_pagamento com pagamento_id = pagamento_id depende_de autorizar
190
+ etapa notificar_falha usa notificar_falha_pagamento com pagamento_id = pagamento_id, motivo = autorizacao_negada depende_de autorizar
191
+ etapa registrar_timeout usa registrar_timeout_pagamento com pagamento_id = pagamento_id depende_de autorizar
192
+ etapa registrar_falha usa registrar_timeout_pagamento com pagamento_id = pagamento_id depende_de autorizar
193
+ effects {
194
+ auditoria fluxo_pagamento criticidade = alta
195
+ evento pagamento_em_processamento criticidade = media
196
+ }
197
+ }
198
+
199
+ route processar_pagamento_publico {
200
+ metodo: POST
201
+ caminho: /pagamentos/processar
202
+ task: processar_pagamento
203
+ input {
204
+ pagamento_id: Id required
205
+ valor: Decimal required
206
+ token: Texto required
207
+ }
208
+ output {
209
+ pagamento: Pagamento required
210
+ status: StatusPagamento required
211
+ }
212
+ effects {
213
+ auditoria pagamento_publico criticidade = alta
214
+ evento pagamento_requisitado criticidade = media
215
+ }
216
+ error {
217
+ autorizacao_negada: "Erro publico quando o gateway recusa a operacao."
218
+ saldo_insuficiente: "Erro publico quando nao ha saldo suficiente."
219
+ timeout_gateway: "Erro publico quando o gateway nao responde."
220
+ }
221
+ }
222
+ }
@@ -0,0 +1,35 @@
1
+ module exemplos.pagamento.dominio {
2
+ docs {
3
+ resumo: "Contratos de dominio compartilhados pelo vertical oficial de pagamento da Sema 0.5."
4
+ }
5
+
6
+ entity Pagamento {
7
+ fields {
8
+ id: Id
9
+ valor: Decimal
10
+ status: StatusPagamento
11
+ }
12
+ }
13
+
14
+ enum StatusPagamento {
15
+ PENDENTE,
16
+ AUTORIZADO,
17
+ RECUSADO,
18
+ PROCESSADO
19
+ }
20
+
21
+ state ciclo_pagamento {
22
+ fields {
23
+ status: StatusPagamento
24
+ conciliado: Booleano
25
+ }
26
+ invariants {
27
+ status existe
28
+ }
29
+ transitions {
30
+ PENDENTE -> AUTORIZADO
31
+ AUTORIZADO -> PROCESSADO
32
+ PENDENTE -> RECUSADO
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,45 @@
1
+ module exemplos.testes.embutidos {
2
+ task validar_documento {
3
+ input {
4
+ documento: Texto required
5
+ }
6
+ output {
7
+ valido: Booleano
8
+ motivo: Texto
9
+ }
10
+ rules {
11
+ documento deve_ser preenchido
12
+ }
13
+ effects {
14
+ auditoria validacao_documento
15
+ }
16
+ guarantees {
17
+ valido existe
18
+ motivo existe
19
+ }
20
+ tests {
21
+ caso "documento valido" {
22
+ given {
23
+ documento: 12345678900
24
+ }
25
+
26
+ expect {
27
+ sucesso: verdadeiro
28
+ }
29
+ }
30
+ caso "documento vazio" {
31
+ given {
32
+ documento: ""
33
+ }
34
+
35
+ expect {
36
+ sucesso: falso
37
+ }
38
+
39
+ error {
40
+ tipo: "entrada_invalida"
41
+ }
42
+ }
43
+ }
44
+ }
45
+ }