OLD | NEW |
(Empty) | |
| 1 library petitparser.test.reflection_test; |
| 2 |
| 3 import 'package:test/test.dart'; |
| 4 |
| 5 import 'package:petitparser/petitparser.dart'; |
| 6 import 'package:petitparser/reflection.dart'; |
| 7 |
| 8 main() { |
| 9 group('iterator', () { |
| 10 test('single', () { |
| 11 var parser1 = lowercase(); |
| 12 var parsers = allParser(parser1).toList(); |
| 13 expect(parsers, [parser1]); |
| 14 }); |
| 15 test('nested', () { |
| 16 var parser3 = lowercase(); |
| 17 var parser2 = parser3.star(); |
| 18 var parser1 = parser2.flatten(); |
| 19 var parsers = allParser(parser1).toList(); |
| 20 expect(parsers, [parser1, parser2, parser3]); |
| 21 }); |
| 22 test('branched', () { |
| 23 var parser3 = lowercase(); |
| 24 var parser2 = uppercase(); |
| 25 var parser1 = parser2.seq(parser3); |
| 26 var parsers = allParser(parser1).toList(); |
| 27 expect(parsers, [parser1, parser3, parser2]); |
| 28 }); |
| 29 test('duplicated', () { |
| 30 var parser2 = uppercase(); |
| 31 var parser1 = parser2.seq(parser2); |
| 32 var parsers = allParser(parser1).toList(); |
| 33 expect(parsers, [parser1, parser2]); |
| 34 }); |
| 35 test('knot', () { |
| 36 var parser1 = undefined(); |
| 37 parser1.set(parser1); |
| 38 var parsers = allParser(parser1).toList(); |
| 39 expect(parsers, [parser1]); |
| 40 }); |
| 41 test('looping', () { |
| 42 var parser1 = undefined(); |
| 43 var parser2 = undefined(); |
| 44 var parser3 = undefined(); |
| 45 parser1.set(parser2); |
| 46 parser2.set(parser3); |
| 47 parser3.set(parser1); |
| 48 var parsers = allParser(parser1).toList(); |
| 49 expect(parsers, [parser1, parser2, parser3]); |
| 50 }); |
| 51 test('basic', () { |
| 52 var lower = lowercase(); |
| 53 var iterator = allParser(lower).iterator; |
| 54 expect(iterator.current, isNull); |
| 55 expect(iterator.moveNext(), isTrue); |
| 56 expect(iterator.current, lower); |
| 57 expect(iterator.current, lower); |
| 58 expect(iterator.moveNext(), isFalse); |
| 59 expect(iterator.current, isNull); |
| 60 expect(iterator.moveNext(), isFalse); |
| 61 }); |
| 62 }); |
| 63 group('transform', () { |
| 64 test('copy', () { |
| 65 var input = lowercase().settable(); |
| 66 var output = transformParser(input, (parser) => parser); |
| 67 expect(input, isNot(output)); |
| 68 expect(input.isEqualTo(output), isTrue); |
| 69 expect(input.children.single, isNot(output.children.single)); |
| 70 }); |
| 71 test('root', () { |
| 72 var source = lowercase(); |
| 73 var input = source; |
| 74 var target = uppercase(); |
| 75 var output = transformParser(input, (parser) { |
| 76 return source.isEqualTo(parser) ? target : parser; |
| 77 }); |
| 78 expect(input, isNot(output)); |
| 79 expect(input.isEqualTo(output), isFalse); |
| 80 expect(input, source); |
| 81 expect(output, target); |
| 82 }); |
| 83 test('single', () { |
| 84 var source = lowercase(); |
| 85 var input = source.settable(); |
| 86 var target = uppercase(); |
| 87 var output = transformParser(input, (parser) { |
| 88 return source.isEqualTo(parser) ? target : parser; |
| 89 }); |
| 90 expect(input, isNot(output)); |
| 91 expect(input.isEqualTo(output), isFalse); |
| 92 expect(input.children.single, source); |
| 93 expect(output.children.single, target); |
| 94 }); |
| 95 test('double', () { |
| 96 var source = lowercase(); |
| 97 var input = source & source; |
| 98 var target = uppercase(); |
| 99 var output = transformParser(input, (parser) { |
| 100 return source.isEqualTo(parser) ? target : parser; |
| 101 }); |
| 102 expect(input, isNot(output)); |
| 103 expect(input.isEqualTo(output), isFalse); |
| 104 expect(input.isEqualTo(source & source), isTrue); |
| 105 expect(input.children.first, input.children.last); |
| 106 expect(output.isEqualTo(target & target), isTrue); |
| 107 expect(output.children.first, output.children.last); |
| 108 }); |
| 109 test('loop (existing)', () { |
| 110 var input = failure().settable().settable().settable(); |
| 111 input.children.single.children.single.set(input); |
| 112 var output = transformParser(input, (parser) { |
| 113 return parser; |
| 114 }); |
| 115 expect(input, isNot(output)); |
| 116 expect(input.isEqualTo(output), isTrue); |
| 117 var inputs = allParser(input).toSet(); |
| 118 var outputs = allParser(output).toSet(); |
| 119 inputs.forEach((each) => expect(outputs.contains(each), isFalse)); |
| 120 outputs.forEach((each) => expect(inputs.contains(each), isFalse)); |
| 121 }); |
| 122 test('loop (new)', () { |
| 123 var source = lowercase(); |
| 124 var input = source; |
| 125 var target = failure().settable().settable().settable(); |
| 126 target.children.single.children.single.set(target); |
| 127 var output = transformParser(input, (parser) { |
| 128 return source.isEqualTo(parser) ? target : parser; |
| 129 }); |
| 130 expect(input, isNot(output)); |
| 131 expect(input.isEqualTo(output), isFalse); |
| 132 expect(output.isEqualTo(target), isTrue); |
| 133 }); |
| 134 }); |
| 135 group('optimize', () { |
| 136 test('remove setables', () { |
| 137 var input = lowercase().settable(); |
| 138 var output = removeSettables(input); |
| 139 expect(output.isEqualTo(lowercase()), isTrue); |
| 140 }); |
| 141 test('remove nested setables', () { |
| 142 var input = lowercase().settable().star(); |
| 143 var output = removeSettables(input); |
| 144 expect(output.isEqualTo(lowercase().star()), isTrue); |
| 145 }); |
| 146 test('remove double setables', () { |
| 147 var input = lowercase().settable().settable(); |
| 148 var output = removeSettables(input); |
| 149 expect(output.isEqualTo(lowercase()), isTrue); |
| 150 }); |
| 151 test('remove duplicate', () { |
| 152 var input = lowercase() & lowercase(); |
| 153 var output = removeDuplicates(input); |
| 154 expect(input.isEqualTo(output), isTrue); |
| 155 expect(input.children.first, isNot(input.children.last)); |
| 156 expect(output.children.first, output.children.last); |
| 157 }); |
| 158 }); |
| 159 } |
OLD | NEW |