Index: frog/tests/parser_test.dart |
diff --git a/frog/tests/parser_test.dart b/frog/tests/parser_test.dart |
deleted file mode 100644 |
index 78c131e491a9c432c629b6156ceca18da555a32c..0000000000000000000000000000000000000000 |
--- a/frog/tests/parser_test.dart |
+++ /dev/null |
@@ -1,312 +0,0 @@ |
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-class ParserTest { |
- static final String TAIL = '//comment\n\n'; |
- |
- static main() { |
- print('start ParserTest'); |
- initializeWorld(new FileSystem('.')); |
- testStatements(); |
- testLambdas(); |
- testExpressionsAsStatements(); |
- testDeclarationStatements(); |
- testTypeAmbiguities(); |
- |
- testDeclarations(); |
- |
- testLiterals(); |
- print('finished ParserTest'); |
- } |
- |
- static testStatements() { |
- testStatement('a - b - c - d;'); |
- |
- testStatement('if (true) return 1*2+3*4; else return 2;'); |
- testStatement('return 42 ? true : false;'); |
- testStatement('return true += 2+6*3;'); |
- |
- testStatement('int x;'); |
- testStatement('x.m y = 42, z;'); |
- testStatement('{ int x; return 22; }'); |
- testStatement('int f() { return 22; }'); |
- |
- testStatement('int f(int y) { return 22 + 3; }'); |
- testStatement('int f(int y, int x) { return 22 + x; }'); |
- |
- testStatement('int f(y, x) { return 22 + x; }'); |
- testStatement('foo() => 42;'); |
- |
- testStatement('throw;'); |
- testStatement('throw x(10);'); |
- |
- testStatement('break;'); |
- testStatement('continue;'); |
- testStatement('assert(true);'); |
- testStatement('assert(x < 10);'); |
- testStatement('break foo;'); |
- testStatement('continue bar;'); |
- |
- testStatement('var z=22, a=new C(1,2);'); |
- |
- testStatement('for (Map<String, Object> suite in stats) {}'); |
- } |
- |
- static testLambdas() { |
- testStatement('x = function() {};'); |
- testStatement('x = function() => 42;'); |
- testStatement('x = void f() {};'); |
- testStatement('x = func() => 42;'); |
- testStatement('x = void f(int x, int y) {};'); |
- testStatement('x = func(x) => 42;'); |
- testStatement('x = func(x,y,z) => 42;'); |
- |
- testStatement('x = func(x);'); |
- testStatement('x = func(x,y,z);'); |
- testStatement('x = func(42);'); |
- testStatement('x = func(x,y,42);'); |
- |
- |
- testStatement('f(x = function() {});'); |
- testStatement('f(x = function() => 42);'); |
- testStatement('f(x = void f() {});'); |
- testStatement('f(x = func() => 42);'); |
- |
- testStatement('f(foo() {});'); |
- |
- testStatement('f(void func(KV<K,V> e) {});'); |
- } |
- |
- static testExpressionsAsStatements() { |
- testStatement('x + 1;'); |
- |
- testStatement('(2+3);'); |
- testStatement('x.m(10);'); |
- testStatement('x(10);'); |
- |
- // TODO(jimhug): This is illegal - add as negative test... |
- //testStatement('var c = z=22, a=new C(1,2);'); |
- |
- testStatement('-a++;'); // TODO(jimhug): Ensure this parses as -(a++). |
- |
- testStatement('[(2+3), x(10), ++x, x++, --y, y--, x[42]];'); |
- testStatement('var m = {"a":42, "b":f(76),};'); |
- testStatement('var m = {};'); |
- testStatement('var m = {"a":"bye"};'); |
- testStatement('var m = {"a":42, "b":f(76)};'); |
- testStatement('var c = const [1,2];'); |
- testStatement('var c = const {"1":2};'); |
- |
- testStatement('final m = const <int>[1,2,3];'); |
- testStatement('final m = const <String, int>{"a":1,"b":2,"c":3};'); |
- |
- testStatement('if (a is double) {}'); |
- testStatement('if ((a is double) && b(10)) {}'); |
- |
- testStatement('try { foo(); } catch (e) {} catch (e, t) {} finally {}'); |
- testStatement('try { foo(); } catch (Ex1 e) {} catch (Ex2 e, St t) {}'); |
- |
- testStatement('for (i in set) {}'); |
- testStatement('for (final i in set) {}'); |
- testStatement('for (var i in set) {}'); |
- testStatement('for (final int i in set) {}'); |
- |
- testStatement('''switch (e) { |
- case 1: |
- foo(); |
- break; |
- case 2: case 3: |
- bar(); return 10; |
- default: return null; |
- }'''); |
- |
- // operator fun |
- testStatement('var o = x >> 2;'); |
- testStatement('var o = x >>> 2;'); |
- |
- testStatement('x >>= 2;'); |
- testStatement('x >>>= 2;'); |
- // TODO - need negatives! |
- |
- testStatement('var kv = new KeyValuePair<K, V>(key, value);'); |
- |
- testStatement('array.sort((a, b) => a < b);'); |
- |
- testStatement(';'); |
- testStatement('{;;;;;;;;;}'); |
- |
- testStatement('print("hello");'); |
- testStatement('print("hello \$foo");'); |
- testStatement('print("\${2 + x} = \${y(\'bar\')}");'); |
- } |
- |
- static testDeclarationStatements() { |
- testStatement('int m() {}'); |
- testStatement('m() {}'); |
- testStatement('m(x) {}'); |
- |
- testStatement('m(A<B> o) {}'); |
- |
- testStatement('m(A<B<C>> z) {}'); |
- |
- testStatement('A.B<C> m(int x, y, double z) {}'); |
- testStatement('A.B<C> m(int x, y, A<B<C>> z) {}'); |
- |
- testStatement('int x;'); |
- testStatement('A.B<C> x = 2+5;'); |
- testStatement('A.B<C> x = 2+5, y, z=42;'); |
- |
- testStatement('void f(e) { }'); |
- |
- testStatement('Promise<int> a = new Promise<int>();'); |
- testStatement('Promise<Promise<int>> b = new Promise<Promise<int>>();'); |
- testStatement('P<P<P<int>>> c = new P<P<P<int>>>();'); |
- testStatement('P<P<P<P<int>>>> c = new P<P<P<P<int>>>>();'); |
- } |
- |
- |
- static testDeclarations() { |
- testDeclaration('int m();'); |
- testDeclaration('m();'); |
- testDeclaration('m(x) {}'); |
- testDeclaration('A.B<C> m(int x, y, double z);'); |
- |
- |
- testDeclaration('A.B<C> m(int x, y, A<B<C>> z);'); |
- |
- testDeclaration('int x;'); |
- testDeclaration('A.B<C> x = 2+5;'); |
- testDeclaration('A.B<C> x = 2+5, y, z=42;'); |
- |
- testDeclaration('operator +(other) {}'); |
- testDeclaration('operator [](index) {}'); |
- testDeclaration('operator []=(index, value) {}'); |
- |
- testDeclaration('foo() => 42;'); |
- |
- testDeclaration('''class C extends D implements I { |
- void m() { return 43; } |
- int x; |
- }'''); |
- |
- testDeclaration('interface I { operator +(y) { return y + 10; }}'); |
- testDeclaration('interface I { int operator +(y) { return y + 10; }}'); |
- |
- testDeclaration('HashMap<K, DLLE<KeyValuePair<K, V>>> m_;'); |
- |
- // pseudo keywords? |
- testDeclaration('foo(A source) {}'); |
- testDeclaration('foo(A get, B assert, C static, D extends) {}'); |
- |
- testDeclaration('C(): b=x+y {}'); |
- |
- testDeclaration('C(): z=22, a=new C(1,2) {}'); |
- testDeclaration('C(b): _b = b == null ? 10 : 20 {}'); |
- |
- testDeclaration('C(this.x, this.y) {}'); |
- |
- testDeclaration('C(this.x, this.y): z=22, a=new C(1,2), b=x+y {}'); |
- |
- testDeclaration('void f(e) { }'); |
- } |
- |
- static testTypeAmbiguities() { |
- testMaybeType('A.B.C', false, false); |
- testMaybeType('A.B.C<10', false, true); |
- testMaybeType('A.B.C<D', false, true); |
- testMaybeType('A.B.C<D>', true, false); |
- testMaybeType('A.B.C<D,E>', true, false); |
- testMaybeType('A.B.C<D,E,F>', true, false); |
- testMaybeType('A.B.C<D,E,F,G>', true, false); |
- |
- testMaybeType('A<B1,B2<C>,D>', true, false); |
- |
- testMaybeType('A<B<C>,D>', true, false); |
- testMaybeType('A<B1,B2<C>,D>', true, false); |
- testMaybeType('A<B<C>>', true, false); |
- testMaybeType('A<B<C<D>>>', true, false); |
- |
- testMaybeType('KeyValuePair<K, V>', true, false); |
- testMaybeType('QueueEntry<KeyValuePair<K, V> >', true, false); |
- testMaybeType('QueueEntry<KeyValuePair<K, V>>', true, false); |
- testMaybeType('HashMap<K, QueueEntry<KeyValuePair<K, V> > >', |
- true, false); |
- testMaybeType('HashMap<K, QueueEntry<KeyValuePair<K, V>>>', |
- true, false); |
- } |
- |
- |
- static testLiterals() { |
- testLiteral('2', 2); |
- testLiteral('10e100', 10e100); |
- testLiteral('3.14159265', 3.14159265); |
- testLiteral('0x0', 0); |
- testLiteral('0xa8', 168); |
- testLiteral('0xfF', 255); |
- testLiteral('0XfF', 255); |
- |
- testLiteral('0xabcdef', 11259375); |
- testLiteral('0xABCDEF', 11259375); |
- // TODO(jimhug): This is too big for JS int |
- //testLiteral('0x123456789', 4886718345); |
- testLiteral('0x12345678', 305419896); |
- } |
- |
- static Parser makeParser(String filename, String code) { |
- return new Parser(new SourceFile(filename, code)); |
- } |
- |
- static void assertEqual(a, b) { |
- Expect.equals(a, b); |
- } |
- |
- static void validateNode(Node node, String filename, String code) { |
- // first, confirm sourcespan exists and is "correct" |
- var span = node.span; |
- assertEqual(span.file.filename, filename); |
- assertEqual(span.start, 0); |
- assertEqual(span.end, code.length); |
- |
- // TODO(jimhug): Walk and validate children spans and contents. |
- } |
- |
- static void testLiteral(String expr, var expected) { |
- print('>>>${expr}<<<'); |
- var filename = 'expr.dart'; |
- final parser = makeParser(filename, expr + TAIL); |
- var node = parser.expression(); |
- validateNode(node, filename, expr); |
- parser.checkEndOfFile(); |
- |
- assertEqual(expected, node.value); |
- } |
- |
- static void testDeclaration(String code, [String filename='test.dart']) { |
- print('>>>${code}<<<'); |
- final parser = makeParser(filename, code + TAIL); |
- var decl = parser.topLevelDefinition(); |
- validateNode(decl, filename, code); |
- parser.checkEndOfFile(); |
- } |
- |
- static void testStatement(String code, [String filename='test.dart']) { |
- print('>>>${code}<<<'); |
- final parser = makeParser(filename, code + TAIL); |
- var node = parser.statement(); |
- validateNode(node, filename, code); |
- parser.checkEndOfFile(); |
- } |
- |
- static void testMaybeType(String code, bool mustBeType, |
- bool mustBeExpression) { |
- if (!mustBeType) { |
- testStatement('x + ' + code + ';'); |
- } |
- if (!mustBeExpression) { |
- testStatement(code + ' x;'); |
- testDeclaration(code + ' x;'); |
- } |
- // TODO(jimhug): add negative test cases. |
- } |
-} |