blob: c31af68bcdbea6baff27da76c1519555dcdf77e7 [file] [log] [blame]
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]'
]);
});
});
}