evaluate method

  1. @override
Future<DartBlockEvaluation> evaluate(
  1. DartBlockProgram solutionCore,
  2. DartBlockProgram answerCore
)
override

Implementation

@override
Future<DartBlockEvaluation> evaluate(
  DartBlockProgram solutionCore,
  DartBlockProgram answerCore,
) async {
  final solutionExecutor = DartBlockExecutor(solutionCore);
  final answerExecutor = DartBlockExecutor(answerCore);
  try {
    await solutionExecutor.execute();
    await answerExecutor.execute();
    if (answerExecutor.thrownException != null) {
      return DartBlockPrintEvaluation.init(
        similarityThreshold,
        [],
        answerExecutor.thrownException,
      );
    }
  } on DartBlockException catch (ex) {
    return DartBlockPrintEvaluation.init(similarityThreshold, [], ex);
  } on Exception catch (ex) {
    return DartBlockPrintEvaluation.init(
      similarityThreshold,
      [],
      DartBlockException.fromException(exception: ex),
    );
  }

  List<(String, String?, DartBlockPrintEvaluationType, double?)>
  printEvaluations = [];
  for (final (index, line) in solutionExecutor.consoleOutput.indexed) {
    if (index < answerExecutor.consoleOutput.length) {
      final userLine = answerExecutor.consoleOutput[index];
      final similarity = _similarity(line, userLine);
      if (similarity >= similarityThreshold) {
        printEvaluations.add((
          line,
          userLine,
          DartBlockPrintEvaluationType.correct,
          similarity,
        ));
      } else {
        printEvaluations.add((
          line,
          userLine,
          DartBlockPrintEvaluationType.wrong,
          similarity,
        ));
      }
    } else {
      printEvaluations.add((
        line,
        null,
        DartBlockPrintEvaluationType.missing,
        null,
      ));
    }
  }

  return DartBlockPrintEvaluation.init(
    similarityThreshold,
    printEvaluations,
    null,
  );
}