| 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 test.domain.analysis.notification.overrides; | 5 library test.domain.analysis.notification.overrides; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'package:analysis_server/src/analysis_server.dart'; | 9 import 'package:analysis_server/src/analysis_server.dart'; |
| 10 import 'package:analysis_server/src/computer/computer_overrides.dart'; | 10 import 'package:analysis_server/src/computer/computer_overrides.dart'; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 * Asserts that there is an overridden interface [Element] at the offset of | 33 * Asserts that there is an overridden interface [Element] at the offset of |
| 34 * [search] in [override]. | 34 * [search] in [override]. |
| 35 */ | 35 */ |
| 36 void assertHasInterfaceElement(String search) { | 36 void assertHasInterfaceElement(String search) { |
| 37 int offset = findOffset(search); | 37 int offset = findOffset(search); |
| 38 for (Element element in override.interfaceElements) { | 38 for (Element element in override.interfaceElements) { |
| 39 if (element.location.offset == offset) { | 39 if (element.location.offset == offset) { |
| 40 return; | 40 return; |
| 41 } | 41 } |
| 42 } | 42 } |
| 43 fail('Expect to find an overridden interface elements at $offset in ' | 43 fail( |
| 44 '${override.interfaceElements.join('\n')}'); | 44 'Expect to find an overridden interface elements at $offset in ' |
| 45 '${override.interfaceElements.join('\n')}'); |
| 45 } | 46 } |
| 46 | 47 |
| 47 /** | 48 /** |
| 48 * Validates that there is an [Override] at the offset of [search]. | 49 * Validates that there is an [Override] at the offset of [search]. |
| 49 * | 50 * |
| 50 * If [length] is not specified explicitly, then length of an identifier | 51 * If [length] is not specified explicitly, then length of an identifier |
| 51 * from [search] is used. | 52 * from [search] is used. |
| 52 */ | 53 */ |
| 53 void assertHasOverride(String search, [int length = -1]) { | 54 void assertHasOverride(String search, [int length = -1]) { |
| 54 int offset = findOffset(search); | 55 int offset = findOffset(search); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 * | 88 * |
| 88 * If [exists] is `true`, then fails if such [Override] does not exist. | 89 * If [exists] is `true`, then fails if such [Override] does not exist. |
| 89 * Otherwise remembers this it into [override]. | 90 * Otherwise remembers this it into [override]. |
| 90 * | 91 * |
| 91 * If [exists] is `false`, then fails if such [Override] exists. | 92 * If [exists] is `false`, then fails if such [Override] exists. |
| 92 */ | 93 */ |
| 93 void findOverride(int offset, int length, [bool exists]) { | 94 void findOverride(int offset, int length, [bool exists]) { |
| 94 for (Override override in overridesList) { | 95 for (Override override in overridesList) { |
| 95 if (override.offset == offset && override.length == length) { | 96 if (override.offset == offset && override.length == length) { |
| 96 if (exists == false) { | 97 if (exists == false) { |
| 97 fail('Not expected to find (offset=$offset; length=$length) in\n' | 98 fail( |
| 98 '${overridesList.join('\n')}'); | 99 'Not expected to find (offset=$offset; length=$length) in\n' |
| 100 '${overridesList.join('\n')}'); |
| 99 } | 101 } |
| 100 this.override = override; | 102 this.override = override; |
| 101 return; | 103 return; |
| 102 } | 104 } |
| 103 } | 105 } |
| 104 if (exists == true) { | 106 if (exists == true) { |
| 105 fail('Expected to find (offset=$offset; length=$length) in\n' | 107 fail( |
| 106 '${overridesList.join('\n')}'); | 108 'Expected to find (offset=$offset; length=$length) in\n' |
| 109 '${overridesList.join('\n')}'); |
| 107 } | 110 } |
| 108 } | 111 } |
| 109 | 112 |
| 110 Future prepareOverrides(then()) { | 113 Future prepareOverrides() { |
| 111 addAnalysisSubscription(AnalysisService.OVERRIDES, testFile); | 114 addAnalysisSubscription(AnalysisService.OVERRIDES, testFile); |
| 112 return waitForTasksFinished().then((_) { | 115 return waitForTasksFinished(); |
| 113 then(); | |
| 114 }); | |
| 115 } | 116 } |
| 116 | 117 |
| 117 void processNotification(Notification notification) { | 118 void processNotification(Notification notification) { |
| 118 if (notification.event == ANALYSIS_OVERRIDES) { | 119 if (notification.event == ANALYSIS_OVERRIDES) { |
| 119 String file = notification.getParameter(FILE); | 120 String file = notification.getParameter(FILE); |
| 120 if (file == testFile) { | 121 if (file == testFile) { |
| 121 overridesList = <Override>[]; | 122 overridesList = <Override>[]; |
| 122 List<Map<String, Object>> jsonList = notification.getParameter( | 123 List<Map<String, Object>> jsonList = |
| 123 OVERRIDES); | 124 notification.getParameter(OVERRIDES); |
| 124 for (Map<String, Object> json in jsonList) { | 125 for (Map<String, Object> json in jsonList) { |
| 125 overridesList.add(new Override.fromJson(json)); | 126 overridesList.add(new Override.fromJson(json)); |
| 126 } | 127 } |
| 127 } | 128 } |
| 128 } | 129 } |
| 129 } | 130 } |
| 130 | 131 |
| 131 void setUp() { | 132 void setUp() { |
| 132 super.setUp(); | 133 super.setUp(); |
| 133 createProject(); | 134 createProject(); |
| 134 } | 135 } |
| 135 | 136 |
| 136 test_afterAnalysis() { | 137 test_afterAnalysis() { |
| 137 addTestFile(''' | 138 addTestFile(''' |
| 138 class A { | 139 class A { |
| 139 m() {} // in A | 140 m() {} // in A |
| 140 } | 141 } |
| 141 class B implements A { | 142 class B implements A { |
| 142 m() {} // in B | 143 m() {} // in B |
| 143 } | 144 } |
| 144 '''); | 145 '''); |
| 145 return waitForTasksFinished().then((_) { | 146 return waitForTasksFinished().then((_) { |
| 146 return prepareOverrides(() { | 147 return prepareOverrides().then((_) { |
| 147 assertHasOverride('m() {} // in B'); | 148 assertHasOverride('m() {} // in B'); |
| 148 assertNoSuperElement(); | 149 assertNoSuperElement(); |
| 149 assertHasInterfaceElement('m() {} // in A'); | 150 assertHasInterfaceElement('m() {} // in A'); |
| 150 }); | 151 }); |
| 151 }); | 152 }); |
| 152 } | 153 } |
| 153 | 154 |
| 154 test_interface_method_direct_multiple() { | 155 test_interface_method_direct_multiple() { |
| 155 addTestFile(''' | 156 addTestFile(''' |
| 156 class IA { | 157 class IA { |
| 157 m() {} // in IA | 158 m() {} // in IA |
| 158 } | 159 } |
| 159 class IB { | 160 class IB { |
| 160 m() {} // in IB | 161 m() {} // in IB |
| 161 } | 162 } |
| 162 class A implements IA, IB { | 163 class A implements IA, IB { |
| 163 m() {} // in A | 164 m() {} // in A |
| 164 } | 165 } |
| 165 '''); | 166 '''); |
| 166 return prepareOverrides(() { | 167 return prepareOverrides().then((_) { |
| 167 assertHasOverride('m() {} // in A'); | 168 assertHasOverride('m() {} // in A'); |
| 168 assertNoSuperElement(); | 169 assertNoSuperElement(); |
| 169 assertHasInterfaceElement('m() {} // in IA'); | 170 assertHasInterfaceElement('m() {} // in IA'); |
| 170 assertHasInterfaceElement('m() {} // in IB'); | 171 assertHasInterfaceElement('m() {} // in IB'); |
| 171 }); | 172 }); |
| 172 } | 173 } |
| 173 | 174 |
| 174 test_interface_method_direct_single() { | 175 test_interface_method_direct_single() { |
| 175 addTestFile(''' | 176 addTestFile(''' |
| 176 class A { | 177 class A { |
| 177 m() {} // in A | 178 m() {} // in A |
| 178 } | 179 } |
| 179 class B implements A { | 180 class B implements A { |
| 180 m() {} // in B | 181 m() {} // in B |
| 181 } | 182 } |
| 182 '''); | 183 '''); |
| 183 return prepareOverrides(() { | 184 return prepareOverrides().then((_) { |
| 184 assertHasOverride('m() {} // in B'); | 185 assertHasOverride('m() {} // in B'); |
| 185 assertNoSuperElement(); | 186 assertNoSuperElement(); |
| 186 assertHasInterfaceElement('m() {} // in A'); | 187 assertHasInterfaceElement('m() {} // in A'); |
| 187 }); | 188 }); |
| 188 } | 189 } |
| 189 | 190 |
| 190 test_interface_method_indirect_single() { | 191 test_interface_method_indirect_single() { |
| 191 addTestFile(''' | 192 addTestFile(''' |
| 192 class A { | 193 class A { |
| 193 m() {} // in A | 194 m() {} // in A |
| 194 } | 195 } |
| 195 class B extends A { | 196 class B extends A { |
| 196 } | 197 } |
| 197 class C implements B { | 198 class C implements B { |
| 198 m() {} // in C | 199 m() {} // in C |
| 199 } | 200 } |
| 200 '''); | 201 '''); |
| 201 return prepareOverrides(() { | 202 return prepareOverrides().then((_) { |
| 202 assertHasOverride('m() {} // in C'); | 203 assertHasOverride('m() {} // in C'); |
| 203 assertNoSuperElement(); | 204 assertNoSuperElement(); |
| 204 assertHasInterfaceElement('m() {} // in A'); | 205 assertHasInterfaceElement('m() {} // in A'); |
| 205 }); | 206 }); |
| 206 } | 207 } |
| 207 | 208 |
| 208 test_super_fieldByField() { | 209 test_super_fieldByField() { |
| 209 addTestFile(''' | 210 addTestFile(''' |
| 210 class A { | 211 class A { |
| 211 int fff; // in A | 212 int fff; // in A |
| 212 } | 213 } |
| 213 class B extends A { | 214 class B extends A { |
| 214 int fff; // in B | 215 int fff; // in B |
| 215 } | 216 } |
| 216 '''); | 217 '''); |
| 217 return prepareOverrides(() { | 218 return prepareOverrides().then((_) { |
| 218 assertHasOverride('fff; // in B'); | 219 assertHasOverride('fff; // in B'); |
| 219 assertHasSuperElement('fff; // in A'); | 220 assertHasSuperElement('fff; // in A'); |
| 220 assertNoInterfaceElements(); | 221 assertNoInterfaceElements(); |
| 221 }); | 222 }); |
| 222 } | 223 } |
| 223 | 224 |
| 224 test_super_fieldByGetter() { | 225 test_super_fieldByGetter() { |
| 225 addTestFile(''' | 226 addTestFile(''' |
| 226 class A { | 227 class A { |
| 227 int fff; // in A | 228 int fff; // in A |
| 228 } | 229 } |
| 229 class B extends A { | 230 class B extends A { |
| 230 get fff => 0; // in B | 231 get fff => 0; // in B |
| 231 } | 232 } |
| 232 '''); | 233 '''); |
| 233 return prepareOverrides(() { | 234 return prepareOverrides().then((_) { |
| 234 assertHasOverride('fff => 0; // in B'); | 235 assertHasOverride('fff => 0; // in B'); |
| 235 assertHasSuperElement('fff; // in A'); | 236 assertHasSuperElement('fff; // in A'); |
| 236 assertNoInterfaceElements(); | 237 assertNoInterfaceElements(); |
| 237 }); | 238 }); |
| 238 } | 239 } |
| 239 | 240 |
| 240 test_super_fieldByMethod() { | 241 test_super_fieldByMethod() { |
| 241 addTestFile(''' | 242 addTestFile(''' |
| 242 class A { | 243 class A { |
| 243 int fff; // in A | 244 int fff; // in A |
| 244 } | 245 } |
| 245 class B extends A { | 246 class B extends A { |
| 246 fff() {} // in B | 247 fff() {} // in B |
| 247 } | 248 } |
| 248 '''); | 249 '''); |
| 249 return prepareOverrides(() { | 250 return prepareOverrides().then((_) { |
| 250 assertHasOverride('fff() {} // in B'); | 251 assertHasOverride('fff() {} // in B'); |
| 251 assertHasSuperElement('fff; // in A'); | 252 assertHasSuperElement('fff; // in A'); |
| 252 assertNoInterfaceElements(); | 253 assertNoInterfaceElements(); |
| 253 }); | 254 }); |
| 254 } | 255 } |
| 255 | 256 |
| 256 test_super_fieldBySetter() { | 257 test_super_fieldBySetter() { |
| 257 addTestFile(''' | 258 addTestFile(''' |
| 258 class A { | 259 class A { |
| 259 int fff; // in A | 260 int fff; // in A |
| 260 } | 261 } |
| 261 class B extends A { | 262 class B extends A { |
| 262 set fff(x) {} // in B | 263 set fff(x) {} // in B |
| 263 } | 264 } |
| 264 '''); | 265 '''); |
| 265 return prepareOverrides(() { | 266 return prepareOverrides().then((_) { |
| 266 assertHasOverride('fff(x) {} // in B'); | 267 assertHasOverride('fff(x) {} // in B'); |
| 267 assertHasSuperElement('fff; // in A'); | 268 assertHasSuperElement('fff; // in A'); |
| 268 assertNoInterfaceElements(); | 269 assertNoInterfaceElements(); |
| 269 }); | 270 }); |
| 270 } | 271 } |
| 271 | 272 |
| 272 test_super_getterByField() { | 273 test_super_getterByField() { |
| 273 addTestFile(''' | 274 addTestFile(''' |
| 274 class A { | 275 class A { |
| 275 get fff => 0; // in A | 276 get fff => 0; // in A |
| 276 set fff(x) {} // in A | 277 set fff(x) {} // in A |
| 277 } | 278 } |
| 278 class B extends A { | 279 class B extends A { |
| 279 int fff; // in B | 280 int fff; // in B |
| 280 } | 281 } |
| 281 '''); | 282 '''); |
| 282 return prepareOverrides(() { | 283 return prepareOverrides().then((_) { |
| 283 assertHasOverride('fff; // in B'); | 284 assertHasOverride('fff; // in B'); |
| 284 assertHasSuperElement('fff => 0; // in A'); | 285 assertHasSuperElement('fff => 0; // in A'); |
| 285 assertNoInterfaceElements(); | 286 assertNoInterfaceElements(); |
| 286 }); | 287 }); |
| 287 } | 288 } |
| 288 | 289 |
| 289 test_super_getterByGetter() { | 290 test_super_getterByGetter() { |
| 290 addTestFile(''' | 291 addTestFile(''' |
| 291 class A { | 292 class A { |
| 292 get fff => 0; // in A | 293 get fff => 0; // in A |
| 293 } | 294 } |
| 294 class B extends A { | 295 class B extends A { |
| 295 get fff => 0; // in B | 296 get fff => 0; // in B |
| 296 } | 297 } |
| 297 '''); | 298 '''); |
| 298 return prepareOverrides(() { | 299 return prepareOverrides().then((_) { |
| 299 assertHasOverride('fff => 0; // in B'); | 300 assertHasOverride('fff => 0; // in B'); |
| 300 assertHasSuperElement('fff => 0; // in A'); | 301 assertHasSuperElement('fff => 0; // in A'); |
| 301 assertNoInterfaceElements(); | 302 assertNoInterfaceElements(); |
| 302 }); | 303 }); |
| 303 } | 304 } |
| 304 | 305 |
| 305 test_super_method_direct() { | 306 test_super_method_direct() { |
| 306 addTestFile(''' | 307 addTestFile(''' |
| 307 class A { | 308 class A { |
| 308 m() {} // in A | 309 m() {} // in A |
| 309 } | 310 } |
| 310 class B extends A { | 311 class B extends A { |
| 311 m() {} // in B | 312 m() {} // in B |
| 312 } | 313 } |
| 313 '''); | 314 '''); |
| 314 return prepareOverrides(() { | 315 return prepareOverrides().then((_) { |
| 315 assertHasOverride('m() {} // in B'); | 316 assertHasOverride('m() {} // in B'); |
| 316 assertHasSuperElement('m() {} // in A'); | 317 assertHasSuperElement('m() {} // in A'); |
| 317 assertNoInterfaceElements(); | 318 assertNoInterfaceElements(); |
| 318 }); | 319 }); |
| 319 } | 320 } |
| 320 | 321 |
| 321 test_super_method_indirect() { | 322 test_super_method_indirect() { |
| 322 addTestFile(''' | 323 addTestFile(''' |
| 323 class A { | 324 class A { |
| 324 m() {} // in A | 325 m() {} // in A |
| 325 } | 326 } |
| 326 class B extends A { | 327 class B extends A { |
| 327 } | 328 } |
| 328 class C extends B { | 329 class C extends B { |
| 329 m() {} // in C | 330 m() {} // in C |
| 330 } | 331 } |
| 331 '''); | 332 '''); |
| 332 return prepareOverrides(() { | 333 return prepareOverrides().then((_) { |
| 333 assertHasOverride('m() {} // in C'); | 334 assertHasOverride('m() {} // in C'); |
| 334 assertHasSuperElement('m() {} // in A'); | 335 assertHasSuperElement('m() {} // in A'); |
| 335 assertNoInterfaceElements(); | 336 assertNoInterfaceElements(); |
| 336 }); | 337 }); |
| 337 } | 338 } |
| 338 | 339 |
| 339 test_super_setterBySetter() { | 340 test_super_setterBySetter() { |
| 340 addTestFile(''' | 341 addTestFile(''' |
| 341 class A { | 342 class A { |
| 342 set fff(x) {} // in A | 343 set fff(x) {} // in A |
| 343 } | 344 } |
| 344 class B extends A { | 345 class B extends A { |
| 345 set fff(x) {} // in B | 346 set fff(x) {} // in B |
| 346 } | 347 } |
| 347 '''); | 348 '''); |
| 348 return prepareOverrides(() { | 349 return prepareOverrides().then((_) { |
| 349 assertHasOverride('fff(x) {} // in B'); | 350 assertHasOverride('fff(x) {} // in B'); |
| 350 assertHasSuperElement('fff(x) {} // in A'); | 351 assertHasSuperElement('fff(x) {} // in A'); |
| 351 assertNoInterfaceElements(); | 352 assertNoInterfaceElements(); |
| 352 }); | 353 }); |
| 353 } | 354 } |
| 354 } | 355 } |
| OLD | NEW |