Skip to content

Commit d127fe9

Browse files
fix: improve AutoTestLintOffsets reliability
handles edge cases when there are multiple similar code fragments
1 parent e0d856f commit d127fe9

1 file changed

Lines changed: 41 additions & 9 deletions

File tree

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,55 @@
11
import 'package:analyzer_testing/analysis_rule/analysis_rule.dart';
2+
import 'package:analyzer_testing/src/analysis_rule/pub_package_resolution.dart';
3+
import 'package:collection/collection.dart';
24

35
mixin AutoTestLintOffsets on AnalysisRuleTest {
4-
List<String> _expectedCodeFragments = [];
6+
int _nextPlaceholderId = 0;
7+
final Map<String, String> _placeholderToCode = {};
58

69
Future<void> assertAutoDiagnostics(String source) async {
710
try {
8-
final expectedDiagnostics = [
9-
for (final codeFragment in _expectedCodeFragments)
10-
lint(source.indexOf(codeFragment), codeFragment.length),
11-
];
11+
final placeholders = _placeholderToCode.entries
12+
.map(
13+
(entry) => (
14+
placeholder: entry.key,
15+
code: entry.value,
16+
index: source.indexOf(entry.key),
17+
),
18+
)
19+
.sorted((a, b) => a.index.compareTo(b.index));
1220

13-
await assertDiagnostics(source, expectedDiagnostics);
21+
final expectedDiagnostics = <ExpectedDiagnostic>[];
22+
int replacedPlaceholdersDelta = 0;
23+
24+
for (final match in placeholders) {
25+
if (match.index == -1) {
26+
throw StateError(
27+
'Expected lint placeholder "${match.placeholder}" was not found in source.',
28+
);
29+
}
30+
31+
expectedDiagnostics.add(
32+
lint(match.index + replacedPlaceholdersDelta, match.code.length),
33+
);
34+
replacedPlaceholdersDelta +=
35+
match.code.length - match.placeholder.length;
36+
}
37+
38+
final resolvedSource = _placeholderToCode.entries.fold(
39+
source,
40+
(resolved, entry) => resolved.replaceFirst(entry.key, entry.value),
41+
);
42+
43+
await assertDiagnostics(resolvedSource, expectedDiagnostics);
1444
} finally {
15-
_expectedCodeFragments = [];
45+
_nextPlaceholderId = 0;
46+
_placeholderToCode.clear();
1647
}
1748
}
1849

1950
String expectLint(String code) {
20-
_expectedCodeFragments.add(code);
21-
return code;
51+
final placeholder = '__AUTO_TEST_LINT_${_nextPlaceholderId++}__';
52+
_placeholderToCode[placeholder] = code;
53+
return placeholder;
2254
}
2355
}

0 commit comments

Comments
 (0)