Index: pkg/smoke/test/codegen/end_to_end_test.dart |
diff --git a/pkg/smoke/test/codegen/end_to_end_test.dart b/pkg/smoke/test/codegen/end_to_end_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f3b95e0cb21074b0f6cfef25ddcaa050945075e3 |
--- /dev/null |
+++ b/pkg/smoke/test/codegen/end_to_end_test.dart |
@@ -0,0 +1,147 @@ |
+// Copyright (c) 2014, 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. |
+ |
+/// And end-to-end test that generates code and checks that the output matches |
+/// the code in `static_test.dart`. Techincally we could run the result in an |
+/// isolate, but instead we decided to split that up in two tests. This test |
+/// ensures that we generate the code as it was written in static_test, and |
+/// separately static_test ensures that the smoke.static library behaves as |
+/// expected. |
+library smoke.test.codegen.end_to_end_test; |
+ |
+import 'dart:io'; |
+ |
+import 'package:analyzer/src/generated/element.dart'; |
+import 'package:smoke/codegen/generator.dart'; |
+import 'package:smoke/codegen/recorder.dart'; |
+import 'package:unittest/unittest.dart'; |
+import 'package:path/path.dart' as path; |
+ |
+import 'testing_resolver_utils.dart' show initAnalyzer; |
+ |
+main(args) { |
+ final updateStaticTest = args.length > 0 && args[0] == '--update_static_test'; |
+ |
+ test('static_test is up to date', () { |
+ var scriptPath = Platform.script.path; |
+ var testDir = path.dirname(path.dirname(scriptPath)); |
+ var commonPath = path.join(testDir, 'common.dart'); |
+ var testCode = new File('$commonPath').readAsStringSync(); |
+ var lib = initAnalyzer({'common.dart' : testCode}) |
+ .libraryFor('common.dart'); |
+ var coreLib = lib.visibleLibraries.firstWhere( |
+ (l) => l.displayName == 'dart.core'); |
+ var generator = new SmokeCodeGenerator(); |
+ var recorder = new Recorder(generator, resolveImportUrl); |
+ |
+ // Record all getters and setters we use in the tests. |
+ generator.addGetter("i"); |
+ generator.addGetter("j"); |
+ generator.addGetter("j2"); |
+ generator.addGetter("inc0"); |
+ generator.addGetter("inc1"); |
+ generator.addGetter("inc2"); |
+ generator.addSetter("i"); |
+ generator.addSetter("j2"); |
+ |
+ // Record symbol convertions. |
+ generator.addSymbol('i'); |
+ |
+ /// Record all parent-class relations that we explicitly request for |
+ recorder.lookupParent(lib.getType('AnnotB')); |
+ recorder.lookupParent(lib.getType('A')); |
+ recorder.lookupParent(lib.getType('B')); |
+ recorder.lookupParent(lib.getType('D')); |
+ recorder.lookupParent(lib.getType('H')); |
+ |
+ // Record members for which we implicitly request their declaration in |
+ // has-getter and has-setter tests. |
+ recorder.lookupMember(lib.getType('A'), "i", recursive: true); |
+ recorder.lookupMember(lib.getType('A'), "j2", recursive: true); |
+ recorder.lookupMember(lib.getType('A'), "inc2", recursive: true); |
+ recorder.lookupMember(lib.getType('B'), "a", recursive: true); |
+ recorder.lookupMember(lib.getType('B'), "f", recursive: true); |
+ recorder.lookupMember(lib.getType('D'), "i", recursive: true); |
+ recorder.lookupMember(lib.getType('E'), "y", recursive: true); |
+ |
+ // Record also lookups for non-exisiting members. |
+ recorder.lookupMember(lib.getType('B'), "i", recursive: true); |
+ recorder.lookupMember(lib.getType('E'), "x", recursive: true); |
+ recorder.lookupMember(lib.getType('E'), "z", recursive: true); |
+ |
+ // Record members for which we explicitly request their declaration. |
+ recorder.lookupMember(lib.getType('B'), "a"); |
+ recorder.lookupMember(lib.getType('B'), "w"); |
+ recorder.lookupMember(lib.getType('A'), "inc1"); |
+ recorder.lookupMember(lib.getType('F'), "staticMethod"); |
+ recorder.lookupMember(lib.getType('G'), "b"); |
+ recorder.lookupMember(lib.getType('G'), "d"); |
+ |
+ // Lookups from no-such-method test. |
+ recorder.lookupMember(lib.getType('A'), "noSuchMethod", recursive: true); |
+ recorder.lookupMember(lib.getType('E'), "noSuchMethod", recursive: true); |
+ recorder.lookupMember(lib.getType('E2'), "noSuchMethod", recursive: true); |
+ |
+ // Lookups from has-instance-method and has-static-method tests. |
+ recorder.lookupMember(lib.getType('A'), "inc0", recursive: true); |
+ recorder.lookupMember(lib.getType('A'), "inc3", recursive: true); |
+ recorder.lookupMember(lib.getType('C'), "inc", recursive: true); |
+ recorder.lookupMember(lib.getType('D'), "inc", recursive: true); |
+ recorder.lookupMember(lib.getType('D'), "inc0", recursive: true); |
+ recorder.lookupMember(lib.getType('F'), "staticMethod", recursive: true); |
+ recorder.lookupMember(lib.getType('F2'), "staticMethod", recursive: true); |
+ |
+ // Record all queries done by the test. |
+ recorder.runQuery(lib.getType('A'), new QueryOptions()); |
+ recorder.runQuery(lib.getType('D'), |
+ new QueryOptions(includeInherited: true)); |
+ |
+ var vars = lib.definingCompilationUnit.topLevelVariables; |
+ expect(vars[0].name, 'a1'); |
+ expect(vars[1].name, 'a2'); |
+ var options = new QueryOptions(includeInherited: true, |
+ withAnnotations: [vars[0], vars[1], lib.getType('Annot')]); |
+ recorder.runQuery(lib.getType('H'), options); |
+ |
+ var code = _createEntrypoint(generator); |
+ var staticTestFile = new File(path.join(testDir, 'static_test.dart')); |
+ var existingCode = staticTestFile.readAsStringSync(); |
+ if (!updateStaticTest) { |
+ expect(code, existingCode); |
+ } else if (code == existingCode) { |
+ print('static_test.dart is already up to date'); |
+ } else { |
+ staticTestFile.writeAsStringSync(code); |
+ print('static_test.dart has been updated.'); |
+ } |
+ }); |
+} |
+ |
+_createEntrypoint(SmokeCodeGenerator generator) { |
+ var sb = new StringBuffer() |
+ ..writeln('/// ---- AUTOGENERATED: DO NOT EDIT THIS FILE --------------') |
+ ..writeln('/// To update this test file, call:') |
+ ..writeln('/// > dart codegen/end_to_end_test.dart --update_static_test') |
+ ..writeln('/// --------------------------------------------------------'); |
+ sb.write('\nlibrary smoke.test.static_test;\n\n'); |
+ sb.writeln("import 'package:unittest/unittest.dart';"); |
+ generator.writeImports(sb); |
+ sb.writeln("import 'common.dart' as common show main;\n"); |
+ generator.writeTopLevelDeclarations(sb); |
+ sb.writeln('\n_configure() {'); |
+ generator.writeInitCall(sb); |
+ sb.writeln('}\n'); |
+ sb.writeln('main() {'); |
+ sb.writeln(' setUp(_configure);'); |
+ sb.writeln(' common.main();'); |
+ sb.writeln('}'); |
+ return sb.toString(); |
+} |
+ |
+ |
+resolveImportUrl(LibraryElement lib) { |
+ if (lib.isDartCore) return 'dart:core'; |
+ if (lib.displayName == 'smoke.test.common') return 'common.dart'; |
+ return 'unknown.dart'; |
+} |