|
@@ -1,24 +1,75 @@
|
|
|
import StringDiff from "./../../util/string_diff";
|
|
|
+import { LocalizedStrings } from './../../services/localizedStringsService'
|
|
|
+
|
|
|
export class OutputAssessmentResult {
|
|
|
|
|
|
- // Status code - it is not grade related!
|
|
|
- // 0 - Succesful execution
|
|
|
- // 1 - failed execution
|
|
|
+ static get PAGE_TEMPLATE () {
|
|
|
+ return `<!DOCTYPE html>
|
|
|
+ <html>
|
|
|
+ <head>
|
|
|
+ <meta http-equiv='content-type' content='text/html; charset=UTF-8'>
|
|
|
+ <link rel='stylesheet' href='css/ivprog-assessment.css' type='text/css'/>
|
|
|
+ </head>
|
|
|
+ <body>
|
|
|
+ :assessment-result:
|
|
|
+ </body>
|
|
|
+ </html>`;
|
|
|
+ }
|
|
|
|
|
|
static get DETAIL_TEMPLATE () {
|
|
|
- return ` <div>
|
|
|
- </div>
|
|
|
- `;
|
|
|
+ return `<div class='details-body'>
|
|
|
+ <div class='details-header'>
|
|
|
+ <h2>:test-name:</h2>
|
|
|
+ <p>:time-label:: <span>:time:ms</span></p>
|
|
|
+ <p>:grade-label:: <span>:grade:%</span></p>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h3>:input-label:</h3>
|
|
|
+ <ul>
|
|
|
+ <li>:input-list:</li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h3>:output-label:</h3>
|
|
|
+ :output-result:
|
|
|
+ </div>
|
|
|
+ </div>`;
|
|
|
+ }
|
|
|
+
|
|
|
+ static get OUPUT_TABLE_TEMPLATE () {
|
|
|
+ return `<div class='detaisl-div-table'>
|
|
|
+ <table class='assessment-output-table'>
|
|
|
+ <tr>
|
|
|
+ <th>:expected-label:</th>
|
|
|
+ <th>:generated-label:</th>
|
|
|
+ <th>:result-label:</th>
|
|
|
+ </tr>
|
|
|
+ :results:
|
|
|
+ </table>
|
|
|
+ </div>`;
|
|
|
}
|
|
|
|
|
|
static get OUTPUT_TEMPLATE () {
|
|
|
- return `<td class=":class-expected:">$0</td>
|
|
|
- <td class=":class-generated:">$1</td>
|
|
|
- <td class=":class-result:">$2</td>`;
|
|
|
+ return `<tr><td class=':class-expected:'>$0</td>
|
|
|
+ <td class=':class-generated:'>$1</td>
|
|
|
+ <td class=':class-result:'>$2</td></tr>`;
|
|
|
}
|
|
|
|
|
|
- constructor (status, result, store, time, error_msg = '') {
|
|
|
+ static get FAILED_TEMPLATE () {
|
|
|
+ return `<p class='assessment-failed-execution'><span class='assessment-failed-case'>✗</span>$0</p>`;
|
|
|
+ }
|
|
|
+
|
|
|
+ static get INPUT_INFO_TEMPLATE () {
|
|
|
+ return `<span class='$0'>$1</span>`;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Status code - it is not grade related!
|
|
|
+ // 0 - Succesful execution
|
|
|
+ // 1 - failed execution
|
|
|
+ constructor (name, status, inputs, result, store, time, error_msg = '') {
|
|
|
+ this.name = name;
|
|
|
this.status = status;
|
|
|
+ this.inputs = inputs;
|
|
|
this.results = result;
|
|
|
this.store = store;
|
|
|
this.time = time;
|
|
@@ -26,26 +77,86 @@ export class OutputAssessmentResult {
|
|
|
}
|
|
|
|
|
|
get grade () {
|
|
|
+ if(this.results == null) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
return this.results.reduce((prev, val) => prev + val.grade, 0) / this.results.length;
|
|
|
}
|
|
|
|
|
|
prepareResults () {
|
|
|
-
|
|
|
+ let template = OutputAssessmentResult.DETAIL_TEMPLATE;
|
|
|
+ const grade = (this.grade * 100).toFixed(2);
|
|
|
+ const time = this.time || "-";
|
|
|
+ template = template.replace(':test-name:', this.name);
|
|
|
+ template = template.replace(':time-label:', LocalizedStrings.getUI('assessment-detail-time-label'));
|
|
|
+ template = template.replace(':time:', time);
|
|
|
+ template = template.replace(':grade-label:', LocalizedStrings.getUI('assessment-detail-grade-label'));
|
|
|
+ template = template.replace(':grade:', grade);
|
|
|
+ const input_spans = this.prepareInputList(this.inputs);
|
|
|
+ template = template.replace(':input-label:', LocalizedStrings.getUI('assessment-detail-input-label'));
|
|
|
+ template = template.replace(':input-list:', input_spans);
|
|
|
+ template = template.replace(':output-label:', LocalizedStrings.getUI('assessment-detail-output-label'));
|
|
|
+ if(this.status == 0) {
|
|
|
+ const output_rows = this.results.map(result => {
|
|
|
+ if(result.type == "string") {
|
|
|
+ return this.formatString(result);
|
|
|
+ } else if (result.type == "number") {
|
|
|
+ return this.formatNumber(result);
|
|
|
+ } else {
|
|
|
+ return this.formatBool(result);
|
|
|
+ }
|
|
|
+ }, this);
|
|
|
+ template = template.replace(':output-result:', this.prepareOutputTable(output_rows));
|
|
|
+ } else {
|
|
|
+ let failed_text = OutputAssessmentResult.FAILED_TEMPLATE;
|
|
|
+ failed_text = failed_text.replace("$0", this.error_msg);
|
|
|
+ template = template.replace(":output-result:", failed_text);
|
|
|
+ }
|
|
|
+ return template;
|
|
|
+ }
|
|
|
+
|
|
|
+ prepareInputList (input_list) {
|
|
|
+ const list = input_list.map(input => {
|
|
|
+ let template = OutputAssessmentResult.INPUT_INFO_TEMPLATE;
|
|
|
+ template = template.replace("$1", input.value);
|
|
|
+ if(input.read) {
|
|
|
+ template = template.replace("$0", "assessment-input-read");
|
|
|
+ } else {
|
|
|
+ template = template.replace("$0", "assessment-input-unread");
|
|
|
+ }
|
|
|
+ return template;
|
|
|
+ }, this);
|
|
|
+ return list.join(LocalizedStrings.getUI('text_join_assessment_outputs'));
|
|
|
}
|
|
|
|
|
|
- generateOutput (output) {
|
|
|
+ prepareOutputTable (output_rows) {
|
|
|
+ let template = OutputAssessmentResult.OUPUT_TABLE_TEMPLATE;
|
|
|
+ template = template.replace(':expected-label:', LocalizedStrings.getUI('assessment-detail-expected-label'));
|
|
|
+ template = template.replace(':generated-label:', LocalizedStrings.getUI('assessment-detail-generated-label'));
|
|
|
+ template = template.replace(':result-label:', LocalizedStrings.getUI('assessment-detail-result-label'));
|
|
|
+ template = template.replace(':results:', output_rows.join(''));
|
|
|
+ return template;
|
|
|
+ }
|
|
|
|
|
|
+ generateOutput () {
|
|
|
+ const assessment_result = this.prepareResults();
|
|
|
+ let page = OutputAssessmentResult.PAGE_TEMPLATE;
|
|
|
+ page = page.replace(':assessment-result:', assessment_result);
|
|
|
+ page = page.replace(/(\r|\n|\t)/gm,'').replace(/> *</g, '><');
|
|
|
+ return page;
|
|
|
}
|
|
|
|
|
|
formatNumber (result) {
|
|
|
+ const result_class = result.grade == 1 ? 'assessment-number-result' : 'assessment-number-result-failed';
|
|
|
let template = this.formatOutput('assessment-number-expected',
|
|
|
- 'assessment-number-generated', 'assessment-number-result', result);
|
|
|
+ 'assessment-number-generated', result_class, result);
|
|
|
return template
|
|
|
}
|
|
|
|
|
|
formatBool (result) {
|
|
|
+ const result_class = result.grade == 1 ? 'assessment-bool-result' : 'assessment-bool-result-failed';
|
|
|
let template = this.formatOutput('assessment-bool-expected',
|
|
|
- 'assessment-bool-generated', 'assessment-bool-result', result);
|
|
|
+ 'assessment-bool-generated', result_class, result);
|
|
|
return template
|
|
|
}
|
|
|
|
|
@@ -64,12 +175,12 @@ export class OutputAssessmentResult {
|
|
|
formatString (result) {
|
|
|
const expected_class = 'assessment-string-expected';
|
|
|
const generated_class = 'assessment-string-generated';
|
|
|
- const result_class = 'assessment-string-result';
|
|
|
+ //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);
|
|
|
+ //template = template.replace(":class-result:", result_class);
|
|
|
|
|
|
const g_string = result.generated || "";
|
|
|
const e_string = result.expected || "";
|
|
@@ -77,11 +188,13 @@ export class OutputAssessmentResult {
|
|
|
template = template.replace("$1", result.generated);
|
|
|
if(result.grade == 1) {
|
|
|
template = template.replace("$2", "✓");
|
|
|
+ template = template.replace(":class-result:", "assessment-string-diff");
|
|
|
} 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);
|
|
|
+ template = template.replace("$2", "<span class='assessment-failed-case'>✗</span>" + diff_string);
|
|
|
+ template = template.replace(":class-result:", 'assessment-string-result');
|
|
|
}
|
|
|
return template;
|
|
|
}
|
|
@@ -97,6 +210,4 @@ export class OutputAssessmentResult {
|
|
|
return template.replace("$0", "stringdiff-equal").replace("$1", text);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-}
|
|
|
+}
|