| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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.services.correction.util; | 5 library test.services.correction.util; |
| 6 | 6 |
| 7 import 'package:analysis_server/plugin/protocol/protocol.dart'; | 7 import 'package:analysis_server/plugin/protocol/protocol.dart'; |
| 8 import 'package:analysis_server/src/services/correction/strings.dart'; | 8 import 'package:analysis_server/src/services/correction/strings.dart'; |
| 9 import 'package:analysis_server/src/services/correction/util.dart'; | 9 import 'package:analysis_server/src/services/correction/util.dart'; |
| 10 import 'package:analyzer/dart/element/element.dart'; | |
| 11 import 'package:analyzer/src/generated/source.dart'; | |
| 12 import 'package:test/test.dart'; | 10 import 'package:test/test.dart'; |
| 13 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 11 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 14 | 12 |
| 15 import '../../abstract_single_unit.dart'; | 13 import '../../abstract_single_unit.dart'; |
| 16 | 14 |
| 17 main() { | 15 main() { |
| 18 defineReflectiveSuite(() { | 16 defineReflectiveSuite(() { |
| 19 defineReflectiveTests(UtilTest); | 17 defineReflectiveTests(UtilTest); |
| 20 }); | 18 }); |
| 21 } | 19 } |
| 22 | 20 |
| 23 @reflectiveTest | 21 @reflectiveTest |
| 24 class UtilTest extends AbstractSingleUnitTest { | 22 class UtilTest extends AbstractSingleUnitTest { |
| 25 test_addLibraryImports_dart_hasImports_between() { | 23 test_addLibraryImports_dart_hasImports_between() { |
| 26 resolveTestUnit(''' | 24 resolveTestUnit(''' |
| 27 import 'dart:async'; | 25 import 'dart:async'; |
| 28 import 'dart:math'; | 26 import 'dart:math'; |
| 29 '''); | 27 '''); |
| 30 LibraryElement newLibrary = _getDartLibrary('dart:collection'); | 28 SourceInfo newLibrary = _getDartSourceInfo('dart:collection'); |
| 31 _assertAddLibraryImport( | 29 _assertAddLibraryImport( |
| 32 <LibraryElement>[newLibrary], | 30 <SourceInfo>[newLibrary], |
| 33 ''' | 31 ''' |
| 34 import 'dart:async'; | 32 import 'dart:async'; |
| 35 import 'dart:collection'; | 33 import 'dart:collection'; |
| 36 import 'dart:math'; | 34 import 'dart:math'; |
| 37 '''); | 35 '''); |
| 38 } | 36 } |
| 39 | 37 |
| 40 test_addLibraryImports_dart_hasImports_first() { | 38 test_addLibraryImports_dart_hasImports_first() { |
| 41 resolveTestUnit(''' | 39 resolveTestUnit(''' |
| 42 import 'dart:collection'; | 40 import 'dart:collection'; |
| 43 import 'dart:math'; | 41 import 'dart:math'; |
| 44 '''); | 42 '''); |
| 45 LibraryElement newLibrary = _getDartLibrary('dart:async'); | 43 SourceInfo newLibrary = _getDartSourceInfo('dart:async'); |
| 46 _assertAddLibraryImport( | 44 _assertAddLibraryImport( |
| 47 <LibraryElement>[newLibrary], | 45 <SourceInfo>[newLibrary], |
| 48 ''' | 46 ''' |
| 49 import 'dart:async'; | 47 import 'dart:async'; |
| 50 import 'dart:collection'; | 48 import 'dart:collection'; |
| 51 import 'dart:math'; | 49 import 'dart:math'; |
| 52 '''); | 50 '''); |
| 53 } | 51 } |
| 54 | 52 |
| 55 test_addLibraryImports_dart_hasImports_last() { | 53 test_addLibraryImports_dart_hasImports_last() { |
| 56 resolveTestUnit(''' | 54 resolveTestUnit(''' |
| 57 import 'dart:async'; | 55 import 'dart:async'; |
| 58 import 'dart:collection'; | 56 import 'dart:collection'; |
| 59 '''); | 57 '''); |
| 60 LibraryElement newLibrary = _getDartLibrary('dart:math'); | 58 SourceInfo newLibrary = _getDartSourceInfo('dart:math'); |
| 61 _assertAddLibraryImport( | 59 _assertAddLibraryImport( |
| 62 <LibraryElement>[newLibrary], | 60 <SourceInfo>[newLibrary], |
| 63 ''' | 61 ''' |
| 64 import 'dart:async'; | 62 import 'dart:async'; |
| 65 import 'dart:collection'; | 63 import 'dart:collection'; |
| 66 import 'dart:math'; | 64 import 'dart:math'; |
| 67 '''); | 65 '''); |
| 68 } | 66 } |
| 69 | 67 |
| 70 test_addLibraryImports_dart_hasImports_multiple() { | 68 test_addLibraryImports_dart_hasImports_multiple() { |
| 71 resolveTestUnit(''' | 69 resolveTestUnit(''' |
| 72 import 'dart:collection'; | 70 import 'dart:collection'; |
| 73 import 'dart:math'; | 71 import 'dart:math'; |
| 74 '''); | 72 '''); |
| 75 LibraryElement newLibrary1 = _getDartLibrary('dart:async'); | 73 SourceInfo newLibrary1 = _getDartSourceInfo('dart:async'); |
| 76 LibraryElement newLibrary2 = _getDartLibrary('dart:html'); | 74 SourceInfo newLibrary2 = _getDartSourceInfo('dart:html'); |
| 77 _assertAddLibraryImport( | 75 _assertAddLibraryImport( |
| 78 <LibraryElement>[newLibrary1, newLibrary2], | 76 <SourceInfo>[newLibrary1, newLibrary2], |
| 79 ''' | 77 ''' |
| 80 import 'dart:async'; | 78 import 'dart:async'; |
| 81 import 'dart:collection'; | 79 import 'dart:collection'; |
| 82 import 'dart:html'; | 80 import 'dart:html'; |
| 83 import 'dart:math'; | 81 import 'dart:math'; |
| 84 '''); | 82 '''); |
| 85 } | 83 } |
| 86 | 84 |
| 87 test_addLibraryImports_dart_hasImports_multiple_first() { | 85 test_addLibraryImports_dart_hasImports_multiple_first() { |
| 88 resolveTestUnit(''' | 86 resolveTestUnit(''' |
| 89 import 'dart:html'; | 87 import 'dart:html'; |
| 90 import 'dart:math'; | 88 import 'dart:math'; |
| 91 '''); | 89 '''); |
| 92 LibraryElement newLibrary1 = _getDartLibrary('dart:async'); | 90 SourceInfo newLibrary1 = _getDartSourceInfo('dart:async'); |
| 93 LibraryElement newLibrary2 = _getDartLibrary('dart:collection'); | 91 SourceInfo newLibrary2 = _getDartSourceInfo('dart:collection'); |
| 94 _assertAddLibraryImport( | 92 _assertAddLibraryImport( |
| 95 <LibraryElement>[newLibrary1, newLibrary2], | 93 <SourceInfo>[newLibrary1, newLibrary2], |
| 96 ''' | 94 ''' |
| 97 import 'dart:async'; | 95 import 'dart:async'; |
| 98 import 'dart:collection'; | 96 import 'dart:collection'; |
| 99 import 'dart:html'; | 97 import 'dart:html'; |
| 100 import 'dart:math'; | 98 import 'dart:math'; |
| 101 '''); | 99 '''); |
| 102 } | 100 } |
| 103 | 101 |
| 104 test_addLibraryImports_dart_hasImports_multiple_last() { | 102 test_addLibraryImports_dart_hasImports_multiple_last() { |
| 105 resolveTestUnit(''' | 103 resolveTestUnit(''' |
| 106 import 'dart:async'; | 104 import 'dart:async'; |
| 107 import 'dart:collection'; | 105 import 'dart:collection'; |
| 108 '''); | 106 '''); |
| 109 LibraryElement newLibrary1 = _getDartLibrary('dart:html'); | 107 SourceInfo newLibrary1 = _getDartSourceInfo('dart:html'); |
| 110 LibraryElement newLibrary2 = _getDartLibrary('dart:math'); | 108 SourceInfo newLibrary2 = _getDartSourceInfo('dart:math'); |
| 111 _assertAddLibraryImport( | 109 _assertAddLibraryImport( |
| 112 <LibraryElement>[newLibrary1, newLibrary2], | 110 <SourceInfo>[newLibrary1, newLibrary2], |
| 113 ''' | 111 ''' |
| 114 import 'dart:async'; | 112 import 'dart:async'; |
| 115 import 'dart:collection'; | 113 import 'dart:collection'; |
| 116 import 'dart:html'; | 114 import 'dart:html'; |
| 117 import 'dart:math'; | 115 import 'dart:math'; |
| 118 '''); | 116 '''); |
| 119 } | 117 } |
| 120 | 118 |
| 121 test_addLibraryImports_dart_hasLibraryDirective() { | 119 test_addLibraryImports_dart_hasLibraryDirective() { |
| 122 resolveTestUnit(''' | 120 resolveTestUnit(''' |
| 123 library test; | 121 library test; |
| 124 | 122 |
| 125 class A {} | 123 class A {} |
| 126 '''); | 124 '''); |
| 127 LibraryElement newLibrary1 = _getDartLibrary('dart:math'); | 125 SourceInfo newLibrary1 = _getDartSourceInfo('dart:math'); |
| 128 LibraryElement newLibrary2 = _getDartLibrary('dart:async'); | 126 SourceInfo newLibrary2 = _getDartSourceInfo('dart:async'); |
| 129 _assertAddLibraryImport( | 127 _assertAddLibraryImport( |
| 130 <LibraryElement>[newLibrary1, newLibrary2], | 128 <SourceInfo>[newLibrary1, newLibrary2], |
| 131 ''' | 129 ''' |
| 132 library test; | 130 library test; |
| 133 | 131 |
| 134 import 'dart:async'; | 132 import 'dart:async'; |
| 135 import 'dart:math'; | 133 import 'dart:math'; |
| 136 | 134 |
| 137 class A {} | 135 class A {} |
| 138 '''); | 136 '''); |
| 139 } | 137 } |
| 140 | 138 |
| 141 test_addLibraryImports_dart_noDirectives_hasComment() { | 139 test_addLibraryImports_dart_noDirectives_hasComment() { |
| 142 resolveTestUnit(''' | 140 resolveTestUnit(''' |
| 143 /// Comment. | 141 /// Comment. |
| 144 | 142 |
| 145 class A {} | 143 class A {} |
| 146 '''); | 144 '''); |
| 147 LibraryElement newLibrary1 = _getDartLibrary('dart:math'); | 145 SourceInfo newLibrary1 = _getDartSourceInfo('dart:math'); |
| 148 LibraryElement newLibrary2 = _getDartLibrary('dart:async'); | 146 SourceInfo newLibrary2 = _getDartSourceInfo('dart:async'); |
| 149 _assertAddLibraryImport( | 147 _assertAddLibraryImport( |
| 150 <LibraryElement>[newLibrary1, newLibrary2], | 148 <SourceInfo>[newLibrary1, newLibrary2], |
| 151 ''' | 149 ''' |
| 152 /// Comment. | 150 /// Comment. |
| 153 | 151 |
| 154 import 'dart:async'; | 152 import 'dart:async'; |
| 155 import 'dart:math'; | 153 import 'dart:math'; |
| 156 | 154 |
| 157 class A {} | 155 class A {} |
| 158 '''); | 156 '''); |
| 159 } | 157 } |
| 160 | 158 |
| 161 test_addLibraryImports_dart_noDirectives_hasShebang() { | 159 test_addLibraryImports_dart_noDirectives_hasShebang() { |
| 162 resolveTestUnit(''' | 160 resolveTestUnit(''' |
| 163 #!/bin/dart | 161 #!/bin/dart |
| 164 | 162 |
| 165 class A {} | 163 class A {} |
| 166 '''); | 164 '''); |
| 167 LibraryElement newLibrary1 = _getDartLibrary('dart:math'); | 165 SourceInfo newLibrary1 = _getDartSourceInfo('dart:math'); |
| 168 LibraryElement newLibrary2 = _getDartLibrary('dart:async'); | 166 SourceInfo newLibrary2 = _getDartSourceInfo('dart:async'); |
| 169 _assertAddLibraryImport( | 167 _assertAddLibraryImport( |
| 170 <LibraryElement>[newLibrary1, newLibrary2], | 168 <SourceInfo>[newLibrary1, newLibrary2], |
| 171 ''' | 169 ''' |
| 172 #!/bin/dart | 170 #!/bin/dart |
| 173 | 171 |
| 174 import 'dart:async'; | 172 import 'dart:async'; |
| 175 import 'dart:math'; | 173 import 'dart:math'; |
| 176 | 174 |
| 177 class A {} | 175 class A {} |
| 178 '''); | 176 '''); |
| 179 } | 177 } |
| 180 | 178 |
| 181 test_addLibraryImports_dart_noDirectives_noShebang() { | 179 test_addLibraryImports_dart_noDirectives_noShebang() { |
| 182 resolveTestUnit(''' | 180 resolveTestUnit(''' |
| 183 class A {} | 181 class A {} |
| 184 '''); | 182 '''); |
| 185 LibraryElement newLibrary1 = _getDartLibrary('dart:math'); | 183 SourceInfo newLibrary1 = _getDartSourceInfo('dart:math'); |
| 186 LibraryElement newLibrary2 = _getDartLibrary('dart:async'); | 184 SourceInfo newLibrary2 = _getDartSourceInfo('dart:async'); |
| 187 _assertAddLibraryImport( | 185 _assertAddLibraryImport( |
| 188 <LibraryElement>[newLibrary1, newLibrary2], | 186 <SourceInfo>[newLibrary1, newLibrary2], |
| 189 ''' | 187 ''' |
| 190 import 'dart:async'; | 188 import 'dart:async'; |
| 191 import 'dart:math'; | 189 import 'dart:math'; |
| 192 | 190 |
| 193 class A {} | 191 class A {} |
| 194 '''); | 192 '''); |
| 195 } | 193 } |
| 196 | 194 |
| 197 test_addLibraryImports_package_hasDart_hasPackages_insertAfter() { | 195 test_addLibraryImports_package_hasDart_hasPackages_insertAfter() { |
| 198 resolveTestUnit(''' | 196 resolveTestUnit(''' |
| 199 import 'dart:async'; | 197 import 'dart:async'; |
| 200 | 198 |
| 201 import 'package:aaa/aaa.dart'; | 199 import 'package:aaa/aaa.dart'; |
| 202 '''); | 200 '''); |
| 203 LibraryElement newLibrary = | 201 SourceInfo newLibrary = |
| 204 _mockLibraryElement('/lib/bbb.dart', 'package:bbb/bbb.dart'); | 202 _getSourceInfo('/lib/bbb.dart', 'package:bbb/bbb.dart'); |
| 205 _assertAddLibraryImport( | 203 _assertAddLibraryImport( |
| 206 <LibraryElement>[newLibrary], | 204 <SourceInfo>[newLibrary], |
| 207 ''' | 205 ''' |
| 208 import 'dart:async'; | 206 import 'dart:async'; |
| 209 | 207 |
| 210 import 'package:aaa/aaa.dart'; | 208 import 'package:aaa/aaa.dart'; |
| 211 import 'package:bbb/bbb.dart'; | 209 import 'package:bbb/bbb.dart'; |
| 212 '''); | 210 '''); |
| 213 } | 211 } |
| 214 | 212 |
| 215 test_addLibraryImports_package_hasDart_hasPackages_insertBefore() { | 213 test_addLibraryImports_package_hasDart_hasPackages_insertBefore() { |
| 216 resolveTestUnit(''' | 214 resolveTestUnit(''' |
| 217 import 'dart:async'; | 215 import 'dart:async'; |
| 218 | 216 |
| 219 import 'package:bbb/bbb.dart'; | 217 import 'package:bbb/bbb.dart'; |
| 220 '''); | 218 '''); |
| 221 LibraryElement newLibrary = | 219 SourceInfo newLibrary = |
| 222 _mockLibraryElement('/lib/aaa.dart', 'package:aaa/aaa.dart'); | 220 _getSourceInfo('/lib/aaa.dart', 'package:aaa/aaa.dart'); |
| 223 _assertAddLibraryImport( | 221 _assertAddLibraryImport( |
| 224 <LibraryElement>[newLibrary], | 222 <SourceInfo>[newLibrary], |
| 225 ''' | 223 ''' |
| 226 import 'dart:async'; | 224 import 'dart:async'; |
| 227 | 225 |
| 228 import 'package:aaa/aaa.dart'; | 226 import 'package:aaa/aaa.dart'; |
| 229 import 'package:bbb/bbb.dart'; | 227 import 'package:bbb/bbb.dart'; |
| 230 '''); | 228 '''); |
| 231 } | 229 } |
| 232 | 230 |
| 233 test_addLibraryImports_package_hasImports_between() { | 231 test_addLibraryImports_package_hasImports_between() { |
| 234 resolveTestUnit(''' | 232 resolveTestUnit(''' |
| 235 import 'package:aaa/aaa.dart'; | 233 import 'package:aaa/aaa.dart'; |
| 236 import 'package:ddd/ddd.dart'; | 234 import 'package:ddd/ddd.dart'; |
| 237 '''); | 235 '''); |
| 238 LibraryElement newLibrary1 = | 236 SourceInfo newLibrary1 = |
| 239 _mockLibraryElement('/lib/bbb.dart', 'package:bbb/bbb.dart'); | 237 _getSourceInfo('/lib/bbb.dart', 'package:bbb/bbb.dart'); |
| 240 LibraryElement newLibrary2 = | 238 SourceInfo newLibrary2 = |
| 241 _mockLibraryElement('/lib/ccc.dart', 'package:ccc/ccc.dart'); | 239 _getSourceInfo('/lib/ccc.dart', 'package:ccc/ccc.dart'); |
| 242 _assertAddLibraryImport( | 240 _assertAddLibraryImport( |
| 243 <LibraryElement>[newLibrary1, newLibrary2], | 241 <SourceInfo>[newLibrary1, newLibrary2], |
| 244 ''' | 242 ''' |
| 245 import 'package:aaa/aaa.dart'; | 243 import 'package:aaa/aaa.dart'; |
| 246 import 'package:bbb/bbb.dart'; | 244 import 'package:bbb/bbb.dart'; |
| 247 import 'package:ccc/ccc.dart'; | 245 import 'package:ccc/ccc.dart'; |
| 248 import 'package:ddd/ddd.dart'; | 246 import 'package:ddd/ddd.dart'; |
| 249 '''); | 247 '''); |
| 250 } | 248 } |
| 251 | 249 |
| 252 void _assertAddLibraryImport( | 250 void _assertAddLibraryImport( |
| 253 List<LibraryElement> newLibraries, String expectedCode) { | 251 List<SourceInfo> newLibraries, String expectedCode) { |
| 254 SourceChange change = new SourceChange(''); | 252 SourceChange change = new SourceChange(''); |
| 255 addLibraryImports(change, testLibraryElement, newLibraries.toSet()); | 253 addLibraryImports(change, testLibraryElement, newLibraries.toSet()); |
| 256 SourceFileEdit testEdit = change.getFileEdit(testFile); | 254 SourceFileEdit testEdit = change.getFileEdit(testFile); |
| 257 expect(testEdit, isNotNull); | 255 expect(testEdit, isNotNull); |
| 258 String resultCode = SourceEdit.applySequence(testCode, testEdit.edits); | 256 String resultCode = SourceEdit.applySequence(testCode, testEdit.edits); |
| 259 expect(resultCode, expectedCode); | 257 expect(resultCode, expectedCode); |
| 260 } | 258 } |
| 261 | 259 |
| 262 LibraryElement _getDartLibrary(String uri) { | 260 SourceInfo _getDartSourceInfo(String uri) { |
| 263 String path = removeStart(uri, 'dart:'); | 261 String path = removeStart(uri, 'dart:'); |
| 264 Source newSource = new _SourceMock('/sdk/lib/$path.dart', Uri.parse(uri)); | 262 return new SourceInfo('/sdk/lib/$path.dart', Uri.parse(uri)); |
| 265 return new _LibraryElementMock(newSource); | |
| 266 } | 263 } |
| 267 | 264 |
| 268 LibraryElement _mockLibraryElement(String path, String uri) { | 265 SourceInfo _getSourceInfo(String path, String uri) { |
| 269 Source newSource = new _SourceMock(path, Uri.parse(uri)); | 266 return new SourceInfo(path, Uri.parse(uri)); |
| 270 return new _LibraryElementMock(newSource); | |
| 271 } | 267 } |
| 272 } | 268 } |
| 273 | |
| 274 class _LibraryElementMock implements LibraryElement { | |
| 275 @override | |
| 276 final Source source; | |
| 277 | |
| 278 _LibraryElementMock(this.source); | |
| 279 | |
| 280 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | |
| 281 } | |
| 282 | |
| 283 class _SourceMock implements Source { | |
| 284 @override | |
| 285 final String fullName; | |
| 286 | |
| 287 @override | |
| 288 final Uri uri; | |
| 289 | |
| 290 _SourceMock(this.fullName, this.uri); | |
| 291 | |
| 292 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | |
| 293 } | |
| OLD | NEW |