Chromium Code Reviews| Index: pkg/analyzer2dart/test/tree_shaker_test.dart |
| diff --git a/pkg/analyzer2dart/test/tree_shaker_test.dart b/pkg/analyzer2dart/test/tree_shaker_test.dart |
| index c094f09c76dc97ba8100a55791cbe040975e7f12..d1caca94217bd09485bde4e9fa2e455d352bbbe7 100644 |
| --- a/pkg/analyzer2dart/test/tree_shaker_test.dart |
| +++ b/pkg/analyzer2dart/test/tree_shaker_test.dart |
| @@ -27,7 +27,7 @@ foo() { |
| helper.assertHasFunction('foo'); |
| }); |
| - test('Toplevel field access', () { |
| + test('Toplevel field read', () { |
| var helper = new TreeShakerTestHelper(''' |
| main() { |
| return foo; |
| @@ -40,6 +40,19 @@ var bar; |
| helper.assertNoVariable('bar'); |
| }); |
| + test('Toplevel field write', () { |
| + var helper = new TreeShakerTestHelper(''' |
| +main() { |
| + foo = 1; |
| +} |
| +var foo; |
| +var bar; |
| +'''); |
| + helper.assertHasFunction('main'); |
| + helper.assertHasVariable('foo'); |
| + helper.assertNoVariable('bar'); |
| + }); |
| + |
| test('Toplevel field invocation', () { |
| var helper = new TreeShakerTestHelper(''' |
| main() { |
| @@ -145,10 +158,14 @@ main() { |
| class A { |
| get g1 => null; |
| get g2 => null; |
| + set g1(x) {} |
| + set g2(x) {} |
| } |
| class B { |
| get g1 => null; |
| get g2 => null; |
| + set g1(x) {} |
| + set g2(x) {} |
| } |
| main() { |
| new A().g1; |
| @@ -158,9 +175,41 @@ main() { |
| helper.assertNoGetter('A.g2'); |
| helper.assertNoGetter('B.g1'); |
| helper.assertNoGetter('B.g2'); |
| + helper.assertNoSetter('A.g1'); |
| + helper.assertNoSetter('A.g2'); |
| + helper.assertNoSetter('B.g1'); |
| + helper.assertNoSetter('B.g2'); |
| + }); |
| + |
| + test('Setter usage', () { |
| + var helper = new TreeShakerTestHelper(''' |
| +class A { |
| + get g1 => null; |
| + get g2 => null; |
| + set g1(x) {} |
| + set g2(x) {} |
| +} |
| +class B { |
| + get g1 => null; |
| + get g2 => null; |
| + set g1(x) {} |
| + set g2(x) {} |
| +} |
| +main() { |
| + new A().g1 = 1; |
| +} |
| +'''); |
| + helper.assertHasSetter('A.g1'); |
| + helper.assertNoSetter('A.g2'); |
| + helper.assertNoSetter('B.g1'); |
| + helper.assertNoSetter('B.g2'); |
| + helper.assertNoGetter('A.g1'); |
| + helper.assertNoGetter('A.g2'); |
| + helper.assertNoGetter('B.g1'); |
| + helper.assertNoGetter('B.g2'); |
| }); |
| - test('Field access', () { |
| + test('Field read', () { |
| var helper = new TreeShakerTestHelper(''' |
| class A { |
| var f1; |
| @@ -180,6 +229,26 @@ main() { |
| helper.assertNoField('B.f2'); |
| }); |
| + test('Field write', () { |
| + var helper = new TreeShakerTestHelper(''' |
| +class A { |
| + var f1; |
| + var f2; |
| +} |
| +class B { |
| + var f1; |
| + var f2; |
| +} |
| +main() { |
| + new A().f1 = 1; |
| +} |
| +'''); |
| + helper.assertHasField('A.f1'); |
| + helper.assertNoField('A.f2'); |
| + helper.assertNoField('B.f1'); |
| + helper.assertNoField('B.f2'); |
| + }); |
| + |
| test('Ordinary constructor with initializer list', () { |
| var helper = new TreeShakerTestHelper(''' |
| class A { |
| @@ -276,6 +345,11 @@ class TreeShakerTestHelper { |
| Map<String, MethodDeclaration> getters = <String, MethodDeclaration>{}; |
| /** |
| + * Setters contained in [world], indexed by className.propertyName. |
| + */ |
| + Map<String, MethodDeclaration> setters = <String, MethodDeclaration>{}; |
| + |
| + /** |
| * Fields contained in [world], indexed by className.fieldName. |
| */ |
| Map<String, VariableDeclaration> fields = <String, VariableDeclaration>{}; |
| @@ -322,9 +396,16 @@ class TreeShakerTestHelper { |
| if (declaration.isGetter) { |
| getters['${element.enclosingElement.name}.${element.name}'] = |
| declaration; |
| + } else if (declaration.isSetter) { |
| + // element.name uses the convention that setter names end in '='. |
| + // Strip off the '=' to avoid confusion in writing the tests. |
|
scheglov
2014/10/21 14:58:21
We could use element.displayName instead.
Paul Berry
2014/10/21 15:14:04
Done.
|
| + String setterName = |
| + '${element.enclosingElement.name}.${element.name}'; |
| + assert(setterName.endsWith('=')); |
| + setters[setterName.substring(0, setterName.length - 1)] = |
| + declaration; |
| } else { |
| - // TODO(paulberry): handle setters. |
| - throw new UnimplementedError(); |
| + fail('Unexpected property accessor (neither getter nor setter)'); |
| } |
| } |
| }); |
| @@ -377,6 +458,13 @@ class TreeShakerTestHelper { |
| } |
| /** |
| + * Asserts that [world] contains a setter with the given qualified name. |
| + */ |
| + void assertHasSetter(String qualifiedName) { |
| + expect(setters, contains(qualifiedName)); |
| + } |
| + |
| + /** |
| * Asserts that [world] instantiates a class with the given name. |
| */ |
| void assertHasInstantiatedClass(String name) { |
| @@ -425,6 +513,14 @@ class TreeShakerTestHelper { |
| } |
| /** |
| + * Asserts that [world] doesn't contain a setter with the given qualified |
| + * name. |
| + */ |
| + void assertNoSetter(String qualifiedName) { |
| + expect(setters, isNot(contains(qualifiedName))); |
| + } |
| + |
| + /** |
| * Asserts that [world] doesn't instantiate a class with the given name. |
| */ |
| void assertNoInstantiatedClass(String name) { |