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 library smoke.test.codegen.generator_test; | |
6 | |
7 import 'package:smoke/codegen/generator.dart'; | |
8 import 'package:test/test.dart'; | |
9 | |
10 import 'common.dart' show checkResults; | |
11 | |
12 main() { | |
13 test('getters', () { | |
14 var generator = new SmokeCodeGenerator(); | |
15 generator.addGetter('i'); | |
16 checkResults(generator, | |
17 initCall: 'useGeneratedCode(new StaticConfiguration(\n' | |
18 ' checkedMode: false,\n' | |
19 ' getters: {\n' | |
20 ' #i: (o) => o.i,\n' | |
21 ' }));\n'); | |
22 | |
23 generator.addGetter('foo'); | |
24 checkResults(generator, | |
25 initCall: 'useGeneratedCode(new StaticConfiguration(\n' | |
26 ' checkedMode: false,\n' | |
27 ' getters: {\n' | |
28 ' #foo: (o) => o.foo,\n' | |
29 ' #i: (o) => o.i,\n' | |
30 ' }));\n'); | |
31 }); | |
32 | |
33 test('setters', () { | |
34 var generator = new SmokeCodeGenerator(); | |
35 generator.addSetter('i'); | |
36 checkResults(generator, | |
37 initCall: 'useGeneratedCode(new StaticConfiguration(\n' | |
38 ' checkedMode: false,\n' | |
39 ' setters: {\n' | |
40 ' #i: (o, v) { o.i = v; },\n' | |
41 ' }));\n'); | |
42 | |
43 generator.addSetter('foo'); | |
44 checkResults(generator, | |
45 initCall: 'useGeneratedCode(new StaticConfiguration(\n' | |
46 ' checkedMode: false,\n' | |
47 ' setters: {\n' | |
48 ' #foo: (o, v) { o.foo = v; },\n' | |
49 ' #i: (o, v) { o.i = v; },\n' | |
50 ' }));\n'); | |
51 }); | |
52 | |
53 test('names/symbols', () { | |
54 var generator = new SmokeCodeGenerator(); | |
55 generator.addSymbol('i'); | |
56 generator.addSymbol('foo'); | |
57 generator.addSymbol('a.b.c'); | |
58 generator.addSymbol('a.b.[]'); | |
59 generator.addSymbol('[]'); | |
60 generator.addSymbol('+'); | |
61 checkResults(generator, | |
62 initCall: 'useGeneratedCode(new StaticConfiguration(\n' | |
63 ' checkedMode: false,\n' | |
64 ' names: {\n' | |
65 ' const Symbol(\'+\'): r\'+\',\n' | |
66 ' const Symbol(\'[]\'): r\'[]\',\n' | |
67 ' const Symbol(\'a.b.[]\'): r\'a.b.[]\',\n' | |
68 ' #a.b.c: r\'a.b.c\',\n' | |
69 ' #foo: r\'foo\',\n' | |
70 ' #i: r\'i\',\n' | |
71 ' }));\n'); | |
72 }); | |
73 | |
74 group('invalid symbols', () { | |
75 var invalidError = | |
76 predicate((e) => e is StateError && '$e'.contains("invalid symbol")); | |
77 test('traling period', () { | |
78 var generator = new SmokeCodeGenerator(); | |
79 generator.addSymbol('a.'); | |
80 var sb = new StringBuffer(); | |
81 expect( | |
82 () => generator.writeStaticConfiguration(sb), throwsA(invalidError)); | |
83 }); | |
84 | |
85 test('operator in the middle', () { | |
86 var generator = new SmokeCodeGenerator(); | |
87 generator.addSymbol('a.[].b'); | |
88 var sb = new StringBuffer(); | |
89 expect( | |
90 () => generator.writeStaticConfiguration(sb), throwsA(invalidError)); | |
91 }); | |
92 }); | |
93 | |
94 test('getters, setters, and names', () { | |
95 var generator = new SmokeCodeGenerator(); | |
96 generator.addGetter('i'); | |
97 generator.addSetter('i'); | |
98 generator.addSetter('foo'); | |
99 generator.addSymbol('foo'); | |
100 checkResults(generator, | |
101 initCall: 'useGeneratedCode(new StaticConfiguration(\n' | |
102 ' checkedMode: false,\n' | |
103 ' getters: {\n' | |
104 ' #i: (o) => o.i,\n' | |
105 ' },\n' | |
106 ' setters: {\n' | |
107 ' #foo: (o, v) { o.foo = v; },\n' | |
108 ' #i: (o, v) { o.i = v; },\n' | |
109 ' },\n' | |
110 ' names: {\n' | |
111 ' #foo: r\'foo\',\n' | |
112 ' }));\n'); | |
113 }); | |
114 | |
115 test('parents', () { | |
116 var generator = new SmokeCodeGenerator(); | |
117 generator.addParent( | |
118 new TypeIdentifier('a.dart', 'A'), new TypeIdentifier('b.dart', 'B')); | |
119 generator.addParent( | |
120 new TypeIdentifier('a.dart', 'C'), new TypeIdentifier('a.dart', 'A')); | |
121 checkResults(generator, | |
122 imports: ["import 'a.dart' as smoke_0;", "import 'b.dart' as smoke_1;"], | |
123 initCall: 'useGeneratedCode(new StaticConfiguration(\n' | |
124 ' checkedMode: false,\n' | |
125 ' parents: {\n' | |
126 ' smoke_0.A: smoke_1.B,\n' | |
127 ' smoke_0.C: smoke_0.A,\n' | |
128 ' }));\n'); | |
129 }); | |
130 | |
131 test('declarations', () { | |
132 var generator = new SmokeCodeGenerator(); | |
133 generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo', | |
134 new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true); | |
135 generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'bar', | |
136 new TypeIdentifier('dart:core', 'Function'), | |
137 isMethod: true, | |
138 annotations: [ | |
139 new ConstExpression.constructor( | |
140 null, 'Annotation', [new ConstExpression.string("hi")], const {}) | |
141 ]); | |
142 generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), '[]', | |
143 new TypeIdentifier('dart:core', 'Function'), isMethod: true); | |
144 var symbol = "const Symbol('[]')"; | |
145 var details = "$symbol, Function, kind: METHOD"; | |
146 checkResults(generator, | |
147 imports: ["import 'a.dart' as smoke_0;"], | |
148 initCall: 'useGeneratedCode(new StaticConfiguration(\n' | |
149 ' checkedMode: false,\n' | |
150 ' declarations: {\n' | |
151 ' smoke_0.A: {\n' | |
152 ' $symbol: const Declaration($details),\n' | |
153 ' #bar: const Declaration(#bar, Function, kind: METHOD, ' | |
154 'annotations: const [const Annotation(\'hi\')]),\n' | |
155 ' #foo: const Declaration(#foo, int, isFinal: true),\n' | |
156 ' },\n' | |
157 ' }));\n'); | |
158 }); | |
159 | |
160 test('staticMethod', () { | |
161 var generator = new SmokeCodeGenerator(); | |
162 generator.addStaticMethod(new TypeIdentifier('a.dart', 'A'), 'm1'); | |
163 checkResults(generator, | |
164 imports: ["import 'a.dart' as smoke_0;"], | |
165 initCall: 'useGeneratedCode(new StaticConfiguration(\n' | |
166 ' checkedMode: false,\n' | |
167 ' staticMethods: {\n' | |
168 ' smoke_0.A: {\n' | |
169 ' #m1: smoke_0.A.m1,\n' | |
170 ' },\n' | |
171 ' }));\n'); | |
172 }); | |
173 | |
174 test('repeated entries appear only once', () { | |
175 var generator = new SmokeCodeGenerator(); | |
176 generator.addGetter('a'); | |
177 generator.addGetter('a'); | |
178 generator.addSetter('b'); | |
179 generator.addSetter('b'); | |
180 generator.addSymbol('d'); | |
181 generator.addSymbol('d'); | |
182 generator.addSymbol('c'); | |
183 generator.addSymbol('c'); | |
184 generator.addSymbol('c'); | |
185 | |
186 generator.addParent( | |
187 new TypeIdentifier('a.dart', 'C'), new TypeIdentifier('a.dart', 'A')); | |
188 generator.addParent( | |
189 new TypeIdentifier('a.dart', 'C'), new TypeIdentifier('a.dart', 'A')); | |
190 generator.addParent( | |
191 new TypeIdentifier('a.dart', 'C'), new TypeIdentifier('a.dart', 'A')); | |
192 | |
193 generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo', | |
194 new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true); | |
195 generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo', | |
196 new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true); | |
197 generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo', | |
198 new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true); | |
199 | |
200 checkResults(generator, | |
201 imports: ["import 'a.dart' as smoke_0;",], | |
202 initCall: 'useGeneratedCode(new StaticConfiguration(\n' | |
203 ' checkedMode: false,\n' | |
204 ' getters: {\n' | |
205 ' #a: (o) => o.a,\n' | |
206 ' },\n' | |
207 ' setters: {\n' | |
208 ' #b: (o, v) { o.b = v; },\n' | |
209 ' },\n' | |
210 ' parents: {\n' | |
211 ' smoke_0.C: smoke_0.A,\n' | |
212 ' },\n' | |
213 ' declarations: {\n' | |
214 ' smoke_0.A: {\n' | |
215 ' #foo: const Declaration(#foo, int, isFinal: true),\n' | |
216 ' },\n' | |
217 ' },\n' | |
218 ' names: {\n' | |
219 ' #c: r\'c\',\n' | |
220 ' #d: r\'d\',\n' | |
221 ' }));\n'); | |
222 }); | |
223 } | |
OLD | NEW |