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); } } }