quizwitz-validator 0.1.1 → 0.3.0

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.
@@ -44,17 +44,18 @@
44
44
  "settingsFields": [
45
45
  {
46
46
  "key": "instantFeedback",
47
- "label": "Show the answer right after each question",
47
+ "label": "Reveal answers instantly",
48
48
  "type": "boolean",
49
49
  "target": "modeSettings",
50
50
  "default": false,
51
- "hint": "The answer appears on the question itself and the round moves on. No result screens: explanations and feedback attachments are not shown."
51
+ "hint": "Instead of saving the results for the end of the round, the correct answer appears on the question as soon as its time is up, and the round moves on. No result screens: explanations and feedback attachments are not shown."
52
52
  }
53
53
  ]
54
54
  },
55
55
  {
56
56
  "token": "commonthread",
57
57
  "name": "Common Thread",
58
+ "roundExplanation": "Find the common thread that links all answers to the following questions.",
58
59
  "guidance": "Normal questions whose answers share a hidden link. The last question asks for that link (\"What is the common thread?\") and always stays last, even with random order. All results are postponed; the last question's result is shown first, then the others.",
59
60
  "description": "All answers should share a common thread. Feedback of the last question is shown first, before all other feedback.",
60
61
  "category": "Regular",
@@ -71,10 +72,11 @@
71
72
  {
72
73
  "token": "multiquestion",
73
74
  "name": "Multiquestion",
74
- "guidance": "Questions come in groups of at most 4. A group is shown at once; each player picks one question of the group by its label and answers only that one, within one shared timer (the longest duration in the group). Give every question a short, distinct label and every group the same number of questions.",
75
+ "guidance": "Questions come in groups of at most 4. A group is shown at once; each player picks one question of the group by its label and answers only that one, within one shared timer (the longest duration in the group). Give every question a short, distinct label and every group the same number of questions. The group shares one screen: the pictures and videos of all its questions (before and during) are shown side by side before it, and only sounds play while it runs.",
75
76
  "description": "Players choose from a selection of multiple questions, each worth different point values.",
76
77
  "category": "Interactive",
77
78
  "questionList": "grouped",
79
+ "sharedQuestionScreen": true,
78
80
  "questionLabel": {
79
81
  "label": "Label",
80
82
  "hint": "Players tap this label to pick this question"
@@ -84,6 +86,75 @@
84
86
  "defaultScoringStrategy": "default",
85
87
  "limiters": [
86
88
  "all"
89
+ ],
90
+ "findings": [
91
+ {
92
+ "id": "group-size",
93
+ "rule": "groupSize",
94
+ "minPopulation": 3,
95
+ "message": "This group has {count} questions while the other groups have {expected}",
96
+ "messageSingle": "This group has 1 question while the other groups have {expected}",
97
+ "description": "Question group with more or fewer questions than the other groups"
98
+ },
99
+ {
100
+ "id": "group-position:points",
101
+ "rule": "groupPosition",
102
+ "setting": "points",
103
+ "minPopulation": 3,
104
+ "majority": 0.5,
105
+ "message": "Worth {value} points while question {position} of most other groups is worth {expected}",
106
+ "description": "Question worth different points than the same question in the other groups"
107
+ },
108
+ {
109
+ "id": "group-position:label",
110
+ "rule": "groupPosition",
111
+ "field": "label",
112
+ "minPopulation": 3,
113
+ "majority": 0.5,
114
+ "message": "Labelled \"{value}\" while question {position} of most other groups is labelled \"{expected}\"",
115
+ "description": "Question with a different label than the same question in the other groups"
116
+ }
117
+ ]
118
+ },
119
+ {
120
+ "token": "questiongroups",
121
+ "name": "Question groups",
122
+ "guidance": "Questions come in groups, asked one after another: first the group's attachment (a video or a sound clip, in the 'Show before the question group' slot of the group's first question) plays once, then every question of the group is asked as a normal question, in order. Use it for several questions about one clip. A group is drawn whole when the round asks a random selection. The option 'Play as a lightning round' postpones every result to the end of the round and keeps the countdown music running within a group.",
123
+ "description": "Questions come in groups: a group's attachment plays once, then its questions are asked one after another.",
124
+ "category": "Regular",
125
+ "questionList": "grouped",
126
+ "groupAttachments": true,
127
+ "allowedQuestionTypes": "*",
128
+ "allowedScoringStrategies": "*",
129
+ "defaultScoringStrategy": "default",
130
+ "limiters": [
131
+ "all",
132
+ "no-private-screens",
133
+ "no-screens"
134
+ ],
135
+ "settingsFields": [
136
+ {
137
+ "key": "lightning",
138
+ "label": "Play as a lightning round",
139
+ "type": "boolean",
140
+ "target": "modeSettings",
141
+ "default": false,
142
+ "postponesFeedback": true,
143
+ "hint": "Every result is shown at the end of the round, and the countdown music keeps running from one question of a group to the next; it stops when the group is done."
144
+ },
145
+ {
146
+ "key": "instantFeedback",
147
+ "label": "Reveal answers instantly",
148
+ "type": "boolean",
149
+ "target": "modeSettings",
150
+ "default": false,
151
+ "postponesFeedback": true,
152
+ "showWhen": {
153
+ "key": "lightning",
154
+ "equals": true
155
+ },
156
+ "hint": "Instead of saving the results for the end of the round, the correct answer appears on the question as soon as its time is up, and the round moves on. No result screens: explanations and feedback attachments are not shown."
157
+ }
87
158
  ]
88
159
  },
89
160
  {
@@ -744,7 +815,7 @@
744
815
  {
745
816
  "token": "imagemapquestion",
746
817
  "name": "Image Map Question",
747
- "guidance": "Players tap spots on an image; taps inside a target zone score. The image and its zones are set in the image-map editor; a map with only neutral zones can never be answered correctly. Give the players a picture large enough to tell the zones apart.",
818
+ "guidance": "Players tap spots on an image; taps inside a target zone score. The image and its zones are set in the image-map editor; the option texts only name the zones there and players never see them, so the question needs no answering instructions or coordinates. A map with only neutral zones can never be answered correctly. Give the players a picture large enough to tell the zones apart.",
748
819
  "description": "Players are presented with an image and must click on the correct position.",
749
820
  "icon": "ads_click",
750
821
  "addToRounds": "*",
@@ -880,6 +951,9 @@
880
951
  "limiters": [
881
952
  "all"
882
953
  ],
954
+ "unavailableSettings": [
955
+ "timeBasedScoring"
956
+ ],
883
957
  "answerModel": {
884
958
  "cardinality": "single",
885
959
  "correctness": "all",
@@ -992,7 +1066,9 @@
992
1066
  {
993
1067
  "token": "strike",
994
1068
  "name": "Strike",
995
- "guidance": "Each correct answer in a row climbs a level and adds a bonus per level; a wrong answer drops levels (see the strike round type).",
1069
+ "roundExplanation": "Answer consecutive questions correctly to reach higher levels and get bonus points.",
1070
+ "guidance": "Each correct answer in a row climbs a level and adds a bonus per level; a wrong answer drops levels (see the strike round type). The level ladder moves with every result, so a round scored this way shows each result right after its question and cannot play as a lightning round. In a question groups round the levels can start over with every group.",
1071
+ "immediateFeedback": true,
996
1072
  "settingsFields": [
997
1073
  {
998
1074
  "key": "bonusPerLevel",
@@ -1017,12 +1093,23 @@
1017
1093
  "target": "scoringStrategy",
1018
1094
  "default": 5,
1019
1095
  "min": 0
1096
+ },
1097
+ {
1098
+ "key": "resetLevelsPerGroup",
1099
+ "label": "Start every question group at level 1",
1100
+ "type": "boolean",
1101
+ "target": "scoringStrategy",
1102
+ "roundTypes": [
1103
+ "questiongroups"
1104
+ ],
1105
+ "hint": "Every player is back on level 1 when a new group of questions starts, so each group is a ladder of its own."
1020
1106
  }
1021
1107
  ]
1022
1108
  },
1023
1109
  {
1024
1110
  "token": "piece-of-pie",
1025
1111
  "name": "Piece of pie",
1112
+ "roundExplanation": "All available points are distributed among all players who answered the question correctly.",
1026
1113
  "guidance": "The question's points times the number of active players, shared equally among the players who answer correctly (see the pieceofpie round type).",
1027
1114
  "description": "All available points are distributed among all players who answered the question correctly."
1028
1115
  },
@@ -1075,6 +1162,7 @@
1075
1162
  {
1076
1163
  "token": "first-come-first-served",
1077
1164
  "name": "First come first served",
1165
+ "roundExplanation": "First players to answer correctly get more points.",
1078
1166
  "guidance": "Faster correct answers earn more: the fastest correct player gets the question's points, each next correct player 1/N less (N = number of players). Wrong answers earn nothing. Questions start without time-based scoring, which would count speed twice.",
1079
1167
  "description": "Faster correct answers earn more points.",
1080
1168
  "settingsFields": [
@@ -1221,15 +1309,6 @@
1221
1309
  "message": "Has {count} answer options while most of this round has {expected}",
1222
1310
  "description": "Different number of answer options than the rest of the round"
1223
1311
  },
1224
- {
1225
- "id": "group-size",
1226
- "rule": "groupSize",
1227
- "minPopulation": 3,
1228
- "questionList": "grouped",
1229
- "message": "This group has {count} questions while the other groups have {expected}",
1230
- "messageSingle": "This group has 1 question while the other groups have {expected}",
1231
- "description": "Question group with more or fewer questions than the other groups"
1232
- },
1233
1312
  {
1234
1313
  "id": "explanation-pair",
1235
1314
  "rule": "explanationPair",
@@ -1400,6 +1479,25 @@
1400
1479
  "questionList": "list",
1401
1480
  "message": "Most questions in this round have an attachment in \"{slot}\", this one does not",
1402
1481
  "description": "Missing an attachment in \"{slot}\", which most of the round has"
1482
+ },
1483
+ {
1484
+ "id": "background-volume",
1485
+ "rule": "attachmentVolume",
1486
+ "setting": "mutedBackgroundVolume",
1487
+ "default": 0,
1488
+ "types": [
1489
+ "audio",
1490
+ "video"
1491
+ ],
1492
+ "excludeSlots": [
1493
+ "background"
1494
+ ],
1495
+ "minPopulation": 4,
1496
+ "majority": 0.75,
1497
+ "questionList": "list",
1498
+ "message": "Background volume {value} while most questions in this round use {expected}",
1499
+ "messageUnset": "No background volume set, so other sounds are muted, while most questions in this round use {expected}",
1500
+ "description": "Attachment with a different background volume than the rest of the round"
1403
1501
  }
1404
1502
  ]
1405
1503
  },
@@ -1478,6 +1576,29 @@
1478
1576
  {
1479
1577
  "token": "mod-betting",
1480
1578
  "name": "Betting",
1579
+ "roundExplanation": {
1580
+ "en": "Before each question you bet points on your answer. Answer right and you win your bet, answer wrong and you lose it!",
1581
+ "bg": "Преди всеки въпрос залагате точки на отговора си. Отговорите ли правилно, печелите залога си, отговорите ли грешно, го губите!",
1582
+ "cs": "Před každou otázkou vsadíte body na svou odpověď. Odpovíte-li správně, sázku vyhrajete, odpovíte-li špatně, přijdete o ni!",
1583
+ "da": "Før hvert spørgsmål satser du point på dit svar. Svar rigtigt, og du vinder din indsats - svar forkert, og du mister den!",
1584
+ "de": "Vor jeder Frage setzt du Punkte auf deine Antwort. Antwortest du richtig, gewinnst du deinen Einsatz, antwortest du falsch, verlierst du ihn!",
1585
+ "el": "Πριν από κάθε ερώτηση ποντάρετε πόντους στην απάντησή σας. Αν απαντήσετε σωστά κερδίζετε όσα ποντάρατε, αν απαντήσετε λάθος τα χάνετε!",
1586
+ "es": "Antes de cada pregunta apuestas puntos por tu respuesta. ¡Si aciertas, ganas tu apuesta; si fallas, la pierdes!",
1587
+ "fi": "Ennen jokaista kysymystä panostat pisteitä vastauksesi puolesta. Jos vastaat oikein, voitat panoksesi, ja jos vastaat väärin, menetät sen!",
1588
+ "fr": "Avant chaque question, vous misez des points sur votre réponse. Répondez correctement et vous gagnez votre mise, trompez-vous et vous la perdez !",
1589
+ "hi": "हर सवाल से पहले आप अपने जवाब पर अंकों का दांव लगाते हैं। सही जवाब दें तो दांव जीतें, गलत जवाब दें तो उसे हार जाएँ!",
1590
+ "hu": "Minden kérdés előtt pontokat teszel fel a válaszodra. Ha jól válaszolsz, megnyered a téted, ha rosszul, elveszíted!",
1591
+ "it": "Prima di ogni domanda punti dei punti sulla tua risposta. Rispondi bene e vinci la tua puntata, sbaglia e la perdi!",
1592
+ "ko": "문제마다 시작 전에 자신의 답에 점수를 베팅합니다. 맞히면 베팅한 점수를 얻고, 틀리면 잃습니다!",
1593
+ "nl": "Voor elke vraag zet je punten in op je antwoord. Antwoord juist en je wint je inzet, antwoord fout en je verliest je inzet!",
1594
+ "no": "Før hvert spørsmål satser du poeng på svaret ditt. Svarer du riktig, vinner du innsatsen din. Svarer du feil, taper du den!",
1595
+ "pl": "Przed każdym pytaniem stawiasz punkty na swoją odpowiedź. Odpowiesz poprawnie - wygrywasz stawkę, odpowiesz błędnie - tracisz ją!",
1596
+ "pt": "Antes de cada pergunta, apostas pontos na tua resposta. Se acertares, ganhas a aposta; se errares, perdes a aposta!",
1597
+ "sk": "Pred každou otázkou vsadíte body na svoju odpoveď. Ak odpoviete správne, stávku vyhráte, ak nesprávne, prídete o ňu!",
1598
+ "sv": "Före varje fråga satsar du poäng på ditt svar. Svarar du rätt vinner du din insats, svarar du fel förlorar du den!",
1599
+ "tr": "Her sorudan önce cevabın üzerine puan bahsi yaparsın. Doğru cevaplarsan bahsini kazanırsın, yanlış cevaplarsan kaybedersin!",
1600
+ "uk": "Перед кожним запитанням ти ставиш бали на свою відповідь. Відповідаєш правильно - виграєш ставку, неправильно - втрачаєш її!"
1601
+ },
1481
1602
  "description": "Before each question, players bet part of the question's points. A right answer wins the bet, a wrong answer loses it.",
1482
1603
  "strategy": "BettingStrategy.js",
1483
1604
  "supportedRoundTypes": [
@@ -1719,10 +1840,172 @@
1719
1840
  {
1720
1841
  "id": "qw-themehacker",
1721
1842
  "name": "Theme Hacker",
1722
- "version": "1.0.0",
1843
+ "version": "1.1.0",
1723
1844
  "contexts": {
1724
1845
  "main": "themehacker.js"
1725
- }
1846
+ },
1847
+ "themeTools": [
1848
+ {
1849
+ "id": "customize",
1850
+ "label": {
1851
+ "en": "Customize theme",
1852
+ "nl": "Thema aanpassen"
1853
+ },
1854
+ "hint": {
1855
+ "en": "Change the colors of the theme in the theme tester, then apply them to this quiz.",
1856
+ "nl": "Pas de kleuren van het thema aan in de thematester en pas ze daarna toe op deze quiz."
1857
+ },
1858
+ "mode": "test",
1859
+ "premium": true
1860
+ }
1861
+ ],
1862
+ "themeSettings": [
1863
+ {
1864
+ "name": "mainColor",
1865
+ "label": "Main color",
1866
+ "type": "color",
1867
+ "marker": "_main_"
1868
+ },
1869
+ {
1870
+ "name": "accentColor",
1871
+ "label": "Accent color",
1872
+ "type": "color",
1873
+ "marker": "_accent_"
1874
+ },
1875
+ {
1876
+ "name": "backgroundColor",
1877
+ "label": "Background",
1878
+ "type": "color",
1879
+ "allowGradient": true,
1880
+ "marker": "_background_"
1881
+ },
1882
+ {
1883
+ "name": "containerColor",
1884
+ "label": "Question container",
1885
+ "type": "color",
1886
+ "allowGradient": true,
1887
+ "allowAlpha": true,
1888
+ "marker": "_container_"
1889
+ },
1890
+ {
1891
+ "name": "containerTextColor",
1892
+ "label": "Player names on the container",
1893
+ "type": "color"
1894
+ },
1895
+ {
1896
+ "name": "timerBackgroundColor",
1897
+ "label": "Timer background",
1898
+ "type": "color",
1899
+ "marker": "_timerBackground_"
1900
+ },
1901
+ {
1902
+ "name": "optionColors",
1903
+ "label": "Answer options",
1904
+ "type": "color",
1905
+ "amount": 4,
1906
+ "marker": "_optionColors_"
1907
+ },
1908
+ {
1909
+ "name": "optionBorderColors",
1910
+ "label": "Answer option borders",
1911
+ "type": "color",
1912
+ "amount": 4,
1913
+ "marker": "_optionColors_"
1914
+ },
1915
+ {
1916
+ "name": "dialogTextColor",
1917
+ "label": "Dialog text",
1918
+ "type": "color"
1919
+ },
1920
+ {
1921
+ "name": "headerTextColor",
1922
+ "label": "Header text",
1923
+ "type": "color"
1924
+ },
1925
+ {
1926
+ "name": "optionTextColor",
1927
+ "label": "Answer option text",
1928
+ "type": "color"
1929
+ },
1930
+ {
1931
+ "name": "pieChartLabelColor",
1932
+ "label": "Pie chart labels",
1933
+ "type": "color"
1934
+ },
1935
+ {
1936
+ "name": "ladderColor",
1937
+ "label": "Score ladder",
1938
+ "type": "color"
1939
+ },
1940
+ {
1941
+ "name": "remoteBackgroundColor",
1942
+ "label": "Devices: background",
1943
+ "type": "color"
1944
+ },
1945
+ {
1946
+ "name": "remoteTextColor",
1947
+ "label": "Devices: text",
1948
+ "type": "color"
1949
+ },
1950
+ {
1951
+ "name": "remoteQuestionColor",
1952
+ "label": "Devices: question",
1953
+ "type": "color"
1954
+ },
1955
+ {
1956
+ "name": "remoteQuestionTextColor",
1957
+ "label": "Devices: question text",
1958
+ "type": "color"
1959
+ },
1960
+ {
1961
+ "name": "remoteOptionColors",
1962
+ "label": "Devices: answer options",
1963
+ "type": "color",
1964
+ "amount": 4
1965
+ },
1966
+ {
1967
+ "name": "remoteOptionOutlineColor",
1968
+ "label": "Devices: answer option outline",
1969
+ "type": "color"
1970
+ },
1971
+ {
1972
+ "name": "remoteOutlineColor",
1973
+ "label": "Devices: outline",
1974
+ "type": "color"
1975
+ },
1976
+ {
1977
+ "name": "remoteContainerBackground",
1978
+ "label": "Devices: container",
1979
+ "type": "color"
1980
+ },
1981
+ {
1982
+ "name": "remoteContainerText",
1983
+ "label": "Devices: container text",
1984
+ "type": "color"
1985
+ },
1986
+ {
1987
+ "name": "defaultFont",
1988
+ "label": "Font",
1989
+ "type": "font",
1990
+ "fontSlot": "default"
1991
+ },
1992
+ {
1993
+ "name": "headerFont",
1994
+ "label": "Header font",
1995
+ "type": "font",
1996
+ "fontSlot": "header"
1997
+ },
1998
+ {
1999
+ "name": "textDecorators",
2000
+ "label": "Upper case text",
2001
+ "type": "decorators"
2002
+ },
2003
+ {
2004
+ "name": "hideLogo",
2005
+ "label": "Hide the QuizWitz logo",
2006
+ "type": "flag"
2007
+ }
2008
+ ]
1726
2009
  },
1727
2010
  {
1728
2011
  "id": "qw-translationoverride",
@@ -2202,7 +2485,7 @@
2202
2485
  }
2203
2486
  },
2204
2487
  {
2205
- "name": "completeness-errors",
2488
+ "name": "background-volume-default-majority",
2206
2489
  "input": {
2207
2490
  "round": {
2208
2491
  "uuid": "r1",
@@ -2225,37 +2508,33 @@
2225
2508
  "uuid": "q1",
2226
2509
  "original_language": "en",
2227
2510
  "mode": {
2228
- "token": "multiplechoice"
2511
+ "token": "openquestion"
2229
2512
  },
2230
2513
  "points": 1000,
2231
2514
  "duration": 30,
2232
2515
  "resources": [
2233
2516
  {
2234
2517
  "language": "en",
2235
- "name": "",
2518
+ "name": "Question q1",
2236
2519
  "options": {
2237
2520
  "items": [
2238
2521
  {
2239
2522
  "option": 1,
2240
- "text": "Paris",
2523
+ "text": "Answer",
2241
2524
  "correct": true
2242
- },
2243
- {
2244
- "option": 2,
2245
- "text": "Rome",
2246
- "correct": false
2247
- },
2248
- {
2249
- "option": 3,
2250
- "text": "Berlin",
2251
- "correct": false
2252
- },
2253
- {
2254
- "option": 4,
2255
- "text": "Madrid",
2256
- "correct": false
2257
2525
  }
2258
2526
  ]
2527
+ },
2528
+ "attachments": {
2529
+ "during": {
2530
+ "items": [
2531
+ {
2532
+ "id": 1,
2533
+ "type": "video",
2534
+ "url": "https://example.test/clip-1.mp4"
2535
+ }
2536
+ ]
2537
+ }
2259
2538
  }
2260
2539
  }
2261
2540
  ]
@@ -2264,37 +2543,33 @@
2264
2543
  "uuid": "q2",
2265
2544
  "original_language": "en",
2266
2545
  "mode": {
2267
- "token": "orderquestion"
2546
+ "token": "openquestion"
2268
2547
  },
2269
2548
  "points": 1000,
2270
2549
  "duration": 30,
2271
2550
  "resources": [
2272
2551
  {
2273
2552
  "language": "en",
2274
- "name": "Order the planets",
2553
+ "name": "Question q2",
2275
2554
  "options": {
2276
2555
  "items": [
2277
2556
  {
2278
2557
  "option": 1,
2279
- "text": "Mercury",
2280
- "correct": true
2281
- },
2282
- {
2283
- "option": 2,
2284
- "text": "",
2285
- "correct": true
2286
- },
2287
- {
2288
- "option": 3,
2289
- "text": "Earth",
2290
- "correct": true
2291
- },
2292
- {
2293
- "option": 4,
2294
- "text": "Mars",
2558
+ "text": "Answer",
2295
2559
  "correct": true
2296
2560
  }
2297
2561
  ]
2562
+ },
2563
+ "attachments": {
2564
+ "during": {
2565
+ "items": [
2566
+ {
2567
+ "id": 2,
2568
+ "type": "video",
2569
+ "url": "https://example.test/clip-2.mp4"
2570
+ }
2571
+ ]
2572
+ }
2298
2573
  }
2299
2574
  }
2300
2575
  ]
@@ -2303,16 +2578,33 @@
2303
2578
  "uuid": "q3",
2304
2579
  "original_language": "en",
2305
2580
  "mode": {
2306
- "token": "tiebreakerquestion"
2581
+ "token": "openquestion"
2307
2582
  },
2308
2583
  "points": 1000,
2309
2584
  "duration": 30,
2310
2585
  "resources": [
2311
2586
  {
2312
2587
  "language": "en",
2313
- "name": "How many moons has Jupiter?",
2588
+ "name": "Question q3",
2314
2589
  "options": {
2315
- "items": []
2590
+ "items": [
2591
+ {
2592
+ "option": 1,
2593
+ "text": "Answer",
2594
+ "correct": true
2595
+ }
2596
+ ]
2597
+ },
2598
+ "attachments": {
2599
+ "during": {
2600
+ "items": [
2601
+ {
2602
+ "id": 3,
2603
+ "type": "video",
2604
+ "url": "https://example.test/clip-3.mp4"
2605
+ }
2606
+ ]
2607
+ }
2316
2608
  }
2317
2609
  }
2318
2610
  ]
@@ -2321,22 +2613,33 @@
2321
2613
  "uuid": "q4",
2322
2614
  "original_language": "en",
2323
2615
  "mode": {
2324
- "token": "imagemapquestion"
2616
+ "token": "openquestion"
2325
2617
  },
2326
2618
  "points": 1000,
2327
2619
  "duration": 30,
2328
2620
  "resources": [
2329
2621
  {
2330
2622
  "language": "en",
2331
- "name": "Where is the Eiffel tower?",
2623
+ "name": "Question q4",
2332
2624
  "options": {
2333
2625
  "items": [
2334
2626
  {
2335
2627
  "option": 1,
2336
- "text": "",
2628
+ "text": "Answer",
2337
2629
  "correct": true
2338
2630
  }
2339
2631
  ]
2632
+ },
2633
+ "attachments": {
2634
+ "during": {
2635
+ "items": [
2636
+ {
2637
+ "id": 4,
2638
+ "type": "video",
2639
+ "url": "https://example.test/clip-4.mp4"
2640
+ }
2641
+ ]
2642
+ }
2340
2643
  }
2341
2644
  }
2342
2645
  ]
@@ -2345,67 +2648,759 @@
2345
2648
  "uuid": "q5",
2346
2649
  "original_language": "en",
2347
2650
  "mode": {
2348
- "token": "multiplechoice"
2651
+ "token": "openquestion"
2349
2652
  },
2350
2653
  "points": 1000,
2351
2654
  "duration": 30,
2352
2655
  "resources": [
2353
2656
  {
2354
2657
  "language": "en",
2355
- "name": "What is the capital of France?",
2658
+ "name": "Question q5",
2356
2659
  "options": {
2357
2660
  "items": [
2358
2661
  {
2359
2662
  "option": 1,
2360
- "text": "Paris",
2361
- "correct": false
2362
- },
2363
- {
2364
- "option": 2,
2365
- "text": "Rome",
2366
- "correct": false
2367
- },
2368
- {
2369
- "option": 3,
2370
- "text": "Berlin",
2371
- "correct": false
2372
- },
2373
- {
2374
- "option": 4,
2375
- "text": "Madrid",
2376
- "correct": false
2663
+ "text": "Answer",
2664
+ "correct": true
2377
2665
  }
2378
2666
  ]
2667
+ },
2668
+ "attachments": {
2669
+ "during": {
2670
+ "items": [
2671
+ {
2672
+ "id": 5,
2673
+ "type": "video",
2674
+ "url": "https://example.test/clip-5.mp4"
2675
+ }
2676
+ ]
2677
+ }
2379
2678
  }
2380
2679
  }
2381
2680
  ]
2382
- }
2383
- ]
2384
- }
2385
- }
2386
- },
2387
- "expected": {
2388
- "errors": [
2389
- {
2390
- "type": "question",
2391
- "label": "Q1",
2392
- "roundId": "r1",
2393
- "questionId": "q1",
2394
- "ruleId": "completeness:requireText",
2395
- "detail": "The question has no text",
2396
- "messageKey": "The question has no text",
2397
- "messageParams": {}
2398
- },
2399
- {
2400
- "type": "question",
2401
- "label": "Q2",
2402
- "roundId": "r1",
2403
- "questionId": "q2",
2404
- "ruleId": "completeness:requireAllOptionsFilled",
2405
- "detail": "Every answer option needs a text",
2406
- "messageKey": "Every answer option needs a text",
2407
- "messageParams": {}
2408
- },
2681
+ },
2682
+ {
2683
+ "uuid": "q6",
2684
+ "original_language": "en",
2685
+ "mode": {
2686
+ "token": "openquestion"
2687
+ },
2688
+ "points": 1000,
2689
+ "duration": 30,
2690
+ "resources": [
2691
+ {
2692
+ "language": "en",
2693
+ "name": "Question q6",
2694
+ "options": {
2695
+ "items": [
2696
+ {
2697
+ "option": 1,
2698
+ "text": "Answer",
2699
+ "correct": true
2700
+ }
2701
+ ]
2702
+ },
2703
+ "attachments": {
2704
+ "during": {
2705
+ "items": [
2706
+ {
2707
+ "id": 6,
2708
+ "type": "video",
2709
+ "url": "https://example.test/clip-6.mp4",
2710
+ "attributes": {
2711
+ "sound": {
2712
+ "mutedBackgroundVolume": 0.25
2713
+ }
2714
+ }
2715
+ }
2716
+ ]
2717
+ }
2718
+ }
2719
+ }
2720
+ ]
2721
+ }
2722
+ ]
2723
+ }
2724
+ }
2725
+ },
2726
+ "expected": {
2727
+ "errors": [],
2728
+ "warnings": []
2729
+ }
2730
+ },
2731
+ {
2732
+ "name": "background-volume",
2733
+ "input": {
2734
+ "round": {
2735
+ "uuid": "r1",
2736
+ "original_language": "en",
2737
+ "mode": {
2738
+ "token": "trivia"
2739
+ },
2740
+ "scoringStrategy": {
2741
+ "token": "default"
2742
+ },
2743
+ "resources": [
2744
+ {
2745
+ "language": "en",
2746
+ "name": "Round one"
2747
+ }
2748
+ ],
2749
+ "questions": {
2750
+ "items": [
2751
+ {
2752
+ "uuid": "q1",
2753
+ "original_language": "en",
2754
+ "mode": {
2755
+ "token": "openquestion"
2756
+ },
2757
+ "points": 1000,
2758
+ "duration": 30,
2759
+ "resources": [
2760
+ {
2761
+ "language": "en",
2762
+ "name": "Question q1",
2763
+ "options": {
2764
+ "items": [
2765
+ {
2766
+ "option": 1,
2767
+ "text": "Answer",
2768
+ "correct": true
2769
+ }
2770
+ ]
2771
+ },
2772
+ "attachments": {
2773
+ "during": {
2774
+ "items": [
2775
+ {
2776
+ "id": 1,
2777
+ "type": "video",
2778
+ "url": "https://example.test/clip-1.mp4",
2779
+ "attributes": {
2780
+ "sound": {
2781
+ "mutedBackgroundVolume": 0.25
2782
+ }
2783
+ }
2784
+ }
2785
+ ]
2786
+ },
2787
+ "background": {
2788
+ "items": [
2789
+ {
2790
+ "id": 91,
2791
+ "type": "audio",
2792
+ "url": "https://example.test/clip-91.mp4"
2793
+ }
2794
+ ]
2795
+ }
2796
+ }
2797
+ }
2798
+ ]
2799
+ },
2800
+ {
2801
+ "uuid": "q2",
2802
+ "original_language": "en",
2803
+ "mode": {
2804
+ "token": "openquestion"
2805
+ },
2806
+ "points": 1000,
2807
+ "duration": 30,
2808
+ "resources": [
2809
+ {
2810
+ "language": "en",
2811
+ "name": "Question q2",
2812
+ "options": {
2813
+ "items": [
2814
+ {
2815
+ "option": 1,
2816
+ "text": "Answer",
2817
+ "correct": true
2818
+ }
2819
+ ]
2820
+ },
2821
+ "attachments": {
2822
+ "during": {
2823
+ "items": [
2824
+ {
2825
+ "id": 2,
2826
+ "type": "video",
2827
+ "url": "https://example.test/clip-2.mp4",
2828
+ "attributes": {
2829
+ "sound": {
2830
+ "mutedBackgroundVolume": 0.25
2831
+ }
2832
+ }
2833
+ }
2834
+ ]
2835
+ }
2836
+ }
2837
+ }
2838
+ ]
2839
+ },
2840
+ {
2841
+ "uuid": "q3",
2842
+ "original_language": "en",
2843
+ "mode": {
2844
+ "token": "openquestion"
2845
+ },
2846
+ "points": 1000,
2847
+ "duration": 30,
2848
+ "resources": [
2849
+ {
2850
+ "language": "en",
2851
+ "name": "Question q3",
2852
+ "options": {
2853
+ "items": [
2854
+ {
2855
+ "option": 1,
2856
+ "text": "Answer",
2857
+ "correct": true
2858
+ }
2859
+ ]
2860
+ },
2861
+ "attachments": {
2862
+ "during": {
2863
+ "items": [
2864
+ {
2865
+ "id": 3,
2866
+ "type": "video",
2867
+ "url": "https://example.test/clip-3.mp4",
2868
+ "attributes": {
2869
+ "sound": {
2870
+ "mutedBackgroundVolume": 0.2525
2871
+ }
2872
+ }
2873
+ }
2874
+ ]
2875
+ },
2876
+ "before": {
2877
+ "items": [
2878
+ {
2879
+ "id": 93,
2880
+ "type": "image",
2881
+ "url": "https://example.test/p.jpg"
2882
+ }
2883
+ ]
2884
+ }
2885
+ }
2886
+ }
2887
+ ]
2888
+ },
2889
+ {
2890
+ "uuid": "q4",
2891
+ "original_language": "en",
2892
+ "mode": {
2893
+ "token": "openquestion"
2894
+ },
2895
+ "points": 1000,
2896
+ "duration": 30,
2897
+ "resources": [
2898
+ {
2899
+ "language": "en",
2900
+ "name": "Question q4",
2901
+ "options": {
2902
+ "items": [
2903
+ {
2904
+ "option": 1,
2905
+ "text": "Answer",
2906
+ "correct": true
2907
+ }
2908
+ ]
2909
+ },
2910
+ "attachments": {
2911
+ "after": {
2912
+ "items": [
2913
+ {
2914
+ "id": 4,
2915
+ "type": "audio",
2916
+ "url": "https://example.test/clip-4.mp4",
2917
+ "name": "Applause [mutedBackgroundVolume=0.25]"
2918
+ }
2919
+ ]
2920
+ },
2921
+ "during": {
2922
+ "items": [
2923
+ {
2924
+ "id": 84,
2925
+ "type": "image",
2926
+ "url": "https://example.test/d.jpg"
2927
+ }
2928
+ ]
2929
+ }
2930
+ }
2931
+ }
2932
+ ]
2933
+ },
2934
+ {
2935
+ "uuid": "q5",
2936
+ "original_language": "en",
2937
+ "mode": {
2938
+ "token": "openquestion"
2939
+ },
2940
+ "points": 1000,
2941
+ "duration": 30,
2942
+ "resources": [
2943
+ {
2944
+ "language": "en",
2945
+ "name": "Question q5",
2946
+ "options": {
2947
+ "items": [
2948
+ {
2949
+ "option": 1,
2950
+ "text": "Answer",
2951
+ "correct": true
2952
+ }
2953
+ ]
2954
+ },
2955
+ "attachments": {
2956
+ "during": {
2957
+ "items": [
2958
+ {
2959
+ "id": 5,
2960
+ "type": "video",
2961
+ "url": "https://example.test/clip-5.mp4",
2962
+ "attributes": {
2963
+ "sound": {
2964
+ "mutedBackgroundVolume": 0.25
2965
+ }
2966
+ }
2967
+ }
2968
+ ]
2969
+ }
2970
+ }
2971
+ }
2972
+ ]
2973
+ },
2974
+ {
2975
+ "uuid": "q6",
2976
+ "original_language": "en",
2977
+ "mode": {
2978
+ "token": "openquestion"
2979
+ },
2980
+ "points": 1000,
2981
+ "duration": 30,
2982
+ "resources": [
2983
+ {
2984
+ "language": "en",
2985
+ "name": "Question q6",
2986
+ "options": {
2987
+ "items": [
2988
+ {
2989
+ "option": 1,
2990
+ "text": "Answer",
2991
+ "correct": true
2992
+ }
2993
+ ]
2994
+ },
2995
+ "attachments": {
2996
+ "during": {
2997
+ "items": [
2998
+ {
2999
+ "id": 6,
3000
+ "type": "video",
3001
+ "url": "https://example.test/clip-6.mp4",
3002
+ "attributes": {
3003
+ "sound": {
3004
+ "mutedBackgroundVolume": 0.25
3005
+ }
3006
+ }
3007
+ }
3008
+ ]
3009
+ },
3010
+ "feedback:after": {
3011
+ "items": [
3012
+ {
3013
+ "id": 96,
3014
+ "type": "audio",
3015
+ "url": "https://example.test/clip-96.mp4",
3016
+ "attributes": {
3017
+ "sound": {
3018
+ "mutedBackgroundVolume": 0.25
3019
+ }
3020
+ }
3021
+ }
3022
+ ]
3023
+ }
3024
+ }
3025
+ }
3026
+ ]
3027
+ },
3028
+ {
3029
+ "uuid": "q7",
3030
+ "original_language": "en",
3031
+ "mode": {
3032
+ "token": "openquestion"
3033
+ },
3034
+ "points": 1000,
3035
+ "duration": 30,
3036
+ "resources": [
3037
+ {
3038
+ "language": "en",
3039
+ "name": "Question q7",
3040
+ "options": {
3041
+ "items": [
3042
+ {
3043
+ "option": 1,
3044
+ "text": "Answer",
3045
+ "correct": true
3046
+ }
3047
+ ]
3048
+ },
3049
+ "attachments": {
3050
+ "during": {
3051
+ "items": [
3052
+ {
3053
+ "id": 7,
3054
+ "type": "video",
3055
+ "url": "https://example.test/clip-7.mp4",
3056
+ "attributes": {
3057
+ "sound": {
3058
+ "volume": 0.8
3059
+ }
3060
+ }
3061
+ }
3062
+ ]
3063
+ }
3064
+ }
3065
+ }
3066
+ ]
3067
+ },
3068
+ {
3069
+ "uuid": "q8",
3070
+ "original_language": "en",
3071
+ "mode": {
3072
+ "token": "openquestion"
3073
+ },
3074
+ "points": 1000,
3075
+ "duration": 30,
3076
+ "resources": [
3077
+ {
3078
+ "language": "en",
3079
+ "name": "Question q8",
3080
+ "options": {
3081
+ "items": [
3082
+ {
3083
+ "option": 1,
3084
+ "text": "Answer",
3085
+ "correct": true
3086
+ }
3087
+ ]
3088
+ },
3089
+ "attachments": {
3090
+ "during": {
3091
+ "items": [
3092
+ {
3093
+ "id": 8,
3094
+ "type": "video",
3095
+ "url": "https://example.test/clip-8.mp4",
3096
+ "attributes": {
3097
+ "sound": {
3098
+ "mutedBackgroundVolume": 0.25
3099
+ }
3100
+ }
3101
+ }
3102
+ ]
3103
+ },
3104
+ "after": {
3105
+ "items": [
3106
+ {
3107
+ "id": 98,
3108
+ "type": "video",
3109
+ "url": "https://example.test/clip-98.mp4",
3110
+ "attributes": {
3111
+ "sound": {
3112
+ "mutedBackgroundVolume": 0.5
3113
+ }
3114
+ }
3115
+ }
3116
+ ]
3117
+ }
3118
+ }
3119
+ }
3120
+ ]
3121
+ },
3122
+ {
3123
+ "uuid": "q9",
3124
+ "original_language": "en",
3125
+ "mode": {
3126
+ "token": "openquestion"
3127
+ },
3128
+ "points": 1000,
3129
+ "duration": 30,
3130
+ "resources": [
3131
+ {
3132
+ "language": "en",
3133
+ "name": "Question q9",
3134
+ "options": {
3135
+ "items": [
3136
+ {
3137
+ "option": 1,
3138
+ "text": "Answer",
3139
+ "correct": true
3140
+ }
3141
+ ]
3142
+ },
3143
+ "attachments": {
3144
+ "before": {
3145
+ "items": [
3146
+ {
3147
+ "id": 99,
3148
+ "type": "image",
3149
+ "url": "https://example.test/q.jpg"
3150
+ }
3151
+ ]
3152
+ },
3153
+ "during": {
3154
+ "items": [
3155
+ {
3156
+ "id": 89,
3157
+ "type": "image",
3158
+ "url": "https://example.test/d.jpg"
3159
+ }
3160
+ ]
3161
+ }
3162
+ }
3163
+ }
3164
+ ]
3165
+ }
3166
+ ]
3167
+ }
3168
+ }
3169
+ },
3170
+ "expected": {
3171
+ "errors": [],
3172
+ "warnings": [
3173
+ {
3174
+ "id": "q7:background-volume",
3175
+ "ruleId": "background-volume",
3176
+ "roundId": "r1",
3177
+ "questionId": "q7",
3178
+ "message": "No background volume set, so other sounds are muted, while most questions in this round use 50%",
3179
+ "messageKey": "No background volume set, so other sounds are muted, while most questions in this round use {expected}",
3180
+ "messageParams": {
3181
+ "expected": "50%"
3182
+ }
3183
+ },
3184
+ {
3185
+ "id": "q8:background-volume",
3186
+ "ruleId": "background-volume",
3187
+ "roundId": "r1",
3188
+ "questionId": "q8",
3189
+ "message": "Background volume 71% while most questions in this round use 50%",
3190
+ "messageKey": "Background volume {value} while most questions in this round use {expected}",
3191
+ "messageParams": {
3192
+ "value": "71%",
3193
+ "expected": "50%"
3194
+ }
3195
+ }
3196
+ ]
3197
+ }
3198
+ },
3199
+ {
3200
+ "name": "completeness-errors",
3201
+ "input": {
3202
+ "round": {
3203
+ "uuid": "r1",
3204
+ "original_language": "en",
3205
+ "mode": {
3206
+ "token": "trivia"
3207
+ },
3208
+ "scoringStrategy": {
3209
+ "token": "default"
3210
+ },
3211
+ "resources": [
3212
+ {
3213
+ "language": "en",
3214
+ "name": "Round one"
3215
+ }
3216
+ ],
3217
+ "questions": {
3218
+ "items": [
3219
+ {
3220
+ "uuid": "q1",
3221
+ "original_language": "en",
3222
+ "mode": {
3223
+ "token": "multiplechoice"
3224
+ },
3225
+ "points": 1000,
3226
+ "duration": 30,
3227
+ "resources": [
3228
+ {
3229
+ "language": "en",
3230
+ "name": "",
3231
+ "options": {
3232
+ "items": [
3233
+ {
3234
+ "option": 1,
3235
+ "text": "Paris",
3236
+ "correct": true
3237
+ },
3238
+ {
3239
+ "option": 2,
3240
+ "text": "Rome",
3241
+ "correct": false
3242
+ },
3243
+ {
3244
+ "option": 3,
3245
+ "text": "Berlin",
3246
+ "correct": false
3247
+ },
3248
+ {
3249
+ "option": 4,
3250
+ "text": "Madrid",
3251
+ "correct": false
3252
+ }
3253
+ ]
3254
+ }
3255
+ }
3256
+ ]
3257
+ },
3258
+ {
3259
+ "uuid": "q2",
3260
+ "original_language": "en",
3261
+ "mode": {
3262
+ "token": "orderquestion"
3263
+ },
3264
+ "points": 1000,
3265
+ "duration": 30,
3266
+ "resources": [
3267
+ {
3268
+ "language": "en",
3269
+ "name": "Order the planets",
3270
+ "options": {
3271
+ "items": [
3272
+ {
3273
+ "option": 1,
3274
+ "text": "Mercury",
3275
+ "correct": true
3276
+ },
3277
+ {
3278
+ "option": 2,
3279
+ "text": "",
3280
+ "correct": true
3281
+ },
3282
+ {
3283
+ "option": 3,
3284
+ "text": "Earth",
3285
+ "correct": true
3286
+ },
3287
+ {
3288
+ "option": 4,
3289
+ "text": "Mars",
3290
+ "correct": true
3291
+ }
3292
+ ]
3293
+ }
3294
+ }
3295
+ ]
3296
+ },
3297
+ {
3298
+ "uuid": "q3",
3299
+ "original_language": "en",
3300
+ "mode": {
3301
+ "token": "tiebreakerquestion"
3302
+ },
3303
+ "points": 1000,
3304
+ "duration": 30,
3305
+ "resources": [
3306
+ {
3307
+ "language": "en",
3308
+ "name": "How many moons has Jupiter?",
3309
+ "options": {
3310
+ "items": []
3311
+ }
3312
+ }
3313
+ ]
3314
+ },
3315
+ {
3316
+ "uuid": "q4",
3317
+ "original_language": "en",
3318
+ "mode": {
3319
+ "token": "imagemapquestion"
3320
+ },
3321
+ "points": 1000,
3322
+ "duration": 30,
3323
+ "resources": [
3324
+ {
3325
+ "language": "en",
3326
+ "name": "Where is the Eiffel tower?",
3327
+ "options": {
3328
+ "items": [
3329
+ {
3330
+ "option": 1,
3331
+ "text": "",
3332
+ "correct": true
3333
+ }
3334
+ ]
3335
+ }
3336
+ }
3337
+ ]
3338
+ },
3339
+ {
3340
+ "uuid": "q5",
3341
+ "original_language": "en",
3342
+ "mode": {
3343
+ "token": "multiplechoice"
3344
+ },
3345
+ "points": 1000,
3346
+ "duration": 30,
3347
+ "resources": [
3348
+ {
3349
+ "language": "en",
3350
+ "name": "What is the capital of France?",
3351
+ "options": {
3352
+ "items": [
3353
+ {
3354
+ "option": 1,
3355
+ "text": "Paris",
3356
+ "correct": false
3357
+ },
3358
+ {
3359
+ "option": 2,
3360
+ "text": "Rome",
3361
+ "correct": false
3362
+ },
3363
+ {
3364
+ "option": 3,
3365
+ "text": "Berlin",
3366
+ "correct": false
3367
+ },
3368
+ {
3369
+ "option": 4,
3370
+ "text": "Madrid",
3371
+ "correct": false
3372
+ }
3373
+ ]
3374
+ }
3375
+ }
3376
+ ]
3377
+ }
3378
+ ]
3379
+ }
3380
+ }
3381
+ },
3382
+ "expected": {
3383
+ "errors": [
3384
+ {
3385
+ "type": "question",
3386
+ "label": "Q1",
3387
+ "roundId": "r1",
3388
+ "questionId": "q1",
3389
+ "ruleId": "completeness:requireText",
3390
+ "detail": "The question has no text",
3391
+ "messageKey": "The question has no text",
3392
+ "messageParams": {}
3393
+ },
3394
+ {
3395
+ "type": "question",
3396
+ "label": "Q2",
3397
+ "roundId": "r1",
3398
+ "questionId": "q2",
3399
+ "ruleId": "completeness:requireAllOptionsFilled",
3400
+ "detail": "Every answer option needs a text",
3401
+ "messageKey": "Every answer option needs a text",
3402
+ "messageParams": {}
3403
+ },
2409
3404
  {
2410
3405
  "type": "question",
2411
3406
  "label": "Q3",
@@ -2417,31 +3412,429 @@
2417
3412
  "messageParams": {}
2418
3413
  },
2419
3414
  {
2420
- "type": "question",
2421
- "label": "Q4",
3415
+ "type": "question",
3416
+ "label": "Q4",
3417
+ "roundId": "r1",
3418
+ "questionId": "q4",
3419
+ "ruleId": "completeness:requireImageMap",
3420
+ "detail": "The image map needs a picture with at least one zone that scores",
3421
+ "messageKey": "The image map needs a picture with at least one zone that scores",
3422
+ "messageParams": {}
3423
+ },
3424
+ {
3425
+ "type": "question",
3426
+ "label": "Q5",
3427
+ "roundId": "r1",
3428
+ "questionId": "q5",
3429
+ "ruleId": "completeness:requireCorrectOption",
3430
+ "detail": "No answer option is marked correct",
3431
+ "messageKey": "No answer option is marked correct",
3432
+ "messageParams": {}
3433
+ }
3434
+ ],
3435
+ "warnings": []
3436
+ }
3437
+ },
3438
+ {
3439
+ "name": "content-gap",
3440
+ "input": {
3441
+ "round": {
3442
+ "uuid": "r1",
3443
+ "original_language": "en",
3444
+ "mode": {
3445
+ "token": "trivia"
3446
+ },
3447
+ "scoringStrategy": {
3448
+ "token": "default"
3449
+ },
3450
+ "resources": [
3451
+ {
3452
+ "language": "en",
3453
+ "name": "Round one"
3454
+ }
3455
+ ],
3456
+ "questions": {
3457
+ "items": [
3458
+ {
3459
+ "uuid": "q1",
3460
+ "original_language": "en",
3461
+ "mode": {
3462
+ "token": "multiplechoice"
3463
+ },
3464
+ "points": 1000,
3465
+ "duration": 30,
3466
+ "resources": [
3467
+ {
3468
+ "language": "en",
3469
+ "name": "What is the capital of France?",
3470
+ "options": {
3471
+ "items": [
3472
+ {
3473
+ "option": 1,
3474
+ "text": "Paris",
3475
+ "correct": true
3476
+ },
3477
+ {
3478
+ "option": 2,
3479
+ "text": "Rome",
3480
+ "correct": false
3481
+ },
3482
+ {
3483
+ "option": 3,
3484
+ "text": "Berlin",
3485
+ "correct": false
3486
+ },
3487
+ {
3488
+ "option": 4,
3489
+ "text": "Madrid",
3490
+ "correct": false
3491
+ }
3492
+ ]
3493
+ },
3494
+ "long": "Script."
3495
+ }
3496
+ ]
3497
+ },
3498
+ {
3499
+ "uuid": "q2",
3500
+ "original_language": "en",
3501
+ "mode": {
3502
+ "token": "multiplechoice"
3503
+ },
3504
+ "points": 1000,
3505
+ "duration": 30,
3506
+ "resources": [
3507
+ {
3508
+ "language": "en",
3509
+ "name": "What is the capital of France?",
3510
+ "options": {
3511
+ "items": [
3512
+ {
3513
+ "option": 1,
3514
+ "text": "Paris",
3515
+ "correct": true
3516
+ },
3517
+ {
3518
+ "option": 2,
3519
+ "text": "Rome",
3520
+ "correct": false
3521
+ },
3522
+ {
3523
+ "option": 3,
3524
+ "text": "Berlin",
3525
+ "correct": false
3526
+ },
3527
+ {
3528
+ "option": 4,
3529
+ "text": "Madrid",
3530
+ "correct": false
3531
+ }
3532
+ ]
3533
+ },
3534
+ "long": "Script."
3535
+ }
3536
+ ]
3537
+ },
3538
+ {
3539
+ "uuid": "q3",
3540
+ "original_language": "en",
3541
+ "mode": {
3542
+ "token": "multiplechoice"
3543
+ },
3544
+ "points": 1000,
3545
+ "duration": 30,
3546
+ "resources": [
3547
+ {
3548
+ "language": "en",
3549
+ "name": "What is the capital of France?",
3550
+ "options": {
3551
+ "items": [
3552
+ {
3553
+ "option": 1,
3554
+ "text": "Paris",
3555
+ "correct": true
3556
+ },
3557
+ {
3558
+ "option": 2,
3559
+ "text": "Rome",
3560
+ "correct": false
3561
+ },
3562
+ {
3563
+ "option": 3,
3564
+ "text": "Berlin",
3565
+ "correct": false
3566
+ },
3567
+ {
3568
+ "option": 4,
3569
+ "text": "Madrid",
3570
+ "correct": false
3571
+ }
3572
+ ]
3573
+ },
3574
+ "long": "Script."
3575
+ }
3576
+ ]
3577
+ },
3578
+ {
3579
+ "uuid": "q4",
3580
+ "original_language": "en",
3581
+ "mode": {
3582
+ "token": "multiplechoice"
3583
+ },
3584
+ "points": 1000,
3585
+ "duration": 30,
3586
+ "resources": [
3587
+ {
3588
+ "language": "en",
3589
+ "name": "What is the capital of France?",
3590
+ "options": {
3591
+ "items": [
3592
+ {
3593
+ "option": 1,
3594
+ "text": "Paris",
3595
+ "correct": true
3596
+ },
3597
+ {
3598
+ "option": 2,
3599
+ "text": "Rome",
3600
+ "correct": false
3601
+ },
3602
+ {
3603
+ "option": 3,
3604
+ "text": "Berlin",
3605
+ "correct": false
3606
+ },
3607
+ {
3608
+ "option": 4,
3609
+ "text": "Madrid",
3610
+ "correct": false
3611
+ }
3612
+ ]
3613
+ }
3614
+ }
3615
+ ]
3616
+ }
3617
+ ]
3618
+ }
3619
+ }
3620
+ },
3621
+ "expected": {
3622
+ "errors": [],
3623
+ "warnings": [
3624
+ {
3625
+ "id": "q4:content-gap:long",
3626
+ "ruleId": "content-gap:long",
2422
3627
  "roundId": "r1",
2423
3628
  "questionId": "q4",
2424
- "ruleId": "completeness:requireImageMap",
2425
- "detail": "The image map needs a picture with at least one zone that scores",
2426
- "messageKey": "The image map needs a picture with at least one zone that scores",
2427
- "messageParams": {}
3629
+ "message": "Most questions in this round have a quizmaster script, this one does not",
3630
+ "messageKey": "Most questions in this round have a {field}, this one does not",
3631
+ "messageParams": {
3632
+ "field": "quizmaster script"
3633
+ }
3634
+ }
3635
+ ]
3636
+ }
3637
+ },
3638
+ {
3639
+ "name": "duration-outlier",
3640
+ "input": {
3641
+ "round": {
3642
+ "uuid": "r1",
3643
+ "original_language": "en",
3644
+ "mode": {
3645
+ "token": "trivia"
3646
+ },
3647
+ "scoringStrategy": {
3648
+ "token": "default"
2428
3649
  },
3650
+ "resources": [
3651
+ {
3652
+ "language": "en",
3653
+ "name": "Round one"
3654
+ }
3655
+ ],
3656
+ "questions": {
3657
+ "items": [
3658
+ {
3659
+ "uuid": "q1",
3660
+ "original_language": "en",
3661
+ "mode": {
3662
+ "token": "multiplechoice"
3663
+ },
3664
+ "points": 1000,
3665
+ "duration": 30,
3666
+ "resources": [
3667
+ {
3668
+ "language": "en",
3669
+ "name": "What is the capital of France?",
3670
+ "options": {
3671
+ "items": [
3672
+ {
3673
+ "option": 1,
3674
+ "text": "Paris",
3675
+ "correct": true
3676
+ },
3677
+ {
3678
+ "option": 2,
3679
+ "text": "Rome",
3680
+ "correct": false
3681
+ },
3682
+ {
3683
+ "option": 3,
3684
+ "text": "Berlin",
3685
+ "correct": false
3686
+ },
3687
+ {
3688
+ "option": 4,
3689
+ "text": "Madrid",
3690
+ "correct": false
3691
+ }
3692
+ ]
3693
+ }
3694
+ }
3695
+ ]
3696
+ },
3697
+ {
3698
+ "uuid": "q2",
3699
+ "original_language": "en",
3700
+ "mode": {
3701
+ "token": "multiplechoice"
3702
+ },
3703
+ "points": 1000,
3704
+ "duration": 30,
3705
+ "resources": [
3706
+ {
3707
+ "language": "en",
3708
+ "name": "What is the capital of France?",
3709
+ "options": {
3710
+ "items": [
3711
+ {
3712
+ "option": 1,
3713
+ "text": "Paris",
3714
+ "correct": true
3715
+ },
3716
+ {
3717
+ "option": 2,
3718
+ "text": "Rome",
3719
+ "correct": false
3720
+ },
3721
+ {
3722
+ "option": 3,
3723
+ "text": "Berlin",
3724
+ "correct": false
3725
+ },
3726
+ {
3727
+ "option": 4,
3728
+ "text": "Madrid",
3729
+ "correct": false
3730
+ }
3731
+ ]
3732
+ }
3733
+ }
3734
+ ]
3735
+ },
3736
+ {
3737
+ "uuid": "q3",
3738
+ "original_language": "en",
3739
+ "mode": {
3740
+ "token": "multiplechoice"
3741
+ },
3742
+ "points": 1000,
3743
+ "duration": 30,
3744
+ "resources": [
3745
+ {
3746
+ "language": "en",
3747
+ "name": "What is the capital of France?",
3748
+ "options": {
3749
+ "items": [
3750
+ {
3751
+ "option": 1,
3752
+ "text": "Paris",
3753
+ "correct": true
3754
+ },
3755
+ {
3756
+ "option": 2,
3757
+ "text": "Rome",
3758
+ "correct": false
3759
+ },
3760
+ {
3761
+ "option": 3,
3762
+ "text": "Berlin",
3763
+ "correct": false
3764
+ },
3765
+ {
3766
+ "option": 4,
3767
+ "text": "Madrid",
3768
+ "correct": false
3769
+ }
3770
+ ]
3771
+ }
3772
+ }
3773
+ ]
3774
+ },
3775
+ {
3776
+ "uuid": "q4",
3777
+ "original_language": "en",
3778
+ "mode": {
3779
+ "token": "multiplechoice"
3780
+ },
3781
+ "points": 1000,
3782
+ "duration": 10,
3783
+ "resources": [
3784
+ {
3785
+ "language": "en",
3786
+ "name": "What is the capital of France?",
3787
+ "options": {
3788
+ "items": [
3789
+ {
3790
+ "option": 1,
3791
+ "text": "Paris",
3792
+ "correct": true
3793
+ },
3794
+ {
3795
+ "option": 2,
3796
+ "text": "Rome",
3797
+ "correct": false
3798
+ },
3799
+ {
3800
+ "option": 3,
3801
+ "text": "Berlin",
3802
+ "correct": false
3803
+ },
3804
+ {
3805
+ "option": 4,
3806
+ "text": "Madrid",
3807
+ "correct": false
3808
+ }
3809
+ ]
3810
+ }
3811
+ }
3812
+ ]
3813
+ }
3814
+ ]
3815
+ }
3816
+ }
3817
+ },
3818
+ "expected": {
3819
+ "errors": [],
3820
+ "warnings": [
2429
3821
  {
2430
- "type": "question",
2431
- "label": "Q5",
3822
+ "id": "q4:duration-outlier",
3823
+ "ruleId": "duration-outlier",
2432
3824
  "roundId": "r1",
2433
- "questionId": "q5",
2434
- "ruleId": "completeness:requireCorrectOption",
2435
- "detail": "No answer option is marked correct",
2436
- "messageKey": "No answer option is marked correct",
2437
- "messageParams": {}
3825
+ "questionId": "q4",
3826
+ "message": "Runs 10 seconds while the rest of this round is around 30",
3827
+ "messageKey": "Runs {value} seconds while the rest of this round is around {median}",
3828
+ "messageParams": {
3829
+ "value": 10,
3830
+ "median": 30
3831
+ }
2438
3832
  }
2439
- ],
2440
- "warnings": []
3833
+ ]
2441
3834
  }
2442
3835
  },
2443
3836
  {
2444
- "name": "content-gap",
3837
+ "name": "explanation-pair",
2445
3838
  "input": {
2446
3839
  "round": {
2447
3840
  "uuid": "r1",
@@ -2461,7 +3854,47 @@
2461
3854
  "questions": {
2462
3855
  "items": [
2463
3856
  {
2464
- "uuid": "q1",
3857
+ "uuid": "q1",
3858
+ "original_language": "en",
3859
+ "mode": {
3860
+ "token": "multiplechoice"
3861
+ },
3862
+ "points": 1000,
3863
+ "duration": 30,
3864
+ "resources": [
3865
+ {
3866
+ "language": "en",
3867
+ "name": "What is the capital of France?",
3868
+ "options": {
3869
+ "items": [
3870
+ {
3871
+ "option": 1,
3872
+ "text": "Paris",
3873
+ "correct": true
3874
+ },
3875
+ {
3876
+ "option": 2,
3877
+ "text": "Rome",
3878
+ "correct": false
3879
+ },
3880
+ {
3881
+ "option": 3,
3882
+ "text": "Berlin",
3883
+ "correct": false
3884
+ },
3885
+ {
3886
+ "option": 4,
3887
+ "text": "Madrid",
3888
+ "correct": false
3889
+ }
3890
+ ]
3891
+ },
3892
+ "longExplanation": "Read this."
3893
+ }
3894
+ ]
3895
+ },
3896
+ {
3897
+ "uuid": "q2",
2465
3898
  "original_language": "en",
2466
3899
  "mode": {
2467
3900
  "token": "multiplechoice"
@@ -2496,12 +3929,12 @@
2496
3929
  }
2497
3930
  ]
2498
3931
  },
2499
- "long": "Script."
3932
+ "longExplanation": "Read this."
2500
3933
  }
2501
3934
  ]
2502
3935
  },
2503
3936
  {
2504
- "uuid": "q2",
3937
+ "uuid": "q3",
2505
3938
  "original_language": "en",
2506
3939
  "mode": {
2507
3940
  "token": "multiplechoice"
@@ -2536,12 +3969,52 @@
2536
3969
  }
2537
3970
  ]
2538
3971
  },
2539
- "long": "Script."
3972
+ "longExplanation": "Read this."
2540
3973
  }
2541
3974
  ]
2542
3975
  },
2543
3976
  {
2544
- "uuid": "q3",
3977
+ "uuid": "q4",
3978
+ "original_language": "en",
3979
+ "mode": {
3980
+ "token": "multiplechoice"
3981
+ },
3982
+ "points": 1000,
3983
+ "duration": 30,
3984
+ "resources": [
3985
+ {
3986
+ "language": "en",
3987
+ "name": "What is the capital of France?",
3988
+ "options": {
3989
+ "items": [
3990
+ {
3991
+ "option": 1,
3992
+ "text": "Paris",
3993
+ "correct": true
3994
+ },
3995
+ {
3996
+ "option": 2,
3997
+ "text": "Rome",
3998
+ "correct": false
3999
+ },
4000
+ {
4001
+ "option": 3,
4002
+ "text": "Berlin",
4003
+ "correct": false
4004
+ },
4005
+ {
4006
+ "option": 4,
4007
+ "text": "Madrid",
4008
+ "correct": false
4009
+ }
4010
+ ]
4011
+ },
4012
+ "longExplanation": "Read this."
4013
+ }
4014
+ ]
4015
+ },
4016
+ {
4017
+ "uuid": "q5",
2545
4018
  "original_language": "en",
2546
4019
  "mode": {
2547
4020
  "token": "multiplechoice"
@@ -2570,49 +4043,260 @@
2570
4043
  "correct": false
2571
4044
  },
2572
4045
  {
2573
- "option": 4,
2574
- "text": "Madrid",
2575
- "correct": false
4046
+ "option": 4,
4047
+ "text": "Madrid",
4048
+ "correct": false
4049
+ }
4050
+ ]
4051
+ },
4052
+ "explanation": "Shown on screen."
4053
+ }
4054
+ ]
4055
+ }
4056
+ ]
4057
+ }
4058
+ }
4059
+ },
4060
+ "expected": {
4061
+ "errors": [],
4062
+ "warnings": [
4063
+ {
4064
+ "id": "q5:explanation-pair",
4065
+ "ruleId": "explanation-pair",
4066
+ "roundId": "r1",
4067
+ "questionId": "q5",
4068
+ "message": "The rest of this round explains the answer in the quizmaster answer explanation, this one uses the answer explanation",
4069
+ "messageKey": "The rest of this round explains the answer in the {expected}, this one uses the {actual}",
4070
+ "messageParams": {
4071
+ "expected": "quizmaster answer explanation",
4072
+ "actual": "answer explanation"
4073
+ }
4074
+ }
4075
+ ]
4076
+ }
4077
+ },
4078
+ {
4079
+ "name": "group-position-label",
4080
+ "input": {
4081
+ "round": {
4082
+ "uuid": "r1",
4083
+ "original_language": "en",
4084
+ "mode": {
4085
+ "token": "multiquestion"
4086
+ },
4087
+ "scoringStrategy": {
4088
+ "token": "default"
4089
+ },
4090
+ "resources": [
4091
+ {
4092
+ "language": "en",
4093
+ "name": "Round one"
4094
+ }
4095
+ ],
4096
+ "questions": {
4097
+ "items": [
4098
+ {
4099
+ "uuid": "q1a",
4100
+ "original_language": "en",
4101
+ "mode": {
4102
+ "token": "openquestion"
4103
+ },
4104
+ "points": 1000,
4105
+ "duration": 30,
4106
+ "group": "1",
4107
+ "resources": [
4108
+ {
4109
+ "language": "en",
4110
+ "name": "Question q1a",
4111
+ "label": "Multiple choice",
4112
+ "options": {
4113
+ "items": [
4114
+ {
4115
+ "option": 1,
4116
+ "text": "Answer",
4117
+ "correct": true
4118
+ }
4119
+ ]
4120
+ }
4121
+ }
4122
+ ]
4123
+ },
4124
+ {
4125
+ "uuid": "q1b",
4126
+ "original_language": "en",
4127
+ "mode": {
4128
+ "token": "openquestion"
4129
+ },
4130
+ "points": 1000,
4131
+ "duration": 30,
4132
+ "group": "1",
4133
+ "resources": [
4134
+ {
4135
+ "language": "en",
4136
+ "name": "Question q1b",
4137
+ "label": "Open question",
4138
+ "options": {
4139
+ "items": [
4140
+ {
4141
+ "option": 1,
4142
+ "text": "Answer",
4143
+ "correct": true
4144
+ }
4145
+ ]
4146
+ }
4147
+ }
4148
+ ]
4149
+ },
4150
+ {
4151
+ "uuid": "q2a",
4152
+ "original_language": "en",
4153
+ "mode": {
4154
+ "token": "openquestion"
4155
+ },
4156
+ "points": 1000,
4157
+ "duration": 30,
4158
+ "group": "2",
4159
+ "resources": [
4160
+ {
4161
+ "language": "en",
4162
+ "name": "Question q2a",
4163
+ "label": "Open question",
4164
+ "options": {
4165
+ "items": [
4166
+ {
4167
+ "option": 1,
4168
+ "text": "Answer",
4169
+ "correct": true
4170
+ }
4171
+ ]
4172
+ }
4173
+ }
4174
+ ]
4175
+ },
4176
+ {
4177
+ "uuid": "q2b",
4178
+ "original_language": "en",
4179
+ "mode": {
4180
+ "token": "openquestion"
4181
+ },
4182
+ "points": 1000,
4183
+ "duration": 30,
4184
+ "group": "2",
4185
+ "resources": [
4186
+ {
4187
+ "language": "en",
4188
+ "name": "Question q2b",
4189
+ "label": "Open question",
4190
+ "options": {
4191
+ "items": [
4192
+ {
4193
+ "option": 1,
4194
+ "text": "Answer",
4195
+ "correct": true
4196
+ }
4197
+ ]
4198
+ }
4199
+ }
4200
+ ]
4201
+ },
4202
+ {
4203
+ "uuid": "q3a",
4204
+ "original_language": "en",
4205
+ "mode": {
4206
+ "token": "openquestion"
4207
+ },
4208
+ "points": 1000,
4209
+ "duration": 30,
4210
+ "group": "3",
4211
+ "resources": [
4212
+ {
4213
+ "language": "en",
4214
+ "name": "Question q3a",
4215
+ "label": "multiple choice ",
4216
+ "options": {
4217
+ "items": [
4218
+ {
4219
+ "option": 1,
4220
+ "text": "Answer",
4221
+ "correct": true
4222
+ }
4223
+ ]
4224
+ }
4225
+ }
4226
+ ]
4227
+ },
4228
+ {
4229
+ "uuid": "q3b",
4230
+ "original_language": "en",
4231
+ "mode": {
4232
+ "token": "openquestion"
4233
+ },
4234
+ "points": 1000,
4235
+ "duration": 30,
4236
+ "group": "3",
4237
+ "resources": [
4238
+ {
4239
+ "language": "en",
4240
+ "name": "Question q3b",
4241
+ "label": "Open question",
4242
+ "options": {
4243
+ "items": [
4244
+ {
4245
+ "option": 1,
4246
+ "text": "Answer",
4247
+ "correct": true
4248
+ }
4249
+ ]
4250
+ }
4251
+ }
4252
+ ]
4253
+ },
4254
+ {
4255
+ "uuid": "q4a",
4256
+ "original_language": "en",
4257
+ "mode": {
4258
+ "token": "openquestion"
4259
+ },
4260
+ "points": 1000,
4261
+ "duration": 30,
4262
+ "group": "4",
4263
+ "resources": [
4264
+ {
4265
+ "language": "en",
4266
+ "name": "Question q4a",
4267
+ "label": "Multiple choice",
4268
+ "options": {
4269
+ "items": [
4270
+ {
4271
+ "option": 1,
4272
+ "text": "Answer",
4273
+ "correct": true
2576
4274
  }
2577
4275
  ]
2578
- },
2579
- "long": "Script."
4276
+ }
2580
4277
  }
2581
4278
  ]
2582
4279
  },
2583
4280
  {
2584
- "uuid": "q4",
4281
+ "uuid": "q4b",
2585
4282
  "original_language": "en",
2586
4283
  "mode": {
2587
- "token": "multiplechoice"
4284
+ "token": "openquestion"
2588
4285
  },
2589
4286
  "points": 1000,
2590
4287
  "duration": 30,
4288
+ "group": "4",
2591
4289
  "resources": [
2592
4290
  {
2593
4291
  "language": "en",
2594
- "name": "What is the capital of France?",
4292
+ "name": "Question q4b",
4293
+ "label": "Open question",
2595
4294
  "options": {
2596
4295
  "items": [
2597
4296
  {
2598
4297
  "option": 1,
2599
- "text": "Paris",
4298
+ "text": "Answer",
2600
4299
  "correct": true
2601
- },
2602
- {
2603
- "option": 2,
2604
- "text": "Rome",
2605
- "correct": false
2606
- },
2607
- {
2608
- "option": 3,
2609
- "text": "Berlin",
2610
- "correct": false
2611
- },
2612
- {
2613
- "option": 4,
2614
- "text": "Madrid",
2615
- "correct": false
2616
4300
  }
2617
4301
  ]
2618
4302
  }
@@ -2627,27 +4311,29 @@
2627
4311
  "errors": [],
2628
4312
  "warnings": [
2629
4313
  {
2630
- "id": "q4:content-gap:long",
2631
- "ruleId": "content-gap:long",
4314
+ "id": "q2a:group-position:label",
4315
+ "ruleId": "group-position:label",
2632
4316
  "roundId": "r1",
2633
- "questionId": "q4",
2634
- "message": "Most questions in this round have a quizmaster script, this one does not",
2635
- "messageKey": "Most questions in this round have a {field}, this one does not",
4317
+ "questionId": "q2a",
4318
+ "message": "Labelled \"Open question\" while question 1 of most other groups is labelled \"Multiple choice\"",
4319
+ "messageKey": "Labelled \"{value}\" while question {position} of most other groups is labelled \"{expected}\"",
2636
4320
  "messageParams": {
2637
- "field": "quizmaster script"
4321
+ "value": "Open question",
4322
+ "expected": "Multiple choice",
4323
+ "position": 1
2638
4324
  }
2639
4325
  }
2640
4326
  ]
2641
4327
  }
2642
4328
  },
2643
4329
  {
2644
- "name": "duration-outlier",
4330
+ "name": "group-position-points",
2645
4331
  "input": {
2646
4332
  "round": {
2647
4333
  "uuid": "r1",
2648
4334
  "original_language": "en",
2649
4335
  "mode": {
2650
- "token": "trivia"
4336
+ "token": "multiquestion"
2651
4337
  },
2652
4338
  "scoringStrategy": {
2653
4339
  "token": "default"
@@ -2661,38 +4347,25 @@
2661
4347
  "questions": {
2662
4348
  "items": [
2663
4349
  {
2664
- "uuid": "q1",
4350
+ "uuid": "q1a",
2665
4351
  "original_language": "en",
2666
4352
  "mode": {
2667
- "token": "multiplechoice"
4353
+ "token": "openquestion"
2668
4354
  },
2669
- "points": 1000,
4355
+ "points": 750,
2670
4356
  "duration": 30,
4357
+ "group": "1",
2671
4358
  "resources": [
2672
4359
  {
2673
4360
  "language": "en",
2674
- "name": "What is the capital of France?",
4361
+ "name": "Question q1a",
4362
+ "label": "Multiple choice",
2675
4363
  "options": {
2676
4364
  "items": [
2677
4365
  {
2678
4366
  "option": 1,
2679
- "text": "Paris",
4367
+ "text": "Answer",
2680
4368
  "correct": true
2681
- },
2682
- {
2683
- "option": 2,
2684
- "text": "Rome",
2685
- "correct": false
2686
- },
2687
- {
2688
- "option": 3,
2689
- "text": "Berlin",
2690
- "correct": false
2691
- },
2692
- {
2693
- "option": 4,
2694
- "text": "Madrid",
2695
- "correct": false
2696
4369
  }
2697
4370
  ]
2698
4371
  }
@@ -2700,38 +4373,25 @@
2700
4373
  ]
2701
4374
  },
2702
4375
  {
2703
- "uuid": "q2",
4376
+ "uuid": "q1b",
2704
4377
  "original_language": "en",
2705
4378
  "mode": {
2706
- "token": "multiplechoice"
4379
+ "token": "openquestion"
2707
4380
  },
2708
- "points": 1000,
4381
+ "points": 1500,
2709
4382
  "duration": 30,
4383
+ "group": "1",
2710
4384
  "resources": [
2711
4385
  {
2712
4386
  "language": "en",
2713
- "name": "What is the capital of France?",
4387
+ "name": "Question q1b",
4388
+ "label": "Open question",
2714
4389
  "options": {
2715
4390
  "items": [
2716
4391
  {
2717
4392
  "option": 1,
2718
- "text": "Paris",
4393
+ "text": "Answer",
2719
4394
  "correct": true
2720
- },
2721
- {
2722
- "option": 2,
2723
- "text": "Rome",
2724
- "correct": false
2725
- },
2726
- {
2727
- "option": 3,
2728
- "text": "Berlin",
2729
- "correct": false
2730
- },
2731
- {
2732
- "option": 4,
2733
- "text": "Madrid",
2734
- "correct": false
2735
4395
  }
2736
4396
  ]
2737
4397
  }
@@ -2739,38 +4399,77 @@
2739
4399
  ]
2740
4400
  },
2741
4401
  {
2742
- "uuid": "q3",
4402
+ "uuid": "q2a",
2743
4403
  "original_language": "en",
2744
4404
  "mode": {
2745
- "token": "multiplechoice"
4405
+ "token": "openquestion"
2746
4406
  },
2747
- "points": 1000,
4407
+ "points": 750,
2748
4408
  "duration": 30,
4409
+ "group": "2",
2749
4410
  "resources": [
2750
4411
  {
2751
4412
  "language": "en",
2752
- "name": "What is the capital of France?",
4413
+ "name": "Question q2a",
4414
+ "label": "Multiple choice",
2753
4415
  "options": {
2754
4416
  "items": [
2755
4417
  {
2756
4418
  "option": 1,
2757
- "text": "Paris",
4419
+ "text": "Answer",
2758
4420
  "correct": true
2759
- },
2760
- {
2761
- "option": 2,
2762
- "text": "Rome",
2763
- "correct": false
2764
- },
4421
+ }
4422
+ ]
4423
+ }
4424
+ }
4425
+ ]
4426
+ },
4427
+ {
4428
+ "uuid": "q2b",
4429
+ "original_language": "en",
4430
+ "mode": {
4431
+ "token": "openquestion"
4432
+ },
4433
+ "points": 1500,
4434
+ "duration": 30,
4435
+ "group": "2",
4436
+ "resources": [
4437
+ {
4438
+ "language": "en",
4439
+ "name": "Question q2b",
4440
+ "label": "Open question",
4441
+ "options": {
4442
+ "items": [
2765
4443
  {
2766
- "option": 3,
2767
- "text": "Berlin",
2768
- "correct": false
2769
- },
4444
+ "option": 1,
4445
+ "text": "Answer",
4446
+ "correct": true
4447
+ }
4448
+ ]
4449
+ }
4450
+ }
4451
+ ]
4452
+ },
4453
+ {
4454
+ "uuid": "q3a",
4455
+ "original_language": "en",
4456
+ "mode": {
4457
+ "token": "openquestion"
4458
+ },
4459
+ "points": 750,
4460
+ "duration": 30,
4461
+ "group": "3",
4462
+ "resources": [
4463
+ {
4464
+ "language": "en",
4465
+ "name": "Question q3a",
4466
+ "label": "Multiple choice",
4467
+ "options": {
4468
+ "items": [
2770
4469
  {
2771
- "option": 4,
2772
- "text": "Madrid",
2773
- "correct": false
4470
+ "option": 1,
4471
+ "text": "Answer",
4472
+ "correct": true
2774
4473
  }
2775
4474
  ]
2776
4475
  }
@@ -2778,38 +4477,77 @@
2778
4477
  ]
2779
4478
  },
2780
4479
  {
2781
- "uuid": "q4",
4480
+ "uuid": "q3b",
2782
4481
  "original_language": "en",
2783
4482
  "mode": {
2784
- "token": "multiplechoice"
4483
+ "token": "openquestion"
2785
4484
  },
2786
4485
  "points": 1000,
2787
- "duration": 10,
4486
+ "duration": 30,
4487
+ "group": "3",
2788
4488
  "resources": [
2789
4489
  {
2790
4490
  "language": "en",
2791
- "name": "What is the capital of France?",
4491
+ "name": "Question q3b",
4492
+ "label": "Open question",
2792
4493
  "options": {
2793
4494
  "items": [
2794
4495
  {
2795
4496
  "option": 1,
2796
- "text": "Paris",
4497
+ "text": "Answer",
2797
4498
  "correct": true
2798
- },
2799
- {
2800
- "option": 2,
2801
- "text": "Rome",
2802
- "correct": false
2803
- },
4499
+ }
4500
+ ]
4501
+ }
4502
+ }
4503
+ ]
4504
+ },
4505
+ {
4506
+ "uuid": "q4a",
4507
+ "original_language": "en",
4508
+ "mode": {
4509
+ "token": "openquestion"
4510
+ },
4511
+ "points": 750,
4512
+ "duration": 30,
4513
+ "group": "4",
4514
+ "resources": [
4515
+ {
4516
+ "language": "en",
4517
+ "name": "Question q4a",
4518
+ "label": "Multiple choice",
4519
+ "options": {
4520
+ "items": [
2804
4521
  {
2805
- "option": 3,
2806
- "text": "Berlin",
2807
- "correct": false
2808
- },
4522
+ "option": 1,
4523
+ "text": "Answer",
4524
+ "correct": true
4525
+ }
4526
+ ]
4527
+ }
4528
+ }
4529
+ ]
4530
+ },
4531
+ {
4532
+ "uuid": "q4b",
4533
+ "original_language": "en",
4534
+ "mode": {
4535
+ "token": "openquestion"
4536
+ },
4537
+ "points": 1500,
4538
+ "duration": 30,
4539
+ "group": "4",
4540
+ "resources": [
4541
+ {
4542
+ "language": "en",
4543
+ "name": "Question q4b",
4544
+ "label": "Open question",
4545
+ "options": {
4546
+ "items": [
2809
4547
  {
2810
- "option": 4,
2811
- "text": "Madrid",
2812
- "correct": false
4548
+ "option": 1,
4549
+ "text": "Answer",
4550
+ "correct": true
2813
4551
  }
2814
4552
  ]
2815
4553
  }
@@ -2824,28 +4562,33 @@
2824
4562
  "errors": [],
2825
4563
  "warnings": [
2826
4564
  {
2827
- "id": "q4:duration-outlier",
2828
- "ruleId": "duration-outlier",
4565
+ "id": "q3b:group-position:points",
4566
+ "ruleId": "group-position:points",
2829
4567
  "roundId": "r1",
2830
- "questionId": "q4",
2831
- "message": "Runs 10 seconds while the rest of this round is around 30",
2832
- "messageKey": "Runs {value} seconds while the rest of this round is around {median}",
4568
+ "questionId": "q3b",
4569
+ "message": "Worth 1000 points while question 2 of most other groups is worth 1500",
4570
+ "messageKey": "Worth {value} points while question {position} of most other groups is worth {expected}",
2833
4571
  "messageParams": {
2834
- "value": 10,
2835
- "median": 30
4572
+ "value": 1000,
4573
+ "expected": 1500,
4574
+ "position": 2
2836
4575
  }
2837
4576
  }
2838
4577
  ]
2839
4578
  }
2840
4579
  },
2841
4580
  {
2842
- "name": "explanation-pair",
4581
+ "name": "group-size-not-in-question-groups",
2843
4582
  "input": {
2844
4583
  "round": {
2845
4584
  "uuid": "r1",
2846
4585
  "original_language": "en",
2847
4586
  "mode": {
2848
- "token": "trivia"
4587
+ "token": "questiongroups"
4588
+ },
4589
+ "modeSettings": {
4590
+ "lightning": false,
4591
+ "instantFeedback": false
2849
4592
  },
2850
4593
  "scoringStrategy": {
2851
4594
  "token": "default"
@@ -2866,6 +4609,7 @@
2866
4609
  },
2867
4610
  "points": 1000,
2868
4611
  "duration": 30,
4612
+ "group": "1",
2869
4613
  "resources": [
2870
4614
  {
2871
4615
  "language": "en",
@@ -2893,8 +4637,7 @@
2893
4637
  "correct": false
2894
4638
  }
2895
4639
  ]
2896
- },
2897
- "longExplanation": "Read this."
4640
+ }
2898
4641
  }
2899
4642
  ]
2900
4643
  },
@@ -2906,6 +4649,7 @@
2906
4649
  },
2907
4650
  "points": 1000,
2908
4651
  "duration": 30,
4652
+ "group": "1",
2909
4653
  "resources": [
2910
4654
  {
2911
4655
  "language": "en",
@@ -2933,8 +4677,7 @@
2933
4677
  "correct": false
2934
4678
  }
2935
4679
  ]
2936
- },
2937
- "longExplanation": "Read this."
4680
+ }
2938
4681
  }
2939
4682
  ]
2940
4683
  },
@@ -2946,6 +4689,7 @@
2946
4689
  },
2947
4690
  "points": 1000,
2948
4691
  "duration": 30,
4692
+ "group": "2",
2949
4693
  "resources": [
2950
4694
  {
2951
4695
  "language": "en",
@@ -2973,8 +4717,7 @@
2973
4717
  "correct": false
2974
4718
  }
2975
4719
  ]
2976
- },
2977
- "longExplanation": "Read this."
4720
+ }
2978
4721
  }
2979
4722
  ]
2980
4723
  },
@@ -2986,6 +4729,7 @@
2986
4729
  },
2987
4730
  "points": 1000,
2988
4731
  "duration": 30,
4732
+ "group": "2",
2989
4733
  "resources": [
2990
4734
  {
2991
4735
  "language": "en",
@@ -3013,8 +4757,7 @@
3013
4757
  "correct": false
3014
4758
  }
3015
4759
  ]
3016
- },
3017
- "longExplanation": "Read this."
4760
+ }
3018
4761
  }
3019
4762
  ]
3020
4763
  },
@@ -3026,6 +4769,7 @@
3026
4769
  },
3027
4770
  "points": 1000,
3028
4771
  "duration": 30,
4772
+ "group": "3",
3029
4773
  "resources": [
3030
4774
  {
3031
4775
  "language": "en",
@@ -3053,8 +4797,7 @@
3053
4797
  "correct": false
3054
4798
  }
3055
4799
  ]
3056
- },
3057
- "explanation": "Shown on screen."
4800
+ }
3058
4801
  }
3059
4802
  ]
3060
4803
  }
@@ -3064,20 +4807,7 @@
3064
4807
  },
3065
4808
  "expected": {
3066
4809
  "errors": [],
3067
- "warnings": [
3068
- {
3069
- "id": "q5:explanation-pair",
3070
- "ruleId": "explanation-pair",
3071
- "roundId": "r1",
3072
- "questionId": "q5",
3073
- "message": "The rest of this round explains the answer in the quizmaster answer explanation, this one uses the answer explanation",
3074
- "messageKey": "The rest of this round explains the answer in the {expected}, this one uses the {actual}",
3075
- "messageParams": {
3076
- "expected": "quizmaster answer explanation",
3077
- "actual": "answer explanation"
3078
- }
3079
- }
3080
- ]
4810
+ "warnings": []
3081
4811
  }
3082
4812
  },
3083
4813
  {