瀏覽代碼

Implement output matching assessment as a set of helpers class and functions

Still needs to create view mode
Lucas Mendonça 4 年之前
父節點
當前提交
8fee865b19
共有 3 個文件被更改,包括 45 次插入9 次删除
  1. 1 1
      js/assessment/ivprogAssessment.js
  2. 40 8
      js/assessment/output_matching/output_matching.js
  3. 4 0
      js/util/input_assessment.js

+ 1 - 1
js/assessment/ivprogAssessment.js

@@ -53,7 +53,7 @@ export class IVProgAssessment {
     prog.registerInput(input);
     prog.registerOutput(output);
     const startTime = Date.now()
-    return prog.interpretAST().then( _ => {
+    return prog.interpretAST().then( () => {
       const millis = Date.now() - startTime;
       if (input.inputList.length !== input.index) {
         outerThis.showErrorMessage('test_case_few_reads', name+1);

+ 40 - 8
js/assessment/output_matching/output_matching.js

@@ -37,30 +37,59 @@ export class OutputMatching {
   }
 
   eval () {
-    const outerThis = this;
+    const refThis = this;
     const input = new InputAssessment(this.input_list);
     const gen_output = new OutputTest();
-    program.registerInput(input);
-    program.registerOutput(gen_output);
+    this.program.registerInput(input);
+    this.program.registerOutput(gen_output);
     const start_time = Date.now();
     return this.program.interpretAST().then( sto => {
-      
+      const final_time = Date.now() - start_time;
+      if(input.isInputAvailable()) {
+        return {status:"failed", grade:0, error_msg: refThis.getErrorMessage('test_case_few_reads', this.name+1),
+          store:sto, time: final_time};
+      }
+      const result = gen_output.list.map((g_out, i) => {
+        if(i >= this.expected_output.length) {
+          return new OutputResult.OutputMatchResult(null, g_out, 0, this.getPotentialOutputType(g_out));
+        }
+        return this.outputMatch(g_out, this.expected_output[i]);
+      }, this);
+      if(this.expected_output.length > gen_output.list.length) {
+        for(let i = gen_output.list.length; i < this.expected_output.length; ++i) {
+          const e_out = this.expected_output[i];
+          result.push(new OutputResult.OutputMatchResult(e_out, null, 0, this.getPotentialOutputType(e_out)));
+        }
+      }
+      const grade = result.reduce((prev, val) => prev + val.grade, 0) / result.length;
+      return {status: "ok", grade: grade, error_msg: "", store: sto, time: final_time, results: result};
     }).catch(error => {
-
+      return {status:"failed", grade:0, error_msg: refThis.getErrorMessage('test_case_failed_exception', this.name + 1, error.message),
+        store:null, time: null};
     });
   }
 
+  getPotentialOutputType (output) {
+    if(OutputMatching.NUM_REGEX.test(output)) {
+      return "number";
+    } else if (OutputMatching.BOOLEAN_REGEX.test(output)) {
+      return "bool";
+    } else {
+      return "string";
+    }
+  }
+
   outputMatch (g_output, e_output) {
     if(OutputMatching.NUM_REGEX.test(e_output)) {
       const g_num = new Decimal(g_output);
       const e_num = new Decimal(e_output);
-      this.checkNumbers(g_num, e_num);
+      return this.checkNumbers(g_num, e_num);
     } else if (OutputMatching.BOOLEAN_REGEX.test(e_output)) {
       const g_bool = TypeParser.toBool(g_output);
       const e_bool = TypeParser.toBool(e_output);
-      this.checkBoolean(g_bool, e_bool);
+      return this.checkBoolean(g_bool, e_bool);
     } else {
-      this.checkStrings(g_output, e_output);
+      return this.checkStrings(g_output, e_output);
     }
   }
 
@@ -130,4 +159,7 @@ export class OutputMatching {
     return OutputResult.createStringResult(e_ouput, g_output, finalGrade);
   }
   
+  getErrorMessage (errorID, ...args) {
+    return LocalizedStrings.getError(errorID, args);
+  }
 }

+ 4 - 0
js/util/input_assessment.js

@@ -21,4 +21,8 @@ export class InputAssessment extends Input {
       throw new Error(LocalizedStrings.getError("exceeded_input_request"));
     }
   }
+
+  isInputAvailable () {
+    return this.index < this.input_list.length;
+  }
 }