import StringDiff from "./../../util/string_diff";
export class OutputAssessmentResult {
// Status code - it is not grade related!
// 0 - Succesful execution
// 1 - failed execution
static get DETAIL_TEMPLATE () {
return `
`;
}
static get OUTPUT_TEMPLATE () {
return `$0 |
$1 |
$2 | `;
}
constructor (status, result, store, time, error_msg = '') {
this.status = status;
this.results = result;
this.store = store;
this.time = time;
this.error_msg = error_msg;
}
get grade () {
return this.results.reduce((prev, val) => prev + val.grade, 0) / this.results.length;
}
prepareResults () {
}
generateOutput (output) {
}
formatNumber (result) {
let template = this.formatOutput('assessment-number-expected',
'assessment-number-generated', 'assessment-number-result', result);
return template
}
formatBool (result) {
let template = this.formatOutput('assessment-bool-expected',
'assessment-bool-generated', 'assessment-bool-result', result);
return template
}
formatOutput (expected_class, generated_class, result_class, result) {
let template = OutputAssessmentResult.OUTPUT_TEMPLATE;
template = template.replace(":class-expected:", expected_class);
template = template.replace(":class-generated:", generated_class);
template = template.replace(":class-result:", result_class);
template = template.replace("$0", result.expected);
template = template.replace("$1", result.generated);
const final_result = result.grade == 1 ? "✓" : "✗"
template = template.replace("$2", final_result);
return template
}
formatString (result) {
const expected_class = 'assessment-string-expected';
const generated_class = 'assessment-string-generated';
const result_class = 'assessment-string-result';
let template = OutputAssessmentResult.OUTPUT_TEMPLATE;
template = template.replace(":class-expected:", expected_class);
template = template.replace(":class-generated:", generated_class);
template = template.replace(":class-result:", result_class);
const g_string = result.generated || "";
const e_string = result.expected || "";
template = template.replace("$0", result.expected);
template = template.replace("$1", result.generated);
if(result.grade == 1) {
template = template.replace("$2", "✓");
} else {
const diff = StringDiff(g_string, e_string);
const diff_vec = diff.map(part => this.getDiffStringStyle(part[1], part[0]), this);
const diff_string = diff_vec.reduce((prev, actual) => prev + actual, "");
template = template.replace("$2", diff_string);
}
return template;
}
getDiffStringStyle (text, action) {
const template = "$1"
switch(action) {
case StringDiff.INSERT:
return template.replace("$0", "stringdiff-insert").replace("$1", text);
case StringDiff.DELETE:
return template.replace("$0", "stringdiff-delete").replace("$1", text);
case StringDiff.EQUAL:
return template.replace("$0", "stringdiff-equal").replace("$1", text);
}
}
}