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);

  final List<(DartBlockVariableDefinition, String?)>
  missingVariableDefinitions = [];
  final List<(DartBlockVariableDefinition, String?, DartBlockDataType)>
  wrongVariableDefinitionTypes = [];
  final List<(DartBlockVariableDefinition, String?, String?)>
  wrongVariableDefinitionValues = [];
  final List<(DartBlockVariableDefinition, String?)>
  correctVariableDefinitions = [];
  try {
    await solutionExecutor.execute();
    await answerExecutor.execute();
    final solutionMemory = solutionExecutor.environment.getAllValues(
      solutionExecutor,
    );
    if (ignoreVariablesStartingWithUnderscore) {
      solutionMemory.removeWhere((key, value) => key.name.startsWith('_'));
    }
    final answerMemory = answerExecutor.environment.getAllValues(
      answerExecutor,
    );
    for (final solutionEntry in solutionMemory.entries) {
      if (answerMemory.containsKey(solutionEntry.key)) {
        final answerMemoryKey = answerMemory.keys.firstWhere(
          (element) => element == solutionEntry.key,
        );
        if (answerMemoryKey.dataType == solutionEntry.key.dataType) {
          final answerValue = answerMemory[solutionEntry.key];
          if (answerValue == solutionEntry.value) {
            correctVariableDefinitions.add((
              solutionEntry.key,
              solutionEntry.value,
            ));
          } else {
            wrongVariableDefinitionValues.add((
              solutionEntry.key,
              solutionEntry.value,
              answerValue,
            ));
          }
        } else {
          wrongVariableDefinitionTypes.add((
            solutionEntry.key,
            solutionEntry.value,
            answerMemoryKey.dataType,
          ));
        }
      } else {
        missingVariableDefinitions.add((
          solutionEntry.key,
          solutionEntry.value,
        ));
      }
    }
  } on DartBlockException catch (ex) {
    return DartBlockEnvironmentEvaluation.init(
      missingVariableDefinitions,
      wrongVariableDefinitionTypes,
      wrongVariableDefinitionValues,
      correctVariableDefinitions,
      ex,
    );
  } on Exception catch (ex) {
    return DartBlockEnvironmentEvaluation.init(
      missingVariableDefinitions,
      wrongVariableDefinitionTypes,
      wrongVariableDefinitionValues,
      correctVariableDefinitions,
      DartBlockException.fromException(exception: ex),
    );
  }

  return DartBlockEnvironmentEvaluation.init(
    missingVariableDefinitions,
    wrongVariableDefinitionTypes,
    wrongVariableDefinitionValues,
    correctVariableDefinitions,
    answerExecutor.thrownException,
  );
}