Parcourir la source

Implement output automatic generation and attached messages

Lucas Mendonça il y a 5 ans
Parent
commit
e82bc748f3
4 fichiers modifiés avec 51 ajouts et 3 suppressions
  1. 3 1
      i18n/pt/message.json
  2. 4 1
      js/iassign-integration-functions.js
  3. 3 1
      js/main.js
  4. 41 0
      js/util/auto_gen_output.js

+ 3 - 1
i18n/pt/message.json

@@ -2,5 +2,7 @@
   "test_case_success": "Caso de teste $0: OK",
   "test_case_duration": "Levou $0ms",
   "test_suite_grade": "A sua solução alcançou $0% da nota.",
-  "awaiting_input_message": "O seu programa está em execução e aguardando uma entrada! Digite algo e pressione ENTER..."
+  "awaiting_input_message": "O seu programa está em execução e aguardando uma entrada! Digite algo e pressione ENTER...",
+  "testcase_autogen_unused_input": "O caso de teste $0 possui mais entradas do que as leituras feitas no programa.",
+  "testcase_autogen_empty": "O caso de teste $0 não gerou qualquer saída."
 }

+ 4 - 1
js/iassign-integration-functions.js

@@ -472,12 +472,15 @@ function generateOutputs () {
   // código:
   var code_teacher = window.generator();
   // array com as entradas já inseridas:
-
   var test_cases = JSON.parse(prepareTestCases().replace('"testcases" :', ''));
+  ivprogCore.autoGenerateTestCaseOutput(code_teacher, test_cases).catch(function (error) {
+    showAlert("Houve um erro durante a execução do seu programa: "+error.message);
+  });
   
 }
 
 function outputGenerated (test_cases) {
+  console.log(test_cases);
   var fields = $('.text_area_output');
   for (var i = 0; i < test_cases.length; i++) {
     $(fields[i]).val(test_cases[i].output);

+ 3 - 1
js/main.js

@@ -7,6 +7,7 @@ import { i18nHelper } from "./services/i18nHelper";
 import { ActionTypes, getLogs, getLogsAsString, registerClick, registerUserEvent, parseLogs } from "./services/userLog";
 import { prepareActivityToStudentHelper, autoEval } from "./util/iassignHelpers";
 import * as CodeEditorAll from "./visualUI/text_editor";
+import {autoGenerateTestCaseOutput} from './util/auto_gen_output';
 
 const CodeEditor = {
   setCode: CodeEditorAll.setCode,
@@ -36,5 +37,6 @@ export {
   registerUserEvent,
   parseLogs,
   ActionTypes,
-  CodeEditor
+  CodeEditor,
+  autoGenerateTestCaseOutput
 }

+ 41 - 0
js/util/auto_gen_output.js

@@ -0,0 +1,41 @@
+import {SemanticAnalyser} from './../processor/semantic/semanticAnalyser';
+import {IVProgProcessor} from './../processor/ivprogProcessor';
+import { InputTest } from './inputTest';
+import { OutputTest } from './outputTest';
+import { LocalizedStrings } from './../services/localizedStringsService'
+
+export function autoGenerateTestCaseOutput (program_text, testCases) {
+  let copyTestCases = testCases.map((test) => Object.assign({}, test));
+  try {
+    const program = SemanticAnalyser.analyseFromSource(program_text);
+    const resultList = testCases.map((test, id) => {
+      const input = new InputTest(test.input);
+      const output = new OutputTest();
+      const exec =  new IVProgProcessor(program);
+      exec.registerInput(input);
+      exec.registerOutput(output);
+      return exec.interpretAST().then(_ => {
+        return {id: id, program: exec};
+      });
+    });
+    return Promise.all(resultList).then(result_final => {
+      for(let i = 0; i < result_final.length; ++i) {
+        const result = result_final[i];
+        const output = result.program.output.list;
+        const input = result.program.input;
+        if(input.index != input.inputList.length) {
+          window.showAlert(LocalizedStrings.getMessage("testcase_autogen_unused_input", [result.id+1]));
+          return Promise.resolve(false);
+        }
+        if(output.length == 0) {
+          window.showAlert(LocalizedStrings.getMessage("testcase_autogen_empty", [result.id+1]));
+        }
+        copyTestCases[result.id].output = output;
+      }
+      window.outputGenerated(copyTestCases);
+      return Promise.resolve(true);
+    });
+  }catch (error) {
+    return Promise.reject(error)
+  }
+}