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