| 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 |