@digabi/exam-engine-rendering 19.1.0-alpha.0 → 19.1.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.
- package/dist/Grading.d.ts +4 -0
- package/dist/Grading.d.ts.map +1 -0
- package/dist/Grading.js +109 -0
- package/dist/Grading.js.map +1 -0
- package/dist/PreviewGrading.d.ts +4 -0
- package/dist/PreviewGrading.d.ts.map +1 -0
- package/dist/PreviewGrading.js +86 -0
- package/dist/PreviewGrading.js.map +1 -0
- package/dist/__tests__/puppeteerUtils.d.ts +0 -4
- package/dist/__tests__/puppeteerUtils.d.ts.map +1 -1
- package/dist/__tests__/puppeteerUtils.js +1 -15
- package/dist/__tests__/puppeteerUtils.js.map +1 -1
- package/dist/__tests__/testGrading.d.ts +2 -0
- package/dist/__tests__/testGrading.d.ts.map +1 -0
- package/dist/__tests__/testGrading.js +97 -0
- package/dist/__tests__/testGrading.js.map +1 -0
- package/dist/__tests__/testOfflineGeneration.js +16 -1
- package/dist/__tests__/testOfflineGeneration.js.map +1 -1
- package/dist/__tests__/tsconfig.tsbuildinfo +1 -1
- package/dist/createOfflineExam.d.ts +0 -4
- package/dist/createOfflineExam.d.ts.map +1 -1
- package/dist/createOfflineExam.js +6 -16
- package/dist/createOfflineExam.js.map +1 -1
- package/dist/getOfflineWebpackConfig.d.ts.map +1 -1
- package/dist/getOfflineWebpackConfig.js +23 -28
- package/dist/getOfflineWebpackConfig.js.map +1 -1
- package/dist/preview.js +5 -2
- package/dist/preview.js.map +1 -1
- package/dist/utils/indexedDBGraringServerAPI.d.ts +3 -0
- package/dist/utils/indexedDBGraringServerAPI.d.ts.map +1 -0
- package/dist/utils/indexedDBGraringServerAPI.js +33 -0
- package/dist/utils/indexedDBGraringServerAPI.js.map +1 -0
- package/package.json +4 -4
- package/public/index.html +16 -0
- package/dist/__tests__/testGradingInstructionsGeneration.d.ts +0 -2
- package/dist/__tests__/testGradingInstructionsGeneration.d.ts.map +0 -1
- package/dist/__tests__/testGradingInstructionsGeneration.js +0 -32
- package/dist/__tests__/testGradingInstructionsGeneration.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Grading.d.ts","sourceRoot":"","sources":["../src/Grading.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAA;;AAqHtE,wBAA6E"}
|
package/dist/Grading.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const react_1 = __importStar(require("react"));
|
|
27
|
+
const react_i18next_1 = require("react-i18next");
|
|
28
|
+
const ResultsContext_1 = require("@digabi/exam-engine-core/dist/components/context/ResultsContext");
|
|
29
|
+
const i18n_1 = require("@digabi/exam-engine-core/dist/i18n");
|
|
30
|
+
const GradingAnswer_1 = require("@digabi/exam-engine-core/dist/components/grading/GradingAnswer");
|
|
31
|
+
const CommonExamContext_1 = require("@digabi/exam-engine-core/dist/components/context/CommonExamContext");
|
|
32
|
+
function Grading() {
|
|
33
|
+
const { answersByQuestionId } = (0, react_1.useContext)(ResultsContext_1.ResultsContext);
|
|
34
|
+
const i18n = (0, i18n_1.initI18n)('FI-fi');
|
|
35
|
+
(0, react_1.useEffect)((0, i18n_1.changeLanguage)(i18n, 'FI-fi'));
|
|
36
|
+
const answerIds = Object.keys(answersByQuestionId).map(Number);
|
|
37
|
+
if (answerIds.length === 0) {
|
|
38
|
+
return react_1.default.createElement("div", null, "No answers");
|
|
39
|
+
}
|
|
40
|
+
const [answerId, setAnswerId] = (0, react_1.useState)(answerIds[0]);
|
|
41
|
+
const annotationsStorage = (0, react_1.useRef)(Object.fromEntries(answerIds.map((id) => [
|
|
42
|
+
id,
|
|
43
|
+
{
|
|
44
|
+
pregrading: [
|
|
45
|
+
{
|
|
46
|
+
startIndex: 2,
|
|
47
|
+
length: 5,
|
|
48
|
+
message: '+1',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
x: 0.07434944237918215,
|
|
52
|
+
y: 0.8599562363238512,
|
|
53
|
+
type: 'rect',
|
|
54
|
+
width: 0.16604708798017348,
|
|
55
|
+
height: 0.03063457330415753,
|
|
56
|
+
message: '+2',
|
|
57
|
+
attachmentIndex: 0,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
x1: 0.4035532994923858,
|
|
61
|
+
x2: 0.5621827411167513,
|
|
62
|
+
y1: 0.957983193277311,
|
|
63
|
+
y2: 0.957983193277311,
|
|
64
|
+
type: 'line',
|
|
65
|
+
message: 'trk, +1',
|
|
66
|
+
attachmentIndex: 0,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
censoring: [],
|
|
70
|
+
},
|
|
71
|
+
])));
|
|
72
|
+
const [annotations, setAnnotations] = (0, react_1.useState)({
|
|
73
|
+
pregrading: [],
|
|
74
|
+
censoring: [],
|
|
75
|
+
});
|
|
76
|
+
(0, react_1.useEffect)(() => {
|
|
77
|
+
setAnnotations(annotationsStorage.current[answerId]);
|
|
78
|
+
});
|
|
79
|
+
const answer = answersByQuestionId[answerId];
|
|
80
|
+
const { type: answerType, value } = answer;
|
|
81
|
+
if (answerType === 'choice') {
|
|
82
|
+
return react_1.default.createElement("div", null, "choice answer");
|
|
83
|
+
}
|
|
84
|
+
const { characterCount } = answer;
|
|
85
|
+
function selectQuestion(e, id) {
|
|
86
|
+
e.preventDefault();
|
|
87
|
+
setAnswerId(id);
|
|
88
|
+
setAnnotations(annotationsStorage.current[id]);
|
|
89
|
+
}
|
|
90
|
+
function saveAnnotations(annotations) {
|
|
91
|
+
annotationsStorage.current[answerId] = annotations;
|
|
92
|
+
setAnnotations({ ...annotationsStorage.current[answerId] });
|
|
93
|
+
}
|
|
94
|
+
return (react_1.default.createElement(react_i18next_1.I18nextProvider, { i18n: i18n },
|
|
95
|
+
react_1.default.createElement("main", { className: "e-exam" },
|
|
96
|
+
react_1.default.createElement("div", { className: "grading-navi" }, answerIds.map((id) => id === answerId ? (react_1.default.createElement("span", { key: id, className: "grading-navi-item" }, answersByQuestionId[id].displayNumber)) : (react_1.default.createElement("a", { className: "grading-navi-item", href: "", onClick: (e) => selectQuestion(e, id), key: id }, answersByQuestionId[id].displayNumber)))),
|
|
97
|
+
react_1.default.createElement(GradingAnswer_1.GradingAnswer, { ...{
|
|
98
|
+
isReadOnly: false,
|
|
99
|
+
answerType,
|
|
100
|
+
gradingRole: 'censoring',
|
|
101
|
+
value,
|
|
102
|
+
characterCount,
|
|
103
|
+
maxLength: 100,
|
|
104
|
+
annotations,
|
|
105
|
+
saveAnnotations,
|
|
106
|
+
} }))));
|
|
107
|
+
}
|
|
108
|
+
exports.default = react_1.default.memo((0, ResultsContext_1.withResultsContext)((0, CommonExamContext_1.withCommonExamContext)(Grading)));
|
|
109
|
+
//# sourceMappingURL=Grading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Grading.js","sourceRoot":"","sources":["../src/Grading.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewGrading.d.ts","sourceRoot":"","sources":["../src/PreviewGrading.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAA;;AA2FtE,wBAAwE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const react_1 = __importStar(require("react"));
|
|
27
|
+
const ResultsContext_1 = require("@digabi/exam-engine-core/dist/components/context/ResultsContext");
|
|
28
|
+
const GradingAnswer_1 = require("@digabi/exam-engine-core/dist/components/grading/GradingAnswer");
|
|
29
|
+
const CommonExamContext_1 = require("@digabi/exam-engine-core/dist/components/context/CommonExamContext");
|
|
30
|
+
function PreviewGrading() {
|
|
31
|
+
const { answersByQuestionId } = (0, react_1.useContext)(ResultsContext_1.ResultsContext);
|
|
32
|
+
const language = 'fi-FI';
|
|
33
|
+
const answerIds = Object.keys(answersByQuestionId).map(Number);
|
|
34
|
+
if (answerIds.length === 0) {
|
|
35
|
+
return react_1.default.createElement("div", null, "No answers");
|
|
36
|
+
}
|
|
37
|
+
const [answerId, setAnswerId] = (0, react_1.useState)(answerIds[0]);
|
|
38
|
+
const annotationsStorage = (0, react_1.useRef)(Object.fromEntries(answerIds.map((id) => [
|
|
39
|
+
id,
|
|
40
|
+
{
|
|
41
|
+
pregrading: [
|
|
42
|
+
{
|
|
43
|
+
startIndex: 2,
|
|
44
|
+
length: 5,
|
|
45
|
+
message: '+1',
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
censoring: [],
|
|
49
|
+
},
|
|
50
|
+
])));
|
|
51
|
+
const [annotations, setAnnotations] = (0, react_1.useState)({
|
|
52
|
+
pregrading: [],
|
|
53
|
+
censoring: [],
|
|
54
|
+
});
|
|
55
|
+
(0, react_1.useEffect)(() => {
|
|
56
|
+
setAnnotations(annotationsStorage.current[answerId]);
|
|
57
|
+
});
|
|
58
|
+
const answer = answersByQuestionId[answerId];
|
|
59
|
+
const { type, value } = answer;
|
|
60
|
+
if (type === 'choice') {
|
|
61
|
+
return react_1.default.createElement("div", null, "choice answer");
|
|
62
|
+
}
|
|
63
|
+
const { characterCount } = answer;
|
|
64
|
+
function selectQuestion(e, id) {
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
setAnswerId(id);
|
|
67
|
+
setAnnotations(annotationsStorage.current[id]);
|
|
68
|
+
}
|
|
69
|
+
function saveAnnotations(annotations) {
|
|
70
|
+
annotationsStorage.current[answerId] = annotations;
|
|
71
|
+
setAnnotations({ ...annotationsStorage.current[answerId] });
|
|
72
|
+
}
|
|
73
|
+
return (react_1.default.createElement("main", { className: "e-exam" },
|
|
74
|
+
react_1.default.createElement("div", { className: "grading-navi" }, answerIds.map((id) => id === answerId ? (react_1.default.createElement("span", { key: id, className: "grading-navi-item" }, answersByQuestionId[id].displayNumber)) : (react_1.default.createElement("a", { className: "grading-navi-item", href: "", onClick: (e) => selectQuestion(e, id), key: id }, answersByQuestionId[id].displayNumber)))),
|
|
75
|
+
react_1.default.createElement(GradingAnswer_1.GradingAnswer, { ...{
|
|
76
|
+
answer: { type, characterCount, value },
|
|
77
|
+
language,
|
|
78
|
+
isReadOnly: false,
|
|
79
|
+
gradingRole: 'censoring',
|
|
80
|
+
maxLength: 100,
|
|
81
|
+
annotations,
|
|
82
|
+
saveAnnotations,
|
|
83
|
+
} })));
|
|
84
|
+
}
|
|
85
|
+
exports.default = (0, ResultsContext_1.withResultsContext)((0, CommonExamContext_1.withCommonExamContext)(PreviewGrading));
|
|
86
|
+
//# sourceMappingURL=PreviewGrading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewGrading.js","sourceRoot":"","sources":["../src/PreviewGrading.tsx"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,4 @@ export declare function halt(page: Page): Promise<void>;
|
|
|
6
6
|
export declare function getInnerText(page: Page, selector: string): Promise<string>;
|
|
7
7
|
export declare function getOuterHtml(page: Page, selector: string): Promise<string>;
|
|
8
8
|
export declare function getTextContent(page: Page, selector: string): Promise<string>;
|
|
9
|
-
export declare function getPageAndRequestErrors(page: Page, filename: string): Promise<{
|
|
10
|
-
requestErrors: string[];
|
|
11
|
-
pageErrors: Error[];
|
|
12
|
-
}>;
|
|
13
9
|
//# sourceMappingURL=puppeteerUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteerUtils.d.ts","sourceRoot":"","sources":["../../__tests__/puppeteerUtils.ts"],"names":[],"mappings":"AAEA,OAAkB,EAAW,IAAI,EAAE,MAAM,WAAW,CAAA;AAIpD,wBAAgB,aAAa,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,CAgBnD;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrE;AAED,wBAAsB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzD;AAGD,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpD;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQhF;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQhF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlF
|
|
1
|
+
{"version":3,"file":"puppeteerUtils.d.ts","sourceRoot":"","sources":["../../__tests__/puppeteerUtils.ts"],"names":[],"mappings":"AAEA,OAAkB,EAAW,IAAI,EAAE,MAAM,WAAW,CAAA;AAIpD,wBAAgB,aAAa,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,CAgBnD;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrE;AAED,wBAAsB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzD;AAGD,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpD;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQhF;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQhF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlF"}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.getTextContent = exports.getOuterHtml = exports.getInnerText = exports.halt = exports.delay = exports.loadExam = exports.initPuppeteer = void 0;
|
|
7
7
|
const puppeteer_1 = __importDefault(require("puppeteer"));
|
|
8
8
|
const isInDebugMode = process.env.PUPPETEER_DEBUG === '1';
|
|
9
9
|
function initPuppeteer() {
|
|
@@ -71,18 +71,4 @@ async function getTextContent(page, selector) {
|
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
exports.getTextContent = getTextContent;
|
|
74
|
-
async function getPageAndRequestErrors(page, filename) {
|
|
75
|
-
const requestErrors = [];
|
|
76
|
-
const pageErrors = [];
|
|
77
|
-
page.on('requestfailed', (req) => {
|
|
78
|
-
const errorText = req.failure().errorText;
|
|
79
|
-
if (errorText !== 'net::ERR_ABORTED') {
|
|
80
|
-
requestErrors.push(req.url());
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
page.on('pageerror', (err) => pageErrors.push(err));
|
|
84
|
-
await page.goto('file://' + filename, { waitUntil: 'networkidle0' });
|
|
85
|
-
return { requestErrors, pageErrors };
|
|
86
|
-
}
|
|
87
|
-
exports.getPageAndRequestErrors = getPageAndRequestErrors;
|
|
88
74
|
//# sourceMappingURL=puppeteerUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteerUtils.js","sourceRoot":"","sources":["../../__tests__/puppeteerUtils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"puppeteerUtils.js","sourceRoot":"","sources":["../../__tests__/puppeteerUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testGrading.d.ts","sourceRoot":"","sources":["../../__tests__/testGrading.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const exam_engine_exams_1 = require("@digabi/exam-engine-exams");
|
|
4
|
+
const exam_engine_rendering_1 = require("@digabi/exam-engine-rendering");
|
|
5
|
+
const puppeteerUtils_1 = require("./puppeteerUtils");
|
|
6
|
+
const VISIBLE = { visible: true };
|
|
7
|
+
const HIDDEN = { hidden: true };
|
|
8
|
+
describe('testGrading.ts', () => {
|
|
9
|
+
const createPage = (0, puppeteerUtils_1.initPuppeteer)();
|
|
10
|
+
let page;
|
|
11
|
+
let ctx;
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
ctx = await (0, exam_engine_rendering_1.previewExam)((0, exam_engine_exams_1.resolveExam)('N/N.xml'));
|
|
14
|
+
page = await createPage();
|
|
15
|
+
await (0, puppeteerUtils_1.loadExam)(page, ctx.url);
|
|
16
|
+
await answer(1, 'Short answer message content');
|
|
17
|
+
await answer(7, 'Duis magna mi, interdum eu mattis vel, ultricies a nibh. Duis tortor tortor, imperdiet eget fermentum eget, rutrum ac lorem. Ut eu enim risus. Donec sed eros orci. Aenean vel eros lobortis, dignissim magna nec, vulputate quam. Morbi non metus consequat, pellentesque tellus iaculis, iaculis dolor. Vivamus vel feugiat neque, sit amet varius turpis. Aliquam non dapibus augue, interdum dapibus tellus. Ut at est eu ex pharetra ultricies');
|
|
18
|
+
await page.click('[data-js="newEquation"]');
|
|
19
|
+
await page.keyboard.type('1/x+2x^2');
|
|
20
|
+
await page.keyboard.press('Escape');
|
|
21
|
+
// await page.type(`.text-answer[data-question-id="${7}"]`, text)
|
|
22
|
+
await page.waitForSelector('.save-indicator-text--saved');
|
|
23
|
+
await page.goto(ctx.url + '/fi-FI/normal/grading');
|
|
24
|
+
await page.waitForSelector('.e-grading-answer');
|
|
25
|
+
});
|
|
26
|
+
afterAll(async () => {
|
|
27
|
+
await ctx.close();
|
|
28
|
+
});
|
|
29
|
+
it('renders single line answer with character without warning and annotate', async () => {
|
|
30
|
+
await navigateToAnswer('1.1');
|
|
31
|
+
await expectText('.e-grading-answer-length', 'Vastauksen pituus: 25 merkkiä.');
|
|
32
|
+
await page.waitForSelector('.e-grading-answer-max-length-surplus', HIDDEN);
|
|
33
|
+
await drag(245, 140, 300, 140);
|
|
34
|
+
await page.waitForSelector('.e-grading-answer-add-annotation', VISIBLE);
|
|
35
|
+
await page.keyboard.type('+1p.');
|
|
36
|
+
await page.keyboard.press('Enter');
|
|
37
|
+
await expectAnnotationMessages(['+1', '+1p.']);
|
|
38
|
+
});
|
|
39
|
+
it('renders character count with surplus warning', async () => {
|
|
40
|
+
await navigateToAnswer('2');
|
|
41
|
+
const surplusText = 'Vastauksen enimmäispituus 100 merkkiä ylittyy 268 %.';
|
|
42
|
+
await expectText('.e-grading-answer-length', 'Vastauksen pituus: 368 merkkiä.' + surplusText);
|
|
43
|
+
await expectText('.e-grading-answer-max-length-surplus', surplusText);
|
|
44
|
+
});
|
|
45
|
+
it('creates annotations, modifies and removes them', async () => {
|
|
46
|
+
await navigateToAnswer('2');
|
|
47
|
+
await drag(200, 200, 402, 200);
|
|
48
|
+
await page.waitForSelector('.e-grading-answer-add-annotation', VISIBLE);
|
|
49
|
+
await page.keyboard.type('first annotation message');
|
|
50
|
+
await page.keyboard.press('Enter');
|
|
51
|
+
await page.waitForSelector('.e-grading-answer-add-annotation', HIDDEN);
|
|
52
|
+
await expectText('.e-annotation--censoring', 'sque tellus iaculis, iaculis d');
|
|
53
|
+
await expectAnnotationMessages(['+1', 'first annotation message']);
|
|
54
|
+
await page.mouse.move(300, 200);
|
|
55
|
+
await page.waitForSelector('.e-grading-answer-tooltip', VISIBLE);
|
|
56
|
+
await page.click('.e-grading-answer-tooltip-label');
|
|
57
|
+
await page.waitForSelector('.e-grading-answer-add-annotation', VISIBLE);
|
|
58
|
+
await page.keyboard.sendCharacter('2');
|
|
59
|
+
await page.keyboard.press('Enter');
|
|
60
|
+
await expectAnnotationMessages(['+1', 'first annotation message2']);
|
|
61
|
+
await page.mouse.move(300, 200);
|
|
62
|
+
await page.click('.e-grading-answer-tooltip-remove');
|
|
63
|
+
await expectAnnotationMessages(['+1']);
|
|
64
|
+
await drag(510, 230, 550, 250);
|
|
65
|
+
await page.waitForSelector('.e-grading-answer-add-annotation', VISIBLE);
|
|
66
|
+
await page.keyboard.type('img annotation msg');
|
|
67
|
+
await page.keyboard.press('Enter');
|
|
68
|
+
await page.waitForSelector('.e-grading-answer-add-annotation', HIDDEN);
|
|
69
|
+
await page.waitForSelector('.e-annotation-wrapper .e-annotation--censoring', VISIBLE);
|
|
70
|
+
await expectAnnotationMessages(['+1', 'img annotation msg']);
|
|
71
|
+
});
|
|
72
|
+
async function expectText(selector, text) {
|
|
73
|
+
const element = await page.waitForSelector(selector, VISIBLE);
|
|
74
|
+
const textContent = await (element === null || element === void 0 ? void 0 : element.evaluate((el) => el.textContent));
|
|
75
|
+
expect(textContent).toBe(text);
|
|
76
|
+
}
|
|
77
|
+
async function expectAnnotationMessages(expected) {
|
|
78
|
+
const annotationList = await page.waitForSelector('.e-annotation-list', VISIBLE);
|
|
79
|
+
const listItems = await (annotationList === null || annotationList === void 0 ? void 0 : annotationList.evaluate((el) => Array.from(el.querySelectorAll('li')).map((li) => li.textContent)));
|
|
80
|
+
expect(listItems).toEqual(expected);
|
|
81
|
+
}
|
|
82
|
+
async function drag(x1, y1, x2, y2) {
|
|
83
|
+
await page.mouse.move(x1, y1);
|
|
84
|
+
await page.mouse.down();
|
|
85
|
+
await page.mouse.move(x2, y2);
|
|
86
|
+
await page.mouse.up();
|
|
87
|
+
}
|
|
88
|
+
async function answer(questionId, text) {
|
|
89
|
+
await page.type(`.text-answer[data-question-id="${questionId}"]`, text);
|
|
90
|
+
}
|
|
91
|
+
async function navigateToAnswer(displayNumber) {
|
|
92
|
+
const navi = await page.waitForSelector('.grading-navi');
|
|
93
|
+
const button = await (navi === null || navi === void 0 ? void 0 : navi.waitForSelector('text/' + displayNumber));
|
|
94
|
+
await (button === null || button === void 0 ? void 0 : button.click());
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=testGrading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testGrading.js","sourceRoot":"","sources":["../../__tests__/testGrading.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,11 +13,13 @@ describe('testOfflineGeneration.ts - Offline version generation', () => {
|
|
|
13
13
|
let page;
|
|
14
14
|
let examHtmlFile;
|
|
15
15
|
let attachmentsHtmlFile;
|
|
16
|
+
let gradingInstructionHtmlFile;
|
|
16
17
|
beforeAll(async () => {
|
|
17
18
|
const tmpdir = await tmp_promise_1.default.dir().then((r) => r.path);
|
|
18
19
|
const [outputDirectory] = await (0, exam_engine_rendering_1.createOfflineExam)((0, exam_engine_exams_1.resolveExam)('A_E/A_E.xml'), tmpdir);
|
|
19
20
|
examHtmlFile = path_1.default.resolve(outputDirectory, 'index.html');
|
|
20
21
|
attachmentsHtmlFile = path_1.default.resolve(outputDirectory, 'attachments/index.html');
|
|
22
|
+
gradingInstructionHtmlFile = path_1.default.resolve(outputDirectory, 'attachments/index.html');
|
|
21
23
|
page = await createPage();
|
|
22
24
|
});
|
|
23
25
|
it('renders exam page without errors', async () => {
|
|
@@ -26,8 +28,21 @@ describe('testOfflineGeneration.ts - Offline version generation', () => {
|
|
|
26
28
|
it('renders attachment page without errors', async () => {
|
|
27
29
|
await expectToRenderWithoutErrors(attachmentsHtmlFile);
|
|
28
30
|
});
|
|
31
|
+
it('renders grading instruction page without errors', async () => {
|
|
32
|
+
await expectToRenderWithoutErrors(gradingInstructionHtmlFile);
|
|
33
|
+
});
|
|
29
34
|
async function expectToRenderWithoutErrors(filename) {
|
|
30
|
-
const
|
|
35
|
+
const requestErrors = [];
|
|
36
|
+
const pageErrors = [];
|
|
37
|
+
// FIXME: Remove explicit type after Puppeteer's types have improved.
|
|
38
|
+
page.on('requestfailed', (req) => {
|
|
39
|
+
const errorText = req.failure().errorText;
|
|
40
|
+
if (errorText !== 'net::ERR_ABORTED') {
|
|
41
|
+
requestErrors.push(req.url());
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
page.on('pageerror', (err) => pageErrors.push(err));
|
|
45
|
+
await page.goto('file://' + filename, { waitUntil: 'networkidle0' });
|
|
31
46
|
expect(requestErrors).toEqual([]);
|
|
32
47
|
expect(pageErrors).toEqual([]);
|
|
33
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testOfflineGeneration.js","sourceRoot":"","sources":["../../__tests__/testOfflineGeneration.ts"],"names":[],"mappings":";;;;;AAAA,iEAAuD;AACvD,yEAAiE;AACjE,gDAAuB;AAEvB,8DAA6B;AAC7B,
|
|
1
|
+
{"version":3,"file":"testOfflineGeneration.js","sourceRoot":"","sources":["../../__tests__/testOfflineGeneration.ts"],"names":[],"mappings":";;;;;AAAA,iEAAuD;AACvD,yEAAiE;AACjE,gDAAuB;AAEvB,8DAA6B;AAC7B,qDAAgD;AAEhD,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACrE,MAAM,UAAU,GAAG,IAAA,8BAAa,GAAE,CAAA;IAClC,IAAI,IAAU,CAAA;IACd,IAAI,YAAoB,CAAA;IACxB,IAAI,mBAA2B,CAAA;IAC/B,IAAI,0BAAkC,CAAA;IAEtC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,qBAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,CAAC,eAAe,CAAC,GAAG,MAAM,IAAA,yCAAiB,EAAC,IAAA,+BAAW,EAAC,aAAa,CAAC,EAAE,MAAM,CAAC,CAAA;QACrF,YAAY,GAAG,cAAI,CAAC,OAAO,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA;QAC1D,mBAAmB,GAAG,cAAI,CAAC,OAAO,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAA;QAC7E,0BAA0B,GAAG,cAAI,CAAC,OAAO,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAA;QACpF,IAAI,GAAG,MAAM,UAAU,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,2BAA2B,CAAC,YAAY,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,2BAA2B,CAAC,mBAAmB,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,2BAA2B,CAAC,0BAA0B,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,KAAK,UAAU,2BAA2B,CAAC,QAAgB;QACzD,MAAM,aAAa,GAAa,EAAE,CAAA;QAClC,MAAM,UAAU,GAAY,EAAE,CAAA;QAE9B,qEAAqE;QACrE,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,GAAgB,EAAE,EAAE;YAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAG,CAAC,SAAS,CAAA;YAC1C,IAAI,SAAS,KAAK,kBAAkB,EAAE;gBACpC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;aAC9B;QACH,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAEnD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAA;QACpE,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACjC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC;AACH,CAAC,CAAC,CAAA"}
|