testSuccess method

void testSuccess({
  1. required I input,
  2. required int pos,
  3. O? result,
  4. List<({Expr<Object?> actual, Expr<Object?> expected, String reason})>? resultTests,
})

Implementation

void testSuccess({
  required I input,
  required int pos,
  O? result,
  List<({String reason, Expr<Object?> actual, Expr<Object?> expected})>?
      resultTests,
}) {
  for (final name in [parserName, parserNameNoResult]) {
    final resultVar = allocator.allocate('result');
    final resultValue = allocator.allocate('value');
    final stateVar = allocator.allocate('state');
    final resultCode = getAsCode(result);
    final inputCode = _inputAsCode(input);
    final resultValueChecked =
        parser.isNullableResultType() ? resultVar : '$resultVar!';
    output.writeln('final $stateVar = State($inputCode);');
    output.writeln('final $resultVar = $name($stateVar);');
    output.writeln(
        'expect($stateVar.ok, true, reason: ${getReason(input: input, subject: 'state.ok == true')});');
    if (name == parserName) {
      output.writeln('final $resultValue = $resultValueChecked;');
      if (resultTests != null) {
        for (var resultTest in resultTests) {
          final actual = resultTest.actual.calculate(context, [resultValue]);
          final expected =
              resultTest.expected.calculate(context, [resultValue]);
          final reason = resultTest.reason;
          output.writeln(
              'expect($actual, $expected, reason: ${getReason(input: input, subject: reason)});');
        }
      } else {
        output.writeln(
            'expect($resultValue, $resultCode, reason: ${getReason(input: input, subject: 'result = value')});');
      }
    } else {
      output.writeln('final $resultValue = $resultVar;');
      output.writeln(
          'expect($resultValue, null, reason: ${getReason(input: input, subject: 'result == null')});');
    }

    output.writeln(
        'expect($stateVar.pos, $pos, reason: ${getReason(input: input, subject: 'state.pos')});');
  }
}