| 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.services.correction.status; | 5 library test.services.correction.status; |
| 6 | 6 |
| 7 import 'package:analysis_server/src/services/correction/status.dart'; | 7 import 'package:analysis_server/src/services/correction/status.dart'; |
| 8 import 'package:analysis_server/src/services/search/search_engine.dart'; | 8 import 'package:analysis_server/src/services/search/search_engine.dart'; |
| 9 import 'package:analysis_server/src/services/correction/source_range.dart'; | 9 import 'package:analysis_server/src/services/correction/source_range.dart'; |
| 10 import 'package:analysis_testing/abstract_single_unit.dart'; | 10 import 'package:analysis_testing/abstract_single_unit.dart'; |
| 11 import 'package:analysis_testing/reflective_tests.dart'; | 11 import 'package:analysis_testing/reflective_tests.dart'; |
| 12 import 'package:analyzer/src/generated/ast.dart'; | 12 import 'package:analyzer/src/generated/ast.dart'; |
| 13 import 'package:analyzer/src/generated/element.dart'; | 13 import 'package:analyzer/src/generated/element.dart'; |
| 14 import 'package:analyzer/src/generated/source.dart'; | 14 import 'package:analyzer/src/generated/source.dart'; |
| 15 import 'package:typed_mock/typed_mock.dart'; | |
| 16 import 'package:unittest/unittest.dart'; | 15 import 'package:unittest/unittest.dart'; |
| 16 import 'package:analysis_server/src/protocol2.dart' show Location, |
| 17 RefactoringProblem, RefactoringProblemSeverity; |
| 17 | 18 |
| 18 | 19 |
| 19 main() { | 20 main() { |
| 20 groupSep = ' | '; | 21 groupSep = ' | '; |
| 21 runReflectiveTests(RefactoringStatusContextTest); | 22 runReflectiveTests(RefactoringLocationTest); |
| 22 runReflectiveTests(RefactoringStatusEntryTest); | |
| 23 runReflectiveTests(RefactoringStatusTest); | 23 runReflectiveTests(RefactoringStatusTest); |
| 24 } | 24 } |
| 25 | 25 |
| 26 | 26 |
| 27 @ReflectiveTestCase() | 27 @ReflectiveTestCase() |
| 28 class RefactoringStatusContextTest extends AbstractSingleUnitTest { | 28 class RefactoringLocationTest extends AbstractSingleUnitTest { |
| 29 void test_new_forElement() { | 29 void test_createLocation_forElement() { |
| 30 resolveTestUnit('class MyClass {}'); | 30 resolveTestUnit('class MyClass {}'); |
| 31 Element element = findElement('MyClass'); | 31 Element element = findElement('MyClass'); |
| 32 var statusContext = new RefactoringStatusContext.forElement(element); | 32 // check |
| 33 // access | 33 Location location = createLocation_forElement(element); |
| 34 expect(statusContext.context, context); | 34 expect(location.file, '/test.dart'); |
| 35 expect(statusContext.source, testSource); | 35 expect(location.offset, 6); |
| 36 expect( | 36 expect(location.length, 7); |
| 37 statusContext.range, | 37 expect(location.startLine, 1); |
| 38 rangeStartLength(element.nameOffset, 'MyClass'.length)); | 38 expect(location.startColumn, 7); |
| 39 } | 39 } |
| 40 | 40 |
| 41 void test_new_forMatch() { | 41 void test_createLocation_forMatch() { |
| 42 resolveTestUnit('class MyClass {}'); | 42 resolveTestUnit('class MyClass {}'); |
| 43 Element element = findElement('MyClass'); | 43 Element element = findElement('MyClass'); |
| 44 SourceRange range = rangeElementName(element); | 44 SourceRange range = rangeElementName(element); |
| 45 SearchMatch match = new SearchMatch(null, element, range, true, false); | 45 SearchMatch match = new SearchMatch(null, element, range, true, false); |
| 46 var statusContext = new RefactoringStatusContext.forMatch(match); | 46 // check |
| 47 // access | 47 Location location = createLocation_forMatch(match); |
| 48 expect(statusContext.context, context); | 48 expect(location.file, '/test.dart'); |
| 49 expect(statusContext.source, testSource); | 49 expect(location.offset, range.offset); |
| 50 expect(statusContext.range, range); | 50 expect(location.length, range.length); |
| 51 } | 51 } |
| 52 | 52 |
| 53 void test_new_forNode() { | 53 void test_createLocation_forNode() { |
| 54 resolveTestUnit(''' | 54 resolveTestUnit(''' |
| 55 main() { | 55 main() { |
| 56 } | 56 } |
| 57 '''); | 57 '''); |
| 58 AstNode node = findNodeAtString('main'); | 58 AstNode node = findNodeAtString('main'); |
| 59 var statusContext = new RefactoringStatusContext.forNode(node); | 59 // check |
| 60 // access | 60 Location location = createLocation_forNode(node); |
| 61 expect(statusContext.context, context); | 61 expect(location.file, '/test.dart'); |
| 62 expect(statusContext.source, testSource); | 62 expect(location.offset, node.offset); |
| 63 expect(statusContext.range, rangeNode(node)); | 63 expect(location.length, node.length); |
| 64 } | 64 } |
| 65 | 65 |
| 66 void test_new_forUnit() { | 66 void test_createLocation_forUnit() { |
| 67 resolveTestUnit(''); | 67 resolveTestUnit(''); |
| 68 SourceRange range = rangeStartLength(10, 20); | 68 SourceRange range = rangeStartLength(10, 20); |
| 69 var statusContext = new RefactoringStatusContext.forUnit(testUnit, range); | 69 // check |
| 70 // access | 70 Location location = createLocation_forUnit(testUnit, range); |
| 71 expect(statusContext.context, context); | 71 expect(location.file, '/test.dart'); |
| 72 expect(statusContext.source, testSource); | 72 expect(location.offset, range.offset); |
| 73 expect(statusContext.range, range); | 73 expect(location.length, range.length); |
| 74 } | 74 } |
| 75 } | 75 } |
| 76 | 76 |
| 77 | |
| 78 @ReflectiveTestCase() | |
| 79 class RefactoringStatusEntryTest { | |
| 80 void test_new_withContext() { | |
| 81 RefactoringStatusContext context = new _MockRefactoringStatusContext(); | |
| 82 RefactoringStatusEntry entry = | |
| 83 new RefactoringStatusEntry( | |
| 84 RefactoringStatusSeverity.ERROR, | |
| 85 "my message", | |
| 86 context); | |
| 87 // access | |
| 88 expect(entry.severity, RefactoringStatusSeverity.ERROR); | |
| 89 expect(entry.message, 'my message'); | |
| 90 expect(entry.context, context); | |
| 91 } | |
| 92 | |
| 93 void test_new_withoutContext() { | |
| 94 RefactoringStatusEntry entry = | |
| 95 new RefactoringStatusEntry(RefactoringStatusSeverity.ERROR, "my message"
); | |
| 96 // access | |
| 97 expect(entry.severity, RefactoringStatusSeverity.ERROR); | |
| 98 expect(entry.message, 'my message'); | |
| 99 expect(entry.context, isNull); | |
| 100 // isX | |
| 101 expect(entry.isFatalError, isFalse); | |
| 102 expect(entry.isError, isTrue); | |
| 103 expect(entry.isWarning, isFalse); | |
| 104 } | |
| 105 } | |
| 106 | |
| 107 | 77 |
| 108 @ReflectiveTestCase() | 78 @ReflectiveTestCase() |
| 109 class RefactoringStatusTest { | 79 class RefactoringStatusTest { |
| 110 void test_addError() { | 80 void test_addError() { |
| 111 RefactoringStatus refactoringStatus = new RefactoringStatus(); | 81 RefactoringStatus refactoringStatus = new RefactoringStatus(); |
| 112 // initial state | 82 // initial state |
| 113 expect(refactoringStatus.severity, RefactoringStatusSeverity.OK); | 83 expect(refactoringStatus.severity, null); |
| 114 // add ERROR | 84 // add ERROR |
| 115 refactoringStatus.addError('msg'); | 85 refactoringStatus.addError('msg'); |
| 116 expect(refactoringStatus.severity, RefactoringStatusSeverity.ERROR); | 86 expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR); |
| 117 expect(refactoringStatus.isOK, isFalse); | 87 expect(refactoringStatus.isOK, isFalse); |
| 118 expect(refactoringStatus.hasFatalError, isFalse); | 88 expect(refactoringStatus.hasFatalError, isFalse); |
| 119 expect(refactoringStatus.hasError, isTrue); | 89 expect(refactoringStatus.hasError, isTrue); |
| 120 // entries | 90 // problems |
| 121 List<RefactoringStatusEntry> entries = refactoringStatus.entries; | 91 List<RefactoringProblem> problems = refactoringStatus.problems; |
| 122 expect(entries, hasLength(1)); | 92 expect(problems, hasLength(1)); |
| 123 expect(entries[0].message, 'msg'); | 93 expect(problems[0].message, 'msg'); |
| 124 } | 94 } |
| 125 | 95 |
| 126 void test_addFatalError_withContext() { | 96 void test_addFatalError_withLocation() { |
| 127 RefactoringStatusContext context = new _MockRefactoringStatusContext(); | 97 Location location = new Location('/test.dart', 1, 2, 3, 4); |
| 128 RefactoringStatus refactoringStatus = new RefactoringStatus(); | 98 RefactoringStatus refactoringStatus = new RefactoringStatus(); |
| 129 // initial state | 99 // initial state |
| 130 expect(refactoringStatus.severity, RefactoringStatusSeverity.OK); | 100 expect(refactoringStatus.severity, null); |
| 131 // add FATAL | 101 // add FATAL |
| 132 refactoringStatus.addFatalError('msg', context); | 102 refactoringStatus.addFatalError('msg', location); |
| 133 expect(refactoringStatus.severity, RefactoringStatusSeverity.FATAL); | 103 expect(refactoringStatus.severity, RefactoringProblemSeverity.FATAL); |
| 134 expect(refactoringStatus.isOK, isFalse); | 104 expect(refactoringStatus.isOK, isFalse); |
| 135 expect(refactoringStatus.hasFatalError, isTrue); | 105 expect(refactoringStatus.hasFatalError, isTrue); |
| 136 expect(refactoringStatus.hasError, isTrue); | 106 expect(refactoringStatus.hasError, isTrue); |
| 137 // entries | 107 // problems |
| 138 List<RefactoringStatusEntry> entries = refactoringStatus.entries; | 108 List<RefactoringProblem> problems = refactoringStatus.problems; |
| 139 expect(entries, hasLength(1)); | 109 expect(problems, hasLength(1)); |
| 140 expect(entries[0].message, 'msg'); | 110 expect(problems[0].message, 'msg'); |
| 141 expect(entries[0].context, context); | 111 expect(problems[0].location.file, '/test.dart'); |
| 112 expect(problems[0].location.offset, 1); |
| 113 expect(problems[0].location.length, 2); |
| 142 // add WARNING, resulting severity is still FATAL | 114 // add WARNING, resulting severity is still FATAL |
| 143 refactoringStatus.addWarning("warning"); | 115 refactoringStatus.addWarning("warning"); |
| 144 expect(refactoringStatus.severity, RefactoringStatusSeverity.FATAL); | 116 expect(refactoringStatus.severity, RefactoringProblemSeverity.FATAL); |
| 145 } | 117 } |
| 146 | 118 |
| 147 void test_addFatalError_withoutContext() { | 119 void test_addFatalError_withoutContext() { |
| 148 RefactoringStatus refactoringStatus = new RefactoringStatus(); | 120 RefactoringStatus refactoringStatus = new RefactoringStatus(); |
| 149 // initial state | 121 // initial state |
| 150 expect(refactoringStatus.severity, RefactoringStatusSeverity.OK); | 122 expect(refactoringStatus.severity, null); |
| 151 // add FATAL | 123 // add FATAL |
| 152 refactoringStatus.addFatalError('msg'); | 124 refactoringStatus.addFatalError('msg'); |
| 153 expect(refactoringStatus.severity, RefactoringStatusSeverity.FATAL); | 125 expect(refactoringStatus.severity, RefactoringProblemSeverity.FATAL); |
| 154 expect(refactoringStatus.isOK, isFalse); | 126 expect(refactoringStatus.isOK, isFalse); |
| 155 expect(refactoringStatus.hasFatalError, isTrue); | 127 expect(refactoringStatus.hasFatalError, isTrue); |
| 156 expect(refactoringStatus.hasError, isTrue); | 128 expect(refactoringStatus.hasError, isTrue); |
| 157 // entries | 129 // problems |
| 158 List<RefactoringStatusEntry> entries = refactoringStatus.entries; | 130 List<RefactoringProblem> problems = refactoringStatus.problems; |
| 159 expect(entries, hasLength(1)); | 131 expect(problems, hasLength(1)); |
| 160 expect(entries[0].message, 'msg'); | 132 expect(problems[0].message, 'msg'); |
| 161 expect(entries[0].context, isNull); | 133 expect(problems[0].location, isNull); |
| 162 } | 134 } |
| 163 | 135 |
| 164 void test_addStatus_Error_withWarning() { | 136 void test_addStatus_Error_withWarning() { |
| 165 RefactoringStatus refactoringStatus = new RefactoringStatus(); | 137 RefactoringStatus refactoringStatus = new RefactoringStatus(); |
| 166 refactoringStatus.addError("err"); | 138 refactoringStatus.addError("err"); |
| 167 expect(refactoringStatus.severity, RefactoringStatusSeverity.ERROR); | 139 expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR); |
| 168 // merge with OK | 140 // merge with OK |
| 169 { | 141 { |
| 170 RefactoringStatus other = new RefactoringStatus(); | 142 RefactoringStatus other = new RefactoringStatus(); |
| 171 other.addWarning("warn"); | 143 other.addWarning("warn"); |
| 172 refactoringStatus.addStatus(other); | 144 refactoringStatus.addStatus(other); |
| 173 } | 145 } |
| 174 expect(refactoringStatus.severity, RefactoringStatusSeverity.ERROR); | 146 expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR); |
| 175 expect(refactoringStatus.message, 'err'); | 147 expect(refactoringStatus.message, 'err'); |
| 176 } | 148 } |
| 177 | 149 |
| 178 void test_addStatus_Warning_null() { | 150 void test_addStatus_Warning_null() { |
| 179 RefactoringStatus refactoringStatus = new RefactoringStatus(); | 151 RefactoringStatus refactoringStatus = new RefactoringStatus(); |
| 180 refactoringStatus.addWarning("warn"); | 152 refactoringStatus.addWarning("warn"); |
| 181 expect(refactoringStatus.severity, RefactoringStatusSeverity.WARNING); | 153 expect(refactoringStatus.severity, RefactoringProblemSeverity.WARNING); |
| 182 // merge with "null" | 154 // merge with "null" |
| 183 refactoringStatus.addStatus(null); | 155 refactoringStatus.addStatus(null); |
| 184 expect(refactoringStatus.severity, RefactoringStatusSeverity.WARNING); | 156 expect(refactoringStatus.severity, RefactoringProblemSeverity.WARNING); |
| 185 } | 157 } |
| 186 | 158 |
| 187 void test_addStatus_Warning_withError() { | 159 void test_addStatus_Warning_withError() { |
| 188 RefactoringStatus refactoringStatus = new RefactoringStatus(); | 160 RefactoringStatus refactoringStatus = new RefactoringStatus(); |
| 189 refactoringStatus.addWarning("warn"); | 161 refactoringStatus.addWarning("warn"); |
| 190 expect(refactoringStatus.severity, RefactoringStatusSeverity.WARNING); | 162 expect(refactoringStatus.severity, RefactoringProblemSeverity.WARNING); |
| 191 // merge with OK | 163 // merge with OK |
| 192 { | 164 { |
| 193 RefactoringStatus other = new RefactoringStatus(); | 165 RefactoringStatus other = new RefactoringStatus(); |
| 194 other.addError("err"); | 166 other.addError("err"); |
| 195 refactoringStatus.addStatus(other); | 167 refactoringStatus.addStatus(other); |
| 196 } | 168 } |
| 197 expect(refactoringStatus.severity, RefactoringStatusSeverity.ERROR); | 169 expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR); |
| 198 expect(refactoringStatus.message, 'err'); | 170 expect(refactoringStatus.message, 'err'); |
| 199 } | 171 } |
| 200 | 172 |
| 201 void test_addWarning() { | 173 void test_addWarning() { |
| 202 RefactoringStatus refactoringStatus = new RefactoringStatus(); | 174 RefactoringStatus refactoringStatus = new RefactoringStatus(); |
| 203 // initial state | 175 // initial state |
| 204 expect(refactoringStatus.severity, RefactoringStatusSeverity.OK); | 176 expect(refactoringStatus.severity, null); |
| 205 // add WARNING | 177 // add WARNING |
| 206 refactoringStatus.addWarning('msg'); | 178 refactoringStatus.addWarning('msg'); |
| 207 expect(refactoringStatus.severity, RefactoringStatusSeverity.WARNING); | 179 expect(refactoringStatus.severity, RefactoringProblemSeverity.WARNING); |
| 208 expect(refactoringStatus.isOK, isFalse); | 180 expect(refactoringStatus.isOK, isFalse); |
| 209 expect(refactoringStatus.hasFatalError, isFalse); | 181 expect(refactoringStatus.hasFatalError, isFalse); |
| 210 expect(refactoringStatus.hasError, isFalse); | 182 expect(refactoringStatus.hasError, isFalse); |
| 211 expect(refactoringStatus.hasWarning, isTrue); | 183 expect(refactoringStatus.hasWarning, isTrue); |
| 212 // entries | 184 // problems |
| 213 List<RefactoringStatusEntry> entries = refactoringStatus.entries; | 185 List<RefactoringProblem> problems = refactoringStatus.problems; |
| 214 expect(entries, hasLength(1)); | 186 expect(problems, hasLength(1)); |
| 215 expect(entries[0].message, 'msg'); | 187 expect(problems[0].message, 'msg'); |
| 216 } | 188 } |
| 217 | 189 |
| 218 void test_escalateErrorToFatal() { | 190 void test_get_problem() { |
| 219 RefactoringStatus refactoringStatus = new RefactoringStatus.error('msg'); | |
| 220 expect(refactoringStatus.severity, RefactoringStatusSeverity.ERROR); | |
| 221 // escalated | |
| 222 RefactoringStatus escalated = refactoringStatus.escalateErrorToFatal(); | |
| 223 expect(escalated.severity, RefactoringStatusSeverity.FATAL); | |
| 224 } | |
| 225 | |
| 226 void test_get_entryWithHighestSeverity() { | |
| 227 RefactoringStatus refactoringStatus = new RefactoringStatus(); | 191 RefactoringStatus refactoringStatus = new RefactoringStatus(); |
| 228 // no entries | 192 // no entries |
| 229 expect(refactoringStatus.entryWithHighestSeverity, isNull); | 193 expect(refactoringStatus.problem, isNull); |
| 230 expect(refactoringStatus.message, isNull); | 194 expect(refactoringStatus.message, isNull); |
| 231 // add entries | 195 // add entries |
| 232 refactoringStatus.addError('msgError'); | 196 refactoringStatus.addError('msgError'); |
| 233 refactoringStatus.addWarning('msgWarning'); | 197 refactoringStatus.addWarning('msgWarning'); |
| 234 refactoringStatus.addFatalError('msgFatalError'); | 198 refactoringStatus.addFatalError('msgFatalError'); |
| 235 // get entry | 199 // get entry |
| 236 { | 200 { |
| 237 RefactoringStatusEntry entry = refactoringStatus.entryWithHighestSeverity; | 201 RefactoringProblem problem = refactoringStatus.problem; |
| 238 expect(entry.severity, RefactoringStatusSeverity.FATAL); | 202 expect(problem.severity, RefactoringProblemSeverity.FATAL); |
| 239 expect(entry.message, 'msgFatalError'); | 203 expect(problem.message, 'msgFatalError'); |
| 240 } | 204 } |
| 241 // get message | 205 // get message |
| 242 expect(refactoringStatus.message, 'msgFatalError'); | 206 expect(refactoringStatus.problem.message, 'msgFatalError'); |
| 243 } | 207 } |
| 244 | 208 |
| 245 void test_newError() { | 209 void test_newError() { |
| 246 RefactoringStatusContext context = new _MockRefactoringStatusContext(); | 210 Location location = new Location('/test.dart', 1, 2, 3, 4); |
| 247 RefactoringStatus refactoringStatus = | 211 RefactoringStatus refactoringStatus = |
| 248 new RefactoringStatus.error('msg', context); | 212 new RefactoringStatus.error('msg', location); |
| 249 expect(refactoringStatus.severity, RefactoringStatusSeverity.ERROR); | 213 expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR); |
| 250 expect(refactoringStatus.message, 'msg'); | 214 expect(refactoringStatus.problem.message, 'msg'); |
| 251 expect(refactoringStatus.entryWithHighestSeverity.context, context); | 215 expect(refactoringStatus.problem.location.file, '/test.dart'); |
| 252 } | 216 } |
| 253 | 217 |
| 254 void test_newFatalError() { | 218 void test_newFatalError() { |
| 255 RefactoringStatus refactoringStatus = new RefactoringStatus.fatal('msg'); | 219 RefactoringStatus refactoringStatus = new RefactoringStatus.fatal('msg'); |
| 256 expect(refactoringStatus.severity, RefactoringStatusSeverity.FATAL); | 220 expect(refactoringStatus.severity, RefactoringProblemSeverity.FATAL); |
| 257 expect(refactoringStatus.message, 'msg'); | 221 expect(refactoringStatus.message, 'msg'); |
| 258 } | 222 } |
| 259 | 223 |
| 260 void test_newWarning() { | 224 void test_newWarning() { |
| 261 RefactoringStatus refactoringStatus = new RefactoringStatus.warning('msg'); | 225 RefactoringStatus refactoringStatus = new RefactoringStatus.warning('msg'); |
| 262 expect(refactoringStatus.severity, RefactoringStatusSeverity.WARNING); | 226 expect(refactoringStatus.severity, RefactoringProblemSeverity.WARNING); |
| 263 expect(refactoringStatus.message, 'msg'); | 227 expect(refactoringStatus.message, 'msg'); |
| 264 } | 228 } |
| 265 } | 229 } |
| 266 | |
| 267 | |
| 268 class _MockRefactoringStatusContext extends TypedMock implements | |
| 269 RefactoringStatusContext { | |
| 270 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | |
| 271 } | |
| OLD | NEW |