| 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 |