// AUTO-GENERATED CODE: DO NOT EDIT

import 'package:petitparser/petitparser.dart';
import 'package:test/test.dart';

import '../utils/assertions.dart';
import '../utils/matchers.dart';

void main() {
  group('seq2', () {
    final parser = seq2(char('a'), char('b'));
    const record = ('a', 'b');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('ab', result: record));
      expect(parser, isParseSuccess('ab*', result: record, position: 2));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('toSequenceParser()', () {
      final alternate = (char('a'), char('b')).toSequenceParser();
      expect(alternate, isParserDeepEqual(parser));
    });
  });
  group('map2', () {
    final parser = seq2(char('a'), char('b')).map2((a, b) => '$a$b');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('ab', result: 'ab'));
      expect(parser, isParseSuccess('ab*', result: 'ab', position: 2));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
  });
  group('record', () {
    const record = ('a', 'b');
    const other = ('b', 'a');
    test('accessors', () {
      expect(record.$1, 'a');
      expect(record.$2, 'b');
    });
    test('map', () {
      expect(
        record.map((a, b) {
          expect(a, 'a');
          expect(b, 'b');
          return 42;
        }),
        42,
      );
    });
    test('equals', () {
      expect(record, record);
      expect(record, isNot(other));
      expect(other, isNot(record));
      expect(other, other);
    });
    test('hashCode', () {
      expect(record.hashCode, record.hashCode);
      expect(record.hashCode, isNot(other.hashCode));
      expect(other.hashCode, isNot(record.hashCode));
      expect(other.hashCode, other.hashCode);
    });
    test('toString', () {
      expect(record.toString(), endsWith('(a, b)'));
      expect(other.toString(), endsWith('(b, a)'));
    });
  });
  group('seq3', () {
    final parser = seq3(char('a'), char('b'), char('c'));
    const record = ('a', 'b', 'c');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abc', result: record));
      expect(parser, isParseSuccess('abc*', result: record, position: 3));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('toSequenceParser()', () {
      final alternate = (char('a'), char('b'), char('c')).toSequenceParser();
      expect(alternate, isParserDeepEqual(parser));
    });
  });
  group('map3', () {
    final parser = seq3(
      char('a'),
      char('b'),
      char('c'),
    ).map3((a, b, c) => '$a$b$c');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abc', result: 'abc'));
      expect(parser, isParseSuccess('abc*', result: 'abc', position: 3));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
  });
  group('record', () {
    const record = ('a', 'b', 'c');
    const other = ('c', 'b', 'a');
    test('accessors', () {
      expect(record.$1, 'a');
      expect(record.$2, 'b');
      expect(record.$3, 'c');
    });
    test('map', () {
      expect(
        record.map((a, b, c) {
          expect(a, 'a');
          expect(b, 'b');
          expect(c, 'c');
          return 42;
        }),
        42,
      );
    });
    test('equals', () {
      expect(record, record);
      expect(record, isNot(other));
      expect(other, isNot(record));
      expect(other, other);
    });
    test('hashCode', () {
      expect(record.hashCode, record.hashCode);
      expect(record.hashCode, isNot(other.hashCode));
      expect(other.hashCode, isNot(record.hashCode));
      expect(other.hashCode, other.hashCode);
    });
    test('toString', () {
      expect(record.toString(), endsWith('(a, b, c)'));
      expect(other.toString(), endsWith('(c, b, a)'));
    });
  });
  group('seq4', () {
    final parser = seq4(char('a'), char('b'), char('c'), char('d'));
    const record = ('a', 'b', 'c', 'd');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abcd', result: record));
      expect(parser, isParseSuccess('abcd*', result: record, position: 4));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('failure at 3', () {
      expect(
        parser,
        isParseFailure('abc', message: '"d" expected', position: 3),
      );
      expect(
        parser,
        isParseFailure('abc*', message: '"d" expected', position: 3),
      );
    });
    test('toSequenceParser()', () {
      final alternate = (
        char('a'),
        char('b'),
        char('c'),
        char('d'),
      ).toSequenceParser();
      expect(alternate, isParserDeepEqual(parser));
    });
  });
  group('map4', () {
    final parser = seq4(
      char('a'),
      char('b'),
      char('c'),
      char('d'),
    ).map4((a, b, c, d) => '$a$b$c$d');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abcd', result: 'abcd'));
      expect(parser, isParseSuccess('abcd*', result: 'abcd', position: 4));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('failure at 3', () {
      expect(
        parser,
        isParseFailure('abc', message: '"d" expected', position: 3),
      );
      expect(
        parser,
        isParseFailure('abc*', message: '"d" expected', position: 3),
      );
    });
  });
  group('record', () {
    const record = ('a', 'b', 'c', 'd');
    const other = ('d', 'c', 'b', 'a');
    test('accessors', () {
      expect(record.$1, 'a');
      expect(record.$2, 'b');
      expect(record.$3, 'c');
      expect(record.$4, 'd');
    });
    test('map', () {
      expect(
        record.map((a, b, c, d) {
          expect(a, 'a');
          expect(b, 'b');
          expect(c, 'c');
          expect(d, 'd');
          return 42;
        }),
        42,
      );
    });
    test('equals', () {
      expect(record, record);
      expect(record, isNot(other));
      expect(other, isNot(record));
      expect(other, other);
    });
    test('hashCode', () {
      expect(record.hashCode, record.hashCode);
      expect(record.hashCode, isNot(other.hashCode));
      expect(other.hashCode, isNot(record.hashCode));
      expect(other.hashCode, other.hashCode);
    });
    test('toString', () {
      expect(record.toString(), endsWith('(a, b, c, d)'));
      expect(other.toString(), endsWith('(d, c, b, a)'));
    });
  });
  group('seq5', () {
    final parser = seq5(char('a'), char('b'), char('c'), char('d'), char('e'));
    const record = ('a', 'b', 'c', 'd', 'e');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abcde', result: record));
      expect(parser, isParseSuccess('abcde*', result: record, position: 5));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('failure at 3', () {
      expect(
        parser,
        isParseFailure('abc', message: '"d" expected', position: 3),
      );
      expect(
        parser,
        isParseFailure('abc*', message: '"d" expected', position: 3),
      );
    });
    test('failure at 4', () {
      expect(
        parser,
        isParseFailure('abcd', message: '"e" expected', position: 4),
      );
      expect(
        parser,
        isParseFailure('abcd*', message: '"e" expected', position: 4),
      );
    });
    test('toSequenceParser()', () {
      final alternate = (
        char('a'),
        char('b'),
        char('c'),
        char('d'),
        char('e'),
      ).toSequenceParser();
      expect(alternate, isParserDeepEqual(parser));
    });
  });
  group('map5', () {
    final parser = seq5(
      char('a'),
      char('b'),
      char('c'),
      char('d'),
      char('e'),
    ).map5((a, b, c, d, e) => '$a$b$c$d$e');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abcde', result: 'abcde'));
      expect(parser, isParseSuccess('abcde*', result: 'abcde', position: 5));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('failure at 3', () {
      expect(
        parser,
        isParseFailure('abc', message: '"d" expected', position: 3),
      );
      expect(
        parser,
        isParseFailure('abc*', message: '"d" expected', position: 3),
      );
    });
    test('failure at 4', () {
      expect(
        parser,
        isParseFailure('abcd', message: '"e" expected', position: 4),
      );
      expect(
        parser,
        isParseFailure('abcd*', message: '"e" expected', position: 4),
      );
    });
  });
  group('record', () {
    const record = ('a', 'b', 'c', 'd', 'e');
    const other = ('e', 'd', 'c', 'b', 'a');
    test('accessors', () {
      expect(record.$1, 'a');
      expect(record.$2, 'b');
      expect(record.$3, 'c');
      expect(record.$4, 'd');
      expect(record.$5, 'e');
    });
    test('map', () {
      expect(
        record.map((a, b, c, d, e) {
          expect(a, 'a');
          expect(b, 'b');
          expect(c, 'c');
          expect(d, 'd');
          expect(e, 'e');
          return 42;
        }),
        42,
      );
    });
    test('equals', () {
      expect(record, record);
      expect(record, isNot(other));
      expect(other, isNot(record));
      expect(other, other);
    });
    test('hashCode', () {
      expect(record.hashCode, record.hashCode);
      expect(record.hashCode, isNot(other.hashCode));
      expect(other.hashCode, isNot(record.hashCode));
      expect(other.hashCode, other.hashCode);
    });
    test('toString', () {
      expect(record.toString(), endsWith('(a, b, c, d, e)'));
      expect(other.toString(), endsWith('(e, d, c, b, a)'));
    });
  });
  group('seq6', () {
    final parser = seq6(
      char('a'),
      char('b'),
      char('c'),
      char('d'),
      char('e'),
      char('f'),
    );
    const record = ('a', 'b', 'c', 'd', 'e', 'f');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abcdef', result: record));
      expect(parser, isParseSuccess('abcdef*', result: record, position: 6));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('failure at 3', () {
      expect(
        parser,
        isParseFailure('abc', message: '"d" expected', position: 3),
      );
      expect(
        parser,
        isParseFailure('abc*', message: '"d" expected', position: 3),
      );
    });
    test('failure at 4', () {
      expect(
        parser,
        isParseFailure('abcd', message: '"e" expected', position: 4),
      );
      expect(
        parser,
        isParseFailure('abcd*', message: '"e" expected', position: 4),
      );
    });
    test('failure at 5', () {
      expect(
        parser,
        isParseFailure('abcde', message: '"f" expected', position: 5),
      );
      expect(
        parser,
        isParseFailure('abcde*', message: '"f" expected', position: 5),
      );
    });
    test('toSequenceParser()', () {
      final alternate = (
        char('a'),
        char('b'),
        char('c'),
        char('d'),
        char('e'),
        char('f'),
      ).toSequenceParser();
      expect(alternate, isParserDeepEqual(parser));
    });
  });
  group('map6', () {
    final parser = seq6(
      char('a'),
      char('b'),
      char('c'),
      char('d'),
      char('e'),
      char('f'),
    ).map6((a, b, c, d, e, f) => '$a$b$c$d$e$f');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abcdef', result: 'abcdef'));
      expect(parser, isParseSuccess('abcdef*', result: 'abcdef', position: 6));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('failure at 3', () {
      expect(
        parser,
        isParseFailure('abc', message: '"d" expected', position: 3),
      );
      expect(
        parser,
        isParseFailure('abc*', message: '"d" expected', position: 3),
      );
    });
    test('failure at 4', () {
      expect(
        parser,
        isParseFailure('abcd', message: '"e" expected', position: 4),
      );
      expect(
        parser,
        isParseFailure('abcd*', message: '"e" expected', position: 4),
      );
    });
    test('failure at 5', () {
      expect(
        parser,
        isParseFailure('abcde', message: '"f" expected', position: 5),
      );
      expect(
        parser,
        isParseFailure('abcde*', message: '"f" expected', position: 5),
      );
    });
  });
  group('record', () {
    const record = ('a', 'b', 'c', 'd', 'e', 'f');
    const other = ('f', 'e', 'd', 'c', 'b', 'a');
    test('accessors', () {
      expect(record.$1, 'a');
      expect(record.$2, 'b');
      expect(record.$3, 'c');
      expect(record.$4, 'd');
      expect(record.$5, 'e');
      expect(record.$6, 'f');
    });
    test('map', () {
      expect(
        record.map((a, b, c, d, e, f) {
          expect(a, 'a');
          expect(b, 'b');
          expect(c, 'c');
          expect(d, 'd');
          expect(e, 'e');
          expect(f, 'f');
          return 42;
        }),
        42,
      );
    });
    test('equals', () {
      expect(record, record);
      expect(record, isNot(other));
      expect(other, isNot(record));
      expect(other, other);
    });
    test('hashCode', () {
      expect(record.hashCode, record.hashCode);
      expect(record.hashCode, isNot(other.hashCode));
      expect(other.hashCode, isNot(record.hashCode));
      expect(other.hashCode, other.hashCode);
    });
    test('toString', () {
      expect(record.toString(), endsWith('(a, b, c, d, e, f)'));
      expect(other.toString(), endsWith('(f, e, d, c, b, a)'));
    });
  });
  group('seq7', () {
    final parser = seq7(
      char('a'),
      char('b'),
      char('c'),
      char('d'),
      char('e'),
      char('f'),
      char('g'),
    );
    const record = ('a', 'b', 'c', 'd', 'e', 'f', 'g');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abcdefg', result: record));
      expect(parser, isParseSuccess('abcdefg*', result: record, position: 7));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('failure at 3', () {
      expect(
        parser,
        isParseFailure('abc', message: '"d" expected', position: 3),
      );
      expect(
        parser,
        isParseFailure('abc*', message: '"d" expected', position: 3),
      );
    });
    test('failure at 4', () {
      expect(
        parser,
        isParseFailure('abcd', message: '"e" expected', position: 4),
      );
      expect(
        parser,
        isParseFailure('abcd*', message: '"e" expected', position: 4),
      );
    });
    test('failure at 5', () {
      expect(
        parser,
        isParseFailure('abcde', message: '"f" expected', position: 5),
      );
      expect(
        parser,
        isParseFailure('abcde*', message: '"f" expected', position: 5),
      );
    });
    test('failure at 6', () {
      expect(
        parser,
        isParseFailure('abcdef', message: '"g" expected', position: 6),
      );
      expect(
        parser,
        isParseFailure('abcdef*', message: '"g" expected', position: 6),
      );
    });
    test('toSequenceParser()', () {
      final alternate = (
        char('a'),
        char('b'),
        char('c'),
        char('d'),
        char('e'),
        char('f'),
        char('g'),
      ).toSequenceParser();
      expect(alternate, isParserDeepEqual(parser));
    });
  });
  group('map7', () {
    final parser = seq7(
      char('a'),
      char('b'),
      char('c'),
      char('d'),
      char('e'),
      char('f'),
      char('g'),
    ).map7((a, b, c, d, e, f, g) => '$a$b$c$d$e$f$g');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abcdefg', result: 'abcdefg'));
      expect(
        parser,
        isParseSuccess('abcdefg*', result: 'abcdefg', position: 7),
      );
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('failure at 3', () {
      expect(
        parser,
        isParseFailure('abc', message: '"d" expected', position: 3),
      );
      expect(
        parser,
        isParseFailure('abc*', message: '"d" expected', position: 3),
      );
    });
    test('failure at 4', () {
      expect(
        parser,
        isParseFailure('abcd', message: '"e" expected', position: 4),
      );
      expect(
        parser,
        isParseFailure('abcd*', message: '"e" expected', position: 4),
      );
    });
    test('failure at 5', () {
      expect(
        parser,
        isParseFailure('abcde', message: '"f" expected', position: 5),
      );
      expect(
        parser,
        isParseFailure('abcde*', message: '"f" expected', position: 5),
      );
    });
    test('failure at 6', () {
      expect(
        parser,
        isParseFailure('abcdef', message: '"g" expected', position: 6),
      );
      expect(
        parser,
        isParseFailure('abcdef*', message: '"g" expected', position: 6),
      );
    });
  });
  group('record', () {
    const record = ('a', 'b', 'c', 'd', 'e', 'f', 'g');
    const other = ('g', 'f', 'e', 'd', 'c', 'b', 'a');
    test('accessors', () {
      expect(record.$1, 'a');
      expect(record.$2, 'b');
      expect(record.$3, 'c');
      expect(record.$4, 'd');
      expect(record.$5, 'e');
      expect(record.$6, 'f');
      expect(record.$7, 'g');
    });
    test('map', () {
      expect(
        record.map((a, b, c, d, e, f, g) {
          expect(a, 'a');
          expect(b, 'b');
          expect(c, 'c');
          expect(d, 'd');
          expect(e, 'e');
          expect(f, 'f');
          expect(g, 'g');
          return 42;
        }),
        42,
      );
    });
    test('equals', () {
      expect(record, record);
      expect(record, isNot(other));
      expect(other, isNot(record));
      expect(other, other);
    });
    test('hashCode', () {
      expect(record.hashCode, record.hashCode);
      expect(record.hashCode, isNot(other.hashCode));
      expect(other.hashCode, isNot(record.hashCode));
      expect(other.hashCode, other.hashCode);
    });
    test('toString', () {
      expect(record.toString(), endsWith('(a, b, c, d, e, f, g)'));
      expect(other.toString(), endsWith('(g, f, e, d, c, b, a)'));
    });
  });
  group('seq8', () {
    final parser = seq8(
      char('a'),
      char('b'),
      char('c'),
      char('d'),
      char('e'),
      char('f'),
      char('g'),
      char('h'),
    );
    const record = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abcdefgh', result: record));
      expect(parser, isParseSuccess('abcdefgh*', result: record, position: 8));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('failure at 3', () {
      expect(
        parser,
        isParseFailure('abc', message: '"d" expected', position: 3),
      );
      expect(
        parser,
        isParseFailure('abc*', message: '"d" expected', position: 3),
      );
    });
    test('failure at 4', () {
      expect(
        parser,
        isParseFailure('abcd', message: '"e" expected', position: 4),
      );
      expect(
        parser,
        isParseFailure('abcd*', message: '"e" expected', position: 4),
      );
    });
    test('failure at 5', () {
      expect(
        parser,
        isParseFailure('abcde', message: '"f" expected', position: 5),
      );
      expect(
        parser,
        isParseFailure('abcde*', message: '"f" expected', position: 5),
      );
    });
    test('failure at 6', () {
      expect(
        parser,
        isParseFailure('abcdef', message: '"g" expected', position: 6),
      );
      expect(
        parser,
        isParseFailure('abcdef*', message: '"g" expected', position: 6),
      );
    });
    test('failure at 7', () {
      expect(
        parser,
        isParseFailure('abcdefg', message: '"h" expected', position: 7),
      );
      expect(
        parser,
        isParseFailure('abcdefg*', message: '"h" expected', position: 7),
      );
    });
    test('toSequenceParser()', () {
      final alternate = (
        char('a'),
        char('b'),
        char('c'),
        char('d'),
        char('e'),
        char('f'),
        char('g'),
        char('h'),
      ).toSequenceParser();
      expect(alternate, isParserDeepEqual(parser));
    });
  });
  group('map8', () {
    final parser = seq8(
      char('a'),
      char('b'),
      char('c'),
      char('d'),
      char('e'),
      char('f'),
      char('g'),
      char('h'),
    ).map8((a, b, c, d, e, f, g, h) => '$a$b$c$d$e$f$g$h');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abcdefgh', result: 'abcdefgh'));
      expect(
        parser,
        isParseSuccess('abcdefgh*', result: 'abcdefgh', position: 8),
      );
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('failure at 3', () {
      expect(
        parser,
        isParseFailure('abc', message: '"d" expected', position: 3),
      );
      expect(
        parser,
        isParseFailure('abc*', message: '"d" expected', position: 3),
      );
    });
    test('failure at 4', () {
      expect(
        parser,
        isParseFailure('abcd', message: '"e" expected', position: 4),
      );
      expect(
        parser,
        isParseFailure('abcd*', message: '"e" expected', position: 4),
      );
    });
    test('failure at 5', () {
      expect(
        parser,
        isParseFailure('abcde', message: '"f" expected', position: 5),
      );
      expect(
        parser,
        isParseFailure('abcde*', message: '"f" expected', position: 5),
      );
    });
    test('failure at 6', () {
      expect(
        parser,
        isParseFailure('abcdef', message: '"g" expected', position: 6),
      );
      expect(
        parser,
        isParseFailure('abcdef*', message: '"g" expected', position: 6),
      );
    });
    test('failure at 7', () {
      expect(
        parser,
        isParseFailure('abcdefg', message: '"h" expected', position: 7),
      );
      expect(
        parser,
        isParseFailure('abcdefg*', message: '"h" expected', position: 7),
      );
    });
  });
  group('record', () {
    const record = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h');
    const other = ('h', 'g', 'f', 'e', 'd', 'c', 'b', 'a');
    test('accessors', () {
      expect(record.$1, 'a');
      expect(record.$2, 'b');
      expect(record.$3, 'c');
      expect(record.$4, 'd');
      expect(record.$5, 'e');
      expect(record.$6, 'f');
      expect(record.$7, 'g');
      expect(record.$8, 'h');
    });
    test('map', () {
      expect(
        record.map((a, b, c, d, e, f, g, h) {
          expect(a, 'a');
          expect(b, 'b');
          expect(c, 'c');
          expect(d, 'd');
          expect(e, 'e');
          expect(f, 'f');
          expect(g, 'g');
          expect(h, 'h');
          return 42;
        }),
        42,
      );
    });
    test('equals', () {
      expect(record, record);
      expect(record, isNot(other));
      expect(other, isNot(record));
      expect(other, other);
    });
    test('hashCode', () {
      expect(record.hashCode, record.hashCode);
      expect(record.hashCode, isNot(other.hashCode));
      expect(other.hashCode, isNot(record.hashCode));
      expect(other.hashCode, other.hashCode);
    });
    test('toString', () {
      expect(record.toString(), endsWith('(a, b, c, d, e, f, g, h)'));
      expect(other.toString(), endsWith('(h, g, f, e, d, c, b, a)'));
    });
  });
  group('seq9', () {
    final parser = seq9(
      char('a'),
      char('b'),
      char('c'),
      char('d'),
      char('e'),
      char('f'),
      char('g'),
      char('h'),
      char('i'),
    );
    const record = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abcdefghi', result: record));
      expect(parser, isParseSuccess('abcdefghi*', result: record, position: 9));
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('failure at 3', () {
      expect(
        parser,
        isParseFailure('abc', message: '"d" expected', position: 3),
      );
      expect(
        parser,
        isParseFailure('abc*', message: '"d" expected', position: 3),
      );
    });
    test('failure at 4', () {
      expect(
        parser,
        isParseFailure('abcd', message: '"e" expected', position: 4),
      );
      expect(
        parser,
        isParseFailure('abcd*', message: '"e" expected', position: 4),
      );
    });
    test('failure at 5', () {
      expect(
        parser,
        isParseFailure('abcde', message: '"f" expected', position: 5),
      );
      expect(
        parser,
        isParseFailure('abcde*', message: '"f" expected', position: 5),
      );
    });
    test('failure at 6', () {
      expect(
        parser,
        isParseFailure('abcdef', message: '"g" expected', position: 6),
      );
      expect(
        parser,
        isParseFailure('abcdef*', message: '"g" expected', position: 6),
      );
    });
    test('failure at 7', () {
      expect(
        parser,
        isParseFailure('abcdefg', message: '"h" expected', position: 7),
      );
      expect(
        parser,
        isParseFailure('abcdefg*', message: '"h" expected', position: 7),
      );
    });
    test('failure at 8', () {
      expect(
        parser,
        isParseFailure('abcdefgh', message: '"i" expected', position: 8),
      );
      expect(
        parser,
        isParseFailure('abcdefgh*', message: '"i" expected', position: 8),
      );
    });
    test('toSequenceParser()', () {
      final alternate = (
        char('a'),
        char('b'),
        char('c'),
        char('d'),
        char('e'),
        char('f'),
        char('g'),
        char('h'),
        char('i'),
      ).toSequenceParser();
      expect(alternate, isParserDeepEqual(parser));
    });
  });
  group('map9', () {
    final parser = seq9(
      char('a'),
      char('b'),
      char('c'),
      char('d'),
      char('e'),
      char('f'),
      char('g'),
      char('h'),
      char('i'),
    ).map9((a, b, c, d, e, f, g, h, i) => '$a$b$c$d$e$f$g$h$i');
    expectParserInvariants(parser);
    test('success', () {
      expect(parser, isParseSuccess('abcdefghi', result: 'abcdefghi'));
      expect(
        parser,
        isParseSuccess('abcdefghi*', result: 'abcdefghi', position: 9),
      );
    });
    test('failure at 0', () {
      expect(parser, isParseFailure('', message: '"a" expected', position: 0));
      expect(parser, isParseFailure('*', message: '"a" expected', position: 0));
    });
    test('failure at 1', () {
      expect(parser, isParseFailure('a', message: '"b" expected', position: 1));
      expect(
        parser,
        isParseFailure('a*', message: '"b" expected', position: 1),
      );
    });
    test('failure at 2', () {
      expect(
        parser,
        isParseFailure('ab', message: '"c" expected', position: 2),
      );
      expect(
        parser,
        isParseFailure('ab*', message: '"c" expected', position: 2),
      );
    });
    test('failure at 3', () {
      expect(
        parser,
        isParseFailure('abc', message: '"d" expected', position: 3),
      );
      expect(
        parser,
        isParseFailure('abc*', message: '"d" expected', position: 3),
      );
    });
    test('failure at 4', () {
      expect(
        parser,
        isParseFailure('abcd', message: '"e" expected', position: 4),
      );
      expect(
        parser,
        isParseFailure('abcd*', message: '"e" expected', position: 4),
      );
    });
    test('failure at 5', () {
      expect(
        parser,
        isParseFailure('abcde', message: '"f" expected', position: 5),
      );
      expect(
        parser,
        isParseFailure('abcde*', message: '"f" expected', position: 5),
      );
    });
    test('failure at 6', () {
      expect(
        parser,
        isParseFailure('abcdef', message: '"g" expected', position: 6),
      );
      expect(
        parser,
        isParseFailure('abcdef*', message: '"g" expected', position: 6),
      );
    });
    test('failure at 7', () {
      expect(
        parser,
        isParseFailure('abcdefg', message: '"h" expected', position: 7),
      );
      expect(
        parser,
        isParseFailure('abcdefg*', message: '"h" expected', position: 7),
      );
    });
    test('failure at 8', () {
      expect(
        parser,
        isParseFailure('abcdefgh', message: '"i" expected', position: 8),
      );
      expect(
        parser,
        isParseFailure('abcdefgh*', message: '"i" expected', position: 8),
      );
    });
  });
  group('record', () {
    const record = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i');
    const other = ('i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a');
    test('accessors', () {
      expect(record.$1, 'a');
      expect(record.$2, 'b');
      expect(record.$3, 'c');
      expect(record.$4, 'd');
      expect(record.$5, 'e');
      expect(record.$6, 'f');
      expect(record.$7, 'g');
      expect(record.$8, 'h');
      expect(record.$9, 'i');
    });
    test('map', () {
      expect(
        record.map((a, b, c, d, e, f, g, h, i) {
          expect(a, 'a');
          expect(b, 'b');
          expect(c, 'c');
          expect(d, 'd');
          expect(e, 'e');
          expect(f, 'f');
          expect(g, 'g');
          expect(h, 'h');
          expect(i, 'i');
          return 42;
        }),
        42,
      );
    });
    test('equals', () {
      expect(record, record);
      expect(record, isNot(other));
      expect(other, isNot(record));
      expect(other, other);
    });
    test('hashCode', () {
      expect(record.hashCode, record.hashCode);
      expect(record.hashCode, isNot(other.hashCode));
      expect(other.hashCode, isNot(record.hashCode));
      expect(other.hashCode, other.hashCode);
    });
    test('toString', () {
      expect(record.toString(), endsWith('(a, b, c, d, e, f, g, h, i)'));
      expect(other.toString(), endsWith('(i, h, g, f, e, d, c, b, a)'));
    });
  });
}
