4a2adf5734
Fix #38792. Change-Id: I6fc98538f75ed03612cd25ba4f0c12054819a3fd Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121406 Reviewed-by: Alexander Thomas <athom@google.com> Commit-Queue: Alexander Thomas <athom@google.com> Auto-Submit: Bob Nystrom <rnystrom@google.com>
762 lines
25 KiB
Dart
762 lines
25 KiB
Dart
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
import 'package:expect/expect.dart';
|
|
|
|
import 'package:test_runner/src/static_error.dart';
|
|
|
|
void main() {
|
|
testFlags();
|
|
testIsSpecifiedFor();
|
|
testCompareTo();
|
|
testDescribeDifferences();
|
|
testSimplify();
|
|
testValidate();
|
|
}
|
|
|
|
void testFlags() {
|
|
var unspecified = StaticError(
|
|
line: 1,
|
|
column: 2,
|
|
length: 3,
|
|
code: "unspecified",
|
|
message: "unspecified");
|
|
var unspecifiedAnalyzer =
|
|
StaticError(line: 1, column: 2, length: 3, code: "unspecified");
|
|
var unspecifiedCfe =
|
|
StaticError(line: 1, column: 2, length: 3, message: "unspecified");
|
|
var noLength = StaticError(line: 1, column: 2, code: "E.CODE");
|
|
var analyzer = StaticError(line: 1, column: 2, length: 3, code: "E.CODE");
|
|
var cfe = StaticError(line: 1, column: 2, length: 3, message: "E.");
|
|
var both =
|
|
StaticError(line: 1, column: 2, length: 3, code: "E.CODE", message: "E.");
|
|
|
|
// isAnalyzer.
|
|
Expect.isTrue(unspecified.isAnalyzer);
|
|
Expect.isTrue(unspecifiedAnalyzer.isAnalyzer);
|
|
Expect.isFalse(unspecifiedCfe.isAnalyzer);
|
|
Expect.isTrue(noLength.isAnalyzer);
|
|
Expect.isTrue(analyzer.isAnalyzer);
|
|
Expect.isFalse(cfe.isAnalyzer);
|
|
Expect.isTrue(both.isAnalyzer);
|
|
|
|
// isCfe.
|
|
Expect.isTrue(unspecified.isCfe);
|
|
Expect.isFalse(unspecifiedAnalyzer.isCfe);
|
|
Expect.isTrue(unspecifiedCfe.isCfe);
|
|
Expect.isFalse(noLength.isCfe);
|
|
Expect.isFalse(analyzer.isCfe);
|
|
Expect.isTrue(cfe.isCfe);
|
|
Expect.isTrue(both.isCfe);
|
|
}
|
|
|
|
void testIsSpecifiedFor() {
|
|
var specifiedBoth = StaticError(
|
|
line: 1, column: 2, length: 3, code: "ERR.CODE", message: "Message.");
|
|
var unspecifiedBoth = StaticError(
|
|
line: 1,
|
|
column: 2,
|
|
length: 3,
|
|
code: "unspecified",
|
|
message: "unspecified");
|
|
var specifiedAnalyzer = StaticError(
|
|
line: 1, column: 2, length: 3, code: "ERR.CODE", message: "unspecified");
|
|
var specifiedCfe = StaticError(
|
|
line: 1, column: 2, length: 3, code: "unspecified", message: "Message.");
|
|
|
|
var specifiedAnalyzerOnly =
|
|
StaticError(line: 1, column: 2, length: 3, code: "ERR.CODE");
|
|
var specifiedCfeOnly =
|
|
StaticError(line: 1, column: 2, length: 3, message: "Message.");
|
|
|
|
var unspecifiedAnalyzerOnly =
|
|
StaticError(line: 1, column: 2, length: 3, code: "unspecified");
|
|
var unspecifiedCfeOnly =
|
|
StaticError(line: 1, column: 2, length: 3, message: "unspecified");
|
|
|
|
var analyzer = StaticError(line: 1, column: 2, length: 3, code: "E.CODE");
|
|
var cfe = StaticError(line: 1, column: 2, length: 3, message: "E.");
|
|
|
|
// isSpecifiedFor().
|
|
Expect.isTrue(specifiedBoth.isSpecifiedFor(analyzer));
|
|
Expect.isTrue(specifiedBoth.isSpecifiedFor(cfe));
|
|
|
|
Expect.isFalse(unspecifiedBoth.isSpecifiedFor(analyzer));
|
|
Expect.isFalse(unspecifiedBoth.isSpecifiedFor(cfe));
|
|
|
|
Expect.isTrue(specifiedAnalyzer.isSpecifiedFor(analyzer));
|
|
Expect.isFalse(specifiedAnalyzer.isSpecifiedFor(cfe));
|
|
|
|
Expect.isFalse(specifiedCfe.isSpecifiedFor(analyzer));
|
|
Expect.isTrue(specifiedCfe.isSpecifiedFor(cfe));
|
|
|
|
Expect.isTrue(specifiedAnalyzerOnly.isSpecifiedFor(analyzer));
|
|
Expect.isFalse(specifiedAnalyzerOnly.isSpecifiedFor(cfe));
|
|
|
|
Expect.isFalse(specifiedCfeOnly.isSpecifiedFor(analyzer));
|
|
Expect.isTrue(specifiedCfeOnly.isSpecifiedFor(cfe));
|
|
|
|
Expect.isFalse(unspecifiedAnalyzerOnly.isSpecifiedFor(analyzer));
|
|
Expect.isFalse(unspecifiedAnalyzerOnly.isSpecifiedFor(cfe));
|
|
|
|
Expect.isFalse(unspecifiedCfeOnly.isSpecifiedFor(analyzer));
|
|
Expect.isFalse(unspecifiedCfeOnly.isSpecifiedFor(cfe));
|
|
}
|
|
|
|
void testCompareTo() {
|
|
var errors = [
|
|
// Order by line.
|
|
StaticError(line: 1, column: 2, length: 2, code: "E.CODE", message: "E."),
|
|
StaticError(line: 2, column: 1, length: 1, code: "E.CODE", message: "E."),
|
|
|
|
// Then column.
|
|
StaticError(line: 3, column: 1, length: 2, code: "E.CODE", message: "E."),
|
|
StaticError(
|
|
line: 3, column: 2, length: 1, code: "Error.CODE", message: "E."),
|
|
|
|
// Then length.
|
|
StaticError(line: 4, column: 1, length: 1, code: "Z.CODE", message: "Z."),
|
|
StaticError(line: 4, column: 1, length: 2, code: "A.CODE", message: "A."),
|
|
|
|
// Then code.
|
|
StaticError(line: 5, column: 1, length: 1, message: "Z."),
|
|
StaticError(line: 5, column: 1, length: 1, code: "A.CODE", message: "Z."),
|
|
StaticError(line: 5, column: 1, length: 1, code: "Z.CODE", message: "Z."),
|
|
|
|
// Then message.
|
|
StaticError(line: 6, column: 1, length: 1, code: "E.CODE"),
|
|
StaticError(line: 6, column: 1, length: 1, code: "E.CODE", message: "A."),
|
|
StaticError(line: 6, column: 1, length: 1, code: "E.CODE", message: "Z."),
|
|
];
|
|
|
|
// Every pair of errors in the array should be ordered correctly.
|
|
for (var i = 0; i < errors.length; i++) {
|
|
for (var j = 0; j < errors.length; j++) {
|
|
var expected = (i - j).sign;
|
|
Expect.equals(expected, errors[i].compareTo(errors[j]),
|
|
"Expected $expected comparison for:\n${errors[i]}\n${errors[j]}");
|
|
}
|
|
}
|
|
}
|
|
|
|
void testDescribeDifferences() {
|
|
var precise = StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 4,
|
|
code: "Error.CODE",
|
|
message: "Error message.");
|
|
|
|
// Perfect match.
|
|
expectNoDifferences(
|
|
precise,
|
|
StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 4,
|
|
code: "Error.CODE",
|
|
message: "Error message."));
|
|
|
|
// Ignore null code.
|
|
expectNoDifferences(
|
|
StaticError(line: 2, column: 3, length: 4, message: "Error message."),
|
|
StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 4,
|
|
code: "Error.CODE",
|
|
message: "Error message."));
|
|
expectNoDifferences(
|
|
StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 4,
|
|
code: "Error.CODE",
|
|
message: "Error message."),
|
|
StaticError(line: 2, column: 3, length: 4, message: "Error message."));
|
|
|
|
// Ignore null message.
|
|
expectNoDifferences(
|
|
StaticError(line: 2, column: 3, length: 4, code: "Error.CODE"),
|
|
StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 4,
|
|
code: "Error.CODE",
|
|
message: "Error message."));
|
|
expectNoDifferences(
|
|
StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 4,
|
|
code: "Error.CODE",
|
|
message: "Error message."),
|
|
StaticError(line: 2, column: 3, length: 4, code: "Error.CODE"));
|
|
|
|
// Different line.
|
|
expectDifferences(
|
|
precise,
|
|
StaticError(
|
|
line: 4,
|
|
column: 3,
|
|
length: 4,
|
|
code: "Error.CODE",
|
|
message: "Error message."),
|
|
"""
|
|
Expected on line 2 but was on 4.
|
|
""");
|
|
|
|
// Different column.
|
|
expectDifferences(
|
|
precise,
|
|
StaticError(
|
|
line: 2,
|
|
column: 5,
|
|
length: 4,
|
|
code: "Error.CODE",
|
|
message: "Error message."),
|
|
"""
|
|
Expected on column 3 but was on 5.
|
|
""");
|
|
|
|
// Different length.
|
|
expectDifferences(
|
|
precise,
|
|
StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 6,
|
|
code: "Error.CODE",
|
|
message: "Error message."),
|
|
"""
|
|
Expected length 4 but was 6.
|
|
""");
|
|
|
|
// Different code.
|
|
expectDifferences(
|
|
precise,
|
|
StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 4,
|
|
code: "Weird.ERROR",
|
|
message: "Error message."),
|
|
"""
|
|
Expected error code Error.CODE but was Weird.ERROR.
|
|
""");
|
|
|
|
// Different message.
|
|
expectDifferences(
|
|
precise,
|
|
StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 4,
|
|
code: "Error.CODE",
|
|
message: "Funny story."),
|
|
"""
|
|
Expected error message 'Error message.' but was 'Funny story.'.
|
|
""");
|
|
|
|
// Multiple differences.
|
|
expectDifferences(
|
|
precise,
|
|
StaticError(
|
|
line: 4,
|
|
column: 3,
|
|
length: 6,
|
|
code: "Weird.ERROR",
|
|
message: "Error message."),
|
|
"""
|
|
Expected on line 2 but was on 4.
|
|
Expected length 4 but was 6.
|
|
Expected error code Error.CODE but was Weird.ERROR.
|
|
""");
|
|
|
|
// Unspecified errors.
|
|
var unspecified = StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 4,
|
|
code: "unspecified",
|
|
message: "unspecified");
|
|
var specifiedAnalyzer = StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 4,
|
|
code: "Error.CODE",
|
|
message: "unspecified");
|
|
var specifiedCfe = StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 4,
|
|
code: "unspecified",
|
|
message: "Error message.");
|
|
|
|
// Matches if line is right.
|
|
expectNoDifferences(
|
|
unspecified,
|
|
StaticError(
|
|
line: 2,
|
|
column: 3,
|
|
length: 4,
|
|
code: "Error.CODE",
|
|
message: "Error message."));
|
|
|
|
// Does not match if lines differ.
|
|
expectDifferences(
|
|
unspecified,
|
|
StaticError(
|
|
line: 3,
|
|
column: 3,
|
|
length: 4,
|
|
code: "Weird.ERROR",
|
|
message: "Error message."),
|
|
"""
|
|
Expected on line 2 but was on 3.
|
|
""");
|
|
|
|
// Ignores differences in other fields.
|
|
expectNoDifferences(
|
|
unspecified,
|
|
StaticError(
|
|
line: 2,
|
|
column: 333,
|
|
length: 4444,
|
|
code: "Different.CODE",
|
|
message: "Different message."));
|
|
|
|
// If error is specified on analyzer, must match fields when actual is
|
|
// analyzer error.
|
|
expectDifferences(specifiedAnalyzer,
|
|
StaticError(line: 2, column: 5, length: 6, code: "Weird.ERROR"), """
|
|
Expected on column 3 but was on 5.
|
|
Expected length 4 but was 6.
|
|
Expected error code Error.CODE but was Weird.ERROR.
|
|
""");
|
|
expectNoDifferences(specifiedAnalyzer,
|
|
StaticError(line: 2, column: 333, length: 444, message: "Message."));
|
|
expectNoDifferences(specifiedAnalyzer,
|
|
StaticError(line: 2, column: 3, length: 4, code: "Error.CODE"));
|
|
|
|
// If error is specified on CFE, must match fields when actual is
|
|
// CFE error.
|
|
expectDifferences(
|
|
specifiedCfe,
|
|
StaticError(line: 2, column: 5, length: 6, message: "Different message."),
|
|
"""
|
|
Expected on column 3 but was on 5.
|
|
Expected length 4 but was 6.
|
|
Expected error message 'Error message.' but was 'Different message.'.
|
|
""");
|
|
expectNoDifferences(specifiedCfe,
|
|
StaticError(line: 2, column: 333, length: 444, code: "Error.CODE."));
|
|
expectNoDifferences(specifiedCfe,
|
|
StaticError(line: 2, column: 3, length: 4, message: "Error message."));
|
|
}
|
|
|
|
void testSimplify() {
|
|
// Merges errors if one has only a code and the only a message.
|
|
expectSimplify([
|
|
StaticError(line: 1, column: 2, length: 3, code: "Weird.ERROR"),
|
|
StaticError(line: 1, column: 2, length: 3, message: "Message.")
|
|
], [
|
|
StaticError(
|
|
line: 1, column: 2, length: 3, code: "Weird.ERROR", message: "Message.")
|
|
]);
|
|
|
|
// Merges if length is null.
|
|
expectSimplify([
|
|
StaticError(line: 1, column: 1, code: "A.ERR"),
|
|
StaticError(line: 1, column: 1, length: 3, message: "A."),
|
|
StaticError(line: 2, column: 1, length: 4, code: "B.ERR"),
|
|
StaticError(line: 2, column: 1, message: "B."),
|
|
StaticError(line: 3, column: 1, code: "C.ERR"),
|
|
StaticError(line: 3, column: 1, message: "C."),
|
|
], [
|
|
StaticError(line: 1, column: 1, length: 3, code: "A.ERR", message: "A."),
|
|
StaticError(line: 2, column: 1, length: 4, code: "B.ERR", message: "B."),
|
|
StaticError(line: 3, column: 1, code: "C.ERR", message: "C."),
|
|
]);
|
|
|
|
// Merges multiple errors with no length with errors that have length.
|
|
expectSimplify([
|
|
StaticError(line: 1, column: 2, length: 3, code: "ERROR.A"),
|
|
StaticError(line: 1, column: 4, length: 3, code: "ERROR.C"),
|
|
StaticError(line: 1, column: 2, length: 5, code: "ERROR.B"),
|
|
StaticError(line: 1, column: 2, message: "One."),
|
|
StaticError(line: 1, column: 4, message: "Three."),
|
|
StaticError(line: 1, column: 2, message: "Two."),
|
|
], [
|
|
StaticError(
|
|
line: 1, column: 2, length: 3, code: "ERROR.A", message: "One."),
|
|
StaticError(
|
|
line: 1, column: 2, length: 5, code: "ERROR.B", message: "Two."),
|
|
StaticError(
|
|
line: 1, column: 4, length: 3, code: "ERROR.C", message: "Three."),
|
|
]);
|
|
|
|
// Merges even if not adjacent in input array.
|
|
expectSimplify([
|
|
StaticError(line: 1, column: 2, length: 3, code: "Some.ERROR"),
|
|
StaticError(line: 10, column: 2, length: 3, code: "Other.ERROR"),
|
|
StaticError(line: 1, column: 2, length: 3, message: "Message.")
|
|
], [
|
|
StaticError(
|
|
line: 1, column: 2, length: 3, code: "Some.ERROR", message: "Message."),
|
|
StaticError(line: 10, column: 2, length: 3, code: "Other.ERROR")
|
|
]);
|
|
|
|
// Does not merge if positions differ.
|
|
expectSimplify([
|
|
StaticError(line: 1, column: 1, length: 1, code: "A.ERR"),
|
|
StaticError(line: 2, column: 1, length: 1, message: "A."),
|
|
], [
|
|
StaticError(line: 1, column: 1, length: 1, code: "A.ERR"),
|
|
StaticError(line: 2, column: 1, length: 1, message: "A."),
|
|
]);
|
|
expectSimplify([
|
|
StaticError(line: 1, column: 1, length: 1, code: "A.ERR"),
|
|
StaticError(line: 1, column: 2, length: 1, message: "A."),
|
|
], [
|
|
StaticError(line: 1, column: 1, length: 1, code: "A.ERR"),
|
|
StaticError(line: 1, column: 2, length: 1, message: "A."),
|
|
]);
|
|
expectSimplify([
|
|
StaticError(line: 1, column: 1, length: 1, code: "A.ERR"),
|
|
StaticError(line: 1, column: 1, length: 2, message: "A."),
|
|
], [
|
|
StaticError(line: 1, column: 1, length: 1, code: "A.ERR"),
|
|
StaticError(line: 1, column: 1, length: 2, message: "A."),
|
|
]);
|
|
|
|
// Does not merge if it would lose code or message.
|
|
expectSimplify([
|
|
StaticError(line: 1, column: 1, length: 1, code: "ERR.ONE"),
|
|
StaticError(line: 1, column: 1, length: 1, code: "ERR.TWO"),
|
|
StaticError(line: 2, column: 1, length: 1, message: "One."),
|
|
StaticError(line: 2, column: 1, length: 1, message: "Two."),
|
|
], [
|
|
StaticError(line: 1, column: 1, length: 1, code: "ERR.ONE"),
|
|
StaticError(line: 1, column: 1, length: 1, code: "ERR.TWO"),
|
|
StaticError(line: 2, column: 1, length: 1, message: "One."),
|
|
StaticError(line: 2, column: 1, length: 1, message: "Two."),
|
|
]);
|
|
|
|
// Orders output.
|
|
expectSimplify([
|
|
StaticError(line: 2, column: 1, length: 1, message: "Two."),
|
|
StaticError(line: 3, column: 1, length: 1, message: "Three."),
|
|
StaticError(line: 1, column: 1, length: 1, message: "One."),
|
|
], [
|
|
StaticError(line: 1, column: 1, length: 1, message: "One."),
|
|
StaticError(line: 2, column: 1, length: 1, message: "Two."),
|
|
StaticError(line: 3, column: 1, length: 1, message: "Three."),
|
|
]);
|
|
}
|
|
|
|
void testValidate() {
|
|
// No errors.
|
|
expectValidate([], [], null);
|
|
|
|
// Same errors.
|
|
expectValidate([
|
|
StaticError(line: 1, column: 2, length: 3, code: "ERR.A", message: "One."),
|
|
StaticError(line: 2, column: 2, length: 3, code: "ERR.B", message: "Two."),
|
|
StaticError(line: 3, column: 2, length: 3, code: "ERR.C", message: "Tres."),
|
|
], [
|
|
// Order doesn't matter.
|
|
StaticError(line: 3, column: 2, length: 3, code: "ERR.C", message: "Tres."),
|
|
StaticError(line: 1, column: 2, length: 3, code: "ERR.A", message: "One."),
|
|
StaticError(line: 2, column: 2, length: 3, code: "ERR.B", message: "Two."),
|
|
], null);
|
|
|
|
// Ignore fields that aren't in actual errors.
|
|
expectValidate([
|
|
StaticError(line: 1, column: 2, length: 3, code: "ERR.A", message: "One."),
|
|
StaticError(line: 2, column: 2, length: 3, code: "ERR.B", message: "Two."),
|
|
StaticError(line: 3, column: 2, length: 3, code: "ERR.C", message: "Tres."),
|
|
], [
|
|
StaticError(line: 1, column: 2, code: "ERR.A", message: "One."),
|
|
StaticError(line: 2, column: 2, length: 3, message: "Two."),
|
|
StaticError(line: 3, column: 2, length: 3, code: "ERR.C"),
|
|
], null);
|
|
|
|
// Catches differences in any field.
|
|
expectValidate([
|
|
StaticError(line: 1, column: 2, length: 3, code: "ERR.A", message: "One."),
|
|
StaticError(line: 2, column: 2, length: 3, code: "ERR.B", message: "Two."),
|
|
StaticError(line: 3, column: 2, length: 3, code: "ERR.C", message: "Tres."),
|
|
StaticError(line: 4, column: 2, length: 3, code: "ERR.D", message: "Four."),
|
|
], [
|
|
StaticError(line: 1, column: 9, length: 3, code: "ERR.A", message: "One."),
|
|
StaticError(line: 2, column: 2, length: 9, code: "ERR.B", message: "Two."),
|
|
StaticError(line: 3, column: 2, length: 3, code: "ERR.Z", message: "Tres."),
|
|
StaticError(line: 4, column: 2, length: 3, code: "ERR.D", message: "Zzz."),
|
|
], """
|
|
Wrong static error at line 1, column 2, length 3:
|
|
- Expected on column 2 but was on 9.
|
|
|
|
Wrong static error at line 2, column 2, length 3:
|
|
- Expected length 3 but was 9.
|
|
|
|
Wrong static error at line 3, column 2, length 3:
|
|
- Expected error code ERR.C but was ERR.Z.
|
|
|
|
Wrong static error at line 4, column 2, length 3:
|
|
- Expected error message 'Four.' but was 'Zzz.'.""");
|
|
|
|
// Unexpected errors.
|
|
expectValidate([
|
|
StaticError(line: 2, column: 2, length: 3, code: "ERR.A", message: "One."),
|
|
StaticError(line: 4, column: 2, length: 3, code: "ERR.B", message: "Two."),
|
|
StaticError(line: 6, column: 2, length: 3, code: "ERR.C", message: "Tres."),
|
|
], [
|
|
StaticError(line: 1, column: 2, length: 3, code: "ERR.W", message: "1."),
|
|
StaticError(line: 2, column: 2, length: 3, code: "ERR.A", message: "One."),
|
|
StaticError(line: 3, column: 2, length: 3, code: "ERR.X", message: "3."),
|
|
StaticError(line: 4, column: 2, length: 3, code: "ERR.B", message: "Two."),
|
|
StaticError(line: 5, column: 2, length: 3, code: "ERR.Y", message: "5."),
|
|
StaticError(line: 6, column: 2, length: 3, code: "ERR.C", message: "Tres."),
|
|
StaticError(line: 7, column: 2, length: 3, code: "ERR.Z", message: "7."),
|
|
], """
|
|
Unexpected static error at line 1, column 2, length 3:
|
|
- Had error code ERR.W.
|
|
- Had error message '1.'.
|
|
|
|
Unexpected static error at line 3, column 2, length 3:
|
|
- Had error code ERR.X.
|
|
- Had error message '3.'.
|
|
|
|
Unexpected static error at line 5, column 2, length 3:
|
|
- Had error code ERR.Y.
|
|
- Had error message '5.'.
|
|
|
|
Unexpected static error at line 7, column 2, length 3:
|
|
- Had error code ERR.Z.
|
|
- Had error message '7.'.""");
|
|
|
|
// Missing errors.
|
|
expectValidate([
|
|
StaticError(line: 1, column: 2, length: 3, code: "ERR.A", message: "1."),
|
|
StaticError(line: 2, column: 2, length: 3, code: "ERR.B", message: "2."),
|
|
StaticError(line: 3, column: 2, length: 3, code: "ERR.C", message: "3."),
|
|
StaticError(line: 4, column: 2, length: 3, code: "ERR.D", message: "4."),
|
|
StaticError(line: 5, column: 2, length: 3, code: "ERR.E", message: "5."),
|
|
StaticError(line: 6, column: 2, length: 3, code: "ERR.F", message: "6."),
|
|
StaticError(line: 7, column: 2, length: 3, code: "ERR.G", message: "7."),
|
|
], [
|
|
StaticError(line: 2, column: 2, length: 3, code: "ERR.B", message: "2."),
|
|
StaticError(line: 4, column: 2, length: 3, code: "ERR.D", message: "4."),
|
|
StaticError(line: 6, column: 2, length: 3, code: "ERR.F", message: "6."),
|
|
], """
|
|
Missing static error at line 1, column 2, length 3:
|
|
- Expected error code ERR.A.
|
|
- Expected error message '1.'.
|
|
|
|
Missing static error at line 3, column 2, length 3:
|
|
- Expected error code ERR.C.
|
|
- Expected error message '3.'.
|
|
|
|
Missing static error at line 5, column 2, length 3:
|
|
- Expected error code ERR.E.
|
|
- Expected error message '5.'.
|
|
|
|
Missing static error at line 7, column 2, length 3:
|
|
- Expected error code ERR.G.
|
|
- Expected error message '7.'.""");
|
|
|
|
// Unspecified errors.
|
|
expectValidate([
|
|
// Missing.
|
|
StaticError(line: 1, column: 2, length: 3, code: "unspecified"),
|
|
StaticError(line: 2, column: 2, length: 3, message: "unspecified"),
|
|
StaticError(
|
|
line: 3,
|
|
column: 2,
|
|
length: 3,
|
|
code: "unspecified",
|
|
message: "unspecified"),
|
|
|
|
// Right.
|
|
StaticError(line: 4, column: 2, length: 3, code: "unspecified"),
|
|
StaticError(line: 5, column: 2, length: 3, message: "unspecified"),
|
|
StaticError(
|
|
line: 6,
|
|
column: 2,
|
|
length: 3,
|
|
code: "unspecified",
|
|
message: "unspecified"),
|
|
], [
|
|
StaticError(line: 4, column: 2, length: 3, code: "ACT.UAL"),
|
|
StaticError(line: 5, column: 2, length: 3, message: "Actual."),
|
|
StaticError(
|
|
line: 6, column: 2, length: 3, code: "ACT.UAL", message: "Actual."),
|
|
|
|
// Unexpected.
|
|
StaticError(line: 7, column: 9, length: 3, code: "ACT.UAL"),
|
|
], """
|
|
Missing static error at line 1, column 2, length 3:
|
|
- Expected unspecified error code.
|
|
|
|
Missing static error at line 2, column 2, length 3:
|
|
- Expected unspecified error message.
|
|
|
|
Missing static error at line 3, column 2, length 3:
|
|
- Expected unspecified error code.
|
|
- Expected unspecified error message.
|
|
|
|
Unexpected static error at line 7, column 9, length 3:
|
|
- Had error code ACT.UAL.""");
|
|
|
|
// Unspecified errors can match multiple errors on the same line.
|
|
|
|
// Unspecified CFE-only error.
|
|
expectValidate([
|
|
StaticError(line: 2, column: 2, length: 3, message: "unspecified"),
|
|
], [
|
|
StaticError(line: 2, column: 1, length: 3, message: "Actual 1."),
|
|
StaticError(line: 2, column: 2, length: 3, message: "Actual 2."),
|
|
StaticError(line: 2, column: 3, length: 3, message: "Actual 3."),
|
|
], null);
|
|
|
|
// Unspecified on both.
|
|
expectValidate([
|
|
StaticError(
|
|
line: 2,
|
|
column: 2,
|
|
length: 3,
|
|
code: "unspecified",
|
|
message: "unspecified"),
|
|
], [
|
|
StaticError(line: 2, column: 1, length: 3, message: "Actual 1."),
|
|
StaticError(line: 2, column: 2, length: 3, message: "Actual 2."),
|
|
StaticError(line: 2, column: 3, length: 3, message: "Actual 3."),
|
|
], null);
|
|
|
|
// Unspecified on CFE, specified on analyzer.
|
|
expectValidate([
|
|
StaticError(
|
|
line: 2,
|
|
column: 2,
|
|
length: 3,
|
|
code: "ERR.CODE",
|
|
message: "unspecified"),
|
|
], [
|
|
StaticError(line: 2, column: 1, length: 3, message: "Actual 1."),
|
|
StaticError(line: 2, column: 2, length: 3, message: "Actual 2."),
|
|
StaticError(line: 2, column: 3, length: 3, message: "Actual 3."),
|
|
], null);
|
|
|
|
// Specified on CFE, unspecified on analyzer.
|
|
expectValidate([
|
|
StaticError(
|
|
line: 2,
|
|
column: 1,
|
|
length: 3,
|
|
code: "unspecified",
|
|
message: "Actual 1."),
|
|
], [
|
|
// These are not matched.
|
|
StaticError(line: 2, column: 1, length: 3, message: "Actual 1."),
|
|
StaticError(line: 2, column: 2, length: 3, message: "Actual 2."),
|
|
StaticError(line: 2, column: 3, length: 3, message: "Actual 3."),
|
|
], """
|
|
Unexpected static error at line 2, column 2, length 3:
|
|
- Had error message 'Actual 2.'.
|
|
|
|
Unexpected static error at line 2, column 3, length 3:
|
|
- Had error message 'Actual 3.'.""");
|
|
|
|
// Unspecified analyzer-only error.
|
|
expectValidate([
|
|
StaticError(line: 2, column: 1, length: 3, code: "unspecified"),
|
|
], [
|
|
StaticError(line: 2, column: 1, length: 3, code: "ERR.CODE1"),
|
|
StaticError(line: 2, column: 2, length: 3, code: "ERR.CODE2"),
|
|
StaticError(line: 2, column: 3, length: 3, code: "ERR.CODE3"),
|
|
], null);
|
|
|
|
// Unspecified on both.
|
|
expectValidate([
|
|
StaticError(
|
|
line: 2,
|
|
column: 1,
|
|
length: 3,
|
|
code: "unspecified",
|
|
message: "unspecified"),
|
|
], [
|
|
StaticError(line: 2, column: 1, length: 3, code: "ERR.CODE1"),
|
|
StaticError(line: 2, column: 2, length: 3, code: "ERR.CODE2"),
|
|
StaticError(line: 2, column: 3, length: 3, code: "ERR.CODE3"),
|
|
], null);
|
|
|
|
// Unspecified on analyzer, specified on CFE.
|
|
expectValidate([
|
|
StaticError(
|
|
line: 2,
|
|
column: 1,
|
|
length: 3,
|
|
code: "unspecified",
|
|
message: "Message."),
|
|
], [
|
|
StaticError(line: 2, column: 1, length: 3, code: "ERR.CODE1"),
|
|
StaticError(line: 2, column: 2, length: 3, code: "ERR.CODE2"),
|
|
StaticError(line: 2, column: 3, length: 3, code: "ERR.CODE3"),
|
|
], null);
|
|
|
|
// Specified on analyzer, unspecified on CFE.
|
|
expectValidate([
|
|
StaticError(
|
|
line: 2,
|
|
column: 1,
|
|
length: 3,
|
|
code: "ERR.CODE1",
|
|
message: "unspecified"),
|
|
], [
|
|
// These are not matched.
|
|
StaticError(line: 2, column: 1, length: 3, code: "ERR.CODE1"),
|
|
StaticError(line: 2, column: 2, length: 3, code: "ERR.CODE2"),
|
|
StaticError(line: 2, column: 3, length: 3, code: "ERR.CODE3"),
|
|
], """
|
|
Unexpected static error at line 2, column 2, length 3:
|
|
- Had error code ERR.CODE2.
|
|
|
|
Unexpected static error at line 2, column 3, length 3:
|
|
- Had error code ERR.CODE3.""");
|
|
}
|
|
|
|
void expectNoDifferences(StaticError expectedError, StaticError actualError) {
|
|
var actualLines = expectedError.describeDifferences(actualError);
|
|
if (actualLines != null) {
|
|
Expect.fail("Expected no differences, but got:\n${actualLines.join('\n')}");
|
|
}
|
|
}
|
|
|
|
void expectDifferences(StaticError expectedError, StaticError actualError,
|
|
String expectedDifferences) {
|
|
var expectedLines = expectedDifferences
|
|
.split("\n")
|
|
.map((line) => line.trim())
|
|
.where((line) => line.isNotEmpty)
|
|
.toList();
|
|
var actualLines = expectedError.describeDifferences(actualError);
|
|
if (actualLines == null) {
|
|
Expect.fail("Got no differences, but expected:\n$expectedDifferences");
|
|
}
|
|
Expect.listEquals(expectedLines, actualLines);
|
|
}
|
|
|
|
void expectSimplify(List<StaticError> input, List<StaticError> expected) {
|
|
var actual = StaticError.simplify(input);
|
|
Expect.listEquals(expected.map((error) => error.toString()).toList(),
|
|
actual.map((error) => error.toString()).toList());
|
|
}
|
|
|
|
void expectValidate(List<StaticError> expected, List<StaticError> actual,
|
|
String expectedValidation) {
|
|
var actualValidation = StaticError.validateExpectations(expected, actual);
|
|
Expect.stringEquals(expectedValidation, actualValidation);
|
|
}
|