ivprogAssessment.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import line_i18n from 'line-i18n'
  2. import { IVProgProcessor } from "./../processor/ivprogProcessor";
  3. import { DOMConsole} from "./../io/domConsole";
  4. import * as LocalizedStringsService from "../services/localizedStringsService";
  5. import { OutputMatching } from './output_matching/output_matching';
  6. const LocalizedStrings = LocalizedStringsService.getInstance();
  7. const StringTypes = line_i18n.StringTypes;
  8. export class IVProgAssessment {
  9. constructor (ast_code, testCases, domConsole) {
  10. this.ast_code = ast_code;
  11. this.testCases = testCases;
  12. this.domConsole = domConsole;
  13. }
  14. runTest () {
  15. const outerRef = this;
  16. try {
  17. // loop test cases and show messages through domconsole
  18. const partialTests = this.testCases.map( (t, name) => {
  19. return new OutputMatching(new IVProgProcessor(outerRef.ast_code), t.input, t.output, name);
  20. });
  21. const testResult = partialTests.map(om => om.eval());
  22. return Promise.all(testResult).then(results => {
  23. let grade = 0;
  24. for(let i = 0; i < results.length; ++i) {
  25. const result = results[i];
  26. grade += result.grade;
  27. if(result.grade == 1) {
  28. outerRef.writeToConsole(DOMConsole.INFO, StringTypes.MESSAGE,'test_case_success',
  29. result.name+1, result.generateOutput());
  30. } else if (result.status == 1) {
  31. outerRef.writeToConsole(DOMConsole.ERR, StringTypes.ERROR,'test_case_failed_exception',
  32. result.name+1,
  33. result.error_msg,
  34. result.generateOutput());
  35. } else {
  36. const inputs = result.inputs.map(input => input.value);
  37. const outputs = result.results;
  38. const expected_output = outputs.map(r => r.expected || '').filter( str => (''+str).length > 0);
  39. const generated_output = outputs.map(r => r.generated || '').filter( str => (''+str).length > 0);
  40. outerRef.writeToConsole(DOMConsole.ERR, StringTypes.ERROR,'test_case_failed',
  41. result.name+1,
  42. inputs.join(LocalizedStrings.getUI('text_join_assessment_outputs')),
  43. expected_output.join(LocalizedStrings.getUI('text_join_assessment_outputs')),
  44. generated_output.join(LocalizedStrings.getUI('text_join_assessment_outputs')),
  45. result.generateOutput());
  46. }
  47. }
  48. grade /= results.length;
  49. const channel = grade == 1 ? DOMConsole.INFO : DOMConsole.ERR;
  50. outerRef.writeToConsole(channel, StringTypes.MESSAGE, "test_suite_grade", (grade * 100).toFixed(2));
  51. });
  52. // return testResult.then(function (total) {
  53. // const grade = total / outerRef.testCases.length;
  54. // const channel = grade == 1 ? DOMConsole.INFO : DOMConsole.ERR;
  55. // outerRef.writeToConsole(channel, StringTypes.MESSAGE, "test_suite_grade", (grade * 100).toFixed(2));
  56. // return Promise.resolve(grade)
  57. // }).catch(err => {
  58. // outerRef.domConsole.err("Erro inesperado durante o cálculo da nota.");// try and show error messages through domconsole
  59. // outerRef.domConsole.err(err.message);
  60. // return Promise.resolve(0);
  61. // });
  62. } catch (error) {
  63. outerRef.domConsole.err("Erro inesperado durante a execução do programa");// try and show error messages through domconsole
  64. outerRef.domConsole.err(error.message);
  65. return Promise.resolve(0);
  66. }
  67. }
  68. showErrorMessage (errorID, ...args) {
  69. this.domConsole.err(LocalizedStrings.getError(errorID, args));
  70. }
  71. showInfoMessage (msgID, ...args) {
  72. this.domConsole.info(LocalizedStrings.getMessage(msgID, args));
  73. }
  74. writeToConsole (channel, msgType, msgID, ...args) {
  75. let msg = LocalizedStrings.getString(msgID, msgType);
  76. msg = LocalizedStrings.processString(msg, args);
  77. switch(channel) {
  78. case DOMConsole.ERR: {
  79. this.domConsole.err(msg);
  80. break;
  81. }
  82. case DOMConsole.INFO: {
  83. this.domConsole.info(msg);
  84. break;
  85. }
  86. case DOMConsole.USER: {
  87. this.domConsole.write(msg);
  88. break;
  89. }
  90. }
  91. }
  92. }