assessment_result.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import StringDiff from "./../../util/string_diff";
  2. export class OutputAssessmentResult {
  3. // Status code - it is not grade related!
  4. // 0 - Succesful execution
  5. // 1 - failed execution
  6. static get DETAIL_TEMPLATE () {
  7. return ` <div>
  8. </div>
  9. `;
  10. }
  11. static get OUTPUT_TEMPLATE () {
  12. return `<td class=":class-expected:">$0</td>
  13. <td class=":class-generated:">$1</td>
  14. <td class=":class-result:">$2</td>`;
  15. }
  16. constructor (status, result, store, time, error_msg = '') {
  17. this.status = status;
  18. this.results = result;
  19. this.store = store;
  20. this.time = time;
  21. this.error_msg = error_msg;
  22. }
  23. get grade () {
  24. return this.results.reduce((prev, val) => prev + val.grade, 0) / this.results.length;
  25. }
  26. prepareResults () {
  27. }
  28. generateOutput (output) {
  29. }
  30. formatNumber (result) {
  31. let template = this.formatOutput('assessment-number-expected',
  32. 'assessment-number-generated', 'assessment-number-result', result);
  33. return template
  34. }
  35. formatBool (result) {
  36. let template = this.formatOutput('assessment-bool-expected',
  37. 'assessment-bool-generated', 'assessment-bool-result', result);
  38. return template
  39. }
  40. formatOutput (expected_class, generated_class, result_class, result) {
  41. let template = OutputAssessmentResult.OUTPUT_TEMPLATE;
  42. template = template.replace(":class-expected:", expected_class);
  43. template = template.replace(":class-generated:", generated_class);
  44. template = template.replace(":class-result:", result_class);
  45. template = template.replace("$0", result.expected);
  46. template = template.replace("$1", result.generated);
  47. const final_result = result.grade == 1 ? "✓" : "✗"
  48. template = template.replace("$2", final_result);
  49. return template
  50. }
  51. formatString (result) {
  52. const expected_class = 'assessment-string-expected';
  53. const generated_class = 'assessment-string-generated';
  54. const result_class = 'assessment-string-result';
  55. let template = OutputAssessmentResult.OUTPUT_TEMPLATE;
  56. template = template.replace(":class-expected:", expected_class);
  57. template = template.replace(":class-generated:", generated_class);
  58. template = template.replace(":class-result:", result_class);
  59. const g_string = result.generated || "";
  60. const e_string = result.expected || "";
  61. template = template.replace("$0", result.expected);
  62. template = template.replace("$1", result.generated);
  63. if(result.grade == 1) {
  64. template = template.replace("$2", "✓");
  65. } else {
  66. const diff = StringDiff(g_string, e_string);
  67. const diff_vec = diff.map(part => this.getDiffStringStyle(part[1], part[0]), this);
  68. const diff_string = diff_vec.reduce((prev, actual) => prev + actual, "");
  69. template = template.replace("$2", diff_string);
  70. }
  71. return template;
  72. }
  73. getDiffStringStyle (text, action) {
  74. const template = "<span class='$0'>$1</span>"
  75. switch(action) {
  76. case StringDiff.INSERT:
  77. return template.replace("$0", "stringdiff-insert").replace("$1", text);
  78. case StringDiff.DELETE:
  79. return template.replace("$0", "stringdiff-delete").replace("$1", text);
  80. case StringDiff.EQUAL:
  81. return template.replace("$0", "stringdiff-equal").replace("$1", text);
  82. }
  83. }
  84. }