OLD | NEW |
(Empty) | |
| 1 library petitparser.test.dart_test; |
| 2 |
| 3 import 'package:test/test.dart'; |
| 4 |
| 5 import 'package:petitparser/test.dart'; |
| 6 import 'package:petitparser/dart.dart'; |
| 7 |
| 8 void main() { |
| 9 var definition = new DartGrammarDefinition(); |
| 10 var dart = new DartGrammar(); |
| 11 group('basic', () { |
| 12 test('structure', () { |
| 13 expect('library test;', accept(dart)); |
| 14 expect('library test; void main() { }', accept(dart)); |
| 15 expect('library test; void main() { print(2 + 3); }', accept(dart)); |
| 16 }); |
| 17 }); |
| 18 group('expression', () { |
| 19 var expression = definition.build(start: definition.expression).end(); |
| 20 test('literal numbers', () { |
| 21 expect('1', accept(expression)); |
| 22 expect('1.2', accept(expression)); |
| 23 expect('1.2e3', accept(expression)); |
| 24 expect('1.2e-3', accept(expression)); |
| 25 expect('-1.2e3', accept(expression)); |
| 26 expect('-1.2e-3', accept(expression)); |
| 27 expect('-1.2E-3', accept(expression)); |
| 28 }); |
| 29 test('literal objects', () { |
| 30 expect('true', accept(expression)); |
| 31 expect('false', accept(expression)); |
| 32 expect('null', accept(expression)); |
| 33 }); |
| 34 test('unary increment/decrement', () { |
| 35 expect('++a', accept(expression)); |
| 36 expect('--a', accept(expression)); |
| 37 expect('a++', accept(expression)); |
| 38 expect('a--', accept(expression)); |
| 39 }); |
| 40 test('unary operators', () { |
| 41 expect('+a', accept(expression)); |
| 42 expect('-a', accept(expression)); |
| 43 expect('!a', accept(expression)); |
| 44 expect('~a', accept(expression)); |
| 45 }); |
| 46 test('binary arithmetic operators', () { |
| 47 expect('a + b', accept(expression)); |
| 48 expect('a - b', accept(expression)); |
| 49 expect('a * b', accept(expression)); |
| 50 expect('a / b', accept(expression)); |
| 51 expect('a ~/ b', accept(expression)); |
| 52 expect('a % b', accept(expression)); |
| 53 }); |
| 54 test('binary logical operators', () { |
| 55 expect('a & b', accept(expression)); |
| 56 expect('a | b', accept(expression)); |
| 57 expect('a ^ b', accept(expression)); |
| 58 expect('a && b', accept(expression)); |
| 59 expect('a || b', accept(expression)); |
| 60 }); |
| 61 test('binary conditional operators', () { |
| 62 expect('a > b', accept(expression)); |
| 63 expect('a >= b', accept(expression)); |
| 64 expect('a < b', accept(expression)); |
| 65 expect('a <= b', accept(expression)); |
| 66 expect('a == b', accept(expression)); |
| 67 expect('a != b', accept(expression)); |
| 68 expect('a === b', accept(expression)); |
| 69 expect('a !== b', accept(expression)); |
| 70 }); |
| 71 test('binary shift operators', () { |
| 72 expect('a << b', accept(expression)); |
| 73 expect('a >>> b', accept(expression)); |
| 74 expect('a >> b', accept(expression)); |
| 75 }); |
| 76 test('ternary operator', () { |
| 77 expect('a ? b : c', accept(expression)); |
| 78 }); |
| 79 test('parenthesis', () { |
| 80 expect('(a + b)', accept(expression)); |
| 81 expect('a * (b + c)', accept(expression)); |
| 82 expect('(a * b) + c', accept(expression)); |
| 83 }); |
| 84 test('access', () { |
| 85 expect('a.b', accept(expression)); |
| 86 }); |
| 87 test('invoke', () { |
| 88 expect('a.b()', accept(expression)); |
| 89 expect('a.b(c)', accept(expression)); |
| 90 expect('a.b(c, d)', accept(expression)); |
| 91 expect('a.b(c: d)', accept(expression)); |
| 92 expect('a.b(c: d, e: f)', accept(expression)); |
| 93 }); |
| 94 test('assignment', () { |
| 95 expect('a = b', accept(expression)); |
| 96 expect('a += b', accept(expression)); |
| 97 expect('a -= b', accept(expression)); |
| 98 expect('a *= b', accept(expression)); |
| 99 expect('a /= b', accept(expression)); |
| 100 expect('a %= b', accept(expression)); |
| 101 expect('a ~/= b', accept(expression)); |
| 102 expect('a <<= b', accept(expression)); |
| 103 expect('a >>>= b', accept(expression)); |
| 104 expect('a >>= b', accept(expression)); |
| 105 expect('a &= b', accept(expression)); |
| 106 expect('a ^= b', accept(expression)); |
| 107 expect('a |= b', accept(expression)); |
| 108 }); |
| 109 test('indexed', () { |
| 110 expect('a[b]', accept(expression)); |
| 111 expect('a[b] = c', accept(expression)); |
| 112 }); |
| 113 }); |
| 114 group('whitespace', () { |
| 115 var whitespaces = definition.build(start: definition.HIDDEN).end(); |
| 116 test('whitespace', () { |
| 117 expect(' ', accept(whitespaces)); |
| 118 expect('\t', accept(whitespaces)); |
| 119 expect('\n', accept(whitespaces)); |
| 120 expect('\r', accept(whitespaces)); |
| 121 expect('a', isNot(accept(whitespaces))); |
| 122 }); |
| 123 test('single-line comment', () { |
| 124 expect('//', accept(whitespaces)); |
| 125 expect('// foo', accept(whitespaces)); |
| 126 expect('//\n', accept(whitespaces)); |
| 127 expect('// foo\n', accept(whitespaces)); |
| 128 }); |
| 129 test('single-line documentation', () { |
| 130 expect('///', accept(whitespaces)); |
| 131 expect('/// foo', accept(whitespaces)); |
| 132 expect('/// \n', accept(whitespaces)); |
| 133 expect('/// foo\n', accept(whitespaces)); |
| 134 }); |
| 135 test('multi-line comment', () { |
| 136 expect('/**/', accept(whitespaces)); |
| 137 expect('/* foo */', accept(whitespaces)); |
| 138 expect('/* foo \n bar */', accept(whitespaces)); |
| 139 expect('/* foo ** bar */', accept(whitespaces)); |
| 140 expect('/* foo * / bar */', accept(whitespaces)); |
| 141 }); |
| 142 test('multi-line documentation', () { |
| 143 expect('/***/', accept(whitespaces)); |
| 144 expect('/*******/', accept(whitespaces)); |
| 145 expect('/** foo */', accept(whitespaces)); |
| 146 expect('/**\n *\n *\n */', accept(whitespaces)); |
| 147 }); |
| 148 test('multi-line nested', () { |
| 149 expect('/* outer /* nested */ */', accept(whitespaces)); |
| 150 expect('/* outer /* nested /* deeply nested */ */ */', accept(whitespaces)
); |
| 151 expect('/* outer /* not closed */', isNot(accept(whitespaces))); |
| 152 }); |
| 153 test('combined', () { |
| 154 expect('/**/', accept(whitespaces)); |
| 155 expect(' /**/', accept(whitespaces)); |
| 156 expect('/**/ ', accept(whitespaces)); |
| 157 expect(' /**/ ', accept(whitespaces)); |
| 158 expect('/**///', accept(whitespaces)); |
| 159 expect('/**/ //', accept(whitespaces)); |
| 160 expect(' /**/ //', accept(whitespaces)); |
| 161 }); |
| 162 }); |
| 163 group('child parsers', () { |
| 164 var parser = definition.build(start: definition.STRING).end(); |
| 165 test('singleLineString', () { |
| 166 expect("'hi'", accept(parser)); |
| 167 expect('"hi"', accept(parser)); |
| 168 expect('no quotes', isNot(accept(parser))); |
| 169 expect('"missing quote', isNot(accept(parser))); |
| 170 expect("'missing quote", isNot(accept(parser))); |
| 171 }); |
| 172 }); |
| 173 group('offical', () { |
| 174 test('identifier', () { |
| 175 var parser = definition.build(start: definition.identifier).end(); |
| 176 expect('foo', accept(parser)); |
| 177 expect('bar9', accept(parser)); |
| 178 expect('dollar\$', accept(parser)); |
| 179 expect('_foo', accept(parser)); |
| 180 expect('_bar9', accept(parser)); |
| 181 expect('_dollar\$', accept(parser)); |
| 182 expect('\$', accept(parser)); |
| 183 expect(' leadingSpace', accept(parser)); |
| 184 expect('9', isNot(accept(parser))); |
| 185 expect('3foo', isNot(accept(parser))); |
| 186 expect('', isNot(accept(parser))); |
| 187 }); |
| 188 test('numeric literal', () { |
| 189 var parser = definition.build(start: definition.literal).end(); |
| 190 expect('0', accept(parser)); |
| 191 expect('1984', accept(parser)); |
| 192 expect(' 1984', accept(parser)); |
| 193 expect('0xCAFE', accept(parser)); |
| 194 expect('0XCAFE', accept(parser)); |
| 195 expect('0xcafe', accept(parser)); |
| 196 expect('0Xcafe', accept(parser)); |
| 197 expect('0xCaFe', accept(parser)); |
| 198 expect('0XCaFe', accept(parser)); |
| 199 expect('3e4', accept(parser)); |
| 200 expect('3e-4', accept(parser)); |
| 201 expect('3E4', accept(parser)); |
| 202 expect('3E-4', accept(parser)); |
| 203 expect('3.14E4', accept(parser)); |
| 204 expect('3.14E-4', accept(parser)); |
| 205 expect('3.14', accept(parser)); |
| 206 expect('3e--4', isNot(accept(parser))); |
| 207 expect('5.', isNot(accept(parser))); |
| 208 expect('CAFE', isNot(accept(parser))); |
| 209 expect('0xGHIJ', isNot(accept(parser))); |
| 210 expect('-', isNot(accept(parser))); |
| 211 expect('', isNot(accept(parser))); |
| 212 }); |
| 213 test('boolean literal', () { |
| 214 var parser = definition.build(start: definition.literal).end(); |
| 215 expect('true', accept(parser)); |
| 216 expect('false', accept(parser)); |
| 217 expect(' true', accept(parser)); |
| 218 expect(' false', accept(parser)); |
| 219 }); |
| 220 }); |
| 221 } |
OLD | NEW |