@media-quest/builder 0.0.38 → 0.0.40

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 (41) hide show
  1. package/dist/public-api.d.ts +82 -99
  2. package/dist/public-api.js +36 -101
  3. package/dist/public-api.js.map +1 -1
  4. package/package.json +29 -29
  5. package/src/{theme → ARKIV}/button-bar/button-text-utils.ts +233 -233
  6. package/src/{theme → ARKIV}/button-bar/text-utils.spec.ts +105 -105
  7. package/src/Builder-option.ts +78 -62
  8. package/src/Builder-question.ts +98 -98
  9. package/src/Builder-schema.spec.ts +348 -348
  10. package/src/Builder-schema.ts +308 -306
  11. package/src/builder-compiler.ts +14 -20
  12. package/src/code-book/codebook-variable.ts +27 -27
  13. package/src/code-book/codebook.ts +89 -89
  14. package/src/media-files.ts +28 -32
  15. package/src/page/Builder-page-collection.spec.ts +219 -219
  16. package/src/page/Builder-page-collection.ts +129 -129
  17. package/src/page/Builder-page.spec.ts +177 -177
  18. package/src/page/Builder-page.ts +250 -250
  19. package/src/primitives/ID.ts +135 -135
  20. package/src/public-api.ts +29 -30
  21. package/src/rulebuilder/RuleAction.ts +105 -105
  22. package/src/schema-config.ts +25 -26
  23. package/src/sum-score/sum-score-variable-collection.spec.ts +68 -68
  24. package/src/sum-score/sum-score-variable-collection.ts +101 -101
  25. package/src/sum-score/sum-score-variable.ts +0 -1
  26. package/src/sum-score/sum-score.ts +166 -167
  27. package/src/tag/BuilderTag.ts +45 -45
  28. package/src/tag/Tag-Collection.ts +53 -53
  29. package/src/theme/Default-theme.ts +173 -188
  30. package/src/theme/IDefault-theme.ts +125 -125
  31. package/src/theme/ThemeCompiler.ts +10 -11
  32. package/src/theme/default-theme-compiler.spec.ts +31 -31
  33. package/src/theme/default-theme-compiler.ts +655 -652
  34. package/src/theme/icon-urls.ts +29 -29
  35. package/src/theme/icons.ts +117 -117
  36. package/src/theme/theme-utils.spec.ts +52 -52
  37. package/src/theme/theme-utils.ts +56 -56
  38. package/src/theme/theme2.ts +388 -386
  39. package/tsconfig.json +19 -19
  40. package/src/Builder-schema-dto.spec.ts +0 -155
  41. package/src/Builder-schema-dto.ts +0 -86
@@ -1,348 +1,348 @@
1
- import { BuilderSchema } from "./Builder-schema";
2
- import { BuilderPage } from "./page/Builder-page";
3
- import type { BuilderTagDto } from "./tag/BuilderTag";
4
- import { BuilderTag } from "./tag/BuilderTag";
5
- import { PagePrefix } from "./primitives/page-prefix";
6
- import { SchemaPrefix } from "./primitives/schema-prefix";
7
-
8
- import { SumScoreVariableDto } from "./sum-score/sum-score-variable";
9
- import { OptionID, PageID, QuestionID, SchemaID, SumScoreVariableID } from "./primitives/ID";
10
- import { BuilderSchemaDto } from "./Builder-schema-dto";
11
-
12
- const tag1: BuilderTagDto = BuilderTag.create("tag1", "This tag is defined in schemaDto1").toJson();
13
-
14
- const tag2: BuilderTagDto = BuilderTag.create("tag2", "This tag is defined in schemaDto1").toJson();
15
- const tag3: BuilderTagDto = BuilderTag.create("tag3", "This tag is defined in schemaDto1").toJson();
16
-
17
- const schemaDto1: BuilderSchemaDto = {
18
- backgroundColor: "gray",
19
- baseHeight: 1200,
20
- baseWidth: 1022,
21
- mainImage: false,
22
- id: SchemaID.create(),
23
- name: "dto1-name",
24
- tags: [tag1, tag2, tag3],
25
- sumScoreVariables: [
26
- {
27
- id: SumScoreVariableID.dummy.a,
28
- name: "label for dummy sum-score",
29
- description: "testId",
30
- useAvg: false,
31
- // basedOn: [],
32
- },
33
- ],
34
- pages: [
35
- {
36
- id: PageID.validateOrCreate("a".repeat(24)),
37
- _type: "info-page",
38
- includedInSumScores: [],
39
- prefix: PagePrefix.fromStringOrThrow("p1"),
40
- mainText: {
41
- text: "hello from test",
42
- autoplay: false,
43
- autoplayDelay: 0,
44
- audioFile: false,
45
- },
46
-
47
- nextButton: {
48
- id: "next-button-text-id" as OptionID,
49
- label: "Neste",
50
- value: -1,
51
- },
52
- defaultQuestion: {
53
- id: QuestionID.create(),
54
- prefix: "one-prefix",
55
- _type: "select-one",
56
- text: "q1-text",
57
- options: [
58
- {
59
- id: "opt-nei" as OptionID,
60
- value: 0,
61
- label: "Nei",
62
- },
63
- {
64
- id: "opt-ja" as OptionID,
65
- value: 1,
66
- label: "Ja",
67
- },
68
- {
69
- id: "opt-vet-ikke" as OptionID,
70
- value: 9,
71
- label: "Vet ikke",
72
- },
73
- ],
74
- },
75
- tags: [
76
- tag1.tag,
77
- tag2.tag,
78
- // { tag: 'can_read', description: 'The patient can read' },
79
- // { tag: 'is grown up', description: 'Is grownUp.' }
80
- ],
81
- autoplaySequence: [],
82
- },
83
- {
84
- id: PageID.dummy.b,
85
- _type: "question",
86
- prefix: PagePrefix.fromStringOrThrow("page2-prefix"),
87
- tags: [tag3.tag],
88
- includedInSumScores: [],
89
- mainText: {
90
- text: "hello from test",
91
- autoplay: false,
92
- autoplayDelay: 0,
93
- audioFile: false,
94
- },
95
- nextButton: {
96
- id: "next-button-id-page2" as OptionID,
97
- label: "Neste",
98
- value: -1,
99
- },
100
- defaultQuestion: {
101
- id: QuestionID.validateOrCreate("default-question-id"),
102
- prefix: "one-prefix",
103
- _type: "select-one",
104
- text: "q1",
105
- options: [],
106
- },
107
- autoplaySequence: [],
108
- },
109
- ],
110
- predefinedVariables: [],
111
- rules: [],
112
- prefix: SchemaPrefix.fromValueOrThrow("d1").value,
113
- };
114
-
115
- const SCHEMA_ID = SchemaID.create();
116
- const SCHEMA_PREFIX_A = SchemaPrefix.castOrCreateRandom("a").value;
117
- let s1 = BuilderSchema.create(SCHEMA_ID, "test-name", SCHEMA_PREFIX_A);
118
-
119
- beforeEach(() => {
120
- s1 = BuilderSchema.create(SCHEMA_ID, "test-name", SCHEMA_PREFIX_A);
121
- });
122
-
123
- describe("Builder schema", () => {
124
- test("Can add pages.", () => {
125
- s1.addPage("question");
126
- s1.addPage("info-page");
127
- expect(s1.pages.length).toBe(2);
128
- const dto = s1.compile().schema;
129
- expect(dto.pages.length).toBe(2);
130
- expect(dto.id).toBe(s1.id);
131
- expect(dto.baseHeight).toBe(s1.baseHeight);
132
- expect(dto.baseWidth).toBe(s1.baseWidth);
133
- expect(dto.backgroundColor).toBe(s1.backgroundColor);
134
- });
135
-
136
- test("Can delete page by passing reference", () => {
137
- const p1 = s1.addPage("question");
138
- const p2 = s1.addPage("question");
139
- const p3 = s1.addPage("info-page");
140
- expect(s1.pages.length).toBe(3);
141
- const result = s1.deletePage(p1);
142
- expect(s1.pages.length).toBe(2);
143
- expect(result).toBe(true);
144
- const result2 = s1.deletePage(p2);
145
- expect(result2).toBe(true);
146
- expect(s1.pages.length).toBe(1);
147
- expect(s1.pages[0]).toBe(p3);
148
- const result3 = s1.deletePage(p2);
149
- expect(result3).toBe(false);
150
- const result4 = s1.deletePage(p3);
151
- expect(result4).toBe(true);
152
- });
153
-
154
- test("Can create Schema from dto", () => {
155
- const s = BuilderSchema.fromJson(schemaDto1);
156
- expect(s.id).toBe(schemaDto1.id);
157
- expect(s.prefix.value).toBe(schemaDto1.prefix);
158
- expect(s.baseHeight).toBe(schemaDto1.baseHeight);
159
- expect(s.baseWidth).toBe(schemaDto1.baseWidth);
160
- expect(s.backgroundColor).toBe(schemaDto1.backgroundColor);
161
- expect(s.pages.length).toBe(schemaDto1.pages.length);
162
- const p1Dto = schemaDto1.pages[0];
163
- expect(s.pages[0].id).toBe(p1Dto.id);
164
- const defaultQuestion = s.pages[0].defaultQuestion;
165
- expect(defaultQuestion).toBeDefined();
166
- expect(defaultQuestion.id).toBe(p1Dto.defaultQuestion.id);
167
- expect(defaultQuestion.options.length).toBe(p1Dto.defaultQuestion.options.length);
168
- const options = defaultQuestion.options;
169
- const nei = options[0];
170
- const ja = options[1];
171
- const vetIkke = options[2];
172
- expect(nei.label).toBe("Nei");
173
- expect(ja.label).toBe("Ja");
174
- expect(vetIkke.label).toBe("Vet ikke");
175
- expect(vetIkke.id).toBe(p1Dto.defaultQuestion.options[2].id);
176
- });
177
-
178
- test("fromJson === toJson", () => {
179
- const s = BuilderSchema.fromJson(schemaDto1);
180
- const json = s.toJson();
181
- expect(schemaDto1).toStrictEqual(json);
182
- });
183
-
184
- test("Can add page at concrete index", () => {
185
- const p1 = s1.addPage("question");
186
- expect(p1.pageType).toBe("question");
187
- const p2 = s1.addPage("info-page", 0);
188
- expect(p2.pageType).toBe("info-page");
189
- // const pages = s1.pages;
190
- expect(s1.pages[0].id).toBe(p2.id);
191
- s1.addPage("question");
192
- s1.addPage("question");
193
- const last = s1.addPage("question");
194
- expect(s1.pages[s1.pages.length - 1]).toBe(last);
195
- const p3 = s1.addPage("info-page", 4);
196
- expect(s1.pages[4].id).toBe(p3.id);
197
- });
198
-
199
- test("Can move page up and down", () => {
200
- const p1 = s1.addPage("question");
201
- const p2 = s1.addPage("question");
202
- const p3 = s1.addPage("question");
203
- const p4 = s1.addPage("info-page");
204
- const last = s1.addPage("question");
205
- s1.movePage(p2, 0);
206
- expect(s1.pages[0]).toBe(p2);
207
- expect(s1.pages[1]).toBe(p1);
208
- expect(s1.movePage(p4, 4)).toBeTruthy();
209
- expect(s1.movePage(p4, 5)).toBeFalsy();
210
- expect(s1.movePage(p4, 10)).toBeFalsy();
211
-
212
- // expect(pages[0].id).toBe(p4.id);
213
- });
214
-
215
- test("Can clone a page and insert at index", () => {
216
- const p1 = s1.addPage("question");
217
- const p2 = s1.addPage("question");
218
- const p3 = s1.addPage("question");
219
- const mainTextContent = "Hello from test";
220
- const p4 = s1.addPage("info-page");
221
- p3.mainText.text = mainTextContent;
222
- const p1Clone = BuilderPage.fromJson(p1.clone());
223
- const beforeLen = s1.pages.length;
224
- s1.insertPage(p1Clone, 2);
225
- const pages = s1.pages;
226
- expect(beforeLen + 1).toBe(pages.length);
227
- expect(pages[2]).toBe(p1Clone);
228
- });
229
-
230
- test("Will not insert a page that is already in array.", () => {
231
- const p1 = s1.addPage("question");
232
- const p2 = s1.addPage("question");
233
- const p3 = s1.addPage("question");
234
- const beforeLen = s1.pages.length;
235
- const result = s1.insertPage(p1, 0);
236
- const pages = s1.pages;
237
- expect(beforeLen).toBe(pages.length);
238
- expect(result).toBe(false);
239
- });
240
-
241
- test("Can generate a info-page", () => {
242
- const p1 = s1.addPage("info-page");
243
- const p2 = s1.addPage("question");
244
- p2.defaultQuestion.addOption("Ja", 1, 0);
245
- p2.defaultQuestion.addOption("Nei", 0);
246
- p1.nextButton.label = "Neste";
247
- s1.backgroundColor = "red";
248
- s1.baseHeight = 600;
249
- s1.baseWidth = 500;
250
- // builderSchema.prefix = "as";
251
- s1.name = "depressed";
252
- const schema = s1.compile().schema;
253
- expect(schema.backgroundColor).toBe("red");
254
- expect(schema.baseHeight).toBe(600);
255
- expect(schema.baseWidth).toBe(500);
256
- expect(schema.pages.length).toBe(2);
257
- const schemaP1 = schema.pages[0];
258
- const schemaP2 = schema.pages[1];
259
- expect(schemaP1.id).toBe(p1.id);
260
- expect(schemaP2.id).toBe(p2.id);
261
- // expect(schemaP1.elements.length).toBe(2);
262
-
263
- // Has Buttons
264
- const options = p2.defaultQuestion.options;
265
- // expect(schemaP2.elements.length).toBe(options.length + 1);
266
- });
267
- test("Can get ruleInput!", () => {
268
- const p0 = s1.addPage("info-page");
269
- // p0.prefix = "info_page_prefix_";
270
- const p1 = s1.addPage("question");
271
- // p1.prefix = "p1_prefix_";
272
- const p2 = s1.addPage("question");
273
- // p2.prefix = "p2_prefix_";
274
- p1.defaultQuestion.addOption("Ja", 1, 0);
275
- p1.defaultQuestion.addOption("Nei", 0, 0);
276
- p2.defaultQuestion.addOption("Ja", 1, 0);
277
- p2.defaultQuestion.addOption("Nei", 0);
278
- const ruleInput = s1.getRuleInput();
279
- expect(ruleInput.questionVars.length).toBe(2);
280
- expect(ruleInput.jumpToPageActions.length).toBe(3);
281
- // TODO add TAGS!!
282
- expect(ruleInput.excludeByTagActions.length).toBe(0);
283
- expect(ruleInput.excludeByPageIdActions.length).toBe(3);
284
- const allPageIds = new Set(ruleInput.jumpToPageActions.map((a) => a.pageId));
285
- expect(allPageIds.has(p0.id)).toBe(true);
286
- expect(allPageIds.has(p1.id)).toBe(true);
287
- expect(allPageIds.has(p2.id)).toBe(true);
288
- // ruleInput.questionVars.forEach((v) => {
289
- // expect(allPageIds.has(v.varId)).toBe(true);
290
- // });
291
- ruleInput.jumpToPageActions.forEach((v) => {
292
- expect(allPageIds.has(v.pageId)).toBe(true);
293
- });
294
- });
295
-
296
- test("Can add, update and delete sum-variable", () => {
297
- const ssv = (name: string) =>
298
- s1.sumScoreVariableCreate({ name, useAvg: true, description: "description for " + name });
299
-
300
- const v1 = ssv("v1");
301
- const v2 = ssv("v2");
302
- const v3 = ssv("v3");
303
- expect(s1.sumScoreVariables.length).toBe(3);
304
- s1.sumScoreVariableUpdate(v1.id, { name: "updatedName" });
305
- expect(s1.sumScoreVariables[0].name).toBe("updatedName");
306
- const success = s1.sumScoreVariableDelete(v2.id);
307
- expect(success).toBeTruthy();
308
- expect(s1.sumScoreVariables.length).toBe(2);
309
- const failure = s1.sumScoreVariableDelete(SumScoreVariableID.create());
310
- expect(failure).toBeFalsy();
311
- // s1.sumScoreVariableDelete(v2.id);
312
- });
313
-
314
- test("When a sum-score updates, then the pages update as well", () => {
315
- const p1 = s1.addPage("question");
316
- const v1 = s1.sumScoreVariableCreate({
317
- name: "v1",
318
- useAvg: true,
319
- description: "description for v1",
320
- });
321
- expect(s1.sumScoreVariables.length).toBe(1);
322
- expect(s1.pages.length).toBe(1);
323
- const success = s1.sumScoreVariableAddToPage(v1, p1, 1);
324
- expect(success).toBe(true);
325
- expect(p1.includedInSumScores.length).toBe(1);
326
- const updateSuccess = s1.sumScoreVariableUpdate(v1.id, {
327
- name: "updated_name",
328
- description: "updated_description",
329
- useAvg: !v1.useAvg,
330
- });
331
- expect(updateSuccess).toBe(true);
332
- expect(p1.includedInSumScores[0].name).toBe("updated_name");
333
- expect(p1.includedInSumScores[0].description).toBe("updated_description");
334
- });
335
-
336
- test("When a sum-score is deleted, then pages will delete from included in sum-scores.", () => {
337
- const p1 = s1.addPage("question");
338
- const v1 = s1.sumScoreVariableCreate({
339
- name: "v1",
340
- useAvg: true,
341
- description: "description for v1",
342
- });
343
- const success = s1.sumScoreVariableAddToPage(v1, p1, 1);
344
- expect(success).toBe(true);
345
- s1.sumScoreVariableDelete(v1.id);
346
- expect(p1.includedInSumScores.length).toBe(0);
347
- });
348
- });
1
+ import type { BuilderSchemaDto } from "./Builder-schema";
2
+ import { BuilderSchema } from "./Builder-schema";
3
+ import { BuilderPage } from "./page/Builder-page";
4
+ import type { BuilderTagDto } from "./tag/BuilderTag";
5
+ import { BuilderTag } from "./tag/BuilderTag";
6
+ import { PagePrefix } from "./primitives/page-prefix";
7
+ import { SchemaPrefix } from "./primitives/schema-prefix";
8
+
9
+ import { SumScoreVariableDto } from "./sum-score/sum-score-variable";
10
+ import { OptionID, PageID, QuestionID, SchemaID, SumScoreVariableID } from "./primitives/ID";
11
+
12
+ const tag1: BuilderTagDto = BuilderTag.create("tag1", "This tag is defined in schemaDto1").toJson();
13
+
14
+ const tag2: BuilderTagDto = BuilderTag.create("tag2", "This tag is defined in schemaDto1").toJson();
15
+ const tag3: BuilderTagDto = BuilderTag.create("tag3", "This tag is defined in schemaDto1").toJson();
16
+
17
+ const schemaDto1: BuilderSchemaDto = {
18
+ backgroundColor: "gray",
19
+ baseHeight: 1200,
20
+ baseWidth: 1022,
21
+ mainImage: false,
22
+ id: SchemaID.create(),
23
+ name: "dto1-name",
24
+ tags: [tag1, tag2, tag3],
25
+ sumScoreVariables: [
26
+ {
27
+ id: SumScoreVariableID.dummy.a,
28
+ name: "label for dummy sum-score",
29
+ description: "testId",
30
+ useAvg: false,
31
+ // basedOn: [],
32
+ },
33
+ ],
34
+ pages: [
35
+ {
36
+ id: PageID.validateOrCreate("a".repeat(24)),
37
+ _type: "info-page",
38
+ includedInSumScores: [],
39
+ prefix: PagePrefix.fromStringOrThrow("p1"),
40
+ mainText: {
41
+ text: "hello from test",
42
+ autoplay: false,
43
+ autoplayDelay: 0,
44
+ audioFile: false,
45
+ },
46
+
47
+ nextButton: {
48
+ id: "next-button-text-id" as OptionID,
49
+ label: "Neste",
50
+ value: -1,
51
+ },
52
+ defaultQuestion: {
53
+ id: QuestionID.create(),
54
+ prefix: "one-prefix",
55
+ _type: "select-one",
56
+ text: "q1-text",
57
+ options: [
58
+ {
59
+ id: "opt-nei" as OptionID,
60
+ value: 0,
61
+ label: "Nei",
62
+ },
63
+ {
64
+ id: "opt-ja" as OptionID,
65
+ value: 1,
66
+ label: "Ja",
67
+ },
68
+ {
69
+ id: "opt-vet-ikke" as OptionID,
70
+ value: 9,
71
+ label: "Vet ikke",
72
+ },
73
+ ],
74
+ },
75
+ tags: [
76
+ tag1.tag,
77
+ tag2.tag,
78
+ // { tag: 'can_read', description: 'The patient can read' },
79
+ // { tag: 'is grown up', description: 'Is grownUp.' }
80
+ ],
81
+ autoplaySequence: [],
82
+ },
83
+ {
84
+ id: PageID.dummy.b,
85
+ _type: "question",
86
+ prefix: PagePrefix.fromStringOrThrow("page2-prefix"),
87
+ tags: [tag3.tag],
88
+ includedInSumScores: [],
89
+ mainText: {
90
+ text: "hello from test",
91
+ autoplay: false,
92
+ autoplayDelay: 0,
93
+ audioFile: false,
94
+ },
95
+ nextButton: {
96
+ id: "next-button-id-page2" as OptionID,
97
+ label: "Neste",
98
+ value: -1,
99
+ },
100
+ defaultQuestion: {
101
+ id: QuestionID.validateOrCreate("default-question-id"),
102
+ prefix: "one-prefix",
103
+ _type: "select-one",
104
+ text: "q1",
105
+ options: [],
106
+ },
107
+ autoplaySequence: [],
108
+ },
109
+ ],
110
+ predefinedVariables: [],
111
+ rules: [],
112
+ prefix: SchemaPrefix.fromValueOrThrow("d1").value,
113
+ };
114
+
115
+ const SCHEMA_ID = SchemaID.create();
116
+ const SCHEMA_PREFIX_A = SchemaPrefix.castOrCreateRandom("a").value;
117
+ let s1 = BuilderSchema.create(SCHEMA_ID, "test-name", SCHEMA_PREFIX_A);
118
+
119
+ beforeEach(() => {
120
+ s1 = BuilderSchema.create(SCHEMA_ID, "test-name", SCHEMA_PREFIX_A);
121
+ });
122
+
123
+ describe("Builder schema", () => {
124
+ test("Can add pages.", () => {
125
+ s1.addPage("question");
126
+ s1.addPage("info-page");
127
+ expect(s1.pages.length).toBe(2);
128
+ const dto = s1.compile().schema;
129
+ expect(dto.pages.length).toBe(2);
130
+ expect(dto.id).toBe(s1.id);
131
+ expect(dto.baseHeight).toBe(s1.baseHeight);
132
+ expect(dto.baseWidth).toBe(s1.baseWidth);
133
+ expect(dto.backgroundColor).toBe(s1.backgroundColor);
134
+ });
135
+
136
+ test("Can delete page by passing reference", () => {
137
+ const p1 = s1.addPage("question");
138
+ const p2 = s1.addPage("question");
139
+ const p3 = s1.addPage("info-page");
140
+ expect(s1.pages.length).toBe(3);
141
+ const result = s1.deletePage(p1);
142
+ expect(s1.pages.length).toBe(2);
143
+ expect(result).toBe(true);
144
+ const result2 = s1.deletePage(p2);
145
+ expect(result2).toBe(true);
146
+ expect(s1.pages.length).toBe(1);
147
+ expect(s1.pages[0]).toBe(p3);
148
+ const result3 = s1.deletePage(p2);
149
+ expect(result3).toBe(false);
150
+ const result4 = s1.deletePage(p3);
151
+ expect(result4).toBe(true);
152
+ });
153
+
154
+ test("Can create Schema from dto", () => {
155
+ const s = BuilderSchema.fromJson(schemaDto1);
156
+ expect(s.id).toBe(schemaDto1.id);
157
+ expect(s.prefix.value).toBe(schemaDto1.prefix);
158
+ expect(s.baseHeight).toBe(schemaDto1.baseHeight);
159
+ expect(s.baseWidth).toBe(schemaDto1.baseWidth);
160
+ expect(s.backgroundColor).toBe(schemaDto1.backgroundColor);
161
+ expect(s.pages.length).toBe(schemaDto1.pages.length);
162
+ const p1Dto = schemaDto1.pages[0];
163
+ expect(s.pages[0].id).toBe(p1Dto.id);
164
+ const defaultQuestion = s.pages[0].defaultQuestion;
165
+ expect(defaultQuestion).toBeDefined();
166
+ expect(defaultQuestion.id).toBe(p1Dto.defaultQuestion.id);
167
+ expect(defaultQuestion.options.length).toBe(p1Dto.defaultQuestion.options.length);
168
+ const options = defaultQuestion.options;
169
+ const nei = options[0];
170
+ const ja = options[1];
171
+ const vetIkke = options[2];
172
+ expect(nei.label).toBe("Nei");
173
+ expect(ja.label).toBe("Ja");
174
+ expect(vetIkke.label).toBe("Vet ikke");
175
+ expect(vetIkke.id).toBe(p1Dto.defaultQuestion.options[2].id);
176
+ });
177
+
178
+ test("fromJson === toJson", () => {
179
+ const s = BuilderSchema.fromJson(schemaDto1);
180
+ const json = s.toJson();
181
+ expect(schemaDto1).toStrictEqual(json);
182
+ });
183
+
184
+ test("Can add page at concrete index", () => {
185
+ const p1 = s1.addPage("question");
186
+ expect(p1.pageType).toBe("question");
187
+ const p2 = s1.addPage("info-page", 0);
188
+ expect(p2.pageType).toBe("info-page");
189
+ // const pages = s1.pages;
190
+ expect(s1.pages[0].id).toBe(p2.id);
191
+ s1.addPage("question");
192
+ s1.addPage("question");
193
+ const last = s1.addPage("question");
194
+ expect(s1.pages[s1.pages.length - 1]).toBe(last);
195
+ const p3 = s1.addPage("info-page", 4);
196
+ expect(s1.pages[4].id).toBe(p3.id);
197
+ });
198
+
199
+ test("Can move page up and down", () => {
200
+ const p1 = s1.addPage("question");
201
+ const p2 = s1.addPage("question");
202
+ const p3 = s1.addPage("question");
203
+ const p4 = s1.addPage("info-page");
204
+ const last = s1.addPage("question");
205
+ s1.movePage(p2, 0);
206
+ expect(s1.pages[0]).toBe(p2);
207
+ expect(s1.pages[1]).toBe(p1);
208
+ expect(s1.movePage(p4, 4)).toBeTruthy();
209
+ expect(s1.movePage(p4, 5)).toBeFalsy();
210
+ expect(s1.movePage(p4, 10)).toBeFalsy();
211
+
212
+ // expect(pages[0].id).toBe(p4.id);
213
+ });
214
+
215
+ test("Can clone a page and insert at index", () => {
216
+ const p1 = s1.addPage("question");
217
+ const p2 = s1.addPage("question");
218
+ const p3 = s1.addPage("question");
219
+ const mainTextContent = "Hello from test";
220
+ const p4 = s1.addPage("info-page");
221
+ p3.mainText.text = mainTextContent;
222
+ const p1Clone = BuilderPage.fromJson(p1.clone());
223
+ const beforeLen = s1.pages.length;
224
+ s1.insertPage(p1Clone, 2);
225
+ const pages = s1.pages;
226
+ expect(beforeLen + 1).toBe(pages.length);
227
+ expect(pages[2]).toBe(p1Clone);
228
+ });
229
+
230
+ test("Will not insert a page that is already in array.", () => {
231
+ const p1 = s1.addPage("question");
232
+ const p2 = s1.addPage("question");
233
+ const p3 = s1.addPage("question");
234
+ const beforeLen = s1.pages.length;
235
+ const result = s1.insertPage(p1, 0);
236
+ const pages = s1.pages;
237
+ expect(beforeLen).toBe(pages.length);
238
+ expect(result).toBe(false);
239
+ });
240
+
241
+ test("Can generate a info-page", () => {
242
+ const p1 = s1.addPage("info-page");
243
+ const p2 = s1.addPage("question");
244
+ p2.defaultQuestion.addOption("Ja", 1, 0);
245
+ p2.defaultQuestion.addOption("Nei", 0);
246
+ p1.nextButton.label = "Neste";
247
+ s1.backgroundColor = "red";
248
+ s1.baseHeight = 600;
249
+ s1.baseWidth = 500;
250
+ // builderSchema.prefix = "as";
251
+ s1.name = "depressed";
252
+ const schema = s1.compile().schema;
253
+ expect(schema.backgroundColor).toBe("red");
254
+ expect(schema.baseHeight).toBe(600);
255
+ expect(schema.baseWidth).toBe(500);
256
+ expect(schema.pages.length).toBe(2);
257
+ const schemaP1 = schema.pages[0];
258
+ const schemaP2 = schema.pages[1];
259
+ expect(schemaP1.id).toBe(p1.id);
260
+ expect(schemaP2.id).toBe(p2.id);
261
+ // expect(schemaP1.elements.length).toBe(2);
262
+
263
+ // Has Buttons
264
+ const options = p2.defaultQuestion.options;
265
+ // expect(schemaP2.elements.length).toBe(options.length + 1);
266
+ });
267
+ test("Can get ruleInput!", () => {
268
+ const p0 = s1.addPage("info-page");
269
+ // p0.prefix = "info_page_prefix_";
270
+ const p1 = s1.addPage("question");
271
+ // p1.prefix = "p1_prefix_";
272
+ const p2 = s1.addPage("question");
273
+ // p2.prefix = "p2_prefix_";
274
+ p1.defaultQuestion.addOption("Ja", 1, 0);
275
+ p1.defaultQuestion.addOption("Nei", 0, 0);
276
+ p2.defaultQuestion.addOption("Ja", 1, 0);
277
+ p2.defaultQuestion.addOption("Nei", 0);
278
+ const ruleInput = s1.getRuleInput();
279
+ expect(ruleInput.questionVars.length).toBe(2);
280
+ expect(ruleInput.jumpToPageActions.length).toBe(3);
281
+ // TODO add TAGS!!
282
+ expect(ruleInput.excludeByTagActions.length).toBe(0);
283
+ expect(ruleInput.excludeByPageIdActions.length).toBe(3);
284
+ const allPageIds = new Set(ruleInput.jumpToPageActions.map((a) => a.pageId));
285
+ expect(allPageIds.has(p0.id)).toBe(true);
286
+ expect(allPageIds.has(p1.id)).toBe(true);
287
+ expect(allPageIds.has(p2.id)).toBe(true);
288
+ // ruleInput.questionVars.forEach((v) => {
289
+ // expect(allPageIds.has(v.varId)).toBe(true);
290
+ // });
291
+ ruleInput.jumpToPageActions.forEach((v) => {
292
+ expect(allPageIds.has(v.pageId)).toBe(true);
293
+ });
294
+ });
295
+
296
+ test("Can add, update and delete sum-variable", () => {
297
+ const ssv = (name: string) =>
298
+ s1.sumScoreVariableCreate({ name, useAvg: true, description: "description for " + name });
299
+
300
+ const v1 = ssv("v1");
301
+ const v2 = ssv("v2");
302
+ const v3 = ssv("v3");
303
+ expect(s1.sumScoreVariables.length).toBe(3);
304
+ s1.sumScoreVariableUpdate(v1.id, { name: "updatedName" });
305
+ expect(s1.sumScoreVariables[0].name).toBe("updatedName");
306
+ const success = s1.sumScoreVariableDelete(v2.id);
307
+ expect(success).toBeTruthy();
308
+ expect(s1.sumScoreVariables.length).toBe(2);
309
+ const failure = s1.sumScoreVariableDelete(SumScoreVariableID.create());
310
+ expect(failure).toBeFalsy();
311
+ // s1.sumScoreVariableDelete(v2.id);
312
+ });
313
+
314
+ test("When a sum-score updates, then the pages update as well", () => {
315
+ const p1 = s1.addPage("question");
316
+ const v1 = s1.sumScoreVariableCreate({
317
+ name: "v1",
318
+ useAvg: true,
319
+ description: "description for v1",
320
+ });
321
+ expect(s1.sumScoreVariables.length).toBe(1);
322
+ expect(s1.pages.length).toBe(1);
323
+ const success = s1.sumScoreVariableAddToPage(v1, p1, 1);
324
+ expect(success).toBe(true);
325
+ expect(p1.includedInSumScores.length).toBe(1);
326
+ const updateSuccess = s1.sumScoreVariableUpdate(v1.id, {
327
+ name: "updated_name",
328
+ description: "updated_description",
329
+ useAvg: !v1.useAvg,
330
+ });
331
+ expect(updateSuccess).toBe(true);
332
+ expect(p1.includedInSumScores[0].name).toBe("updated_name");
333
+ expect(p1.includedInSumScores[0].description).toBe("updated_description");
334
+ });
335
+
336
+ test("When a sum-score is deleted, then pages will delete from included in sum-scores.", () => {
337
+ const p1 = s1.addPage("question");
338
+ const v1 = s1.sumScoreVariableCreate({
339
+ name: "v1",
340
+ useAvg: true,
341
+ description: "description for v1",
342
+ });
343
+ const success = s1.sumScoreVariableAddToPage(v1, p1, 1);
344
+ expect(success).toBe(true);
345
+ s1.sumScoreVariableDelete(v1.id);
346
+ expect(p1.includedInSumScores.length).toBe(0);
347
+ });
348
+ });