Chromium Code Reviews| Index: tests/compiler/dart2js/patch_test.dart |
| diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart |
| index 720c85dd479edd31e61b2fc087c2d66afd0b668a..81f02d951e1acda5a997bc0c19b784b5029caf9c 100644 |
| --- a/tests/compiler/dart2js/patch_test.dart |
| +++ b/tests/compiler/dart2js/patch_test.dart |
| @@ -44,7 +44,8 @@ Element ensure(compiler, |
| bool isPatch: false, |
| bool isMethod: true, |
| bool isGetter: false, |
| - bool isFound: true}) { |
| + bool isFound: true, |
| + bool isRegular: false}) { |
|
ngeoffray
2013/01/11 11:46:12
What's 'isRegular'? Maybe add a comment.
Johnni Winther
2013/01/29 09:30:56
A regular member is one that is neither patched no
|
| var element = lookup(buildSourceString(name)); |
| if (!isFound) { |
| Expect.isNull(element); |
| @@ -86,7 +87,7 @@ Element ensure(compiler, |
| } else { |
| Expect.isTrue(element.isDeclaration); |
| } |
| - if (!(element.isPatched || element.isPatch)) { |
| + if (isRegular) { |
| Expect.isNull(element.origin); |
| Expect.isNull(element.patch); |
| @@ -114,6 +115,37 @@ testPatchFunction() { |
| "Unexpected errors: ${compiler.errors}"); |
| } |
| +testPatchConstructor() { |
| + var compiler = applyPatch( |
| + """ |
| + class Class { |
| + external Class(); |
| + } |
| + """, |
| + """ |
| + patch class Class { |
| + patch Class(); |
| + } |
| + """); |
| + var container = ensure(compiler, "Class", compiler.coreLibrary.find, |
| + isMethod: false, isPatched: true); |
| + container.parseNode(compiler); |
| + ensure(compiler, "Class", compiler.coreLibrary.patch.find, |
| + isMethod: false, isPatch: true); |
| + |
| + |
| + |
| + ensure(compiler, "Class", (name) => container.localScope[name], |
| + isMethod: false, isPatched: true); |
| + ensure(compiler, "Class", (name) => container.patch.localScope[name], |
| + isMethod: false, isPatch: true); |
| + |
| + Expect.isTrue(compiler.warnings.isEmpty, |
| + "Unexpected warnings: ${compiler.warnings}"); |
| + Expect.isTrue(compiler.errors.isEmpty, |
| + "Unexpected errors: ${compiler.errors}"); |
| +} |
| + |
| testPatchMember() { |
| var compiler = applyPatch( |
| """ |
| @@ -192,8 +224,9 @@ testRegularMember() { |
| ensure(compiler, "Class", compiler.coreLibrary.patch.find, |
| isMethod: false, isPatch: true); |
| - ensure(compiler, "regular", container.lookupLocalMember); |
| - ensure(compiler, "regular", container.patch.lookupLocalMember); |
| + ensure(compiler, "regular", container.lookupLocalMember, isRegular: true); |
| + ensure(compiler, "regular", container.patch.lookupLocalMember, |
| + isRegular: true); |
| Expect.isTrue(compiler.warnings.isEmpty, |
| "Unexpected warnings: ${compiler.warnings}"); |
| @@ -219,7 +252,8 @@ testGhostMember() { |
| isMethod: false, isPatch: true); |
| ensure(compiler, "ghost", container.lookupLocalMember, isFound: false); |
| - ensure(compiler, "ghost", container.patch.lookupLocalMember); |
| + ensure(compiler, "ghost", container.patch.lookupLocalMember, |
| + isRegular: true); |
| Expect.isTrue(compiler.warnings.isEmpty, |
| "Unexpected warnings: ${compiler.warnings}"); |
| @@ -237,7 +271,8 @@ testInjectFunction() { |
| isFound: false); |
| ensure(compiler, |
| "_function", |
| - compiler.coreLibrary.patch.find); |
| + compiler.coreLibrary.patch.find, |
| + isRegular: true); |
| Expect.isTrue(compiler.warnings.isEmpty, |
| "Unexpected warnings: ${compiler.warnings}"); |
| @@ -355,7 +390,233 @@ testPatchSignatureCheck() { |
| print('method8:${compiler.errors}'); |
| } |
| +testPatchNonExistingTopLevel() { |
| + var compiler = applyPatch( |
| + """ |
|
ahe
2013/01/21 10:53:35
Why a multiline string?
Johnni Winther
2013/01/29 09:30:56
Expanded with the missing class declaration.
|
| + """, |
| + """ |
| + patch class Class {} |
| + """); |
| + Expect.isTrue(compiler.warnings.isEmpty, |
| + "Unexpected warnings: ${compiler.warnings}"); |
| + print('testPatchNonExistingTopLevel:${compiler.errors}'); |
| + Expect.equals(1, compiler.errors.length); |
| + Expect.isTrue( |
| + compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXISTING); |
|
ahe
2013/01/21 10:53:35
I don't think you're testing the positions. This a
|
| +} |
| + |
| +testPatchNonExistingMember() { |
| + var compiler = applyPatch( |
| + """ |
| + class Class {} |
| + """, |
| + """ |
| + patch class Class { |
| + patch void foo() {} |
| + } |
| + """); |
| + var container = ensure(compiler, "Class", compiler.coreLibrary.find, |
| + isMethod: false, isPatched: true); |
| + container.parseNode(compiler); |
| + |
| + Expect.isTrue(compiler.warnings.isEmpty, |
| + "Unexpected warnings: ${compiler.warnings}"); |
| + print('testPatchNonExistingMember:${compiler.errors}'); |
| + Expect.equals(1, compiler.errors.length); |
| + Expect.isTrue( |
| + compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXISTING); |
| +} |
| + |
| +testPatchNonPatchablePatch() { |
| + var compiler = applyPatch( |
| + """ |
| + external get foo; |
| + """, |
| + """ |
| + patch var foo; |
| + """); |
| + ensure(compiler, "foo", compiler.coreLibrary.find); |
| + |
| + Expect.isTrue(compiler.warnings.isEmpty, |
| + "Unexpected warnings: ${compiler.warnings}"); |
| + print('testPatchNonPatchablePatch:${compiler.errors}'); |
| + Expect.equals(1, compiler.errors.length); |
| + Expect.isTrue( |
| + compiler.errors[0].message.kind == MessageKind.PATCH_NONPATCHABLE); |
|
ahe
2013/01/21 10:53:35
This, and many tests below, do not test that you g
Johnni Winther
2013/01/29 09:30:56
Generally a good idea, but not easy currently.
|
| +} |
| + |
| +testPatchNonPatchableOrigin() { |
| + var compiler = applyPatch( |
| + """ |
| + external var foo; |
| + """, |
| + """ |
| + patch get foo => 0; |
| + """); |
| + ensure(compiler, "foo", compiler.coreLibrary.find, isMethod: false); |
| + |
| + Expect.isTrue(compiler.warnings.isEmpty, |
| + "Unexpected warnings: ${compiler.warnings}"); |
| + print('testPatchNonPatchableOrigin:${compiler.errors}'); |
| + Expect.equals(1, compiler.errors.length); |
| + Expect.isTrue( |
| + compiler.errors[0].message.kind == MessageKind.PATCH_NONPATCHABLE); |
| +} |
| + |
| +testPatchNonExternalTopLevel() { |
| + var compiler = applyPatch( |
| + """ |
| + void foo() {} |
| + """, |
| + """ |
| + patch void foo() {} |
| + """); |
| + print('testPatchNonExternalTopLevel.errors:${compiler.errors}'); |
| + print('testPatchNonExternalTopLevel.warnings:${compiler.warnings}'); |
| + Expect.equals(1, compiler.errors.length); |
| + Expect.isTrue( |
| + compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL); |
| + Expect.equals(1, compiler.warnings.length); |
| + Expect.isTrue( |
| + compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_FUNCTION); |
| +} |
| + |
| +testPatchNonExternalMember() { |
| + var compiler = applyPatch( |
| + """ |
| + class Class { |
| + void foo() {} |
| + } |
| + """, |
| + """ |
| + patch class Class { |
| + patch void foo() {} |
| + } |
| + """); |
| + var container = ensure(compiler, "Class", compiler.coreLibrary.find, |
| + isMethod: false, isPatched: true); |
| + container.parseNode(compiler); |
| + |
| + print('testPatchNonExternalMember.errors:${compiler.errors}'); |
| + print('testPatchNonExternalMember.warnings:${compiler.warnings}'); |
| + Expect.equals(1, compiler.errors.length); |
| + Expect.isTrue( |
| + compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL); |
| + Expect.equals(1, compiler.warnings.length); |
| + Expect.isTrue( |
| + compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_FUNCTION); |
| +} |
| + |
| +testPatchNonClass() { |
| + var compiler = applyPatch( |
| + """ |
| + external void Class() {} |
| + """, |
| + """ |
| + patch class Class {} |
| + """); |
| + print('testPatchNonClass.errors:${compiler.errors}'); |
| + print('testPatchNonClass.warnings:${compiler.warnings}'); |
| + Expect.equals(1, compiler.errors.length); |
| + Expect.isTrue( |
| + compiler.errors[0].message.kind == MessageKind.PATCH_NON_CLASS); |
| + Expect.equals(1, compiler.warnings.length); |
| + Expect.isTrue( |
| + compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_CLASS); |
| +} |
| + |
| +testPatchNonGetter() { |
| + var compiler = applyPatch( |
| + """ |
| + external void foo() {} |
| + """, |
| + """ |
| + patch get foo => 0; |
| + """); |
| + print('testPatchNonClass.errors:${compiler.errors}'); |
| + print('testPatchNonClass.warnings:${compiler.warnings}'); |
| + Expect.equals(1, compiler.errors.length); |
| + Expect.isTrue( |
| + compiler.errors[0].message.kind == MessageKind.PATCH_NON_GETTER); |
| + Expect.equals(1, compiler.warnings.length); |
| + Expect.isTrue( |
| + compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER); |
| +} |
| + |
| +testPatchNoGetter() { |
| + var compiler = applyPatch( |
| + """ |
| + external set foo(var value) {} |
| + """, |
| + """ |
| + patch get foo => 0; |
| + """); |
| + print('testPatchNonClass.errors:${compiler.errors}'); |
| + print('testPatchNonClass.warnings:${compiler.warnings}'); |
| + Expect.equals(1, compiler.errors.length); |
| + Expect.isTrue( |
| + compiler.errors[0].message.kind == MessageKind.PATCH_NO_GETTER); |
| + Expect.equals(1, compiler.warnings.length); |
| + Expect.isTrue( |
| + compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER); |
| +} |
| + |
| +testPatchNonSetter() { |
| + var compiler = applyPatch( |
| + """ |
| + external void foo() {} |
| + """, |
| + """ |
| + patch set foo(var value) {} |
| + """); |
| + print('testPatchNonClass.errors:${compiler.errors}'); |
| + print('testPatchNonClass.warnings:${compiler.warnings}'); |
| + Expect.equals(1, compiler.errors.length); |
| + Expect.isTrue( |
| + compiler.errors[0].message.kind == MessageKind.PATCH_NON_SETTER); |
| + Expect.equals(1, compiler.warnings.length); |
| + Expect.isTrue( |
| + compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER); |
| +} |
| + |
| +testPatchNoSetter() { |
| + var compiler = applyPatch( |
| + """ |
| + external get foo; |
| + """, |
| + """ |
| + patch set foo(var value) {} |
| + """); |
| + print('testPatchNonClass.errors:${compiler.errors}'); |
| + print('testPatchNonClass.warnings:${compiler.warnings}'); |
| + Expect.equals(1, compiler.errors.length); |
| + Expect.isTrue( |
| + compiler.errors[0].message.kind == MessageKind.PATCH_NO_SETTER); |
| + Expect.equals(1, compiler.warnings.length); |
| + Expect.isTrue( |
| + compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER); |
| +} |
| + |
| +testPatchNonFunction() { |
| + var compiler = applyPatch( |
| + """ |
| + external get foo; |
| + """, |
| + """ |
| + patch void foo() {} |
| + """); |
| + print('testPatchNonClass.errors:${compiler.errors}'); |
| + print('testPatchNonClass.warnings:${compiler.warnings}'); |
| + Expect.equals(1, compiler.errors.length); |
| + Expect.isTrue( |
| + compiler.errors[0].message.kind == MessageKind.PATCH_NON_FUNCTION); |
| + Expect.equals(1, compiler.warnings.length); |
| + Expect.isTrue( |
| + compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_FUNCTION); |
| +} |
| + |
| main() { |
| + testPatchConstructor(); |
| testPatchFunction(); |
| testPatchMember(); |
| testPatchGetter(); |
| @@ -363,4 +624,17 @@ main() { |
| testGhostMember(); |
| testInjectFunction(); |
| testPatchSignatureCheck(); |
| + |
| + testPatchNonExistingTopLevel(); |
| + testPatchNonExistingMember(); |
| + testPatchNonPatchablePatch(); |
| + testPatchNonPatchableOrigin(); |
| + testPatchNonExternalTopLevel(); |
| + testPatchNonExternalMember(); |
| + testPatchNonClass(); |
| + testPatchNonGetter(); |
| + testPatchNoGetter(); |
| + testPatchNonSetter(); |
| + testPatchNoSetter(); |
| + testPatchNonFunction(); |
| } |