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

Side by Side Diff: pkg/smoke/test/codegen/end_to_end_test.dart

Issue 194813007: Add codegen support in smoke (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698