-
Notifications
You must be signed in to change notification settings - Fork 488
/
Copy pathindex.test-d.ts
152 lines (135 loc) · 4.24 KB
/
index.test-d.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import { expectType } from "tsd";
import rulesEngine, {
Almanac,
EngineResult,
Engine,
Event,
Fact,
Operator,
OperatorEvaluator,
OperatorDecorator,
OperatorDecoratorEvaluator,
PathResolver,
Rule,
RuleProperties,
RuleResult,
RuleSerializable,
TopLevelConditionResult,
AnyConditionsResult,
AllConditionsResult,
NotConditionsResult
} from "../";
// setup basic fixture data
const ruleProps: RuleProperties = {
conditions: {
all: []
},
event: {
type: "message"
}
};
const complexRuleProps: RuleProperties = {
conditions: {
all: [
{
any: [
{
all: []
},
{
fact: "foo",
operator: "equal",
value: "bar"
}
]
}
]
},
event: {
type: "message"
}
};
// path resolver
const pathResolver = function(value: object, path: string): any {}
expectType<PathResolver>(pathResolver)
// default export test
expectType<Engine>(rulesEngine([ruleProps]));
const engine = rulesEngine([complexRuleProps]);
// Rule tests
const rule: Rule = new Rule(ruleProps);
const ruleFromString: Rule = new Rule(JSON.stringify(ruleProps));
expectType<Engine>(engine.addRule(rule));
expectType<boolean>(engine.removeRule(ruleFromString));
expectType<void>(engine.updateRule(ruleFromString));
expectType<Rule>(rule.setConditions({ any: [] }));
expectType<Rule>(rule.setEvent({ type: "test" }));
expectType<Rule>(rule.setPriority(1));
expectType<string>(rule.toJSON());
expectType<string>(rule.toJSON(true));
expectType<RuleSerializable>(rule.toJSON(false));
// Operator tests
const operatorEvaluator: OperatorEvaluator<number, number> = (
a: number,
b: number
) => a === b;
expectType<void>(
engine.addOperator("test", operatorEvaluator)
);
const operator: Operator = new Operator(
"test",
operatorEvaluator,
(num: number) => num > 0
);
expectType<void>(engine.addOperator(operator));
expectType<boolean>(engine.removeOperator(operator));
// Operator Decorator tests
const operatorDecoratorEvaluator: OperatorDecoratorEvaluator<number[], number, number, number> = (
a: number[],
b: number,
next: OperatorEvaluator<number, number>
) => next(a[0], b);
expectType<void>(
engine.addOperatorDecorator("first", operatorDecoratorEvaluator)
);
const operatorDecorator: OperatorDecorator = new OperatorDecorator(
"first",
operatorDecoratorEvaluator,
(a: number[]) => a.length > 0
);
expectType<void>(engine.addOperatorDecorator(operatorDecorator));
expectType<boolean>(engine.removeOperatorDecorator(operatorDecorator));
// Fact tests
const fact = new Fact<number>("test-fact", 3);
const dynamicFact = new Fact<number[]>("test-fact", () => [42]);
expectType<Engine>(
engine.addFact<string>("test-fact", "value", { priority: 10 })
);
expectType<Engine>(engine.addFact(fact));
expectType<Engine>(engine.addFact(dynamicFact));
expectType<boolean>(engine.removeFact(fact));
expectType<Fact<string>>(engine.getFact<string>("test"));
engine.on('success', (event, almanac, ruleResult) => {
expectType<Event>(event)
expectType<Almanac>(almanac)
expectType<RuleResult>(ruleResult)
})
engine.on<{ foo: Array<string> }>('foo', (event, almanac, ruleResult) => {
expectType<{ foo: Array<string> }>(event)
expectType<Almanac>(almanac)
expectType<RuleResult>(ruleResult)
})
// Run the Engine
const result = engine.run({ displayMessage: true })
expectType<Promise<EngineResult>>(result);
const topLevelConditionResult = result.then(r => r.results[0].conditions);
expectType<Promise<TopLevelConditionResult>>(topLevelConditionResult)
const topLevelAnyConditionsResult = topLevelConditionResult.then(r => (r as AnyConditionsResult).result);
expectType<Promise<boolean | undefined>>(topLevelAnyConditionsResult)
const topLevelAllConditionsResult = topLevelConditionResult.then(r => (r as AllConditionsResult).result);
expectType<Promise<boolean | undefined>>(topLevelAllConditionsResult)
const topLevelNotConditionsResult = topLevelConditionResult.then(r => (r as NotConditionsResult).result);
expectType<Promise<boolean | undefined>>(topLevelNotConditionsResult)
// Alamanac tests
const almanac: Almanac = (await engine.run()).almanac;
expectType<Promise<string>>(almanac.factValue<string>("test-fact"));
expectType<void>(almanac.addRuntimeFact("test-fact", "some-value"));