@mmapp/player-core 0.1.0-alpha.1
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.
- package/dist/index.d.mts +1436 -0
- package/dist/index.d.ts +1436 -0
- package/dist/index.js +4828 -0
- package/dist/index.mjs +4762 -0
- package/package.json +35 -0
- package/package.json.backup +35 -0
- package/src/__tests__/actions.test.ts +187 -0
- package/src/__tests__/blueprint-e2e.test.ts +706 -0
- package/src/__tests__/blueprint-test-runner.test.ts +680 -0
- package/src/__tests__/core-functions.test.ts +78 -0
- package/src/__tests__/dsl-compiler.test.ts +1382 -0
- package/src/__tests__/dsl-grammar.test.ts +1682 -0
- package/src/__tests__/events.test.ts +200 -0
- package/src/__tests__/expression.test.ts +296 -0
- package/src/__tests__/failure-policies.test.ts +110 -0
- package/src/__tests__/frontend-context.test.ts +182 -0
- package/src/__tests__/integration.test.ts +256 -0
- package/src/__tests__/security.test.ts +190 -0
- package/src/__tests__/state-machine.test.ts +450 -0
- package/src/__tests__/testing-engine.test.ts +671 -0
- package/src/actions/dispatcher.ts +80 -0
- package/src/actions/index.ts +7 -0
- package/src/actions/types.ts +25 -0
- package/src/dsl/compiler/component-mapper.ts +289 -0
- package/src/dsl/compiler/field-mapper.ts +187 -0
- package/src/dsl/compiler/index.ts +82 -0
- package/src/dsl/compiler/manifest-compiler.ts +76 -0
- package/src/dsl/compiler/symbol-table.ts +214 -0
- package/src/dsl/compiler/utils.ts +48 -0
- package/src/dsl/compiler/view-compiler.ts +286 -0
- package/src/dsl/compiler/workflow-compiler.ts +600 -0
- package/src/dsl/index.ts +66 -0
- package/src/dsl/ir-migration.ts +221 -0
- package/src/dsl/ir-types.ts +416 -0
- package/src/dsl/lexer.ts +579 -0
- package/src/dsl/parser.ts +115 -0
- package/src/dsl/types.ts +256 -0
- package/src/events/event-bus.ts +68 -0
- package/src/events/index.ts +9 -0
- package/src/events/pattern-matcher.ts +61 -0
- package/src/events/types.ts +27 -0
- package/src/expression/evaluator.ts +676 -0
- package/src/expression/functions.ts +214 -0
- package/src/expression/index.ts +13 -0
- package/src/expression/types.ts +64 -0
- package/src/index.ts +61 -0
- package/src/state-machine/index.ts +16 -0
- package/src/state-machine/interpreter.ts +319 -0
- package/src/state-machine/types.ts +89 -0
- package/src/testing/action-trace.ts +209 -0
- package/src/testing/blueprint-test-runner.ts +214 -0
- package/src/testing/graph-walker.ts +249 -0
- package/src/testing/index.ts +69 -0
- package/src/testing/nrt-comparator.ts +199 -0
- package/src/testing/nrt-types.ts +230 -0
- package/src/testing/test-actions.ts +645 -0
- package/src/testing/test-compiler.ts +278 -0
- package/src/testing/test-runner.ts +444 -0
- package/src/testing/types.ts +231 -0
- package/src/validation/definition-validator.ts +812 -0
- package/src/validation/index.ts +13 -0
- package/tsconfig.json +26 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Function Tests — one test per function (31 total).
|
|
3
|
+
* Verifies each of the 31 core expression functions produces correct results.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
7
|
+
import { createEvaluator, WEB_FAILURE_POLICIES, clearExpressionCache } from '../expression';
|
|
8
|
+
import type { Evaluator, ExpressionContext } from '../expression';
|
|
9
|
+
|
|
10
|
+
describe('31 Core Functions', () => {
|
|
11
|
+
let ev: Evaluator;
|
|
12
|
+
let ctx: ExpressionContext;
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
clearExpressionCache();
|
|
16
|
+
ev = createEvaluator({ functions: [], failurePolicy: WEB_FAILURE_POLICIES.VIEW_BINDING });
|
|
17
|
+
ctx = {
|
|
18
|
+
state_data: { items: [1, 2, 3], name: 'Alice', empty: '', obj: { a: 1 } },
|
|
19
|
+
memory: {},
|
|
20
|
+
current_state: 'active',
|
|
21
|
+
status: 'ACTIVE',
|
|
22
|
+
items: [1, 2, 3],
|
|
23
|
+
name: 'Alice',
|
|
24
|
+
empty: '',
|
|
25
|
+
obj: { a: 1 },
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Math (8)
|
|
30
|
+
it('add', () => expect(ev.evaluate('add(10, 5)', ctx).value).toBe(15));
|
|
31
|
+
it('subtract', () => expect(ev.evaluate('subtract(10, 3)', ctx).value).toBe(7));
|
|
32
|
+
it('multiply', () => expect(ev.evaluate('multiply(4, 5)', ctx).value).toBe(20));
|
|
33
|
+
it('divide', () => expect(ev.evaluate('divide(10, 2)', ctx).value).toBe(5));
|
|
34
|
+
it('divide by zero', () => expect(ev.evaluate('divide(10, 0)', ctx).value).toBe(0));
|
|
35
|
+
it('abs', () => expect(ev.evaluate('abs(-42)', ctx).value).toBe(42));
|
|
36
|
+
it('round', () => expect(ev.evaluate('round(3.456, 1)', ctx).value).toBe(3.5));
|
|
37
|
+
it('min', () => expect(ev.evaluate('min(5, 2, 8)', ctx).value).toBe(2));
|
|
38
|
+
it('max', () => expect(ev.evaluate('max(5, 2, 8)', ctx).value).toBe(8));
|
|
39
|
+
|
|
40
|
+
// Comparison (6)
|
|
41
|
+
it('eq', () => expect(ev.evaluate('eq(5, 5)', ctx).value).toBe(true));
|
|
42
|
+
it('neq', () => expect(ev.evaluate('neq(5, 3)', ctx).value).toBe(true));
|
|
43
|
+
it('gt', () => expect(ev.evaluate('gt(5, 3)', ctx).value).toBe(true));
|
|
44
|
+
it('gte', () => expect(ev.evaluate('gte(5, 5)', ctx).value).toBe(true));
|
|
45
|
+
it('lt', () => expect(ev.evaluate('lt(3, 5)', ctx).value).toBe(true));
|
|
46
|
+
it('lte', () => expect(ev.evaluate('lte(5, 5)', ctx).value).toBe(true));
|
|
47
|
+
|
|
48
|
+
// Logic (5)
|
|
49
|
+
it('if', () => expect(ev.evaluate("if(true, 'yes', 'no')", ctx).value).toBe('yes'));
|
|
50
|
+
it('and', () => expect(ev.evaluate('and(true, true, true)', ctx).value).toBe(true));
|
|
51
|
+
it('or', () => expect(ev.evaluate('or(false, true)', ctx).value).toBe(true));
|
|
52
|
+
it('not', () => expect(ev.evaluate('not(false)', ctx).value).toBe(true));
|
|
53
|
+
it('coalesce', () => expect(ev.evaluate("coalesce(null, undefined, 'found')", ctx).value).toBe('found'));
|
|
54
|
+
|
|
55
|
+
// String (6)
|
|
56
|
+
it('concat', () => expect(ev.evaluate("concat('a', 'b', 'c')", ctx).value).toBe('abc'));
|
|
57
|
+
it('upper', () => expect(ev.evaluate("upper('hello')", ctx).value).toBe('HELLO'));
|
|
58
|
+
it('lower', () => expect(ev.evaluate("lower('HELLO')", ctx).value).toBe('hello'));
|
|
59
|
+
it('trim', () => expect(ev.evaluate("trim(' hi ')", ctx).value).toBe('hi'));
|
|
60
|
+
it('format', () => expect(ev.evaluate("format('Hello {0}!', 'World')", ctx).value).toBe('Hello World!'));
|
|
61
|
+
it('length (string)', () => expect(ev.evaluate("length('hello')", ctx).value).toBe(5));
|
|
62
|
+
it('length (array)', () => expect(ev.evaluate('length(items)', ctx).value).toBe(3));
|
|
63
|
+
|
|
64
|
+
// Path (3)
|
|
65
|
+
it('get', () => expect(ev.evaluate("get(obj, 'a')", ctx).value).toBe(1));
|
|
66
|
+
it('includes (string)', () => expect(ev.evaluate("includes(name, 'lic')", ctx).value).toBe(true));
|
|
67
|
+
it('includes (array)', () => expect(ev.evaluate('includes(items, 2)', ctx).value).toBe(true));
|
|
68
|
+
it('is_defined (defined)', () => expect(ev.evaluate('is_defined(name)', ctx).value).toBe(true));
|
|
69
|
+
it('is_defined (null)', () => expect(ev.evaluate('is_defined(null)', ctx).value).toBe(false));
|
|
70
|
+
|
|
71
|
+
// Type (3)
|
|
72
|
+
it('is_empty (empty string)', () => expect(ev.evaluate("is_empty('')", ctx).value).toBe(true));
|
|
73
|
+
it('is_empty (non-empty)', () => expect(ev.evaluate("is_empty('x')", ctx).value).toBe(false));
|
|
74
|
+
it('is_null (null)', () => expect(ev.evaluate('is_null(null)', ctx).value).toBe(true));
|
|
75
|
+
it('is_null (value)', () => expect(ev.evaluate('is_null(name)', ctx).value).toBe(false));
|
|
76
|
+
it('to_string (number)', () => expect(ev.evaluate('to_string(42)', ctx).value).toBe('42'));
|
|
77
|
+
it('to_string (null)', () => expect(ev.evaluate('to_string(null)', ctx).value).toBe(''));
|
|
78
|
+
});
|