Index: packages/petitparser/test/reflection_test.dart |
diff --git a/packages/petitparser/test/reflection_test.dart b/packages/petitparser/test/reflection_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dc200a9694dacd0128bbb2fc9822aa7088ac96a3 |
--- /dev/null |
+++ b/packages/petitparser/test/reflection_test.dart |
@@ -0,0 +1,159 @@ |
+library petitparser.test.reflection_test; |
+ |
+import 'package:test/test.dart'; |
+ |
+import 'package:petitparser/petitparser.dart'; |
+import 'package:petitparser/reflection.dart'; |
+ |
+main() { |
+ group('iterator', () { |
+ test('single', () { |
+ var parser1 = lowercase(); |
+ var parsers = allParser(parser1).toList(); |
+ expect(parsers, [parser1]); |
+ }); |
+ test('nested', () { |
+ var parser3 = lowercase(); |
+ var parser2 = parser3.star(); |
+ var parser1 = parser2.flatten(); |
+ var parsers = allParser(parser1).toList(); |
+ expect(parsers, [parser1, parser2, parser3]); |
+ }); |
+ test('branched', () { |
+ var parser3 = lowercase(); |
+ var parser2 = uppercase(); |
+ var parser1 = parser2.seq(parser3); |
+ var parsers = allParser(parser1).toList(); |
+ expect(parsers, [parser1, parser3, parser2]); |
+ }); |
+ test('duplicated', () { |
+ var parser2 = uppercase(); |
+ var parser1 = parser2.seq(parser2); |
+ var parsers = allParser(parser1).toList(); |
+ expect(parsers, [parser1, parser2]); |
+ }); |
+ test('knot', () { |
+ var parser1 = undefined(); |
+ parser1.set(parser1); |
+ var parsers = allParser(parser1).toList(); |
+ expect(parsers, [parser1]); |
+ }); |
+ test('looping', () { |
+ var parser1 = undefined(); |
+ var parser2 = undefined(); |
+ var parser3 = undefined(); |
+ parser1.set(parser2); |
+ parser2.set(parser3); |
+ parser3.set(parser1); |
+ var parsers = allParser(parser1).toList(); |
+ expect(parsers, [parser1, parser2, parser3]); |
+ }); |
+ test('basic', () { |
+ var lower = lowercase(); |
+ var iterator = allParser(lower).iterator; |
+ expect(iterator.current, isNull); |
+ expect(iterator.moveNext(), isTrue); |
+ expect(iterator.current, lower); |
+ expect(iterator.current, lower); |
+ expect(iterator.moveNext(), isFalse); |
+ expect(iterator.current, isNull); |
+ expect(iterator.moveNext(), isFalse); |
+ }); |
+ }); |
+ group('transform', () { |
+ test('copy', () { |
+ var input = lowercase().settable(); |
+ var output = transformParser(input, (parser) => parser); |
+ expect(input, isNot(output)); |
+ expect(input.isEqualTo(output), isTrue); |
+ expect(input.children.single, isNot(output.children.single)); |
+ }); |
+ test('root', () { |
+ var source = lowercase(); |
+ var input = source; |
+ var target = uppercase(); |
+ var output = transformParser(input, (parser) { |
+ return source.isEqualTo(parser) ? target : parser; |
+ }); |
+ expect(input, isNot(output)); |
+ expect(input.isEqualTo(output), isFalse); |
+ expect(input, source); |
+ expect(output, target); |
+ }); |
+ test('single', () { |
+ var source = lowercase(); |
+ var input = source.settable(); |
+ var target = uppercase(); |
+ var output = transformParser(input, (parser) { |
+ return source.isEqualTo(parser) ? target : parser; |
+ }); |
+ expect(input, isNot(output)); |
+ expect(input.isEqualTo(output), isFalse); |
+ expect(input.children.single, source); |
+ expect(output.children.single, target); |
+ }); |
+ test('double', () { |
+ var source = lowercase(); |
+ var input = source & source; |
+ var target = uppercase(); |
+ var output = transformParser(input, (parser) { |
+ return source.isEqualTo(parser) ? target : parser; |
+ }); |
+ expect(input, isNot(output)); |
+ expect(input.isEqualTo(output), isFalse); |
+ expect(input.isEqualTo(source & source), isTrue); |
+ expect(input.children.first, input.children.last); |
+ expect(output.isEqualTo(target & target), isTrue); |
+ expect(output.children.first, output.children.last); |
+ }); |
+ test('loop (existing)', () { |
+ var input = failure().settable().settable().settable(); |
+ input.children.single.children.single.set(input); |
+ var output = transformParser(input, (parser) { |
+ return parser; |
+ }); |
+ expect(input, isNot(output)); |
+ expect(input.isEqualTo(output), isTrue); |
+ var inputs = allParser(input).toSet(); |
+ var outputs = allParser(output).toSet(); |
+ inputs.forEach((each) => expect(outputs.contains(each), isFalse)); |
+ outputs.forEach((each) => expect(inputs.contains(each), isFalse)); |
+ }); |
+ test('loop (new)', () { |
+ var source = lowercase(); |
+ var input = source; |
+ var target = failure().settable().settable().settable(); |
+ target.children.single.children.single.set(target); |
+ var output = transformParser(input, (parser) { |
+ return source.isEqualTo(parser) ? target : parser; |
+ }); |
+ expect(input, isNot(output)); |
+ expect(input.isEqualTo(output), isFalse); |
+ expect(output.isEqualTo(target), isTrue); |
+ }); |
+ }); |
+ group('optimize', () { |
+ test('remove setables', () { |
+ var input = lowercase().settable(); |
+ var output = removeSettables(input); |
+ expect(output.isEqualTo(lowercase()), isTrue); |
+ }); |
+ test('remove nested setables', () { |
+ var input = lowercase().settable().star(); |
+ var output = removeSettables(input); |
+ expect(output.isEqualTo(lowercase().star()), isTrue); |
+ }); |
+ test('remove double setables', () { |
+ var input = lowercase().settable().settable(); |
+ var output = removeSettables(input); |
+ expect(output.isEqualTo(lowercase()), isTrue); |
+ }); |
+ test('remove duplicate', () { |
+ var input = lowercase() & lowercase(); |
+ var output = removeDuplicates(input); |
+ expect(input.isEqualTo(output), isTrue); |
+ expect(input.children.first, isNot(input.children.last)); |
+ expect(output.children.first, output.children.last); |
+ }); |
+ }); |
+} |