| 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'; |
| 11 import 'package:analysis_server/src/computer/element.dart'; | |
| 12 import 'package:analysis_server/src/constants.dart'; | 11 import 'package:analysis_server/src/constants.dart'; |
| 13 import 'package:analysis_server/src/protocol.dart'; | 12 import 'package:analysis_server/src/protocol.dart'; |
| 14 import 'package:analysis_services/constants.dart'; | 13 import 'package:analysis_services/constants.dart'; |
| 15 import 'package:analysis_testing/reflective_tests.dart'; | 14 import 'package:analysis_testing/reflective_tests.dart'; |
| 16 import 'package:unittest/unittest.dart'; | 15 import 'package:unittest/unittest.dart'; |
| 17 | 16 |
| 18 import 'analysis_abstract.dart'; | 17 import 'analysis_abstract.dart'; |
| 19 | 18 |
| 20 | 19 |
| 21 main() { | 20 main() { |
| 22 groupSep = ' | '; | 21 groupSep = ' | '; |
| 23 runReflectiveTests(AnalysisNotificationOverridesTest); | 22 runReflectiveTests(AnalysisNotificationOverridesTest); |
| 24 } | 23 } |
| 25 | 24 |
| 26 | 25 |
| 27 @ReflectiveTestCase() | 26 @ReflectiveTestCase() |
| 28 class AnalysisNotificationOverridesTest extends AbstractAnalysisTest { | 27 class AnalysisNotificationOverridesTest extends AbstractAnalysisTest { |
| 29 List<Override> overridesList; | 28 List<Override> overridesList; |
| 30 Override override; | 29 Override override; |
| 31 | 30 |
| 32 /** | 31 /** |
| 33 * Asserts that there is an overridden interface [Element] at the offset of | 32 * Asserts that there is an overridden interface [OverriddenMember] at the |
| 34 * [search] in [override]. | 33 * offset of [search] in [override]. |
| 35 */ | 34 */ |
| 36 void assertHasInterfaceElement(String search) { | 35 void assertHasInterfaceMember(String search) { |
| 37 int offset = findOffset(search); | 36 int offset = findOffset(search); |
| 38 for (Element element in override.interfaceElements) { | 37 for (OverriddenMember member in override.interfaceMembers) { |
| 39 if (element.location.offset == offset) { | 38 if (member.element.location.offset == offset) { |
| 40 return; | 39 return; |
| 41 } | 40 } |
| 42 } | 41 } |
| 43 fail( | 42 fail( |
| 44 'Expect to find an overridden interface elements at $offset in ' | 43 'Expect to find an overridden interface members at $offset in ' |
| 45 '${override.interfaceElements.join('\n')}'); | 44 '${override.interfaceMembers.join('\n')}'); |
| 46 } | 45 } |
| 47 | 46 |
| 48 /** | 47 /** |
| 49 * Validates that there is an [Override] at the offset of [search]. | 48 * Validates that there is an [Override] at the offset of [search]. |
| 50 * | 49 * |
| 51 * If [length] is not specified explicitly, then length of an identifier | 50 * If [length] is not specified explicitly, then length of an identifier |
| 52 * from [search] is used. | 51 * from [search] is used. |
| 53 */ | 52 */ |
| 54 void assertHasOverride(String search, [int length = -1]) { | 53 void assertHasOverride(String search, [int length = -1]) { |
| 55 int offset = findOffset(search); | 54 int offset = findOffset(search); |
| 56 if (length == -1) { | 55 if (length == -1) { |
| 57 length = findIdentifierLength(search); | 56 length = findIdentifierLength(search); |
| 58 } | 57 } |
| 59 findOverride(offset, length, true); | 58 findOverride(offset, length, true); |
| 60 } | 59 } |
| 61 | 60 |
| 62 /** | 61 /** |
| 63 * Asserts that there is an overridden superclass [Element] at the offset of | 62 * Asserts that there is an overridden superclass [OverriddenMember] at the |
| 64 * [search] in [override]. | 63 * offset of [search] in [override]. |
| 65 */ | 64 */ |
| 66 void assertHasSuperElement(String search) { | 65 void assertHasSuperElement(String search) { |
| 67 int offset = findOffset(search); | 66 int offset = findOffset(search); |
| 68 Element element = override.superclassElement; | 67 OverriddenMember member = override.superclassMember; |
| 69 expect(element.location.offset, offset); | 68 expect(member.element.location.offset, offset); |
| 70 } | 69 } |
| 71 | 70 |
| 72 /** | 71 /** |
| 73 * Asserts that there are no overridden elements from interfaces. | 72 * Asserts that there are no overridden members from interfaces. |
| 74 */ | 73 */ |
| 75 void assertNoInterfaceElements() { | 74 void assertNoInterfaceMembers() { |
| 76 expect(override.interfaceElements, isNull); | 75 expect(override.interfaceMembers, isNull); |
| 77 } | 76 } |
| 78 | 77 |
| 79 /** | 78 /** |
| 80 * Asserts that there are no overridden elements from the superclass. | 79 * Asserts that there are no overridden member from the superclass. |
| 81 */ | 80 */ |
| 82 void assertNoSuperElement() { | 81 void assertNoSuperMember() { |
| 83 expect(override.superclassElement, isNull); | 82 expect(override.superclassMember, isNull); |
| 84 } | 83 } |
| 85 | 84 |
| 86 /** | 85 /** |
| 87 * Finds an [Override] with the given [offset] and [length]. | 86 * Finds an [Override] with the given [offset] and [length]. |
| 88 * | 87 * |
| 89 * If [exists] is `true`, then fails if such [Override] does not exist. | 88 * If [exists] is `true`, then fails if such [Override] does not exist. |
| 90 * Otherwise remembers this it into [override]. | 89 * Otherwise remembers this it into [override]. |
| 91 * | 90 * |
| 92 * If [exists] is `false`, then fails if such [Override] exists. | 91 * If [exists] is `false`, then fails if such [Override] exists. |
| 93 */ | 92 */ |
| (...skipping 18 matching lines...) Expand all Loading... |
| 112 | 111 |
| 113 Future prepareOverrides() { | 112 Future prepareOverrides() { |
| 114 addAnalysisSubscription(AnalysisService.OVERRIDES, testFile); | 113 addAnalysisSubscription(AnalysisService.OVERRIDES, testFile); |
| 115 return waitForTasksFinished(); | 114 return waitForTasksFinished(); |
| 116 } | 115 } |
| 117 | 116 |
| 118 void processNotification(Notification notification) { | 117 void processNotification(Notification notification) { |
| 119 if (notification.event == ANALYSIS_OVERRIDES) { | 118 if (notification.event == ANALYSIS_OVERRIDES) { |
| 120 String file = notification.getParameter(FILE); | 119 String file = notification.getParameter(FILE); |
| 121 if (file == testFile) { | 120 if (file == testFile) { |
| 122 overridesList = <Override>[]; | |
| 123 List<Map<String, Object>> jsonList = | 121 List<Map<String, Object>> jsonList = |
| 124 notification.getParameter(OVERRIDES); | 122 notification.getParameter(OVERRIDES); |
| 125 for (Map<String, Object> json in jsonList) { | 123 overridesList = jsonList.map(Override.fromJson).toList(); |
| 126 overridesList.add(new Override.fromJson(json)); | |
| 127 } | |
| 128 } | 124 } |
| 129 } | 125 } |
| 130 } | 126 } |
| 131 | 127 |
| 132 void setUp() { | 128 void setUp() { |
| 133 super.setUp(); | 129 super.setUp(); |
| 134 createProject(); | 130 createProject(); |
| 135 } | 131 } |
| 136 | 132 |
| 137 test_afterAnalysis() { | 133 test_afterAnalysis() { |
| 138 addTestFile(''' | 134 addTestFile(''' |
| 139 class A { | 135 class A { |
| 140 m() {} // in A | 136 m() {} // in A |
| 141 } | 137 } |
| 142 class B implements A { | 138 class B implements A { |
| 143 m() {} // in B | 139 m() {} // in B |
| 144 } | 140 } |
| 145 '''); | 141 '''); |
| 146 return waitForTasksFinished().then((_) { | 142 return waitForTasksFinished().then((_) { |
| 147 return prepareOverrides().then((_) { | 143 return prepareOverrides().then((_) { |
| 148 assertHasOverride('m() {} // in B'); | 144 assertHasOverride('m() {} // in B'); |
| 149 assertNoSuperElement(); | 145 assertNoSuperMember(); |
| 150 assertHasInterfaceElement('m() {} // in A'); | 146 assertHasInterfaceMember('m() {} // in A'); |
| 151 }); | 147 }); |
| 152 }); | 148 }); |
| 153 } | 149 } |
| 154 | 150 |
| 155 test_interface_method_direct_multiple() { | 151 test_interface_method_direct_multiple() { |
| 156 addTestFile(''' | 152 addTestFile(''' |
| 157 class IA { | 153 class IA { |
| 158 m() {} // in IA | 154 m() {} // in IA |
| 159 } | 155 } |
| 160 class IB { | 156 class IB { |
| 161 m() {} // in IB | 157 m() {} // in IB |
| 162 } | 158 } |
| 163 class A implements IA, IB { | 159 class A implements IA, IB { |
| 164 m() {} // in A | 160 m() {} // in A |
| 165 } | 161 } |
| 166 '''); | 162 '''); |
| 167 return prepareOverrides().then((_) { | 163 return prepareOverrides().then((_) { |
| 168 assertHasOverride('m() {} // in A'); | 164 assertHasOverride('m() {} // in A'); |
| 169 assertNoSuperElement(); | 165 assertNoSuperMember(); |
| 170 assertHasInterfaceElement('m() {} // in IA'); | 166 assertHasInterfaceMember('m() {} // in IA'); |
| 171 assertHasInterfaceElement('m() {} // in IB'); | 167 assertHasInterfaceMember('m() {} // in IB'); |
| 172 }); | 168 }); |
| 173 } | 169 } |
| 174 | 170 |
| 175 test_interface_method_direct_single() { | 171 test_interface_method_direct_single() { |
| 176 addTestFile(''' | 172 addTestFile(''' |
| 177 class A { | 173 class A { |
| 178 m() {} // in A | 174 m() {} // in A |
| 179 } | 175 } |
| 180 class B implements A { | 176 class B implements A { |
| 181 m() {} // in B | 177 m() {} // in B |
| 182 } | 178 } |
| 183 '''); | 179 '''); |
| 184 return prepareOverrides().then((_) { | 180 return prepareOverrides().then((_) { |
| 185 assertHasOverride('m() {} // in B'); | 181 assertHasOverride('m() {} // in B'); |
| 186 assertNoSuperElement(); | 182 assertNoSuperMember(); |
| 187 assertHasInterfaceElement('m() {} // in A'); | 183 assertHasInterfaceMember('m() {} // in A'); |
| 188 }); | 184 }); |
| 189 } | 185 } |
| 190 | 186 |
| 191 test_interface_method_indirect_single() { | 187 test_interface_method_indirect_single() { |
| 192 addTestFile(''' | 188 addTestFile(''' |
| 193 class A { | 189 class A { |
| 194 m() {} // in A | 190 m() {} // in A |
| 195 } | 191 } |
| 196 class B extends A { | 192 class B extends A { |
| 197 } | 193 } |
| 198 class C implements B { | 194 class C implements B { |
| 199 m() {} // in C | 195 m() {} // in C |
| 200 } | 196 } |
| 201 '''); | 197 '''); |
| 202 return prepareOverrides().then((_) { | 198 return prepareOverrides().then((_) { |
| 203 assertHasOverride('m() {} // in C'); | 199 assertHasOverride('m() {} // in C'); |
| 204 assertNoSuperElement(); | 200 assertNoSuperMember(); |
| 205 assertHasInterfaceElement('m() {} // in A'); | 201 assertHasInterfaceMember('m() {} // in A'); |
| 206 }); | 202 }); |
| 207 } | 203 } |
| 208 | 204 |
| 209 test_super_fieldByField() { | 205 test_super_fieldByField() { |
| 210 addTestFile(''' | 206 addTestFile(''' |
| 211 class A { | 207 class A { |
| 212 int fff; // in A | 208 int fff; // in A |
| 213 } | 209 } |
| 214 class B extends A { | 210 class B extends A { |
| 215 int fff; // in B | 211 int fff; // in B |
| 216 } | 212 } |
| 217 '''); | 213 '''); |
| 218 return prepareOverrides().then((_) { | 214 return prepareOverrides().then((_) { |
| 219 assertHasOverride('fff; // in B'); | 215 assertHasOverride('fff; // in B'); |
| 220 assertHasSuperElement('fff; // in A'); | 216 assertHasSuperElement('fff; // in A'); |
| 221 assertNoInterfaceElements(); | 217 assertNoInterfaceMembers(); |
| 222 }); | 218 }); |
| 223 } | 219 } |
| 224 | 220 |
| 225 test_super_fieldByGetter() { | 221 test_super_fieldByGetter() { |
| 226 addTestFile(''' | 222 addTestFile(''' |
| 227 class A { | 223 class A { |
| 228 int fff; // in A | 224 int fff; // in A |
| 229 } | 225 } |
| 230 class B extends A { | 226 class B extends A { |
| 231 get fff => 0; // in B | 227 get fff => 0; // in B |
| 232 } | 228 } |
| 233 '''); | 229 '''); |
| 234 return prepareOverrides().then((_) { | 230 return prepareOverrides().then((_) { |
| 235 assertHasOverride('fff => 0; // in B'); | 231 assertHasOverride('fff => 0; // in B'); |
| 236 assertHasSuperElement('fff; // in A'); | 232 assertHasSuperElement('fff; // in A'); |
| 237 assertNoInterfaceElements(); | 233 assertNoInterfaceMembers(); |
| 238 }); | 234 }); |
| 239 } | 235 } |
| 240 | 236 |
| 241 test_super_fieldByMethod() { | 237 test_super_fieldByMethod() { |
| 242 addTestFile(''' | 238 addTestFile(''' |
| 243 class A { | 239 class A { |
| 244 int fff; // in A | 240 int fff; // in A |
| 245 } | 241 } |
| 246 class B extends A { | 242 class B extends A { |
| 247 fff() {} // in B | 243 fff() {} // in B |
| 248 } | 244 } |
| 249 '''); | 245 '''); |
| 250 return prepareOverrides().then((_) { | 246 return prepareOverrides().then((_) { |
| 251 assertHasOverride('fff() {} // in B'); | 247 assertHasOverride('fff() {} // in B'); |
| 252 assertHasSuperElement('fff; // in A'); | 248 assertHasSuperElement('fff; // in A'); |
| 253 assertNoInterfaceElements(); | 249 assertNoInterfaceMembers(); |
| 254 }); | 250 }); |
| 255 } | 251 } |
| 256 | 252 |
| 257 test_super_fieldBySetter() { | 253 test_super_fieldBySetter() { |
| 258 addTestFile(''' | 254 addTestFile(''' |
| 259 class A { | 255 class A { |
| 260 int fff; // in A | 256 int fff; // in A |
| 261 } | 257 } |
| 262 class B extends A { | 258 class B extends A { |
| 263 set fff(x) {} // in B | 259 set fff(x) {} // in B |
| 264 } | 260 } |
| 265 '''); | 261 '''); |
| 266 return prepareOverrides().then((_) { | 262 return prepareOverrides().then((_) { |
| 267 assertHasOverride('fff(x) {} // in B'); | 263 assertHasOverride('fff(x) {} // in B'); |
| 268 assertHasSuperElement('fff; // in A'); | 264 assertHasSuperElement('fff; // in A'); |
| 269 assertNoInterfaceElements(); | 265 assertNoInterfaceMembers(); |
| 270 }); | 266 }); |
| 271 } | 267 } |
| 272 | 268 |
| 273 test_super_getterByField() { | 269 test_super_getterByField() { |
| 274 addTestFile(''' | 270 addTestFile(''' |
| 275 class A { | 271 class A { |
| 276 get fff => 0; // in A | 272 get fff => 0; // in A |
| 277 set fff(x) {} // in A | 273 set fff(x) {} // in A |
| 278 } | 274 } |
| 279 class B extends A { | 275 class B extends A { |
| 280 int fff; // in B | 276 int fff; // in B |
| 281 } | 277 } |
| 282 '''); | 278 '''); |
| 283 return prepareOverrides().then((_) { | 279 return prepareOverrides().then((_) { |
| 284 assertHasOverride('fff; // in B'); | 280 assertHasOverride('fff; // in B'); |
| 285 assertHasSuperElement('fff => 0; // in A'); | 281 assertHasSuperElement('fff => 0; // in A'); |
| 286 assertNoInterfaceElements(); | 282 assertNoInterfaceMembers(); |
| 287 }); | 283 }); |
| 288 } | 284 } |
| 289 | 285 |
| 290 test_super_getterByGetter() { | 286 test_super_getterByGetter() { |
| 291 addTestFile(''' | 287 addTestFile(''' |
| 292 class A { | 288 class A { |
| 293 get fff => 0; // in A | 289 get fff => 0; // in A |
| 294 } | 290 } |
| 295 class B extends A { | 291 class B extends A { |
| 296 get fff => 0; // in B | 292 get fff => 0; // in B |
| 297 } | 293 } |
| 298 '''); | 294 '''); |
| 299 return prepareOverrides().then((_) { | 295 return prepareOverrides().then((_) { |
| 300 assertHasOverride('fff => 0; // in B'); | 296 assertHasOverride('fff => 0; // in B'); |
| 301 assertHasSuperElement('fff => 0; // in A'); | 297 assertHasSuperElement('fff => 0; // in A'); |
| 302 assertNoInterfaceElements(); | 298 assertNoInterfaceMembers(); |
| 303 }); | 299 }); |
| 304 } | 300 } |
| 305 | 301 |
| 306 test_super_method_direct() { | 302 test_super_method_direct() { |
| 307 addTestFile(''' | 303 addTestFile(''' |
| 308 class A { | 304 class A { |
| 309 m() {} // in A | 305 m() {} // in A |
| 310 } | 306 } |
| 311 class B extends A { | 307 class B extends A { |
| 312 m() {} // in B | 308 m() {} // in B |
| 313 } | 309 } |
| 314 '''); | 310 '''); |
| 315 return prepareOverrides().then((_) { | 311 return prepareOverrides().then((_) { |
| 316 assertHasOverride('m() {} // in B'); | 312 assertHasOverride('m() {} // in B'); |
| 317 assertHasSuperElement('m() {} // in A'); | 313 assertHasSuperElement('m() {} // in A'); |
| 318 assertNoInterfaceElements(); | 314 assertNoInterfaceMembers(); |
| 319 }); | 315 }); |
| 320 } | 316 } |
| 321 | 317 |
| 322 test_super_method_indirect() { | 318 test_super_method_indirect() { |
| 323 addTestFile(''' | 319 addTestFile(''' |
| 324 class A { | 320 class A { |
| 325 m() {} // in A | 321 m() {} // in A |
| 326 } | 322 } |
| 327 class B extends A { | 323 class B extends A { |
| 328 } | 324 } |
| 329 class C extends B { | 325 class C extends B { |
| 330 m() {} // in C | 326 m() {} // in C |
| 331 } | 327 } |
| 332 '''); | 328 '''); |
| 333 return prepareOverrides().then((_) { | 329 return prepareOverrides().then((_) { |
| 334 assertHasOverride('m() {} // in C'); | 330 assertHasOverride('m() {} // in C'); |
| 335 assertHasSuperElement('m() {} // in A'); | 331 assertHasSuperElement('m() {} // in A'); |
| 336 assertNoInterfaceElements(); | 332 assertNoInterfaceMembers(); |
| 337 }); | 333 }); |
| 338 } | 334 } |
| 339 | 335 |
| 340 test_super_setterBySetter() { | 336 test_super_setterBySetter() { |
| 341 addTestFile(''' | 337 addTestFile(''' |
| 342 class A { | 338 class A { |
| 343 set fff(x) {} // in A | 339 set fff(x) {} // in A |
| 344 } | 340 } |
| 345 class B extends A { | 341 class B extends A { |
| 346 set fff(x) {} // in B | 342 set fff(x) {} // in B |
| 347 } | 343 } |
| 348 '''); | 344 '''); |
| 349 return prepareOverrides().then((_) { | 345 return prepareOverrides().then((_) { |
| 350 assertHasOverride('fff(x) {} // in B'); | 346 assertHasOverride('fff(x) {} // in B'); |
| 351 assertHasSuperElement('fff(x) {} // in A'); | 347 assertHasSuperElement('fff(x) {} // in A'); |
| 352 assertNoInterfaceElements(); | 348 assertNoInterfaceMembers(); |
| 353 }); | 349 }); |
| 354 } | 350 } |
| 355 } | 351 } |
| OLD | NEW |