|  | // 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_test_data; | 
|  |  | 
|  | const List<Test> TESTS = const <Test>[ | 
|  | // These tests are very long-running and put here first to compile them on | 
|  | // their own tests. | 
|  | const Test( | 
|  | 'Disable tree shaking through reflection', | 
|  | const { | 
|  | 'main.dart': ''' | 
|  | import 'dart:mirrors'; | 
|  |  | 
|  | main() { | 
|  | reflect(null).invoke(#toString, []).reflectee; | 
|  | } | 
|  | ''', | 
|  | }, | 
|  | expectedWarningCount: 1), | 
|  |  | 
|  | const Test('Use of dart:indexed_db', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() {} | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | import 'dart:indexed_db'; | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | // These tests | 
|  | const Test('Empty program', const {'main.dart': 'main() {}'}), | 
|  |  | 
|  | const Test( | 
|  | 'Hello World', const {'main.dart': 'main() => print("Hello World");'}), | 
|  |  | 
|  | const Test('Too many arguments to print', | 
|  | const {'main.dart': 'main() => print("Hello World", 0);'}, | 
|  | expectedWarningCount: 1, expectedInfoCount: 1), | 
|  |  | 
|  | const Test('Hello World with string interpolation', const { | 
|  | 'main.dart': r''' | 
|  | main() { | 
|  | String text = "Hello World"; | 
|  | print('$text'); | 
|  | }''' | 
|  | }), | 
|  |  | 
|  | const Test( | 
|  | 'Too many arguments to print with string interpolation', | 
|  | const { | 
|  | 'main.dart': r''' | 
|  | main() { | 
|  | String text = "Hello World"; | 
|  | print('$text', text); | 
|  | }''' | 
|  | }, | 
|  | expectedWarningCount: 1, | 
|  | expectedInfoCount: 1), | 
|  |  | 
|  | const Test('Print main arguments', const { | 
|  | 'main.dart': r''' | 
|  | main(List<String> arguments) { | 
|  | print(arguments); | 
|  | }''' | 
|  | }), | 
|  |  | 
|  | const Test('For loop on main arguments', const { | 
|  | 'main.dart': r''' | 
|  | main(List<String> arguments) { | 
|  | for (int i = 0; i < arguments.length; i++) { | 
|  | print(arguments[i]); | 
|  | } | 
|  | }''' | 
|  | }), | 
|  |  | 
|  | const Test('For-in loop on main arguments', const { | 
|  | 'main.dart': r''' | 
|  | main(List<String> arguments) { | 
|  | for (String argument in arguments) { | 
|  | print(argument); | 
|  | } | 
|  | }''' | 
|  | }), | 
|  |  | 
|  | const Test('Simple class', const { | 
|  | 'main.dart': r''' | 
|  | class Class {} | 
|  | main() { | 
|  | print(new Class()); | 
|  | }''' | 
|  | }), | 
|  |  | 
|  | const Test( | 
|  | 'Simple class implements Function without call method', | 
|  | const { | 
|  | 'main.dart': r''' | 
|  | class Class implements Function {} | 
|  | main() { | 
|  | print(new Class()); | 
|  | }''' | 
|  | }, | 
|  | expectedWarningCount: 1), | 
|  |  | 
|  | const Test('Simple class implements Function with call method', const { | 
|  | 'main.dart': r''' | 
|  | class Class implements Function { | 
|  | call() {} | 
|  | } | 
|  | main() { | 
|  | print(new Class()()); | 
|  | }''' | 
|  | }), | 
|  |  | 
|  | const Test('Implement Comparable', const { | 
|  | 'main.dart': r''' | 
|  | class Class implements Comparable<Class> { | 
|  | int compareTo(Class other) => 0; | 
|  | } | 
|  | main() { | 
|  | print(new Class()); | 
|  | }''' | 
|  | }), | 
|  |  | 
|  | const Test( | 
|  | 'Implement Comparable with two many type arguments', | 
|  | const { | 
|  | 'main.dart': r''' | 
|  | class Class implements Comparable<Class, Class> { | 
|  | int compareTo(other) => 0; | 
|  | } | 
|  | main() { | 
|  | print(new Class()); | 
|  | }''' | 
|  | }, | 
|  | expectedWarningCount: 1), | 
|  |  | 
|  | const Test( | 
|  | 'Implement Comparable with incompatible parameter types', | 
|  | const { | 
|  | 'main.dart': r''' | 
|  | class Class implements Comparable<Class> { | 
|  | int compareTo(String other) => 0; | 
|  | } | 
|  | main() { | 
|  | print(new Class().compareTo(null)); | 
|  | }''' | 
|  | }, | 
|  | expectedWarningCount: 1, | 
|  | expectedInfoCount: 1), | 
|  |  | 
|  | const Test( | 
|  | 'Implement Comparable with incompatible parameter count', | 
|  | const { | 
|  | 'main.dart': r''' | 
|  | class Class implements Comparable { | 
|  | bool compareTo(a, b) => true; | 
|  | } | 
|  | main() { | 
|  | print(new Class().compareTo(null, null)); | 
|  | }''' | 
|  | }, | 
|  | expectedWarningCount: 1, | 
|  | expectedInfoCount: 1), | 
|  |  | 
|  | const Test( | 
|  | 'Implement Random and call nextInt directly', | 
|  | const { | 
|  | 'main.dart': r''' | 
|  | import 'dart:math'; | 
|  |  | 
|  | class MyRandom implements Random { | 
|  | int nextInt(int max) { | 
|  | return max.length; | 
|  | } | 
|  | bool nextBool() => true; | 
|  | double nextDouble() => 0.0; | 
|  | } | 
|  | main() { | 
|  | new MyRandom().nextInt(0); | 
|  | }''' | 
|  | }, | 
|  | expectedWarningCount: 1, | 
|  | expectedInfoCount: 0), | 
|  |  | 
|  | const Test('Implement Random and do not call nextInt', const { | 
|  | 'main.dart': r''' | 
|  | import 'dart:math'; | 
|  |  | 
|  | class MyRandom implements Random { | 
|  | int nextInt(int max) { | 
|  | return max.length; | 
|  | } | 
|  | bool nextBool() => true; | 
|  | double nextDouble() => 0.0; | 
|  | } | 
|  | main() { | 
|  | new MyRandom(); | 
|  | }''' | 
|  | }), | 
|  |  | 
|  | const Test( | 
|  | 'Implement Random and call nextInt through native code', | 
|  | const { | 
|  | 'main.dart': r''' | 
|  | import 'dart:math'; | 
|  |  | 
|  | class MyRandom implements Random { | 
|  | int nextInt(int max) { | 
|  | return max.length; | 
|  | } | 
|  | bool nextBool() => true; | 
|  | double nextDouble() => 0.0; | 
|  | } | 
|  | main() { | 
|  | // Invocation of `MyRandom.nextInt` is only detected knowing the actual | 
|  | // implementation class for `List` and the world impact of its `shuffle` | 
|  | // method. | 
|  | [].shuffle(new MyRandom()); | 
|  | }''' | 
|  | }, | 
|  | expectedWarningCount: 1, | 
|  | expectedInfoCount: 0), | 
|  |  | 
|  | const Test('Handle break and continue', const { | 
|  | 'main.dart': ''' | 
|  | main() { | 
|  | loop: for (var a in []) { | 
|  | for (var b in []) { | 
|  | continue loop; | 
|  | } | 
|  | break; | 
|  | } | 
|  | }''' | 
|  | }), | 
|  |  | 
|  | const Test('Explicit default constructor', const { | 
|  | 'main.dart': ''' | 
|  | class A { | 
|  | A(); | 
|  | } | 
|  | main() => new A(); | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Explicit default constructor, preserialized', const { | 
|  | 'main.dart': ''' | 
|  | import 'lib.dart'; | 
|  | main() => new A(); | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'lib.dart': ''' | 
|  | class A { | 
|  | A(); | 
|  | } | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Const constructor', const { | 
|  | 'main.dart': ''' | 
|  | class C { | 
|  | const C(); | 
|  | } | 
|  | main() => const C();''' | 
|  | }), | 
|  |  | 
|  | const Test('Redirecting factory', const { | 
|  | 'main.dart': ''' | 
|  | class C { | 
|  | factory C() = Object; | 
|  | } | 
|  | main() => new C();''' | 
|  | }), | 
|  |  | 
|  | const Test('Redirecting factory with optional arguments', const { | 
|  | 'main.dart': ''' | 
|  | abstract class C implements List { | 
|  | factory C([_]) = List; | 
|  | } | 
|  | main() => new C();''' | 
|  | }), | 
|  |  | 
|  | const Test('Constructed constant using its default values.', const { | 
|  | 'main.dart': ''' | 
|  | main() => const Duration(); | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Call forwarding constructor on named mixin application', const { | 
|  | 'main.dart': ''' | 
|  | import 'dart:collection'; | 
|  | main() => new UnmodifiableListView(null); | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Function reference constant', const { | 
|  | 'main.dart': ''' | 
|  | var myIdentical = identical; | 
|  | main() => myIdentical; | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Super method call', const { | 
|  | 'main.dart': ''' | 
|  | class Foo { | 
|  | String toString() => super.toString(); | 
|  | } | 
|  | main() { | 
|  | print(new Foo()); | 
|  | } | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test( | 
|  | 'Call forwarding constructor on named mixin application, no args.', | 
|  | const { | 
|  | 'main.dart': ''' | 
|  | import 'lib.dart'; | 
|  | main() => new C(); | 
|  | ''', | 
|  | }, | 
|  | preserializedSourceFiles: const { | 
|  | 'lib.dart': ''' | 
|  | class M {} | 
|  | class S {} | 
|  | class C = S with M; | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test( | 
|  | 'Call forwarding constructor on named mixin application, one arg.', | 
|  | const { | 
|  | 'main.dart': ''' | 
|  | import 'lib.dart'; | 
|  | main() => new C(0); | 
|  | ''', | 
|  | }, | 
|  | preserializedSourceFiles: const { | 
|  | 'lib.dart': ''' | 
|  | class M {} | 
|  | class S { | 
|  | S(a); | 
|  | } | 
|  | class C = S with M; | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test( | 
|  | 'Import mirrors, thus checking import paths', | 
|  | const { | 
|  | 'main.dart': ''' | 
|  | import 'dart:mirrors'; | 
|  | main() {} | 
|  | ''', | 
|  | }, | 
|  | expectedWarningCount: 1), | 
|  |  | 
|  | const Test('Serialized symbol literal', const { | 
|  | 'main.dart': ''' | 
|  | import 'lib.dart'; | 
|  | main() => m(); | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'lib.dart': ''' | 
|  | m() => print(#main); | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Indirect unserialized library', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  | main() => foo(); | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | import 'memory:b.dart'; | 
|  | foo() => bar(); | 
|  | ''', | 
|  | }, unserializedSourceFiles: const { | 
|  | 'b.dart': ''' | 
|  | import 'memory:a.dart'; | 
|  | bar() => foo(); | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Multiple structurally identical mixins', const { | 
|  | 'main.dart': ''' | 
|  | class S {} | 
|  | class M {} | 
|  | class C1 extends S with M {} | 
|  | class C2 extends S with M {} | 
|  | main() { | 
|  | new C1(); | 
|  | new C2(); | 
|  | } | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Deferred loading', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart' deferred as lib; | 
|  | main() { | 
|  | lib.foo(); | 
|  | } | 
|  | ''', | 
|  | 'a.dart': ''' | 
|  | void foo() {} | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('fromEnvironment constants', const { | 
|  | 'main.dart': ''' | 
|  | main() => const String.fromEnvironment("foo"); | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Unused noSuchMethod', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() { | 
|  | new A().m(); | 
|  | } | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | class A { | 
|  | noSuchMethod(_) => null; | 
|  | m(); | 
|  | } | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Malformed types', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() { | 
|  | m(); | 
|  | } | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | Unresolved m() {} | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Function types for closures', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | typedef Func(); | 
|  |  | 
|  | main(args) { | 
|  | (args.isEmpty ? new B() : new C()) is Func; | 
|  | } | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | class B { | 
|  | call(a) {} | 
|  | } | 
|  | class C { | 
|  | call() {} | 
|  | } | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Double literal in constant constructor', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() { | 
|  | const A(1.0); | 
|  | } | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | class A { | 
|  | final field1; | 
|  | const A(a) : this.field1 = a + 1.0; | 
|  | } | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Index set if null', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() => m(null, null, null); | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | m(a, b, c) => a[b] ??= c; | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('If-null expression in constant constructor', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() { | 
|  | const A(1.0); | 
|  | } | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | class A { | 
|  | final field1; | 
|  | const A(a) : this.field1 = a ?? 1.0; | 
|  | } | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Forwarding constructor defined by forwarding constructor', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() => new C(); | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | class A {} | 
|  | class B {} | 
|  | class C {} | 
|  | class D = A with B, C; | 
|  | ''', | 
|  | 'b.dart': ''' | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Deferred prefix loadLibrary', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() { | 
|  | test(); | 
|  | } | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | import 'b.dart' deferred as pre; | 
|  | test() { | 
|  | pre.loadLibrary(); | 
|  | } | 
|  | ''', | 
|  | 'b.dart': ''' | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test( | 
|  | 'Deferred without prefix', | 
|  | const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() { | 
|  | test(); | 
|  | } | 
|  | ''', | 
|  | }, | 
|  | preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | import 'b.dart' deferred; | 
|  | test() {} | 
|  | ''', | 
|  | 'b.dart': ''' | 
|  | ''', | 
|  | }, | 
|  | expectedErrorCount: 1), | 
|  |  | 
|  | const Test( | 
|  | 'Deferred with duplicate prefix', | 
|  | const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() { | 
|  | test(); | 
|  | } | 
|  | ''', | 
|  | }, | 
|  | preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | import 'b.dart' deferred as pre; | 
|  | import 'c.dart' deferred as pre; | 
|  | test() {} | 
|  | ''', | 
|  | 'b.dart': ''' | 
|  | ''', | 
|  | 'c.dart': ''' | 
|  | ''', | 
|  | }, | 
|  | expectedErrorCount: 1), | 
|  |  | 
|  | const Test('Closure in operator function', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() { | 
|  | test(); | 
|  | } | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | class C { | 
|  | operator ==(other) => () {}; | 
|  | } | 
|  |  | 
|  | test() => new C() == null; | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test( | 
|  | 'Checked setter', | 
|  | const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() { | 
|  | test(); | 
|  | } | 
|  | ''', | 
|  | }, | 
|  | preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | class C { | 
|  | set foo(int i) {} | 
|  | } | 
|  |  | 
|  | test() => new C().foo = 0; | 
|  | ''', | 
|  | }, | 
|  | checkedMode: true), | 
|  |  | 
|  | const Test('Deferred access', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() { | 
|  | test(); | 
|  | } | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | import 'b.dart' deferred as b; | 
|  |  | 
|  | test() => b.loadLibrary().then((_) => b.test2()); | 
|  | ''', | 
|  | 'b.dart': ''' | 
|  | test2() {} | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Deferred access of dart:core', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() { | 
|  | test(); | 
|  | } | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | import "dart:core" deferred as core; | 
|  |  | 
|  | test() { | 
|  | core.loadLibrary().then((_) => null); | 
|  | } | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Use of dart:indexed_db', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() {} | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | import 'dart:indexed_db'; | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Deferred static access', const {}, | 
|  | preserializedSourceFiles: const { | 
|  | 'main.dart': ''' | 
|  | import 'b.dart' deferred as prefix; | 
|  |  | 
|  | main() => prefix.loadLibrary().then((_) => prefix.test2()); | 
|  | ''', | 
|  | 'b.dart': ''' | 
|  | test2() => x; | 
|  | var x = const ConstClass(const ConstClass(1)); | 
|  | class ConstClass { | 
|  | final x; | 
|  | const ConstClass(this.x); | 
|  | } | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Multi variable declaration', const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  |  | 
|  | main() => y; | 
|  | ''', | 
|  | }, preserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | var x, y = 2; | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Double values', const {}, preserializedSourceFiles: const { | 
|  | 'main.dart': ''' | 
|  | const a = 1e+400; | 
|  | main() => a; | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('Erroneous constructor', const {}, | 
|  | preserializedSourceFiles: const { | 
|  | 'main.dart': ''' | 
|  | main() => new Null(); | 
|  | ''' | 
|  | }), | 
|  |  | 
|  | const Test('Metadata on imports', const {}, preserializedSourceFiles: const { | 
|  | 'main.dart': ''' | 
|  | @deprecated | 
|  | import 'main.dart'; | 
|  |  | 
|  | main() {} | 
|  | ''' | 
|  | }), | 
|  |  | 
|  | const Test('Metadata on exports', const {}, preserializedSourceFiles: const { | 
|  | 'main.dart': ''' | 
|  | @deprecated | 
|  | export 'main.dart'; | 
|  |  | 
|  | main() {} | 
|  | ''' | 
|  | }), | 
|  |  | 
|  | const Test('Metadata on part tags', const {}, | 
|  | preserializedSourceFiles: const { | 
|  | 'main.dart': ''' | 
|  | library main; | 
|  |  | 
|  | @deprecated | 
|  | part 'a.dart'; | 
|  |  | 
|  | main() {} | 
|  | ''' | 
|  | }, | 
|  | unserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | part of main; | 
|  | ''' | 
|  | }), | 
|  |  | 
|  | const Test('Metadata on part-of tags', const {}, | 
|  | preserializedSourceFiles: const { | 
|  | 'main.dart': ''' | 
|  | library main; | 
|  |  | 
|  | part 'a.dart'; | 
|  |  | 
|  | main() {} | 
|  | ''' | 
|  | }, | 
|  | unserializedSourceFiles: const { | 
|  | 'a.dart': ''' | 
|  | @deprecated | 
|  | part of main; | 
|  | ''' | 
|  | }), | 
|  |  | 
|  | const Test('Ambiguous elements', const {}, preserializedSourceFiles: const { | 
|  | 'main.dart': ''' | 
|  | import 'a.dart'; | 
|  | import 'b.dart'; | 
|  |  | 
|  | main() => new foo(); | 
|  | ''', | 
|  | 'a.dart': ''' | 
|  | var foo; | 
|  | ''', | 
|  | 'b.dart': ''' | 
|  | var foo; | 
|  | ''', | 
|  | }), | 
|  |  | 
|  | const Test('html and mirrors', const {}, | 
|  | preserializedSourceFiles: const { | 
|  | 'main.dart': ''' | 
|  | import 'dart:html'; | 
|  | import 'dart:mirrors'; | 
|  | main() {} | 
|  | ''' | 
|  | }, | 
|  | expectedWarningCount: 1), | 
|  | ]; | 
|  |  | 
|  | class Test { | 
|  | final String name; | 
|  | final Map sourceFiles; | 
|  | final Map preserializedSourceFiles; | 
|  | final Map unserializedSourceFiles; | 
|  | final int expectedErrorCount; | 
|  | final int expectedWarningCount; | 
|  | final int expectedHintCount; | 
|  | final int expectedInfoCount; | 
|  | final bool checkedMode; | 
|  |  | 
|  | const Test(this.name, this.sourceFiles, | 
|  | {this.preserializedSourceFiles, | 
|  | this.unserializedSourceFiles, | 
|  | this.expectedErrorCount: 0, | 
|  | this.expectedWarningCount: 0, | 
|  | this.expectedHintCount: 0, | 
|  | this.expectedInfoCount: 0, | 
|  | this.checkedMode: false}); | 
|  | } |