assistant.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. export class Assistant {
  2. constructor () {
  3. this.incorrect = false;
  4. this.allWrong = true;
  5. this.wrongTags = [];
  6. this.wrongTagsAux = [];
  7. this.lastErrorsPerTypeGraph = [];
  8. this.lastErrorsPerTagGraph = [];
  9. this.suggestions = [{subject: "Leitura e Escrita", suggestion: `A Leitura e a Escrita são partes fundamentais na criação de um código, pois permitem a interação do usuário com o código e muitas vezes são fundamentais para a aquisição de entradas e para o fornecimento de saídas em um programa.<br><br>
  10. <img src='http://127.0.0.1:81/moodle/mod/iassign/ilm/iVProg/1.0.20200221/ivprog/img/leitura.png' alt='leitura.png' style='float:right;max-width:100%;'>
  11. <img src='http://127.0.0.1:81/moodle/mod/iassign/ilm/iVProg/1.0.20200221/ivprog/img/escrita.png' alt='escrita.png' vspace='30' style='float:right;max-width:100%;'>
  12. Erros em exercícios de Leitura e Escrita geralmente estão associados a erros de digitação e a atribuições erradas de tipo de variável.<br><br>
  13. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=LeituraeEscrita'>https://edisciplinas.usp.br/mod/assign/view.php?id=LeituraeEscrita</a><br><br>`},
  14. {subject: "Manipulação de Entrada", suggestion: `A Manipulação de Entrada ocorre quando a entrada completa ou fragmentos da entrada devem ser alterados, trocados, substituídos pelo programa.<br><br>
  15. Erros em exercícios de Manipulação de Entrada geralmente estão relacionados a atribuições erradas de variáveis.<br><br>
  16. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=ManipulacaodeEntrada'>https://edisciplinas.usp.br/mod/assign/view.php?id=ManipulacaodeEntrada</a><br><br>`},
  17. {subject: "Lógica", suggestion: `A Lógica é parte fundamental na elaboração de um programa, já que códigos são compostos de construções e operações lógicas. O desenvolvimento de raciocínio lógico é parte crucial na jornada de aprendizagem de programação.<br><br>
  18. Erros em exercícios de Lógica geralmente estão relacionados a um entendimento errôneo do enunciado do exercício e a uma falta de consideração de todos os cenários possíveis para o exercício.<br><br>
  19. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=Logica'>https://edisciplinas.usp.br/mod/assign/view.php?id=Logica</a><br><br>`},
  20. {subject: "Matemática", suggestion: `Problemas de Matemática são muito utilizados no ensino de programação, seu formato lógico permite a aplicação quase que direta de problemas matemáticos vistos no Ensino Fundamental e Médio, sendo uma boa porta de entrada para transpor problemas para o ambiente virtual para que possam ser resolvidos através de programação.<br><br>
  21. Erros em exercício de Matemática geralmente estão relacionados a erros em operações matemáticas e a falta de conhecimento sobre um conceito matemático.<br><br>
  22. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=Matematica'>https://edisciplinas.usp.br/mod/assign/view.php?id=Matematica</a><br><br>`},
  23. {subject: "Condição", suggestion: `O uso de Condições é muito importante na programação, pois permite que se construa programas com comportamentos diferentes para situações diferentes, permitindo uma grande aplicabilidade aos códigos.<br>
  24. <img src='http://127.0.0.1:81/moodle/mod/iassign/ilm/iVProg/1.0.20200221/ivprog/img/condicao.png' alt='condicao.png' vspace='30' style='float:right;max-width:100%;'>
  25. Erros em exercícios de Condição estão geralmente relacionados ao limite da condição, ou seja, nos valores adjacentes aos valores que satisfazem a condição.<br><br>
  26. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=Condicao'>https://edisciplinas.usp.br/mod/assign/view.php?id=Condicao</a><br><br>`},
  27. {subject: "Laço", suggestion: `O conceito de Laço tem muita importância para a programação, pois permite a repetição de uma tarefa até que uma condição de parada seja satisfeita, eliminando a necessidade de ter que ficar escrevendo diversas vezes o código da tarefa.<br>
  28. <img src='http://127.0.0.1:81/moodle/mod/iassign/ilm/iVProg/1.0.20200221/ivprog/img/laco1.png' alt='laco1.png' vspace='30' style='float:right;max-width:100%;'>
  29. <img src='http://127.0.0.1:81/moodle/mod/iassign/ilm/iVProg/1.0.20200221/ivprog/img/laco2.png' alt='laco2.png' style='float:right;max-width:100%;'>
  30. <img src='http://127.0.0.1:81/moodle/mod/iassign/ilm/iVProg/1.0.20200221/ivprog/img/laco3.png' alt='laco3.png' vspace='30' style='float:right;max-width:100%;'>
  31. Erros em exercícios de Laços geralmente estão relacionados à condição de parada, à atribuição da variável da condição de parada antes do laço e à manipulação da variável da condição de parada depois do laço.<br><br>
  32. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=Lacos'>https://edisciplinas.usp.br/mod/assign/view.php?id=Lacos</a><br><br>`},
  33. {subject: "Vetor", suggestion: `O uso de Vetores acrescenta diversas possibilidades a um programa, permite que conjuntos de dados sejam armazenados e manipulados de forma mais eficiente, o que facilita o uso de conjuntos de dados em programas.<br>
  34. <img src='http://127.0.0.1:81/moodle/mod/iassign/ilm/iVProg/1.0.20200221/ivprog/img/vetor.png' alt='vetor.png' vspace='30' style='float:right;max-width:100%;'>
  35. Erros em exercícios com Vetores geralmente estão relacionados a erros no uso do índice dos vetores, o que resulta no uso de dados errados, por isso sempre é importante checar se os índices estão sendo usados da forma correta.<br><br>
  36. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=Vetor'>https://edisciplinas.usp.br/mod/assign/view.php?id=Vetor</a><br><br>`},
  37. {subject: "Caso Geral", suggestion: `Quando um programa é utilizado, geralmente a maioria de suas execuções ocorrerá em um Caso Geral, em função disso a maioria dos testes são iniciados testando Casos Gerais, a fim de verificar o funcionamento da região do programa que concrentrará a maioria dos casos.<br><br>
  38. Os Casos Gerais ocorrem nos valores que não apresentam um comportamento especial, ou seja, os casos comuns, que não se encaixam nos outros Tipos de Caso Teste.<br><br>
  39. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=CasoGeral'>https://edisciplinas.usp.br/mod/assign/view.php?id=CasoGeral</a><br><br>`},
  40. {subject: "Caso Limite", suggestion: `Levantar quais são os Casos Limites do problema a ser resolvido é fundamental para se avaliar o funcionamento adequado do programa desenvolvido, pois ao se testá-los podem ser encontrados erros que não são observados nos Casos Gerais.<br><br>
  41. Os Casos Limites ocorrem nos valores que se encontram no limite da mudança de comportamento do programa. Por exemplo, em um programa que retorna se um número inteiro é maior que 5, os Casos Limites seriam os valores 5 e 6.<br><br>
  42. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=CasoLimite'>https://edisciplinas.usp.br/mod/assign/view.php?id=CasoLimite</a><br><br>`},
  43. {subject: "Caso Nulo", suggestion: `É sempre importante testar o funcionamento adequado do programa desenvolvido em casos de entrada nula (Caso Nulo), pois o zero pode ter um impacto muito grande em diferentes cálculos, sempre deve se tomar cuidado com possíveis multiplicações e divisões por zero.<br><br>
  44. O Caso Nulo ocorre quando a entrada do programa é nula. Por exemplo, em um programa que trabalha com números, um Caso Nulo ocorre quando uma das entradas é zero, já em um programa que trabalha com texto, um Caso Nulo ocorre quando a entrada é um texto vazio.<br><br>
  45. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=CasoNulo'>https://edisciplinas.usp.br/mod/assign/view.php?id=CasoNulo</a><br><br>`},
  46. {subject: "Caso Negativo", suggestion: `É sempre importante testar o funcionamento adequado do programa desenvolvido em casos de entradas negativas (Caso Negativo), já que números negativos podem inverter comportamentos esperados e bagunçar cálculos que não esperavam por números negativos, sempre deve se checar se os cálculos realizados estão preparados para lidar com números negativos.<br><br>
  47. O Caso Negativo ocorre quando a entrada do programa é negativa. Por exemplo, em um programa que multiplica dois números, um exemplo de Caso Negativo seriam os valores 5 e -6.<br><br>
  48. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=CasoNegativo'>https://edisciplinas.usp.br/mod/assign/view.php?id=CasoNegativo</a><br><br>`},
  49. {subject: "Igualdade", suggestion: `Entradas iguais podem causar resultados inesperados, por isso é importante se testar Igualdade, tanto em casos numéricos quanto em casos textuais<br><br>
  50. A Igualdade ocorre quando o programa apresenta entradas idênticas, por exemplo, em um progama que recebe uma lista de números e tem que retornar os números primos presentes nessa lista sem repetir números.<br><br>
  51. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=Igualdade'>https://edisciplinas.usp.br/mod/assign/view.php?id=Igualdade</a><br><br>`},
  52. {subject: "Tipo de Entrada", suggestion: `Ao se elaborar um programa, é fundamental garantir que os Tipos de Entrada estão que estão sendo recebidos estão corretos, pois uma entrada de um tipo inesperado pode afetar gravemente o funcionamento de um programa.<br><br>
  53. O Tipo de Entrada é testado quando se fornece um tipo de entrada diferente do esperado. Um exemplo de um teste de Tipo de Entrada é fornecer um número real em um programa que recebe números inteiros.<br><br>
  54. <a href='https://edisciplinas.usp.br/mod/assign/view.php?id=TipodeEntrada'>https://edisciplinas.usp.br/mod/assign/view.php?id=TipodeEntrada</a><br><br>`}];
  55. }
  56. // Função que encontra um objeto dentro de um array a partir do valor de uma de suas chaves
  57. findObject(array,key,value) {
  58. for(let i = 0; i < array.length; i++) {
  59. if(array[i][key] === value) {
  60. return i
  61. }
  62. }
  63. }
  64. // Funções do agente
  65. // Função que analisa o exercício em relação às tags
  66. updateTags(testCases,performance) {
  67. for (let i = 0; i < testCases.length; i++) {
  68. for (let j = 0; j < performance.tag.length; j++) {
  69. if (testCases[i].tags.toString() === performance.tag[j].tag) {
  70. performance.tag[j].total += 1;
  71. if (!testCases[i].grade) {
  72. this.incorrect = true;
  73. performance.tag[j].errors += 1;
  74. performance.lastTagErrors.push(testCases[i].tags.toString());
  75. if (performance.lastTagErrors.length > 50) {
  76. performance.lastTagErrors.shift();
  77. }
  78. this.wrongTagsAux.push(testCases[i].tags.toString());
  79. }
  80. else {
  81. this.allWrong = false;
  82. }
  83. }
  84. }
  85. }
  86. this.wrongTags = this.wrongTagsAux.filter((element, i) => this.wrongTagsAux.indexOf(element) === i);
  87. }
  88. // Função que analisa o exercício em relação aos types
  89. updateTypes(exerciseType,performance) {
  90. for (let i = 0; i < exerciseType.length; i++) {
  91. for (let j = 0; j < performance.type.length; j++) {
  92. if (exerciseType[i] === performance.type[j].type) {
  93. performance.type[j].total += 1;
  94. if (this.incorrect) {
  95. performance.type[j].errors += 1;
  96. performance.lastTypeErrors.push(exerciseType[i]);
  97. if (performance.lastTypeErrors.length > 50) {
  98. performance.lastTypeErrors.shift();
  99. }
  100. }
  101. }
  102. }
  103. }
  104. }
  105. // Função que contabiliza as ocorrências dentro das fila de últimos erros
  106. lastErrors(performance) {
  107. performance.lastTypeErrors.forEach((x) => this.lastErrorsPerTypeGraph[x] = (this.lastErrorsPerTypeGraph[x] || 0)+1);
  108. performance.lastTagErrors.forEach((x) => this.lastErrorsPerTagGraph[x] = (this.lastErrorsPerTagGraph[x] || 0)+1);
  109. }
  110. // Função que adiciona o desempenho à saída
  111. addPerformance(exerciseType,wrongTags,performance) {
  112. let performanceText = "";//"Desempenho\n\n";
  113. performanceText += `Neste exercício relacionado a ${exerciseType[0]}`;
  114. for (let i = 1; i < exerciseType.length; i++) {
  115. if (i+1 === exerciseType.length) {
  116. performanceText += ` e ${exerciseType[i]}`;
  117. }
  118. else {
  119. performanceText += `, ${exerciseType[i]}`;
  120. }
  121. }
  122. performanceText += ` você `;
  123. if(this.allWrong) {
  124. performanceText += `errou todos os testes`;
  125. }
  126. else {
  127. if (this.incorrect) {
  128. performanceText += `errou os teste que envolvem ${wrongTags[0]}`;
  129. for (let i = 1; i < wrongTags.length; i++) {
  130. if (i+1 === wrongTags.length) {
  131. performanceText += ` e ${wrongTags[i]}`;
  132. }
  133. else {
  134. performanceText += `, ${wrongTags[i]}`;
  135. }
  136. }
  137. }
  138. else{
  139. performanceText += `acertou todos os teste`;
  140. }
  141. }
  142. performanceText += `.<br><br><br>`;
  143. for (let i = 0; i < exerciseType.length; i++) {
  144. let obj = this.findObject(performance.type,"type",exerciseType[i]);
  145. performanceText += `Seu desempenho em exercícios com ${exerciseType[i]} é de ${(100*(1-performance.type[obj].errors/performance.type[obj].total)).toFixed(2)}% de sucesso.<br><br>`;
  146. }
  147. if (this.incorrect & !this.allWrong) {
  148. for (let i = 0; i < wrongTags.length; i++) {
  149. let obj = this.findObject(performance.tag,"tag",wrongTags[i]);
  150. performanceText += `Seu desempenho em testes de ${wrongTags[i]} é de ${(100*(1-performance.tag[obj].errors/performance.tag[obj].total)).toFixed(2)}% de sucesso.<br><br>`;
  151. performanceText += `Dos seus últimos ${performance.lastTagErrors.length} erros ${(100*(this.lastErrorsPerTagGraph[wrongTags[i]]/performance.lastTagErrors.length)).toFixed(2)}% foram em testes de ${wrongTags[i]}.<br><br>`;
  152. }
  153. performanceText += `<table align='center' cellpadding='4' bgcolor='transparent' style='width: 40%;'><tr><td align='center' colspan='2' style='height: 50px;'><b>Últimos ${performance.lastTagErrors.length} Erros</b></td></tr>`;
  154. performanceText += `<tr style='height: 250px;'><td colspan='2' class='piechart'>
  155. <style>
  156. .piechart {
  157. display: block;
  158. position: absolute;
  159. width: 17%;
  160. height:0;
  161. padding-bottom: 17%;
  162. border-radius: 50%;
  163. background-image: conic-gradient(`;
  164. let dg = 0;
  165. if (this.lastErrorsPerTagGraph[performance.tag[0].tag]) {
  166. performanceText += `pink ${360*this.lastErrorsPerTagGraph[performance.tag[0].tag]/performance.lastTagErrors.length}deg,`;
  167. dg += 360*this.lastErrorsPerTagGraph[performance.tag[0].tag]/performance.lastTagErrors.length;
  168. }
  169. if (this.lastErrorsPerTagGraph[performance.tag[1].tag]) {
  170. performanceText += `red 0 ${dg+360*this.lastErrorsPerTagGraph[performance.tag[1].tag]/performance.lastTagErrors.length}deg,`;
  171. dg += 360*this.lastErrorsPerTagGraph[performance.tag[1].tag]/performance.lastTagErrors.length;
  172. }
  173. if (this.lastErrorsPerTagGraph[performance.tag[2].tag]) {
  174. performanceText += `blue 0 ${dg+360*this.lastErrorsPerTagGraph[performance.tag[2].tag]/performance.lastTagErrors.length}deg,`;
  175. dg += 360*this.lastErrorsPerTagGraph[performance.tag[2].tag]/performance.lastTagErrors.length;
  176. }
  177. if (this.lastErrorsPerTagGraph[performance.tag[3].tag]) {
  178. performanceText += `yellow 0 ${dg+360*this.lastErrorsPerTagGraph[performance.tag[3].tag]/performance.lastTagErrors.length}deg,`;
  179. dg += 360*this.lastErrorsPerTagGraph[performance.tag[3].tag]/performance.lastTagErrors.length;
  180. }
  181. if (this.lastErrorsPerTagGraph[performance.tag[4].tag]) {
  182. performanceText += `green 0 ${dg+360*this.lastErrorsPerTagGraph[performance.tag[4].tag]/performance.lastTagErrors.length}deg,`;
  183. }
  184. performanceText += `white 0);
  185. }
  186. body,
  187. .piechart {
  188. display: flex;
  189. justify-content: center;
  190. align-items: center;
  191. }
  192. </style></td></tr>`;
  193. if (this.lastErrorsPerTagGraph[performance.tag[0].tag]) {
  194. performanceText += `<tr style='background-color:pink;'><td>${performance.tag[0].tag}</td><td style='text-align: center;'>${(100*(this.lastErrorsPerTagGraph[performance.tag[0].tag]/performance.lastTagErrors.length)).toFixed(2)}%</td></tr>`;
  195. }
  196. if (this.lastErrorsPerTagGraph[performance.tag[1].tag]) {
  197. performanceText += `<tr style='background-color:red;'><td style='color: white;'>${performance.tag[1].tag}</td><td style='text-align: center; color: white;'>${(100*(this.lastErrorsPerTagGraph[performance.tag[1].tag]/performance.lastTagErrors.length)).toFixed(2)}%</td></tr>`;
  198. }
  199. if (this.lastErrorsPerTagGraph[performance.tag[2].tag]) {
  200. performanceText += `<tr style='background-color:blue;'><td style='color: white;'>${performance.tag[2].tag}</td><td style='text-align: center; color: white;'>${(100*(this.lastErrorsPerTagGraph[performance.tag[2].tag]/performance.lastTagErrors.length)).toFixed(2)}%</td></tr>`;
  201. }
  202. if (this.lastErrorsPerTagGraph[performance.tag[3].tag]) {
  203. performanceText += `<tr style='background-color:yellow;'><td>${performance.tag[3].tag}</td><td style='text-align: center;'>${(100*(this.lastErrorsPerTagGraph[performance.tag[3].tag]/performance.lastTagErrors.length)).toFixed(2)}%</td></tr>`;
  204. }
  205. if (this.lastErrorsPerTagGraph[performance.tag[4].tag]) {
  206. performanceText += `<tr style='background-color:green;'><td style='color: white;'>${performance.tag[4].tag}</td><td style='text-align: center; color: white;'>${(100*(this.lastErrorsPerTagGraph[performance.tag[4].tag]/performance.lastTagErrors.length)).toFixed(2)}%</td></tr>`;
  207. }
  208. if (this.lastErrorsPerTagGraph[performance.tag[5].tag]) {
  209. performanceText += `<tr style='background-color:white;'><td>${performance.tag[5].tag}</td><td style='text-align: center;'>${(100*(this.lastErrorsPerTagGraph[performance.tag[5].tag]/performance.lastTagErrors.length)).toFixed(2)}%</td></tr>`;
  210. }
  211. performanceText += `</table>`;
  212. /*
  213. for (let i = 0; i < performance.tag.length; i++) {
  214. if (this.lastErrorsPerTagGraph[performance.tag[i].tag]) {
  215. if (wrongTags.includes(performance.tag[i].tag)) {
  216. performanceText += `<tr style='background-color:orange;'><td><b>${performance.tag[i].tag}</b></td><td style='text-align: center;'><b>${(100*(this.lastErrorsPerTagGraph[performance.tag[i].tag]/performance.lastTagErrors.length)).toFixed(2)}%</b></td></tr>`;
  217. }
  218. else {
  219. performanceText += `<tr style='background-color:white;'><td>${performance.tag[i].tag}</td><td style='text-align: center;'>${(100*(this.lastErrorsPerTagGraph[performance.tag[i].tag]/performance.lastTagErrors.length)).toFixed(2)}%</td></tr>`;
  220. }
  221. }
  222. }
  223. performanceText += `</table>`;
  224. performanceText += `<p class='piechart'>
  225. <style>
  226. .piechart {
  227. display: block;
  228. position: absolute;
  229. width: 15%;
  230. height:0;
  231. padding-bottom: 15%;
  232. border-radius: 50%;
  233. background-image: conic-gradient(`;
  234. let dg = 0;
  235. if (this.lastErrorsPerTagGraph[performance.tag[0].tag]) {
  236. performanceText += `pink ${360*this.lastErrorsPerTagGraph[performance.tag[0].tag]/performance.lastTagErrors.length}deg,`;
  237. dg += 360*this.lastErrorsPerTagGraph[performance.tag[0].tag]/performance.lastTagErrors.length;
  238. }
  239. if (this.lastErrorsPerTagGraph[performance.tag[1].tag]) {
  240. performanceText += `red 0 ${dg+360*this.lastErrorsPerTagGraph[performance.tag[1].tag]/performance.lastTagErrors.length}deg,`;
  241. dg += 360*this.lastErrorsPerTagGraph[performance.tag[1].tag]/performance.lastTagErrors.length;
  242. }
  243. if (this.lastErrorsPerTagGraph[performance.tag[2].tag]) {
  244. performanceText += `blue 0 ${dg+360*this.lastErrorsPerTagGraph[performance.tag[2].tag]/performance.lastTagErrors.length}deg,`;
  245. dg += 360*this.lastErrorsPerTagGraph[performance.tag[2].tag]/performance.lastTagErrors.length;
  246. }
  247. if (this.lastErrorsPerTagGraph[performance.tag[3].tag]) {
  248. performanceText += `yellow 0 ${dg+360*this.lastErrorsPerTagGraph[performance.tag[3].tag]/performance.lastTagErrors.length}deg,`;
  249. dg += 360*this.lastErrorsPerTagGraph[performance.tag[3].tag]/performance.lastTagErrors.length;
  250. }
  251. if (this.lastErrorsPerTagGraph[performance.tag[4].tag]) {
  252. performanceText += `green 0 ${dg+360*this.lastErrorsPerTagGraph[performance.tag[4].tag]/performance.lastTagErrors.length}deg,`;
  253. }
  254. performanceText += `white 0);
  255. }
  256. body,
  257. .piechart {
  258. display: flex;
  259. justify-content: center;
  260. align-items: center;
  261. }
  262. </style>
  263. </p>`;*/
  264. }
  265. return performanceText;
  266. }
  267. // Função que adiciona a sugestão à saída
  268. addSuggestion(exerciseType,wrongTags) {
  269. let suggestionText = "";//"Sugestões\n\n";
  270. if (this.incorrect) {
  271. if (!this.allWrong) {
  272. for (let i = 0; i < wrongTags.length; i++) {
  273. let obj = this.findObject(this.suggestions,"subject",wrongTags[i]);
  274. suggestionText += this.suggestions[obj].suggestion;
  275. }
  276. for (let i = 0; i < exerciseType.length; i++) {
  277. let obj = this.findObject(this.suggestions,"subject",exerciseType[i]);
  278. suggestionText += this.suggestions[obj].suggestion;
  279. }
  280. }
  281. else {
  282. suggestionText += `Sempre é importante testar o programa desenvolvido antes de aplicá-lo em um ambiente real, lembre-se de testar o programa antes de submetê-lo à avaliação automática.<br><br>`;
  283. for (let i = 0; i < exerciseType.length; i++) {
  284. let obj = this.findObject(this.suggestions,"subject",exerciseType[i]);
  285. suggestionText += this.suggestions[obj].suggestion;
  286. }
  287. }
  288. }
  289. else {
  290. suggestionText += `Parabéns!!! Seu exercício não apresentou erros.<br><br>`;
  291. }
  292. return suggestionText;
  293. }
  294. async get(url) {
  295. let response = await fetch(url);
  296. let data = await response.json();
  297. return data
  298. }
  299. async post(url, data) {
  300. let payload = new FormData();
  301. payload.append("data",JSON.stringify(data));
  302. let options = {
  303. method : "POST",
  304. body : payload
  305. }
  306. let response = await fetch(url, options);
  307. await response.text();
  308. }
  309. async analise(url,exerciseType,testCases) {
  310. let data = this.get(url);
  311. return Promise.resolve(data).then((performance) => {
  312. this.updateTags(testCases,performance);
  313. this.updateTypes(exerciseType,performance);
  314. this.lastErrors(performance);
  315. let assistantData = {exerciseType: exerciseType, testCases: testCases, performance: performance};
  316. this.post(url,assistantData);
  317. let text = [];
  318. text.push(this.addPerformance(exerciseType,this.wrongTags,performance));
  319. text.push(this.addSuggestion(exerciseType,this.wrongTags));
  320. return text;
  321. });
  322. }
  323. }