@media-quest/builder 0.0.22 → 0.0.23

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 (56) hide show
  1. package/package.json +1 -1
  2. package/src/Builder-option.ts +66 -66
  3. package/src/Builder-page.spec.ts +320 -320
  4. package/src/Builder-page.ts +257 -257
  5. package/src/Builder-question.spec.ts +68 -68
  6. package/src/Builder-question.ts +101 -101
  7. package/src/Builder-schema.spec.ts +357 -306
  8. package/src/Builder-schema.ts +287 -254
  9. package/src/Builder-text.spec.ts +24 -24
  10. package/src/Builder-text.ts +57 -57
  11. package/src/BuilderMainImageDto.ts +7 -7
  12. package/src/BuilderMainText.ts +81 -81
  13. package/src/BuilderMainVideoDto.ts +10 -10
  14. package/src/BuilderObject.ts +61 -61
  15. package/src/BuilderTag.ts +97 -97
  16. package/src/builder-compiler.ts +14 -0
  17. package/src/codebook.ts +72 -72
  18. package/src/media-files.ts +28 -28
  19. package/src/primitives/page-prefix.ts +58 -58
  20. package/src/primitives/prefix.spec.ts +5 -5
  21. package/src/primitives/schema-prefix.ts +52 -52
  22. package/src/primitives/varID.ts +11 -11
  23. package/src/public-api.ts +3 -1
  24. package/src/rulebuilder/Builder-rule.spec.ts +322 -322
  25. package/src/rulebuilder/Builder-rule.ts +190 -190
  26. package/src/rulebuilder/RuleAction.ts +106 -106
  27. package/src/rulebuilder/RuleBuilder-test-utils.ts +316 -316
  28. package/src/rulebuilder/RuleInput.ts +44 -44
  29. package/src/rulebuilder/RuleVariable.ts +49 -49
  30. package/src/rulebuilder/SingleSelectItem.ts +135 -135
  31. package/src/rulebuilder/condition/Builder-condition-group.spec.ts +47 -47
  32. package/src/rulebuilder/condition/Builder-condition-group.ts +118 -118
  33. package/src/rulebuilder/condition/Builder-condition.spec.ts +195 -195
  34. package/src/rulebuilder/condition/Builder-condition.ts +208 -208
  35. package/src/rulebuilder/condition/Builder-operator.spec.ts +9 -9
  36. package/src/rulebuilder/condition/Builder-operator.ts +31 -31
  37. package/src/rulebuilder/index.ts +22 -22
  38. package/src/rulebuilder/jump-to-action-manager.ts +33 -33
  39. package/src/rulebuilder/multi-select-item.ts +73 -73
  40. package/src/rulebuilder/page-action-manager.ts +31 -31
  41. package/src/rulebuilder/rule2/Rule2.ts +211 -211
  42. package/src/rulebuilder/tag-action-manager.spec.ts +44 -44
  43. package/src/rulebuilder/tag-action-manager.ts +28 -28
  44. package/src/schema-config.ts +25 -25
  45. package/src/theme/AbstractThemeCompiler.ts +7 -7
  46. package/src/theme/IDefaultTheme.ts +226 -226
  47. package/src/theme/css-theme.ts +7 -7
  48. package/src/theme/default-theme-compiler.ts +358 -358
  49. package/src/theme/icon-urls.ts +29 -29
  50. package/src/theme/theme-utils.ts +57 -57
  51. package/src/theme/theme1.spec.ts +52 -52
  52. package/src/variable/mq-variable.spec.ts +91 -0
  53. package/src/{mq-variable.ts → variable/mq-variable.ts} +63 -61
  54. package/src/variable/sum-score-variable.ts +56 -0
  55. package/tsconfig.json +15 -15
  56. package/tsconfig.tsbuildinfo +1 -1
@@ -1,320 +1,320 @@
1
- import { BuilderPage } from "./Builder-page";
2
- import type { BuilderPageDto } from "./Builder-page";
3
- import type { BuilderQuestionDto } from "./Builder-question";
4
- import { BuilderQuestion } from "./Builder-question";
5
- import type { BuilderObjectId } from "./BuilderObject";
6
- import { DUtil, PageID } from "@media-quest/engine";
7
- import { PagePrefix } from "./primitives/page-prefix";
8
- import { SchemaPrefix } from "./primitives/schema-prefix";
9
-
10
- const U = DUtil;
11
- const deleteIdsFromPage = (page: BuilderPageDto) => {
12
- const deleteIdsFromQuestion = (q: BuilderQuestionDto) => {
13
- U.deleteProp(q, "id");
14
- q.options.forEach((o) => {
15
- U.deleteProp(o, "id");
16
- });
17
- };
18
- U.deleteProp(page, "id");
19
- page.questions.forEach(deleteIdsFromQuestion);
20
- deleteIdsFromQuestion(page.defaultQuestion);
21
- return page;
22
- };
23
-
24
- const pxx = PagePrefix.fromStringOrThrow("pxx");
25
- const questionPageDto: BuilderPageDto = {
26
- _type: "question",
27
- autoplaySequence: [],
28
- mainText: {
29
- text: "Velkommen til denne undersøkelsen.",
30
- audioFile: false,
31
- autoplayDelay: 0,
32
- autoplay: false,
33
- },
34
- tags: [],
35
-
36
- nextButton: {
37
- id: "next-button-id-5" as BuilderObjectId.QuestionOptionID,
38
- label: "Neste",
39
- value: -1,
40
- },
41
- defaultQuestion: {
42
- id: "q1" as BuilderObjectId.QuestionID,
43
- prefix: "q1",
44
- text: "sadf",
45
- options: [
46
- {
47
- id: "q1-opt1" as BuilderObjectId.QuestionOptionID,
48
- value: 0,
49
- label: "Nei",
50
- },
51
- {
52
- id: "q1-opt2" as BuilderObjectId.QuestionOptionID,
53
- value: 1,
54
- label: "Ja",
55
- },
56
- {
57
- id: "q1-opt3" as BuilderObjectId.QuestionOptionID,
58
- value: 9,
59
- label: "Vet ikke",
60
- },
61
- ],
62
- _type: "select-one",
63
- },
64
- // id: "p1" as BuilderObjectId.PageID,
65
- id: PageID.create(),
66
- prefix: PagePrefix.fromStringOrThrow("pxx"),
67
- questions: [],
68
- };
69
-
70
- const multiQuestionPageDto: BuilderPageDto = {
71
- _type: "multi-select",
72
- mainText: {
73
- text: "Velkommen til denne undersøkelsen.",
74
- audioFile: false,
75
- autoplay: false,
76
- autoplayDelay: 0,
77
- },
78
- autoplaySequence: [],
79
- defaultQuestion: {
80
- id: "q1" as BuilderObjectId.QuestionID,
81
- prefix: "",
82
- text: "",
83
- options: [],
84
- _type: "select-one",
85
- },
86
- tags: [],
87
- nextButton: {
88
- id: "next-button-id-3" as BuilderObjectId.QuestionOptionID,
89
- label: "Neste",
90
- value: -1,
91
- },
92
-
93
- id: PageID.create(),
94
- prefix: PagePrefix.fromStringOrThrow("pxx"),
95
- questions: [
96
- {
97
- id: "q3" as BuilderObjectId.QuestionID,
98
- prefix: "a",
99
- text: "har du..",
100
- _type: "select-one",
101
- // options: []
102
- options: [
103
- {
104
- id: "q3-opt1" as BuilderObjectId.QuestionOptionID,
105
- value: 0,
106
- label: "Nei",
107
- },
108
- {
109
- id: "q3-opt2" as BuilderObjectId.QuestionOptionID,
110
- value: 1,
111
- label: "Ja",
112
- },
113
- {
114
- id: "q3-opt3" as BuilderObjectId.QuestionOptionID,
115
- value: 9,
116
- label: "Vet ikke",
117
- },
118
- ],
119
- },
120
- {
121
- id: "q4" as BuilderObjectId.QuestionID,
122
- prefix: "a",
123
- text: "har du..",
124
- _type: "select-one",
125
- // options: []
126
- options: [
127
- {
128
- id: "q4-opt1" as BuilderObjectId.QuestionOptionID,
129
- value: 0,
130
- label: "Nei",
131
- },
132
- {
133
- id: "q4-opt2" as BuilderObjectId.QuestionOptionID,
134
- value: 1,
135
- label: "Ja",
136
- },
137
- {
138
- id: "q4-opt3" as BuilderObjectId.QuestionOptionID,
139
- value: 9,
140
- label: "Vet ikke",
141
- },
142
- ],
143
- },
144
- ],
145
- };
146
-
147
- let page = BuilderPage.create("info-page", PagePrefix.fromStringOrThrow("a"));
148
-
149
- beforeEach(() => {
150
- page = BuilderPage.create("info-page", PagePrefix.fromStringOrThrow("a"));
151
- });
152
-
153
- describe("Builder Page", () => {
154
- test("Can create page, and convert to json, and back", () => {
155
- const page1 = BuilderPage.fromJson(questionPageDto);
156
- const asJson = page1.toJson();
157
- expect(questionPageDto).toStrictEqual(asJson);
158
- const page2 = BuilderPage.fromJson(multiQuestionPageDto);
159
- const asJson2 = page2.toJson();
160
- expect(multiQuestionPageDto).toStrictEqual(asJson2);
161
- // expect(page1.prefix).toBe(pageDto.prefix);
162
- });
163
- test("Can change question type", () => {
164
- expect(page.questions.length).toBe(0);
165
- page.addQuestion("select-one");
166
- page.addQuestion("select-one");
167
- expect(page.questions.length).toBe(2);
168
- page.pageType = "question";
169
- expect(page.questions.length).toBe(0);
170
- });
171
- test("Can add and delete questions", () => {
172
- page.pageType = "multi-select";
173
- expect(page.questions.length).toBe(1);
174
- const q1 = page.addQuestion("select-one");
175
- const q2 = page.addQuestion("select-one");
176
- expect(page.questions.length).toBe(3);
177
- page.deleteQuestion(q1);
178
- expect(page.questions.length).toBe(2);
179
- page.deleteQuestion(q2);
180
- expect(page.questions.length).toBe(1);
181
- // page.pageType = 'question';
182
- // expect(page.questions.length).toBe(0);
183
- });
184
- test("Can add question at concrete index. ", () => {
185
- page.pageType = "multi-select";
186
- expect(page.questions.length).toBe(1);
187
- const q1 = page.addQuestion("select-one", 0);
188
- expect(page.questions[0].id).toBe(q1.id);
189
- const q2 = page.addQuestion("select-one", 1);
190
- expect(page.questions[1].id).toBe(q2.id);
191
- expect(page.questions.length).toBe(3);
192
- const q3 = page.addQuestion("email", 2);
193
- expect(page.questions[2]).toBe(q3);
194
- expect(q3.type).toBe("email");
195
- });
196
- test("Can clone a page and everything except id is equal ", () => {
197
- const page1 = BuilderPage.create("info-page", PagePrefix.fromStringOrThrow("as"));
198
- const clone1 = BuilderPage.fromJson(page1.clone());
199
- const page1Json = deleteIdsFromPage(page1.clone());
200
- const clone1Json = deleteIdsFromPage(page1.clone());
201
- expect(page1Json).toStrictEqual(clone1Json);
202
-
203
- const page2 = BuilderPage.fromJson(questionPageDto);
204
- const clone2 = BuilderPage.fromJson(page2.clone());
205
- const page2Json = deleteIdsFromPage(page2.toJson());
206
- const clone2Json = deleteIdsFromPage(clone2.toJson());
207
- expect(page2Json).toStrictEqual(clone2Json);
208
-
209
- const page3 = BuilderPage.fromJson(multiQuestionPageDto);
210
- const clone3 = BuilderPage.fromJson(page3.clone());
211
- const page3Json = deleteIdsFromPage(page3.toJson());
212
- const clone3Json = deleteIdsFromPage(clone3.toJson());
213
- expect(page3Json).toStrictEqual(clone3Json);
214
- });
215
- test("Can clone a page and no id is equal", () => {
216
- const page1 = BuilderPage.create("info-page", pxx);
217
- const clone1 = BuilderPage.fromJson(page1.clone());
218
- expect(page1.id).not.toBe(clone1.id);
219
-
220
- const testDtoIds = (dto: BuilderPageDto) => {
221
- const instance = BuilderPage.fromJson(dto);
222
- const clone = BuilderPage.fromJson(instance.clone());
223
- const p2QuestionIds = instance.questions.map((q) => q.id);
224
- const cloneQuestionIds = clone.questions.map((q) => q.id);
225
-
226
- // expect(instance.id).to.not.eq(clone.id);
227
- // expect(instance.defaultQuestion.id).to.not.eq(clone.defaultQuestion.id);
228
- expect(p2QuestionIds.length).toBe(cloneQuestionIds.length);
229
- p2QuestionIds.forEach((id, index) => {
230
- expect(id).not.toBe(cloneQuestionIds[index]);
231
- });
232
-
233
- instance.questions.forEach((q, qIndex) => {
234
- const cloneQ = clone.questions[qIndex];
235
- expect(cloneQ).toBeDefined();
236
- expect(q.id).not.toBe(cloneQ.id);
237
- q.options.forEach((op, opIndex) => {
238
- const cloneOp = cloneQ.options[opIndex];
239
- expect(cloneOp).toBeDefined();
240
- expect(op.id).not.toBe(cloneOp.id);
241
- });
242
- });
243
-
244
- // expect(p)
245
- };
246
- testDtoIds(questionPageDto);
247
- testDtoIds(multiQuestionPageDto);
248
- });
249
- test("Can insert a new Question at index", () => {
250
- const page1 = BuilderPage.create("form", pxx);
251
- const q1 = page1.addQuestion("select-one");
252
- const q2 = page1.addQuestion("select-many");
253
- expect(page1.questions.length).toBe(3);
254
- expect(page1.questions[1]).toBe(q1);
255
- const q1Clone = BuilderQuestion.fromJson(q1.clone());
256
- const result10 = page1.insertQuestion(q1Clone, 10);
257
- expect(result10).toBeFalsy();
258
- const result1 = page1.insertQuestion(q1Clone, 1);
259
- expect(result1).toBeTruthy();
260
- expect(page1.questions[1]).toBe(q1Clone);
261
- });
262
- test("Can not insert a duplicate question", () => {
263
- const page1 = BuilderPage.create("form", pxx);
264
- const q1 = page1.addQuestion("select-one");
265
- expect(page1.questions.length).toBe(2);
266
- expect(page1.questions[1]).toBe(q1);
267
- const result1 = page1.insertQuestion(q1, 0);
268
- expect(page1.questions.length).toBe(2);
269
- expect(result1).toBeFalsy();
270
- });
271
-
272
- test("Can move a question", () => {
273
- const page1 = BuilderPage.create("form", pxx);
274
- const q1 = page1.addQuestion("select-many");
275
- const q2 = page1.addQuestion("select-one");
276
- const q3 = page1.addQuestion("select-one");
277
- const q4 = page1.addQuestion("select-one");
278
- expect(page1.questions.length).toBe(5);
279
- const m1 = page1.moveQuestion(q1, 0);
280
- expect(page1.questions.length).toBe(5);
281
- expect(page1.questions[0]).toBe(q1);
282
- expect(m1).toBeTruthy();
283
- const illegalMove = page1.moveQuestion(q2, -1);
284
- expect(illegalMove).toBeFalsy();
285
- expect(page1.questions.length).toBe(5);
286
- const m3 = page1.moveQuestion(q4, 1);
287
- expect(m3).toBe(true);
288
- expect(page1.questions[1]).toBe(q4);
289
- });
290
-
291
- test("Can not move a question that is not in questions-array", () => {
292
- const prefix = PagePrefix.fromStringOrThrow("as1");
293
- const page1 = BuilderPage.create("form", prefix);
294
- const q1 = page1.addQuestion("select-many");
295
- const q2 = page1.addQuestion("select-one");
296
- expect(page1.questions.length).toBe(3);
297
- const newQuestion = BuilderQuestion.create("select-one");
298
- const m1 = page1.moveQuestion(newQuestion, 0);
299
- expect(page1.questions.length).toBe(3);
300
- expect(m1).toBe(false);
301
- });
302
- test("Can get all rule-variables.", () => {
303
- const prefix = PagePrefix.fromStringOrThrow("as1");
304
- const page = BuilderPage.create("question", prefix);
305
- page.mainText.text = "Hva heter du?";
306
- page.defaultQuestion.addOption("Ja", 1);
307
- page.defaultQuestion.addOption("Nei", 0);
308
- const shemaPrefix = SchemaPrefix.fromValueOrThrow("ax");
309
- const variables = page.getQuestionVariables(shemaPrefix, 1);
310
- const first = variables[0];
311
- expect(variables.length).toBe(1);
312
- expect(first.options.length).toBe(2);
313
- expect(first.options[0].value).toBe(1);
314
- expect(first.kind === "question-variable").toBe(true);
315
- // const newQuestion = BuilderQuestion.create('select-one');
316
- // const m1 = page1.moveQuestion(newQuestion, 0);
317
- // expect(page1.questions.length).toBe(3);
318
- // expect(m1).toBe(false);
319
- });
320
- });
1
+ import { BuilderPage } from "./Builder-page";
2
+ import type { BuilderPageDto } from "./Builder-page";
3
+ import type { BuilderQuestionDto } from "./Builder-question";
4
+ import { BuilderQuestion } from "./Builder-question";
5
+ import type { BuilderObjectId } from "./BuilderObject";
6
+ import { DUtil, PageID } from "@media-quest/engine";
7
+ import { PagePrefix } from "./primitives/page-prefix";
8
+ import { SchemaPrefix } from "./primitives/schema-prefix";
9
+
10
+ const U = DUtil;
11
+ const deleteIdsFromPage = (page: BuilderPageDto) => {
12
+ const deleteIdsFromQuestion = (q: BuilderQuestionDto) => {
13
+ U.deleteProp(q, "id");
14
+ q.options.forEach((o) => {
15
+ U.deleteProp(o, "id");
16
+ });
17
+ };
18
+ U.deleteProp(page, "id");
19
+ page.questions.forEach(deleteIdsFromQuestion);
20
+ deleteIdsFromQuestion(page.defaultQuestion);
21
+ return page;
22
+ };
23
+
24
+ const pxx = PagePrefix.fromStringOrThrow("pxx");
25
+ const questionPageDto: BuilderPageDto = {
26
+ _type: "question",
27
+ autoplaySequence: [],
28
+ mainText: {
29
+ text: "Velkommen til denne undersøkelsen.",
30
+ audioFile: false,
31
+ autoplayDelay: 0,
32
+ autoplay: false,
33
+ },
34
+ tags: [],
35
+
36
+ nextButton: {
37
+ id: "next-button-id-5" as BuilderObjectId.QuestionOptionID,
38
+ label: "Neste",
39
+ value: -1,
40
+ },
41
+ defaultQuestion: {
42
+ id: "q1" as BuilderObjectId.QuestionID,
43
+ prefix: "q1",
44
+ text: "sadf",
45
+ options: [
46
+ {
47
+ id: "q1-opt1" as BuilderObjectId.QuestionOptionID,
48
+ value: 0,
49
+ label: "Nei",
50
+ },
51
+ {
52
+ id: "q1-opt2" as BuilderObjectId.QuestionOptionID,
53
+ value: 1,
54
+ label: "Ja",
55
+ },
56
+ {
57
+ id: "q1-opt3" as BuilderObjectId.QuestionOptionID,
58
+ value: 9,
59
+ label: "Vet ikke",
60
+ },
61
+ ],
62
+ _type: "select-one",
63
+ },
64
+ // id: "p1" as BuilderObjectId.PageID,
65
+ id: PageID.create(),
66
+ prefix: PagePrefix.fromStringOrThrow("pxx"),
67
+ questions: [],
68
+ };
69
+
70
+ const multiQuestionPageDto: BuilderPageDto = {
71
+ _type: "multi-select",
72
+ mainText: {
73
+ text: "Velkommen til denne undersøkelsen.",
74
+ audioFile: false,
75
+ autoplay: false,
76
+ autoplayDelay: 0,
77
+ },
78
+ autoplaySequence: [],
79
+ defaultQuestion: {
80
+ id: "q1" as BuilderObjectId.QuestionID,
81
+ prefix: "",
82
+ text: "",
83
+ options: [],
84
+ _type: "select-one",
85
+ },
86
+ tags: [],
87
+ nextButton: {
88
+ id: "next-button-id-3" as BuilderObjectId.QuestionOptionID,
89
+ label: "Neste",
90
+ value: -1,
91
+ },
92
+
93
+ id: PageID.create(),
94
+ prefix: PagePrefix.fromStringOrThrow("pxx"),
95
+ questions: [
96
+ {
97
+ id: "q3" as BuilderObjectId.QuestionID,
98
+ prefix: "a",
99
+ text: "har du..",
100
+ _type: "select-one",
101
+ // options: []
102
+ options: [
103
+ {
104
+ id: "q3-opt1" as BuilderObjectId.QuestionOptionID,
105
+ value: 0,
106
+ label: "Nei",
107
+ },
108
+ {
109
+ id: "q3-opt2" as BuilderObjectId.QuestionOptionID,
110
+ value: 1,
111
+ label: "Ja",
112
+ },
113
+ {
114
+ id: "q3-opt3" as BuilderObjectId.QuestionOptionID,
115
+ value: 9,
116
+ label: "Vet ikke",
117
+ },
118
+ ],
119
+ },
120
+ {
121
+ id: "q4" as BuilderObjectId.QuestionID,
122
+ prefix: "a",
123
+ text: "har du..",
124
+ _type: "select-one",
125
+ // options: []
126
+ options: [
127
+ {
128
+ id: "q4-opt1" as BuilderObjectId.QuestionOptionID,
129
+ value: 0,
130
+ label: "Nei",
131
+ },
132
+ {
133
+ id: "q4-opt2" as BuilderObjectId.QuestionOptionID,
134
+ value: 1,
135
+ label: "Ja",
136
+ },
137
+ {
138
+ id: "q4-opt3" as BuilderObjectId.QuestionOptionID,
139
+ value: 9,
140
+ label: "Vet ikke",
141
+ },
142
+ ],
143
+ },
144
+ ],
145
+ };
146
+
147
+ let page = BuilderPage.create("info-page", PagePrefix.fromStringOrThrow("a"));
148
+
149
+ beforeEach(() => {
150
+ page = BuilderPage.create("info-page", PagePrefix.fromStringOrThrow("a"));
151
+ });
152
+
153
+ describe("Builder Page", () => {
154
+ test("Can create page, and convert to json, and back", () => {
155
+ const page1 = BuilderPage.fromJson(questionPageDto);
156
+ const asJson = page1.toJson();
157
+ expect(questionPageDto).toStrictEqual(asJson);
158
+ const page2 = BuilderPage.fromJson(multiQuestionPageDto);
159
+ const asJson2 = page2.toJson();
160
+ expect(multiQuestionPageDto).toStrictEqual(asJson2);
161
+ // expect(page1.prefix).toBe(pageDto.prefix);
162
+ });
163
+ test("Can change question type", () => {
164
+ expect(page.questions.length).toBe(0);
165
+ page.addQuestion("select-one");
166
+ page.addQuestion("select-one");
167
+ expect(page.questions.length).toBe(2);
168
+ page.pageType = "question";
169
+ expect(page.questions.length).toBe(0);
170
+ });
171
+ test("Can add and delete questions", () => {
172
+ page.pageType = "multi-select";
173
+ expect(page.questions.length).toBe(1);
174
+ const q1 = page.addQuestion("select-one");
175
+ const q2 = page.addQuestion("select-one");
176
+ expect(page.questions.length).toBe(3);
177
+ page.deleteQuestion(q1);
178
+ expect(page.questions.length).toBe(2);
179
+ page.deleteQuestion(q2);
180
+ expect(page.questions.length).toBe(1);
181
+ // page.pageType = 'question';
182
+ // expect(page.questions.length).toBe(0);
183
+ });
184
+ test("Can add question at concrete index. ", () => {
185
+ page.pageType = "multi-select";
186
+ expect(page.questions.length).toBe(1);
187
+ const q1 = page.addQuestion("select-one", 0);
188
+ expect(page.questions[0].id).toBe(q1.id);
189
+ const q2 = page.addQuestion("select-one", 1);
190
+ expect(page.questions[1].id).toBe(q2.id);
191
+ expect(page.questions.length).toBe(3);
192
+ const q3 = page.addQuestion("email", 2);
193
+ expect(page.questions[2]).toBe(q3);
194
+ expect(q3.type).toBe("email");
195
+ });
196
+ test("Can clone a page and everything except id is equal ", () => {
197
+ const page1 = BuilderPage.create("info-page", PagePrefix.fromStringOrThrow("as"));
198
+ const clone1 = BuilderPage.fromJson(page1.clone());
199
+ const page1Json = deleteIdsFromPage(page1.clone());
200
+ const clone1Json = deleteIdsFromPage(page1.clone());
201
+ expect(page1Json).toStrictEqual(clone1Json);
202
+
203
+ const page2 = BuilderPage.fromJson(questionPageDto);
204
+ const clone2 = BuilderPage.fromJson(page2.clone());
205
+ const page2Json = deleteIdsFromPage(page2.toJson());
206
+ const clone2Json = deleteIdsFromPage(clone2.toJson());
207
+ expect(page2Json).toStrictEqual(clone2Json);
208
+
209
+ const page3 = BuilderPage.fromJson(multiQuestionPageDto);
210
+ const clone3 = BuilderPage.fromJson(page3.clone());
211
+ const page3Json = deleteIdsFromPage(page3.toJson());
212
+ const clone3Json = deleteIdsFromPage(clone3.toJson());
213
+ expect(page3Json).toStrictEqual(clone3Json);
214
+ });
215
+ test("Can clone a page and no id is equal", () => {
216
+ const page1 = BuilderPage.create("info-page", pxx);
217
+ const clone1 = BuilderPage.fromJson(page1.clone());
218
+ expect(page1.id).not.toBe(clone1.id);
219
+
220
+ const testDtoIds = (dto: BuilderPageDto) => {
221
+ const instance = BuilderPage.fromJson(dto);
222
+ const clone = BuilderPage.fromJson(instance.clone());
223
+ const p2QuestionIds = instance.questions.map((q) => q.id);
224
+ const cloneQuestionIds = clone.questions.map((q) => q.id);
225
+
226
+ // expect(instance.id).to.not.eq(clone.id);
227
+ // expect(instance.defaultQuestion.id).to.not.eq(clone.defaultQuestion.id);
228
+ expect(p2QuestionIds.length).toBe(cloneQuestionIds.length);
229
+ p2QuestionIds.forEach((id, index) => {
230
+ expect(id).not.toBe(cloneQuestionIds[index]);
231
+ });
232
+
233
+ instance.questions.forEach((q, qIndex) => {
234
+ const cloneQ = clone.questions[qIndex];
235
+ expect(cloneQ).toBeDefined();
236
+ expect(q.id).not.toBe(cloneQ.id);
237
+ q.options.forEach((op, opIndex) => {
238
+ const cloneOp = cloneQ.options[opIndex];
239
+ expect(cloneOp).toBeDefined();
240
+ expect(op.id).not.toBe(cloneOp.id);
241
+ });
242
+ });
243
+
244
+ // expect(p)
245
+ };
246
+ testDtoIds(questionPageDto);
247
+ testDtoIds(multiQuestionPageDto);
248
+ });
249
+ test("Can insert a new Question at index", () => {
250
+ const page1 = BuilderPage.create("form", pxx);
251
+ const q1 = page1.addQuestion("select-one");
252
+ const q2 = page1.addQuestion("select-many");
253
+ expect(page1.questions.length).toBe(3);
254
+ expect(page1.questions[1]).toBe(q1);
255
+ const q1Clone = BuilderQuestion.fromJson(q1.clone());
256
+ const result10 = page1.insertQuestion(q1Clone, 10);
257
+ expect(result10).toBeFalsy();
258
+ const result1 = page1.insertQuestion(q1Clone, 1);
259
+ expect(result1).toBeTruthy();
260
+ expect(page1.questions[1]).toBe(q1Clone);
261
+ });
262
+ test("Can not insert a duplicate question", () => {
263
+ const page1 = BuilderPage.create("form", pxx);
264
+ const q1 = page1.addQuestion("select-one");
265
+ expect(page1.questions.length).toBe(2);
266
+ expect(page1.questions[1]).toBe(q1);
267
+ const result1 = page1.insertQuestion(q1, 0);
268
+ expect(page1.questions.length).toBe(2);
269
+ expect(result1).toBeFalsy();
270
+ });
271
+
272
+ test("Can move a question", () => {
273
+ const page1 = BuilderPage.create("form", pxx);
274
+ const q1 = page1.addQuestion("select-many");
275
+ const q2 = page1.addQuestion("select-one");
276
+ const q3 = page1.addQuestion("select-one");
277
+ const q4 = page1.addQuestion("select-one");
278
+ expect(page1.questions.length).toBe(5);
279
+ const m1 = page1.moveQuestion(q1, 0);
280
+ expect(page1.questions.length).toBe(5);
281
+ expect(page1.questions[0]).toBe(q1);
282
+ expect(m1).toBeTruthy();
283
+ const illegalMove = page1.moveQuestion(q2, -1);
284
+ expect(illegalMove).toBeFalsy();
285
+ expect(page1.questions.length).toBe(5);
286
+ const m3 = page1.moveQuestion(q4, 1);
287
+ expect(m3).toBe(true);
288
+ expect(page1.questions[1]).toBe(q4);
289
+ });
290
+
291
+ test("Can not move a question that is not in questions-array", () => {
292
+ const prefix = PagePrefix.fromStringOrThrow("as1");
293
+ const page1 = BuilderPage.create("form", prefix);
294
+ const q1 = page1.addQuestion("select-many");
295
+ const q2 = page1.addQuestion("select-one");
296
+ expect(page1.questions.length).toBe(3);
297
+ const newQuestion = BuilderQuestion.create("select-one");
298
+ const m1 = page1.moveQuestion(newQuestion, 0);
299
+ expect(page1.questions.length).toBe(3);
300
+ expect(m1).toBe(false);
301
+ });
302
+ test("Can get all rule-variables.", () => {
303
+ const prefix = PagePrefix.fromStringOrThrow("as1");
304
+ const page = BuilderPage.create("question", prefix);
305
+ page.mainText.text = "Hva heter du?";
306
+ page.defaultQuestion.addOption("Ja", 1);
307
+ page.defaultQuestion.addOption("Nei", 0);
308
+ const shemaPrefix = SchemaPrefix.fromValueOrThrow("ax");
309
+ const variables = page.getQuestionVariables(shemaPrefix, 1);
310
+ const first = variables[0];
311
+ expect(variables.length).toBe(1);
312
+ expect(first.options.length).toBe(2);
313
+ expect(first.options[0].value).toBe(1);
314
+ expect(first.kind === "question-variable").toBe(true);
315
+ // const newQuestion = BuilderQuestion.create('select-one');
316
+ // const m1 = page1.moveQuestion(newQuestion, 0);
317
+ // expect(page1.questions.length).toBe(3);
318
+ // expect(m1).toBe(false);
319
+ });
320
+ });