OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 /// And end-to-end test that generates code and checks that the output matches |
| 6 /// the code in `static_test.dart`. Techincally we could run the result in an |
| 7 /// isolate, but instead we decided to split that up in two tests. This test |
| 8 /// ensures that we generate the code as it was written in static_test, and |
| 9 /// separately static_test ensures that the smoke.static library behaves as |
| 10 /// expected. |
| 11 library smoke.test.codegen.end_to_end_test; |
| 12 |
| 13 import 'dart:io'; |
| 14 import 'dart:isolate'; |
| 15 |
| 16 import 'package:analyzer/src/generated/element.dart'; |
| 17 import 'package:smoke/codegen/generator.dart'; |
| 18 import 'package:smoke/codegen/recorder.dart'; |
| 19 import 'package:unittest/unittest.dart'; |
| 20 import 'package:path/path.dart' as path; |
| 21 |
| 22 import 'testing_resolver_utils.dart' show initAnalyzer; |
| 23 |
| 24 main(args) { |
| 25 final updateStaticTest = args.length > 0 && args[0] == '--update_static_test'; |
| 26 |
| 27 test('static_test is up to date', () { |
| 28 var scriptPath = Platform.script.path; |
| 29 var testDir = path.dirname(path.dirname(scriptPath)); |
| 30 var commonPath = path.join(testDir, 'common.dart'); |
| 31 var testCode = new File('$commonPath').readAsStringSync(); |
| 32 var lib = initAnalyzer({'common.dart' : testCode}) |
| 33 .libraryFor('common.dart'); |
| 34 var coreLib = lib.visibleLibraries.firstWhere( |
| 35 (l) => l.displayName == 'dart.core'); |
| 36 var generator = new SmokeCodeGenerator(); |
| 37 var recorder = new Recorder(generator, resolveImportUrl); |
| 38 |
| 39 // Record all getters and setters we use in the tests. |
| 40 generator.addGetter("i"); |
| 41 generator.addGetter("j"); |
| 42 generator.addGetter("j2"); |
| 43 generator.addGetter("inc0"); |
| 44 generator.addGetter("inc1"); |
| 45 generator.addGetter("inc2"); |
| 46 generator.addSetter("i"); |
| 47 generator.addSetter("j2"); |
| 48 |
| 49 // Record symbol convertions. |
| 50 generator.addSymbol('i'); |
| 51 |
| 52 /// Record all parent-class relations that we explicitly request for |
| 53 recorder.lookupParent(lib.getType('AnnotB')); |
| 54 recorder.lookupParent(lib.getType('A')); |
| 55 recorder.lookupParent(lib.getType('B')); |
| 56 recorder.lookupParent(lib.getType('D')); |
| 57 recorder.lookupParent(lib.getType('H')); |
| 58 |
| 59 // Record members for which we implicitly request their declaration in |
| 60 // has-getter and has-setter tests. |
| 61 recorder.lookupMember(lib.getType('A'), "i", recursive: true); |
| 62 recorder.lookupMember(lib.getType('A'), "j2", recursive: true); |
| 63 recorder.lookupMember(lib.getType('A'), "inc2", recursive: true); |
| 64 recorder.lookupMember(lib.getType('B'), "a", recursive: true); |
| 65 recorder.lookupMember(lib.getType('B'), "f", recursive: true); |
| 66 recorder.lookupMember(lib.getType('D'), "i", recursive: true); |
| 67 recorder.lookupMember(lib.getType('E'), "y", recursive: true); |
| 68 |
| 69 // Record also lookups for non-exisiting members. |
| 70 recorder.lookupMember(lib.getType('B'), "i", recursive: true); |
| 71 recorder.lookupMember(lib.getType('E'), "x", recursive: true); |
| 72 recorder.lookupMember(lib.getType('E'), "z", recursive: true); |
| 73 |
| 74 // Record members for which we explicitly request their declaration. |
| 75 recorder.lookupMember(lib.getType('B'), "a"); |
| 76 recorder.lookupMember(lib.getType('B'), "w"); |
| 77 recorder.lookupMember(lib.getType('A'), "inc1"); |
| 78 recorder.lookupMember(lib.getType('F'), "staticMethod"); |
| 79 recorder.lookupMember(lib.getType('G'), "b"); |
| 80 recorder.lookupMember(lib.getType('G'), "d"); |
| 81 |
| 82 // Lookups from no-such-method test. |
| 83 recorder.lookupMember(lib.getType('A'), "noSuchMethod", recursive: true); |
| 84 recorder.lookupMember(lib.getType('E'), "noSuchMethod", recursive: true); |
| 85 recorder.lookupMember(lib.getType('E2'), "noSuchMethod", recursive: true); |
| 86 |
| 87 // Lookups from has-instance-method and has-static-method tests. |
| 88 recorder.lookupMember(lib.getType('A'), "inc0", recursive: true); |
| 89 recorder.lookupMember(lib.getType('A'), "inc3", recursive: true); |
| 90 recorder.lookupMember(lib.getType('C'), "inc", recursive: true); |
| 91 recorder.lookupMember(lib.getType('D'), "inc", recursive: true); |
| 92 recorder.lookupMember(lib.getType('D'), "inc0", recursive: true); |
| 93 recorder.lookupMember(lib.getType('F'), "staticMethod", recursive: true); |
| 94 recorder.lookupMember(lib.getType('F2'), "staticMethod", recursive: true); |
| 95 |
| 96 // Record all queries done by the test. |
| 97 recorder.runQuery(lib.getType('A'), new QueryOptions()); |
| 98 recorder.runQuery(lib.getType('D'), |
| 99 new QueryOptions(includeInherited: true)); |
| 100 |
| 101 var vars = lib.definingCompilationUnit.topLevelVariables; |
| 102 expect(vars[0].name, 'a1'); |
| 103 expect(vars[1].name, 'a2'); |
| 104 var options = new QueryOptions(includeInherited: true, |
| 105 withAnnotations: [vars[0], vars[1], lib.getType('Annot')]); |
| 106 recorder.runQuery(lib.getType('H'), options); |
| 107 |
| 108 /// Create the isolate entrypoint |
| 109 var code = _createEntrypoint(generator); |
| 110 |
| 111 var staticTestFile = new File(path.join(testDir, 'static_test.dart')); |
| 112 var existingCode = staticTestFile.readAsStringSync(); |
| 113 if (!updateStaticTest) { |
| 114 expect(code, existingCode); |
| 115 } else if (code == existingCode) { |
| 116 print('static_test.dart is already up to date'); |
| 117 } else { |
| 118 staticTestFile.writeAsStringSync(code); |
| 119 print('static_test.dart has been updated.'); |
| 120 } |
| 121 }); |
| 122 } |
| 123 |
| 124 _createEntrypoint(SmokeCodeGenerator generator) { |
| 125 var sb = new StringBuffer() |
| 126 ..writeln('/// ---- AUTOGENERATED: DO NOT EDIT THIS FILE --------------') |
| 127 ..writeln('/// To update this test file, call:') |
| 128 ..writeln('/// > dart codegen/end_to_end_test.dart --update_static_test') |
| 129 ..writeln('/// --------------------------------------------------------'); |
| 130 sb.write('\nlibrary smoke.test.static_test;\n\n'); |
| 131 sb.writeln("import 'package:unittest/unittest.dart';"); |
| 132 for (var import in generator.generateImports()) { |
| 133 sb.writeln(import); |
| 134 } |
| 135 sb.writeln("import 'common.dart' as common show main;\n"); |
| 136 sb.writeln(generator.generateTopLevelDeclarations()); |
| 137 sb.writeln('_configure() {'); |
| 138 sb.write(generator.generateInitCall()); |
| 139 sb.writeln('}\n'); |
| 140 sb.writeln('main() {'); |
| 141 sb.writeln(' setUp(_configure);'); |
| 142 sb.writeln(' common.main();'); |
| 143 sb.writeln('}'); |
| 144 return sb.toString(); |
| 145 } |
| 146 |
| 147 |
| 148 resolveImportUrl(LibraryElement lib) { |
| 149 if (lib.isDartCore) return 'dart:core'; |
| 150 if (lib.displayName == 'smoke.test.common') return 'common.dart'; |
| 151 return 'unknown.dart'; |
| 152 } |
OLD | NEW |