blob: 806e0770d4f2874e99d77a215a8503afa4c77365 [file] [log] [blame]
// 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();
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 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.""");
}
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);
}