@media-quest/engine 0.0.22 → 0.0.24
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/package.json +1 -1
- package/src/Delement/DElement.dto.ts +5 -5
- package/src/Delement/DElement.ts +88 -88
- package/src/Delement/DImg.ts +39 -39
- package/src/Delement/DStyle-utils.ts +616 -616
- package/src/Delement/DStyle.ts +165 -165
- package/src/Delement/DText.ts +13 -13
- package/src/Delement/Ddiv.ts +25 -25
- package/src/Delement/button-click-action.ts +35 -35
- package/src/Delement/css.spec.ts +36 -36
- package/src/Delement/css.ts +46 -46
- package/src/Delement/element-factory.ts +40 -40
- package/src/common/DMaybe.ts +46 -46
- package/src/common/DTimestamp.ts +20 -20
- package/src/common/DTmestamp.spec.ts +11 -11
- package/src/common/result.ts +41 -41
- package/src/engine/SchemaDto.ts +24 -24
- package/src/engine/SchemaEngine.ts +150 -150
- package/src/engine/SchemaResult.ts +10 -10
- package/src/engine/dplayer.spec.ts +91 -91
- package/src/engine/dplayer.ts +104 -104
- package/src/engine/history-que.spec.ts +67 -67
- package/src/engine/history-que.ts +17 -17
- package/src/engine/next-que.spec.ts +121 -121
- package/src/engine/next-que.ts +101 -101
- package/src/engine/page-que-ruleengine-action.ts +6 -6
- package/src/engine/scale.spec.ts +38 -38
- package/src/engine/scale.ts +70 -70
- package/src/events/mq-events.ts +63 -63
- package/src/page/Page.ts +182 -182
- package/src/page/media-player.ts +117 -117
- package/src/page/page-component.ts +113 -113
- package/src/page/page-result.ts +11 -11
- package/src/page/task-manager.ts +240 -240
- package/src/page/task-state.ts +55 -55
- package/src/page/task.ts +90 -90
- package/src/public-api.ts +26 -26
- package/src/rules/__test__/complex-condition.spec.ts +15 -15
- package/src/rules/__test__/conditon.spec.ts +124 -124
- package/src/rules/__test__/numeric-condition.spec.ts +84 -84
- package/src/rules/__test__/rule-engine.spec.ts +348 -348
- package/src/rules/__test__/rule-evaluation.spec.ts +140 -140
- package/src/rules/__test__/string-condition.spec.ts +41 -41
- package/src/rules/condition.ts +191 -191
- package/src/rules/fact.ts +18 -18
- package/src/rules/rule-engine.ts +45 -45
- package/src/rules/rule.ts +40 -40
- package/src/utils/DUtil.ts +116 -116
- package/src/utils/ID.spec.ts +39 -39
- package/src/utils/ID.ts +73 -73
- package/tsconfig.json +19 -19
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Fact } from "../rules/fact";
|
|
2
|
-
import { MqEvent } from "../events/mq-events";
|
|
3
|
-
|
|
4
|
-
export interface SchemaResult {
|
|
5
|
-
readonly schemaId: string;
|
|
6
|
-
readonly pagesLeft: number;
|
|
7
|
-
readonly predefinedFacts: ReadonlyArray<Fact>;
|
|
8
|
-
readonly eventLog: ReadonlyArray<MqEvent>;
|
|
9
|
-
readonly answers: ReadonlyArray<Fact>;
|
|
10
|
-
}
|
|
1
|
+
import { Fact } from "../rules/fact";
|
|
2
|
+
import { MqEvent } from "../events/mq-events";
|
|
3
|
+
|
|
4
|
+
export interface SchemaResult {
|
|
5
|
+
readonly schemaId: string;
|
|
6
|
+
readonly pagesLeft: number;
|
|
7
|
+
readonly predefinedFacts: ReadonlyArray<Fact>;
|
|
8
|
+
readonly eventLog: ReadonlyArray<MqEvent>;
|
|
9
|
+
readonly answers: ReadonlyArray<Fact>;
|
|
10
|
+
}
|
|
@@ -1,91 +1,91 @@
|
|
|
1
|
-
import { DPlayer, DPlayerData } from "./dplayer";
|
|
2
|
-
import { PageSequenceDto } from "./SchemaDto";
|
|
3
|
-
import { Rule } from "../rules/rule";
|
|
4
|
-
import { DTimestamp } from "../common/DTimestamp";
|
|
5
|
-
import { RuleActionPageQue } from "./page-que-ruleengine-action";
|
|
6
|
-
import { PageDto } from "../page/Page";
|
|
7
|
-
import { PageResult } from "../page/page-result";
|
|
8
|
-
|
|
9
|
-
const page = (id: number): PageDto => {
|
|
10
|
-
return PageDto.createDummy(id);
|
|
11
|
-
// return { id: PageID.create(), elements: [] };
|
|
12
|
-
};
|
|
13
|
-
const p1 = page(1);
|
|
14
|
-
const p2 = page(2);
|
|
15
|
-
const p3 = page(3);
|
|
16
|
-
const p4 = page(4);
|
|
17
|
-
const p5 = page(5);
|
|
18
|
-
const p6 = page(6);
|
|
19
|
-
const all = [p1, p2, p3, p4, p5, p6];
|
|
20
|
-
const Seq1 = {
|
|
21
|
-
p10: page(10),
|
|
22
|
-
p11: page(11),
|
|
23
|
-
p12: page(12),
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
const seq1: PageSequenceDto = {
|
|
27
|
-
id: "s1",
|
|
28
|
-
pages: [Seq1.p10, Seq1.p11, Seq1.p12],
|
|
29
|
-
rules: [],
|
|
30
|
-
};
|
|
31
|
-
const data = (
|
|
32
|
-
pages: PageDto[],
|
|
33
|
-
pageSequences: PageSequenceDto[] = [],
|
|
34
|
-
rules: Rule<RuleActionPageQue, never>[] = [],
|
|
35
|
-
): DPlayerData => ({ pages: pages, pageSequences, rules });
|
|
36
|
-
// const seq = (pages: PageDto[], rules: Rule[]) => {};
|
|
37
|
-
beforeEach(() => {
|
|
38
|
-
// data = { pages: [], rules: [], pageSequences: [] };
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
describe("DPlayer", () => {
|
|
42
|
-
it("should create an instance", () => {
|
|
43
|
-
const player = new DPlayer(data([p1, p1]));
|
|
44
|
-
expect(player).toBeTruthy();
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it("can app pages, and get next", () => {
|
|
48
|
-
const player = new DPlayer(data([p1, p2]));
|
|
49
|
-
|
|
50
|
-
expect(player.getNextPage()).toBe(p1);
|
|
51
|
-
expect(player.getNextPage()).toBe(p2);
|
|
52
|
-
expect(player.getNextPage()).toBe(false);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it("Can insert a sequence", () => {
|
|
56
|
-
const player = new DPlayer(data(all, [seq1]));
|
|
57
|
-
|
|
58
|
-
expect(player.getNextPage()).toBe(p1);
|
|
59
|
-
expect(player.getNextPage()).toBe(p2);
|
|
60
|
-
player.insertSequence(seq1.id);
|
|
61
|
-
expect(player.getNextPage()).toBe(Seq1.p10);
|
|
62
|
-
expect(player.getNextPage()).toBe(Seq1.p11);
|
|
63
|
-
expect(player.getNextPage()).toBe(Seq1.p12);
|
|
64
|
-
expect(player.getNextPage()).toBe(p3);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it("Save history", () => {
|
|
68
|
-
const player = new DPlayer(data(all));
|
|
69
|
-
|
|
70
|
-
const curr = player.getNextPage() as PageDto;
|
|
71
|
-
|
|
72
|
-
const result: PageResult = {
|
|
73
|
-
pageId: curr.id,
|
|
74
|
-
pagePrefix: curr.id,
|
|
75
|
-
eventLog: [],
|
|
76
|
-
pageTime: DTimestamp.diff(DTimestamp.now(), DTimestamp.now()),
|
|
77
|
-
collectedFacts: [
|
|
78
|
-
{
|
|
79
|
-
referenceId: "as",
|
|
80
|
-
referenceLabel: "as-label",
|
|
81
|
-
kind: "numeric-fact",
|
|
82
|
-
label: "litt",
|
|
83
|
-
value: 2,
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
|
-
};
|
|
87
|
-
player.saveHistory(result);
|
|
88
|
-
expect(player.getNextPage()).toBe(p2);
|
|
89
|
-
expect(player.getResults().answerFacts.length).toBe(1);
|
|
90
|
-
});
|
|
91
|
-
});
|
|
1
|
+
import { DPlayer, DPlayerData } from "./dplayer";
|
|
2
|
+
import { PageSequenceDto } from "./SchemaDto";
|
|
3
|
+
import { Rule } from "../rules/rule";
|
|
4
|
+
import { DTimestamp } from "../common/DTimestamp";
|
|
5
|
+
import { RuleActionPageQue } from "./page-que-ruleengine-action";
|
|
6
|
+
import { PageDto } from "../page/Page";
|
|
7
|
+
import { PageResult } from "../page/page-result";
|
|
8
|
+
|
|
9
|
+
const page = (id: number): PageDto => {
|
|
10
|
+
return PageDto.createDummy(id);
|
|
11
|
+
// return { id: PageID.create(), elements: [] };
|
|
12
|
+
};
|
|
13
|
+
const p1 = page(1);
|
|
14
|
+
const p2 = page(2);
|
|
15
|
+
const p3 = page(3);
|
|
16
|
+
const p4 = page(4);
|
|
17
|
+
const p5 = page(5);
|
|
18
|
+
const p6 = page(6);
|
|
19
|
+
const all = [p1, p2, p3, p4, p5, p6];
|
|
20
|
+
const Seq1 = {
|
|
21
|
+
p10: page(10),
|
|
22
|
+
p11: page(11),
|
|
23
|
+
p12: page(12),
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const seq1: PageSequenceDto = {
|
|
27
|
+
id: "s1",
|
|
28
|
+
pages: [Seq1.p10, Seq1.p11, Seq1.p12],
|
|
29
|
+
rules: [],
|
|
30
|
+
};
|
|
31
|
+
const data = (
|
|
32
|
+
pages: PageDto[],
|
|
33
|
+
pageSequences: PageSequenceDto[] = [],
|
|
34
|
+
rules: Rule<RuleActionPageQue, never>[] = [],
|
|
35
|
+
): DPlayerData => ({ pages: pages, pageSequences, rules });
|
|
36
|
+
// const seq = (pages: PageDto[], rules: Rule[]) => {};
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
// data = { pages: [], rules: [], pageSequences: [] };
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
describe("DPlayer", () => {
|
|
42
|
+
it("should create an instance", () => {
|
|
43
|
+
const player = new DPlayer(data([p1, p1]));
|
|
44
|
+
expect(player).toBeTruthy();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("can app pages, and get next", () => {
|
|
48
|
+
const player = new DPlayer(data([p1, p2]));
|
|
49
|
+
|
|
50
|
+
expect(player.getNextPage()).toBe(p1);
|
|
51
|
+
expect(player.getNextPage()).toBe(p2);
|
|
52
|
+
expect(player.getNextPage()).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("Can insert a sequence", () => {
|
|
56
|
+
const player = new DPlayer(data(all, [seq1]));
|
|
57
|
+
|
|
58
|
+
expect(player.getNextPage()).toBe(p1);
|
|
59
|
+
expect(player.getNextPage()).toBe(p2);
|
|
60
|
+
player.insertSequence(seq1.id);
|
|
61
|
+
expect(player.getNextPage()).toBe(Seq1.p10);
|
|
62
|
+
expect(player.getNextPage()).toBe(Seq1.p11);
|
|
63
|
+
expect(player.getNextPage()).toBe(Seq1.p12);
|
|
64
|
+
expect(player.getNextPage()).toBe(p3);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("Save history", () => {
|
|
68
|
+
const player = new DPlayer(data(all));
|
|
69
|
+
|
|
70
|
+
const curr = player.getNextPage() as PageDto;
|
|
71
|
+
|
|
72
|
+
const result: PageResult = {
|
|
73
|
+
pageId: curr.id,
|
|
74
|
+
pagePrefix: curr.id,
|
|
75
|
+
eventLog: [],
|
|
76
|
+
pageTime: DTimestamp.diff(DTimestamp.now(), DTimestamp.now()),
|
|
77
|
+
collectedFacts: [
|
|
78
|
+
{
|
|
79
|
+
referenceId: "as",
|
|
80
|
+
referenceLabel: "as-label",
|
|
81
|
+
kind: "numeric-fact",
|
|
82
|
+
label: "litt",
|
|
83
|
+
value: 2,
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
player.saveHistory(result);
|
|
88
|
+
expect(player.getNextPage()).toBe(p2);
|
|
89
|
+
expect(player.getResults().answerFacts.length).toBe(1);
|
|
90
|
+
});
|
|
91
|
+
});
|
package/src/engine/dplayer.ts
CHANGED
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
import { HistoryQue } from "./history-que";
|
|
2
|
-
import { RuleEngine } from "../rules/rule-engine";
|
|
3
|
-
import { NextQue } from "./next-que";
|
|
4
|
-
import { SchemaDto } from "./SchemaDto";
|
|
5
|
-
import { RuleActionPageQue } from "./page-que-ruleengine-action";
|
|
6
|
-
import { PageDto } from "../page/Page";
|
|
7
|
-
import { PageResult } from "../page/page-result";
|
|
8
|
-
import { Fact } from "../rules/fact";
|
|
9
|
-
import { MqEvent } from "../events/mq-events";
|
|
10
|
-
|
|
11
|
-
export type DPlayerData = Pick<SchemaDto, "pages" | "pageSequences" | "rules" | "predefinedFacts">;
|
|
12
|
-
export class DPlayer {
|
|
13
|
-
private readonly eventLog: Array<MqEvent> = [];
|
|
14
|
-
private history = new HistoryQue();
|
|
15
|
-
private ruleEngine = new RuleEngine<RuleActionPageQue, never>();
|
|
16
|
-
private nextQue = new NextQue();
|
|
17
|
-
private data: DPlayerData;
|
|
18
|
-
private readonly predefinedFacts: ReadonlyArray<Fact>;
|
|
19
|
-
|
|
20
|
-
constructor(data: DPlayerData) {
|
|
21
|
-
this.data = data;
|
|
22
|
-
const pages = data.pages ?? [];
|
|
23
|
-
this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];
|
|
24
|
-
this.nextQue.resetQue(pages);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
saveEvent(event: MqEvent) {
|
|
28
|
-
this.eventLog.push(event);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
saveHistory(pageHistory: PageResult) {
|
|
32
|
-
// console.log("SAVE HISTORY", pageHistory);
|
|
33
|
-
this.history.addToHistory(pageHistory);
|
|
34
|
-
this.eventLog.push(...pageHistory.eventLog);
|
|
35
|
-
// Evaluate rules
|
|
36
|
-
const userGeneratedFact = this.history.getFacts();
|
|
37
|
-
const predefinedFacts = this.predefinedFacts;
|
|
38
|
-
const facts = [...userGeneratedFact, ...predefinedFacts];
|
|
39
|
-
const result = this.ruleEngine.solveAll(this.data.rules, facts);
|
|
40
|
-
|
|
41
|
-
const matchingRules = result.matching;
|
|
42
|
-
const actions = matchingRules.map((r) => r.actionList).flat(1);
|
|
43
|
-
// Execute actions
|
|
44
|
-
actions.forEach((a) => {
|
|
45
|
-
// console.log(a.payload);
|
|
46
|
-
switch (a.kind) {
|
|
47
|
-
case "jumpToPage":
|
|
48
|
-
this.nextQue.jumpToPageById(a.pageId);
|
|
49
|
-
break;
|
|
50
|
-
case "excludeByPageId":
|
|
51
|
-
this.nextQue.removeByPageId(a.pageIds);
|
|
52
|
-
break;
|
|
53
|
-
case "excludeByTag":
|
|
54
|
-
this.nextQue.removeByTag(a.tagIds);
|
|
55
|
-
break;
|
|
56
|
-
default:
|
|
57
|
-
console.log("UNKNOWN ACTION", a);
|
|
58
|
-
const check: never = a;
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
getResults() {
|
|
64
|
-
const pagesLeft = this.nextQue.size;
|
|
65
|
-
const answerFacts = this.history.getFacts();
|
|
66
|
-
const predefinedFacts = this.predefinedFacts;
|
|
67
|
-
const eventLog = [...this.eventLog];
|
|
68
|
-
console.log(answerFacts);
|
|
69
|
-
return { answerFacts, predefinedFacts, eventLog, pagesLeft };
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
insertSequence(sequenceId: string) {
|
|
73
|
-
this.insertSequenceById(sequenceId);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
getNextPage(): PageDto | false {
|
|
77
|
-
const next = this.nextQue.pop();
|
|
78
|
-
return next ?? false;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
private insertSequenceById(id: string) {
|
|
82
|
-
const seq = this.data.pageSequences?.find((s) => s.id === id);
|
|
83
|
-
if (seq) {
|
|
84
|
-
this.nextQue.insertAsNextByForce([...seq.pages]);
|
|
85
|
-
} else {
|
|
86
|
-
// HOW TO HANDLE INVALID ID_REFS?? LOGGER??
|
|
87
|
-
// LOG INVALID COMMAND.
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Total number of pages left in que
|
|
93
|
-
*/
|
|
94
|
-
get pagesLeft(): number {
|
|
95
|
-
return this.nextQue.pageCount;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Total number of pages in test
|
|
100
|
-
*/
|
|
101
|
-
get totalPageCount(): number {
|
|
102
|
-
return this.data.pages.length;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
1
|
+
import { HistoryQue } from "./history-que";
|
|
2
|
+
import { RuleEngine } from "../rules/rule-engine";
|
|
3
|
+
import { NextQue } from "./next-que";
|
|
4
|
+
import { SchemaDto } from "./SchemaDto";
|
|
5
|
+
import { RuleActionPageQue } from "./page-que-ruleengine-action";
|
|
6
|
+
import { PageDto } from "../page/Page";
|
|
7
|
+
import { PageResult } from "../page/page-result";
|
|
8
|
+
import { Fact } from "../rules/fact";
|
|
9
|
+
import { MqEvent } from "../events/mq-events";
|
|
10
|
+
|
|
11
|
+
export type DPlayerData = Pick<SchemaDto, "pages" | "pageSequences" | "rules" | "predefinedFacts">;
|
|
12
|
+
export class DPlayer {
|
|
13
|
+
private readonly eventLog: Array<MqEvent> = [];
|
|
14
|
+
private history = new HistoryQue();
|
|
15
|
+
private ruleEngine = new RuleEngine<RuleActionPageQue, never>();
|
|
16
|
+
private nextQue = new NextQue();
|
|
17
|
+
private data: DPlayerData;
|
|
18
|
+
private readonly predefinedFacts: ReadonlyArray<Fact>;
|
|
19
|
+
|
|
20
|
+
constructor(data: DPlayerData) {
|
|
21
|
+
this.data = data;
|
|
22
|
+
const pages = data.pages ?? [];
|
|
23
|
+
this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];
|
|
24
|
+
this.nextQue.resetQue(pages);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
saveEvent(event: MqEvent) {
|
|
28
|
+
this.eventLog.push(event);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
saveHistory(pageHistory: PageResult) {
|
|
32
|
+
// console.log("SAVE HISTORY", pageHistory);
|
|
33
|
+
this.history.addToHistory(pageHistory);
|
|
34
|
+
this.eventLog.push(...pageHistory.eventLog);
|
|
35
|
+
// Evaluate rules
|
|
36
|
+
const userGeneratedFact = this.history.getFacts();
|
|
37
|
+
const predefinedFacts = this.predefinedFacts;
|
|
38
|
+
const facts = [...userGeneratedFact, ...predefinedFacts];
|
|
39
|
+
const result = this.ruleEngine.solveAll(this.data.rules, facts);
|
|
40
|
+
|
|
41
|
+
const matchingRules = result.matching;
|
|
42
|
+
const actions = matchingRules.map((r) => r.actionList).flat(1);
|
|
43
|
+
// Execute actions
|
|
44
|
+
actions.forEach((a) => {
|
|
45
|
+
// console.log(a.payload);
|
|
46
|
+
switch (a.kind) {
|
|
47
|
+
case "jumpToPage":
|
|
48
|
+
this.nextQue.jumpToPageById(a.pageId);
|
|
49
|
+
break;
|
|
50
|
+
case "excludeByPageId":
|
|
51
|
+
this.nextQue.removeByPageId(a.pageIds);
|
|
52
|
+
break;
|
|
53
|
+
case "excludeByTag":
|
|
54
|
+
this.nextQue.removeByTag(a.tagIds);
|
|
55
|
+
break;
|
|
56
|
+
default:
|
|
57
|
+
console.log("UNKNOWN ACTION", a);
|
|
58
|
+
const check: never = a;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
getResults() {
|
|
64
|
+
const pagesLeft = this.nextQue.size;
|
|
65
|
+
const answerFacts = this.history.getFacts();
|
|
66
|
+
const predefinedFacts = this.predefinedFacts;
|
|
67
|
+
const eventLog = [...this.eventLog];
|
|
68
|
+
console.log(answerFacts);
|
|
69
|
+
return { answerFacts, predefinedFacts, eventLog, pagesLeft };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
insertSequence(sequenceId: string) {
|
|
73
|
+
this.insertSequenceById(sequenceId);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
getNextPage(): PageDto | false {
|
|
77
|
+
const next = this.nextQue.pop();
|
|
78
|
+
return next ?? false;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private insertSequenceById(id: string) {
|
|
82
|
+
const seq = this.data.pageSequences?.find((s) => s.id === id);
|
|
83
|
+
if (seq) {
|
|
84
|
+
this.nextQue.insertAsNextByForce([...seq.pages]);
|
|
85
|
+
} else {
|
|
86
|
+
// HOW TO HANDLE INVALID ID_REFS?? LOGGER??
|
|
87
|
+
// LOG INVALID COMMAND.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Total number of pages left in que
|
|
93
|
+
*/
|
|
94
|
+
get pagesLeft(): number {
|
|
95
|
+
return this.nextQue.pageCount;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Total number of pages in test
|
|
100
|
+
*/
|
|
101
|
+
get totalPageCount(): number {
|
|
102
|
+
return this.data.pages.length;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
import { HistoryQue } from "./history-que";
|
|
2
|
-
import { DTimestamp } from "../common/DTimestamp";
|
|
3
|
-
import { PageID } from "../utils/ID";
|
|
4
|
-
import { PageDto } from "../page/Page";
|
|
5
|
-
import { PageResult } from "../page/page-result";
|
|
6
|
-
|
|
7
|
-
const p = (id: number): PageDto => {
|
|
8
|
-
return {
|
|
9
|
-
id: PageID.create(),
|
|
10
|
-
prefix: "prefix" + id,
|
|
11
|
-
components: [],
|
|
12
|
-
initialTasks: [],
|
|
13
|
-
staticElements: [],
|
|
14
|
-
background: "",
|
|
15
|
-
tags: [],
|
|
16
|
-
};
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const pageResult = (id: number, value: number): PageResult => {
|
|
20
|
-
const pageEntered = DTimestamp.now();
|
|
21
|
-
const pageExited = DTimestamp.addMills(pageEntered, 1000);
|
|
22
|
-
const pageTime = DTimestamp.diff(pageEntered, pageExited);
|
|
23
|
-
|
|
24
|
-
const result: PageResult = {
|
|
25
|
-
pageId: "_dummyId" + id,
|
|
26
|
-
pagePrefix: "prefix" + id,
|
|
27
|
-
eventLog: [],
|
|
28
|
-
pageTime,
|
|
29
|
-
collectedFacts: [
|
|
30
|
-
{
|
|
31
|
-
referenceId: "" + id,
|
|
32
|
-
referenceLabel: "label-for-" + id,
|
|
33
|
-
value,
|
|
34
|
-
label: "value-label " + value,
|
|
35
|
-
kind: "numeric-fact",
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
};
|
|
39
|
-
return result;
|
|
40
|
-
};
|
|
41
|
-
// const h = (page: PageDto, answeredQuestions: AnsweredQuestion[]): PageResult => ({
|
|
42
|
-
// pageId: page.id,
|
|
43
|
-
// answeredQuestions,
|
|
44
|
-
// });
|
|
45
|
-
const p1 = p(1);
|
|
46
|
-
const p2 = p(2);
|
|
47
|
-
const p3 = p(3);
|
|
48
|
-
const p4 = p(4);
|
|
49
|
-
const p5 = p(5);
|
|
50
|
-
const p6 = p(6);
|
|
51
|
-
const all = [p1, p2, p3, p4, p5, p6];
|
|
52
|
-
|
|
53
|
-
let history = new HistoryQue();
|
|
54
|
-
beforeEach(() => {
|
|
55
|
-
history = new HistoryQue();
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
describe("HistoryQue", () => {
|
|
59
|
-
it("should create an instance", () => {
|
|
60
|
-
expect(history).toBeTruthy();
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("Can add history, and get facts back", () => {
|
|
64
|
-
history.addToHistory(pageResult(1, 2));
|
|
65
|
-
expect(history.getFacts().length).toBe(1);
|
|
66
|
-
});
|
|
67
|
-
});
|
|
1
|
+
import { HistoryQue } from "./history-que";
|
|
2
|
+
import { DTimestamp } from "../common/DTimestamp";
|
|
3
|
+
import { PageID } from "../utils/ID";
|
|
4
|
+
import { PageDto } from "../page/Page";
|
|
5
|
+
import { PageResult } from "../page/page-result";
|
|
6
|
+
|
|
7
|
+
const p = (id: number): PageDto => {
|
|
8
|
+
return {
|
|
9
|
+
id: PageID.create(),
|
|
10
|
+
prefix: "prefix" + id,
|
|
11
|
+
components: [],
|
|
12
|
+
initialTasks: [],
|
|
13
|
+
staticElements: [],
|
|
14
|
+
background: "",
|
|
15
|
+
tags: [],
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const pageResult = (id: number, value: number): PageResult => {
|
|
20
|
+
const pageEntered = DTimestamp.now();
|
|
21
|
+
const pageExited = DTimestamp.addMills(pageEntered, 1000);
|
|
22
|
+
const pageTime = DTimestamp.diff(pageEntered, pageExited);
|
|
23
|
+
|
|
24
|
+
const result: PageResult = {
|
|
25
|
+
pageId: "_dummyId" + id,
|
|
26
|
+
pagePrefix: "prefix" + id,
|
|
27
|
+
eventLog: [],
|
|
28
|
+
pageTime,
|
|
29
|
+
collectedFacts: [
|
|
30
|
+
{
|
|
31
|
+
referenceId: "" + id,
|
|
32
|
+
referenceLabel: "label-for-" + id,
|
|
33
|
+
value,
|
|
34
|
+
label: "value-label " + value,
|
|
35
|
+
kind: "numeric-fact",
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
// const h = (page: PageDto, answeredQuestions: AnsweredQuestion[]): PageResult => ({
|
|
42
|
+
// pageId: page.id,
|
|
43
|
+
// answeredQuestions,
|
|
44
|
+
// });
|
|
45
|
+
const p1 = p(1);
|
|
46
|
+
const p2 = p(2);
|
|
47
|
+
const p3 = p(3);
|
|
48
|
+
const p4 = p(4);
|
|
49
|
+
const p5 = p(5);
|
|
50
|
+
const p6 = p(6);
|
|
51
|
+
const all = [p1, p2, p3, p4, p5, p6];
|
|
52
|
+
|
|
53
|
+
let history = new HistoryQue();
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
history = new HistoryQue();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe("HistoryQue", () => {
|
|
59
|
+
it("should create an instance", () => {
|
|
60
|
+
expect(history).toBeTruthy();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("Can add history, and get facts back", () => {
|
|
64
|
+
history.addToHistory(pageResult(1, 2));
|
|
65
|
+
expect(history.getFacts().length).toBe(1);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { Fact } from "../rules/fact";
|
|
2
|
-
import { PageResult } from "../page/page-result";
|
|
3
|
-
|
|
4
|
-
export class HistoryQue {
|
|
5
|
-
private history: PageResult[] = [];
|
|
6
|
-
|
|
7
|
-
getFacts(): Array<Fact> {
|
|
8
|
-
const answers = this.history.map((h) => h.collectedFacts).flat(1);
|
|
9
|
-
// const facts = answers.map((a) => a.fact);
|
|
10
|
-
// TODO FIND LATEST FACT (answer) if have multiple.
|
|
11
|
-
return answers;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
addToHistory(result: PageResult) {
|
|
15
|
-
this.history.push(result);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
1
|
+
import { Fact } from "../rules/fact";
|
|
2
|
+
import { PageResult } from "../page/page-result";
|
|
3
|
+
|
|
4
|
+
export class HistoryQue {
|
|
5
|
+
private history: PageResult[] = [];
|
|
6
|
+
|
|
7
|
+
getFacts(): Array<Fact> {
|
|
8
|
+
const answers = this.history.map((h) => h.collectedFacts).flat(1);
|
|
9
|
+
// const facts = answers.map((a) => a.fact);
|
|
10
|
+
// TODO FIND LATEST FACT (answer) if have multiple.
|
|
11
|
+
return answers;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
addToHistory(result: PageResult) {
|
|
15
|
+
this.history.push(result);
|
|
16
|
+
}
|
|
17
|
+
}
|