Index: packages/petitparser/test/debug_test.dart |
diff --git a/packages/petitparser/test/debug_test.dart b/packages/petitparser/test/debug_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c31af68bcdbea6baff27da76c1519555dcdf77e7 |
--- /dev/null |
+++ b/packages/petitparser/test/debug_test.dart |
@@ -0,0 +1,146 @@ |
+library petitparser.test.debug_test; |
+ |
+import 'package:test/test.dart'; |
+ |
+import 'package:petitparser/petitparser.dart'; |
+import 'package:petitparser/debug.dart'; |
+ |
+final identifier = letter() & word().star(); |
+ |
+main() { |
+ group('continuation', () { |
+ test('delegation', () { |
+ var parser = new ContinuationParser(digit(), (continuation, context) { |
+ return continuation(context); |
+ }); |
+ expect(parser.parse('1').isSuccess, isTrue); |
+ expect(parser.parse('a').isSuccess, isFalse); |
+ }); |
+ test('divertion', () { |
+ var parser = new ContinuationParser(digit(), (continuation, context) { |
+ return letter().parseOn(context); |
+ }); |
+ expect(parser.parse('1').isSuccess, isFalse); |
+ expect(parser.parse('a').isSuccess, isTrue); |
+ }); |
+ test('resume', () { |
+ var capture = new List(); |
+ var parser = new ContinuationParser(digit(), (continuation, Context context) { |
+ capture.add([continuation, context]); |
+ // we have to return something for now |
+ return context.failure('Abort'); |
+ }); |
+ // execute the parser twice to collect the continuations |
+ expect(parser.parse('1').isSuccess, isFalse); |
+ expect(parser.parse('a').isSuccess, isFalse); |
+ // later we can execute the captured continuations |
+ expect(capture[0][0](capture[0][1]).isSuccess, isTrue); |
+ expect(capture[1][0](capture[1][1]).isSuccess, isFalse); |
+ // of course the continuations can be resumed multiple times |
+ expect(capture[0][0](capture[0][1]).isSuccess, isTrue); |
+ expect(capture[1][0](capture[1][1]).isSuccess, isFalse); |
+ }); |
+ test('success', () { |
+ var parser = new ContinuationParser(digit(), (continuation, Context context) { |
+ return context.success('Always succeed'); |
+ }); |
+ expect(parser.parse('1').isSuccess, isTrue); |
+ expect(parser.parse('a').isSuccess, isTrue); |
+ }); |
+ test('failure', () { |
+ var parser = new ContinuationParser(digit(), (continuation, Context context) { |
+ return context.failure('Always fail'); |
+ }); |
+ expect(parser.parse('1').isSuccess, isFalse); |
+ expect(parser.parse('a').isSuccess, isFalse); |
+ }); |
+ test('copy', () { |
+ var parser = new ContinuationParser(digit(), (continuation, context) { |
+ return continuation(context); |
+ }); |
+ var copy = parser.copy(); |
+ expect(copy.parse('1').isSuccess, isTrue); |
+ expect(copy.parse('a').isSuccess, isFalse); |
+ }); |
+ }); |
+ group('trace', () { |
+ test('success', () { |
+ var lines = new List(); |
+ expect(trace(identifier, (line) => lines.add(line)).parse('a').isSuccess, isTrue); |
+ expect(lines, [ |
+ 'Instance of \'SequenceParser\'', |
+ ' Instance of \'CharacterParser\'[letter expected]', |
+ ' Success[1:2]: a', |
+ ' Instance of \'PossessiveRepeatingParser\'[0..*]', |
+ ' Instance of \'CharacterParser\'[letter or digit expected]', |
+ ' Failure[1:2]: letter or digit expected', |
+ ' Success[1:2]: []', |
+ 'Success[1:2]: [a, []]' |
+ ]); |
+ }); |
+ test('failure', () { |
+ var lines = new List(); |
+ expect(trace(identifier, (line) => lines.add(line)).parse('1').isFailure, isTrue); |
+ expect(lines, [ |
+ 'Instance of \'SequenceParser\'', |
+ ' Instance of \'CharacterParser\'[letter expected]', |
+ ' Failure[1:1]: letter expected', |
+ 'Failure[1:1]: letter expected' |
+ ]); |
+ }); |
+ }); |
+ group('profile', () { |
+ test('success', () { |
+ var lines = new List(); |
+ expect(profile(identifier, (line) => lines.add(line)) |
+ .parse('ab123').isSuccess, isTrue); |
+ lines = lines |
+ .map((row) => row.split('\t')) |
+ .map((row) => [int.parse(row[0]), int.parse(row[1]), row[2]]); |
+ expect(lines, hasLength(4)); |
+ expect(lines.every((row) => row[1] >= 0), isTrue); |
+ expect(lines.firstWhere((row) => row[2].indexOf('SequenceParser') > 0)[0], 1); |
+ expect(lines.firstWhere((row) => row[2].indexOf('letter expected') > 0)[0], 1); |
+ expect(lines.firstWhere((row) => row[2].indexOf('PossessiveRepeatingParser') > 0)[0], 1); |
+ expect(lines.firstWhere((row) => row[2].indexOf('letter or digit expected') > 0)[0], 5); |
+ }); |
+ test('failure', () { |
+ var lines = new List(); |
+ expect(profile(identifier, (line) => lines.add(line)).parse('1').isFailure, isTrue); |
+ lines = lines |
+ .map((row) => row.split('\t')) |
+ .map((row) => [int.parse(row[0]), int.parse(row[1]), row[2]]); |
+ expect(lines, hasLength(4)); |
+ expect(lines.every((row) => row[1] >= 0), isTrue); |
+ expect(lines.firstWhere((row) => row[2].indexOf('SequenceParser') > 0)[0], 1); |
+ expect(lines.firstWhere((row) => row[2].indexOf('letter expected') > 0)[0], 1); |
+ expect(lines.firstWhere((row) => row[2].indexOf('PossessiveRepeatingParser') > 0)[0], 0); |
+ expect(lines.firstWhere((row) => row[2].indexOf('letter or digit expected') > 0)[0], 0); |
+ }); |
+ }); |
+ group('progress', () { |
+ test('success', () { |
+ var lines = new List(); |
+ expect(progress(identifier, (line) => lines.add(line)) |
+ .parse('ab123').isSuccess, isTrue); |
+ expect(lines, [ |
+ '* Instance of \'SequenceParser\'', |
+ '* Instance of \'CharacterParser\'[letter expected]', |
+ '** Instance of \'PossessiveRepeatingParser\'[0..*]', |
+ '** Instance of \'CharacterParser\'[letter or digit expected]', |
+ '*** Instance of \'CharacterParser\'[letter or digit expected]', |
+ '**** Instance of \'CharacterParser\'[letter or digit expected]', |
+ '***** Instance of \'CharacterParser\'[letter or digit expected]', |
+ '****** Instance of \'CharacterParser\'[letter or digit expected]' |
+ ]); |
+ }); |
+ test('failure', () { |
+ var lines = new List(); |
+ expect(progress(identifier, (line) => lines.add(line)).parse('1').isFailure, isTrue); |
+ expect(lines, [ |
+ '* Instance of \'SequenceParser\'', |
+ '* Instance of \'CharacterParser\'[letter expected]' |
+ ]); |
+ }); |
+ }); |
+} |