Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(788)

Unified Diff: tests/compiler/dart2js/serialization/members_test.dart

Issue 2015903002: Compute and check members for serialization (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Fix invariant Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tests/compiler/dart2js/serialization/members_test.dart
diff --git a/tests/compiler/dart2js/serialization/members_test.dart b/tests/compiler/dart2js/serialization/members_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..ef23e87ff23bcf20473b409fd8a1aeb00ba2a759
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/members_test.dart
@@ -0,0 +1,157 @@
+// Copyright (c) 2016, 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.
+
+library dart2js.serialization.class_members_test;
+
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/common/names.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/filenames.dart';
+import 'package:compiler/src/resolution/class_members.dart';
+import 'package:compiler/src/serialization/equivalence.dart';
+import '../memory_compiler.dart';
+import 'helper.dart';
+import 'test_helper.dart';
+
+
+main(List<String> args) {
+ Arguments arguments = new Arguments.from(args);
+ asyncTest(() async {
+ SerializedData serializedData =
+ await serializeDartCore(arguments: arguments);
+ if (arguments.filename != null) {
+ Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.filename));
+ await checkClassMembers(
+ serializedData, entryPoint, verbose: arguments.verbose);
+ } else {
+ await checkClassMembers(
+ serializedData, Uris.dart_core, verbose: arguments.verbose);
+ }
+ });
+}
+
+Future checkClassMembers(
+ SerializedData serializedData,
+ Uri entryPoint,
+ {bool verbose: false}) async {
+
+ Compiler compilerNormal = compilerFor(
+ options: [Flags.analyzeAll]);
+ await compilerNormal.run(entryPoint);
+
+ Compiler compilerDeserialized = compilerFor(
+ memorySourceFiles: serializedData.toMemorySourceFiles(),
+ resolutionInputs: serializedData.toUris(),
+ options: [Flags.analyzeAll]);
+ await compilerDeserialized.run(entryPoint);
+
+ checkAllMembers(compilerNormal, compilerDeserialized, verbose: true);
+}
+
+void checkAllMembers(
+ Compiler compiler1,
+ Compiler compiler2,
+ {bool verbose: false}) {
+ checkLoadedLibraryMembers(
+ compiler1,
+ compiler2,
+ (Element member1) => member1 is ClassElement,
+ checkMembers,
+ verbose: verbose);
+}
+
+
+/// Check equivalence of members of [class1] and [class2].
+void checkMembers(
+ Compiler compiler1, ClassMemberMixin class1,
+ Compiler compiler2, ClassMemberMixin class2,
+ {bool verbose: false}) {
+ if (verbose) {
+ print('Checking $class1 vs $class2');
+ }
+ MembersCreator.computeAllClassMembers(compiler1.resolution, class1);
+ MembersCreator.computeAllClassMembers(compiler2.resolution, class2);
+
+ check(class1, class2, 'interfaceMemberAreClassMembers',
+ class1.interfaceMembersAreClassMembers,
+ class2.interfaceMembersAreClassMembers);
+ class1.forEachClassMember((Member member1) {
+ Name name1 = member1.name;
+ Name name2 = convertName(name1, compiler2);
+ checkMember(class1, class2, 'classMember:$name1',
+ member1, class2.lookupClassMember(name2));
+ });
+
+ class1.forEachInterfaceMember((MemberSignature member1) {
+ Name name1 = member1.name;
+ Name name2 = convertName(name1, compiler2);
+ checkMemberSignature(class1, class2, 'interfaceMember:$name1',
+ member1, class2.lookupInterfaceMember(name2));
+ });
+}
+
+Name convertName(Name name, Compiler compiler) {
+ if (name.isPrivate) {
+ LibraryElement library =
+ compiler.libraryLoader.lookupLibrary(name.library.canonicalUri);
+ if (!areElementsEquivalent(name.library, library)) {
+ throw 'Libraries ${name.library} and ${library} are not equivalent';
+ }
+ name = new Name(name.text, library, isSetter: name.isSetter);
+ }
+ return name;
+}
+
+void checkMember(ClassElement class1, ClassElement class2, String property,
+ Member member1, Member member2) {
+ if (member2 == null) {
+ print('$class1 class members:');
+ class1.forEachClassMember((m) => print(' ${m.name} $m'));
+ print('$class2 class members:');
+ class2.forEachClassMember((m) => print(' ${m.name} $m'));
+ throw "No member ${member1.name} in $class2 for $property";
+ }
+ checkMemberSignature(class1, class2, property, member1, member2);
+ checkElementIdentities(class1, class2, '$property.element',
+ member1.element, member2.element);
+ check(class1, class2, '$property.declarer',
+ member1.declarer, member2.declarer, areTypesEquivalent);
+ check(class1, class2, '$property.isStatic',
+ member1.isStatic, member2.isStatic);
+ check(class1, class2, '$property.isDeclaredByField',
+ member1.isDeclaredByField, member2.isDeclaredByField);
+ check(class1, class2, '$property.isAbstract',
+ member1.isAbstract, member2.isAbstract);
+ if (member1.isAbstract && member1.implementation != null) {
+ checkMember(class1, class2, '$property.implementation',
+ member1.implementation, member2.implementation);
+ }
+}
+
+void checkMemberSignature(ClassElement class1, ClassElement class2,
+ String property,
+ MemberSignature member1, MemberSignature member2) {
+ if (member2 == null) {
+ print('$class1 interface members:');
+ class1.forEachInterfaceMember((m) => print(' ${m.name} $m'));
+ print('$class2 interface members:');
+ class2.forEachInterfaceMember((m) => print(' ${m.name} $m'));
+ throw "No member ${member1.name} in $class2 for $property";
+ }
+ check(class1, class2, '$property.name',
+ member1.name, member2.name, areNamesEquivalent);
+ check(class1, class2, '$property.type',
+ member1.type, member2.type, areTypesEquivalent);
+ check(class1, class2, '$property.functionType',
+ member1.functionType, member2.functionType, areTypesEquivalent);
+ check(class1, class2, '$property.isGetter',
+ member1.isGetter, member2.isGetter);
+ check(class1, class2, '$property.isSetter',
+ member1.isSetter, member2.isSetter);
+ check(class1, class2, '$property.isMethod',
+ member1.isMethod, member2.isMethod);
+}

Powered by Google App Engine
This is Rietveld 408576698