addTest<O> method

void addTest<O>(
  1. String description,
  2. ParserBuilder<I, O> parser,
  3. String test(
    1. String parserName,
    2. String parserNameNoResult,
    3. ParserBuilder<I, O> parser,
    4. ParserBuilder<I, Object?> parserNoResult,
    )
)

Implementation

void addTest<O>(
  String description,
  ParserBuilder<I, O> parser,
  String Function(
          String parserName,
          String parserNameNoResult,
          ParserBuilder<I, O> parser,
          ParserBuilder<I, Object?> parserNoResult)
      test,
) {
  if (description.isEmpty) {
    throw ArgumentError.value(
        description, 'description', 'Must not be empty');
  }

  final globalAllocator = context.globalAllocator;
  final nameFromDescription = _getValidIdentifier(description);
  final parserName = globalAllocator.allocate(nameFromDescription);
  final parserNameNoResult =
      globalAllocator.allocate('${nameFromDescription}_NoResult');
  final parserNoResult = NoResult<I>([parser]);
  final namedParser = Named(parserName, parser);
  final namedParserNoResult = Named(parserNameNoResult, parserNoResult);
  parsers.add(namedParser);
  parsers.add(namedParserNoResult);
  final body = test(parserName, parserNameNoResult, parser, parserNoResult);
  final titleCode = getAsCode(description);
  final source = '''
test($titleCode, () {
$body
});''';
  final buffer = StringBuffer();
  buffer.writeln('void _test$parserName() {');
  buffer.writeln(' // $description');
  buffer.writeln(source);
  buffer.writeln('}');
  _tests.add(buffer.toString());
  localOutput.writeln(' // $description');
  localOutput.writeln('_test$parserName();');
}