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