blob: b50a47127aebaae65fcb2b716ff79e16df5e4630 [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';
import 'utils.dart';
void main() {
testProperties();
testIsWarning();
testCompareTo();
testValidate();
}
void testProperties() {
var analyzer = StaticError(ErrorSource.analyzer, "E.CODE",
line: 1, column: 2, length: 3, sourceLines: {1, 3, 5});
Expect.equals(analyzer.source, ErrorSource.analyzer);
Expect.equals(analyzer.message, "E.CODE");
Expect.equals(analyzer.line, 1);
Expect.equals(analyzer.column, 2);
Expect.equals(analyzer.length, 3);
Expect.isTrue(analyzer.isSpecified);
Expect.setEquals({1, 3, 5}, analyzer.sourceLines);
var cfe = StaticError(ErrorSource.cfe, "Error.", line: 4, column: 5);
Expect.equals(cfe.source, ErrorSource.cfe);
Expect.equals(cfe.message, "Error.");
Expect.equals(cfe.line, 4);
Expect.equals(cfe.column, 5);
Expect.equals(cfe.length, 0);
Expect.isTrue(cfe.isSpecified);
Expect.isTrue(cfe.sourceLines.isEmpty);
var unspecified =
StaticError(ErrorSource.web, "unspecified", line: 1, column: 2);
Expect.isFalse(unspecified.isSpecified);
}
void testIsWarning() {
// Analyzer only.
Expect.isTrue(
makeError(analyzerError: "STATIC_WARNING.INVALID_OPTION").isWarning);
Expect.isFalse(
makeError(analyzerError: "SYNTACTIC_ERROR.MISSING_FUNCTION_BODY")
.isWarning);
Expect.isFalse(makeError(
analyzerError: "COMPILE_TIME_ERROR.NOT_ENOUGH_POSITIONAL_ARGUMENTS")
.isWarning);
// CFE only.
Expect.isFalse(makeError(cfeError: "Any error message.").isWarning);
// Web only.
Expect.isFalse(makeError(webError: "Any error message.").isWarning);
}
void testCompareTo() {
var errors = [
// Order by line.
makeError(line: 1, column: 2, length: 2, cfeError: "E."),
makeError(line: 2, column: 1, length: 1, cfeError: "E."),
// Then column.
makeError(line: 3, column: 1, length: 2, cfeError: "E."),
makeError(line: 3, column: 2, length: 1, cfeError: "E."),
// Then length.
makeError(line: 4, column: 1, length: 1, cfeError: "Z."),
makeError(line: 4, column: 1, length: 2, cfeError: "A."),
// Then source.
makeError(line: 5, column: 1, length: 1, analyzerError: "Z.CODE"),
makeError(line: 5, column: 1, length: 1, cfeError: "A."),
// Then message.
makeError(line: 6, column: 1, length: 1, cfeError: "A."),
makeError(line: 6, column: 1, length: 1, cfeError: "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 testValidate() {
// No errors.
expectValidate([], [], null);
// Same errors.
expectValidate([
makeError(line: 1, column: 2, length: 3, analyzerError: "ERR.A"),
makeError(line: 2, column: 2, length: 3, analyzerError: "ERR.B"),
makeError(line: 3, column: 2, length: 3, analyzerError: "ERR.C"),
], [
// Order doesn't matter.
makeError(line: 3, column: 2, length: 3, analyzerError: "ERR.C"),
makeError(line: 1, column: 2, length: 3, analyzerError: "ERR.A"),
makeError(line: 2, column: 2, length: 3, analyzerError: "ERR.B"),
], null);
// Catches differences in any field.
expectValidate([
makeError(line: 1, column: 2, length: 3, analyzerError: "ERR.A"),
makeError(line: 2, column: 2, length: 3, analyzerError: "ERR.B"),
makeError(line: 3, column: 2, length: 3, analyzerError: "ERR.C"),
], [
makeError(line: 1, column: 9, length: 3, analyzerError: "ERR.A"),
makeError(line: 2, column: 2, length: 9, analyzerError: "ERR.B"),
makeError(line: 3, column: 2, length: 3, analyzerError: "ERR.Z"),
], """
- Wrong error location line 1, column 2, length 3: ERR.A
Expected column 2 but was column 9.
- Wrong error location line 2, column 2, length 3: ERR.B
Expected length 3 but was length 9.
- Wrong message at line 3, column 2, length 3: ERR.Z
Expected: ERR.C""");
expectValidate([
makeError(line: 4, column: 2, length: 3, cfeError: "Four."),
], [
makeError(line: 4, column: 2, length: 3, cfeError: "Zzz."),
], """
- Wrong message at line 4, column 2, length 3: Zzz.
Expected: Four.""");
expectValidate([
makeError(line: 5, column: 2, length: 3, webError: "Web 5."),
], [
makeError(line: 5, column: 2, length: 3, webError: "Web Z."),
], """
- Wrong message at line 5, column 2, length 3: Web Z.
Expected: Web 5.""");
// Unexpected errors.
expectValidate([
makeError(line: 2, column: 2, length: 3, cfeError: "One."),
makeError(line: 4, column: 2, length: 3, cfeError: "Two."),
makeError(line: 6, column: 2, length: 3, cfeError: "Tres."),
], [
makeError(line: 1, column: 2, length: 3, cfeError: "1."),
makeError(line: 2, column: 2, length: 3, cfeError: "One."),
makeError(line: 3, column: 2, length: 3, cfeError: "3."),
makeError(line: 4, column: 2, length: 3, cfeError: "Two."),
makeError(line: 5, column: 2, length: 3, cfeError: "5."),
makeError(line: 6, column: 2, length: 3, cfeError: "Tres."),
makeError(line: 7, column: 2, length: 3, cfeError: "7."),
], """
- Unexpected error at line 1, column 2, length 3: 1.
- Unexpected error at line 3, column 2, length 3: 3.
- Unexpected error at line 5, column 2, length 3: 5.
- Unexpected error at line 7, column 2, length 3: 7.""");
// Missing errors.
expectValidate([
makeError(line: 1, column: 2, length: 3, analyzerError: "ERR.A"),
makeError(line: 2, column: 2, length: 3, analyzerError: "ERR.B"),
makeError(line: 3, column: 2, length: 3, analyzerError: "ERR.C"),
makeError(line: 4, column: 2, length: 3, analyzerError: "ERR.D"),
makeError(line: 5, column: 2, length: 3, analyzerError: "ERR.E"),
], [
makeError(line: 2, column: 2, length: 3, analyzerError: "ERR.B"),
makeError(line: 4, column: 2, length: 3, analyzerError: "ERR.D"),
], """
- Missing expected error at line 1, column 2, length 3: ERR.A
- Missing expected error at line 3, column 2, length 3: ERR.C
- Missing expected error at line 5, column 2, length 3: ERR.E""");
// Unspecified errors.
expectValidate([
// Missing.
makeError(line: 2, column: 2, length: 3, cfeError: "unspecified"),
// Right.
makeError(line: 6, column: 2, length: 3, cfeError: "unspecified"),
], [
makeError(line: 6, column: 2, length: 3, cfeError: "Actual 1."),
// Unexpected.
makeError(line: 9, column: 9, length: 3, cfeError: "Actual 2."),
], """
- Missing expected unspecified error at line 2, column 2, length 3.
- Unexpected error at line 9, column 9, length 3: Actual 2.""");
// Unspecified errors can match multiple errors on the same line.
expectValidate([
makeError(line: 1, column: 2, length: 3, analyzerError: "unspecified"),
], [
makeError(line: 1, column: 1, length: 3, analyzerError: "ERROR.CODE1"),
makeError(line: 1, column: 2, length: 3, analyzerError: "ERROR.CODE2"),
makeError(line: 1, column: 3, length: 3, analyzerError: "ERROR.CODE3"),
], null);
expectValidate([
makeError(line: 1, column: 2, length: 3, cfeError: "unspecified"),
], [
makeError(line: 1, column: 1, length: 3, cfeError: "Actual 1."),
makeError(line: 1, column: 2, length: 3, cfeError: "Actual 2."),
makeError(line: 1, column: 3, length: 3, cfeError: "Actual 3."),
], null);
expectValidate([
makeError(line: 1, column: 2, length: 3, webError: "unspecified"),
], [
makeError(line: 1, column: 1, length: 3, webError: "Web 1."),
makeError(line: 1, column: 2, length: 3, webError: "Web 2."),
makeError(line: 1, column: 3, length: 3, webError: "Web 3."),
], null);
// Same message.
expectValidate([
makeError(line: 1, column: 2, length: 1, cfeError: "message"),
makeError(line: 2, column: 3, length: 2, cfeError: "message"),
], [
makeError(line: 1, column: 2, length: 1, cfeError: "message"),
makeError(line: 2, column: 3, length: 2, cfeError: "message"),
makeError(line: 3, column: 3, length: 3, cfeError: "message"),
], '- Unexpected error at line 3, column 3, length 3: message');
// Same location.
expectValidate([
makeError(line: 1, column: 2, length: 1, cfeError: "message 1"),
makeError(line: 1, column: 2, length: 1, cfeError: "message 2"),
], [
makeError(line: 1, column: 2, length: 1, cfeError: "wrong 1"),
makeError(line: 1, column: 2, length: 1, cfeError: "wrong 2"),
makeError(line: 1, column: 2, length: 1, cfeError: "wrong 3"),
], '''
- Wrong message at line 1, column 2, length 1: wrong 1
Expected: message 1
- Wrong message at line 1, column 2, length 1: wrong 2
Expected: message 2
- Unexpected error at line 1, column 2, length 1: wrong 3''');
// Prefer match over wrong message.
expectValidate([
makeError(line: 10, column: 1, length: 1, cfeError: "match"),
makeError(line: 10, column: 1, length: 1, cfeError: "a wrong message"),
], [
makeError(line: 1, column: 1, length: 1, cfeError: /* not a */ "match"),
makeError(line: 10, column: 1, length: 1, cfeError: "match"),
], '''
- Missing expected error at line 10, column 1, length 1: a wrong message
- Unexpected error at line 1, column 1, length 1: match''');
// Combined.
expectValidate([
makeError(line: 10, column: 1, length: 1, cfeError: "match"),
makeError(line: 20, column: 2, length: 2, cfeError: "missing"),
makeError(line: 20, column: 2, length: 2, cfeError: "message"),
makeError(line: 30, column: 3, length: 3, cfeError: "wrong location"),
makeError(line: 40, column: 4, length: 4, cfeError: "match"),
], [
makeError(line: 1, column: 2, length: 1, cfeError: "unexpected"),
makeError(line: 10, column: 3, length: 3, cfeError: "wrong location"),
makeError(line: 20, column: 2, length: 2, cfeError: "wrong message"),
makeError(line: 10, column: 1, length: 1, cfeError: "match"),
makeError(line: 40, column: 4, length: 4, cfeError: "match"),
], '''
- Wrong error location line 30, column 3, length 3: wrong location
Expected line 30 but was line 10.
- Wrong message at line 20, column 2, length 2: wrong message
Expected: message
- Missing expected error at line 20, column 2, length 2: missing
- Unexpected error at line 1, column 2, length 1: unexpected''');
// If expectation has context, actual must match it.
expectValidate([
makeError(line: 1, column: 2, length: 3, cfeError: "Error.", context: [
makeError(line: 4, column: 5, length: 6, contextError: "Context A."),
makeError(line: 7, column: 8, length: 9, contextError: "Context B."),
]),
], [
makeError(line: 1, column: 2, length: 3, cfeError: "Error.", context: [
makeError(line: 4, column: 5, length: 6, contextError: "Context A."),
makeError(line: 7, column: 8, length: 9, contextError: "Context B."),
]),
], null);
// Actual context is different.
expectValidate([
makeError(line: 1, column: 2, length: 3, cfeError: "Error.", context: [
makeError(line: 4, column: 5, length: 6, contextError: "Context A."),
]),
], [
makeError(line: 1, column: 2, length: 3, cfeError: "Error.", context: [
makeError(line: 4, column: 5, length: 6, contextError: "Context Z."),
]),
], """
- Wrong context message at line 4, column 5, length 6: Context Z.
Expected: Context A.""");
// Missing some actual context.
expectValidate([
makeError(line: 1, column: 2, length: 3, cfeError: "Error.", context: [
makeError(line: 4, column: 5, length: 6, contextError: "Context A."),
makeError(line: 7, column: 8, length: 9, contextError: "Context B."),
]),
], [
makeError(line: 1, column: 2, length: 3, cfeError: "Error.", context: [
makeError(line: 7, column: 8, length: 9, contextError: "Context B."),
]),
], """
- Missing expected context message at line 4, column 5, length 6: Context A.""");
// Missing all actual context.
expectValidate([
makeError(line: 1, column: 2, length: 3, cfeError: "Error.", context: [
makeError(line: 4, column: 5, length: 6, contextError: "Context A."),
makeError(line: 7, column: 8, length: 9, contextError: "Context B."),
]),
], [
makeError(line: 1, column: 2, length: 3, cfeError: "Error."),
], """
- Missing expected context message at line 4, column 5, length 6: Context A.
- Missing expected context message at line 7, column 8, length 9: Context B.""");
// Unexpected extra actual context.
expectValidate([
makeError(line: 1, column: 2, length: 3, cfeError: "Error.", context: [
makeError(line: 4, column: 5, length: 6, contextError: "Context A."),
]),
], [
makeError(line: 1, column: 2, length: 3, cfeError: "Error.", context: [
makeError(line: 4, column: 5, length: 6, contextError: "Context A."),
makeError(line: 7, column: 8, length: 9, contextError: "Context B."),
]),
], """
- Unexpected context message at line 7, column 8, length 9: Context B.""");
// Actual context owned by wrong error.
// TODO(rnystrom): This error is pretty confusing. Ideally we would detect
// this case specifically and give better guidance.
expectValidate([
makeError(line: 1, column: 2, length: 3, cfeError: "Error A.", context: [
makeError(line: 4, column: 5, length: 6, contextError: "Context A."),
makeError(line: 33, column: 5, length: 6, contextError: "Context."),
]),
makeError(line: 10, column: 2, length: 3, cfeError: "Error B.", context: [
makeError(line: 11, column: 5, length: 6, contextError: "Context B."),
]),
], [
makeError(line: 1, column: 2, length: 3, cfeError: "Error A.", context: [
makeError(line: 4, column: 5, length: 6, contextError: "Context A."),
]),
makeError(line: 10, column: 2, length: 3, cfeError: "Error B.", context: [
makeError(line: 11, column: 5, length: 6, contextError: "Context B."),
makeError(line: 33, column: 5, length: 6, contextError: "Context."),
]),
], """
- Missing expected context message at line 33, column 5, length 6: Context.
- Unexpected context message at line 33, column 5, length 6: Context.""");
// If expectation has no context at all, then ignore actual context.
expectValidate([
makeError(line: 1, column: 2, length: 3, cfeError: "Error."),
], [
makeError(line: 1, column: 2, length: 3, cfeError: "Error.", context: [
makeError(line: 4, column: 5, length: 6, contextError: "Context A."),
makeError(line: 7, column: 8, length: 9, contextError: "Context B."),
]),
], null);
}
void expectValidate(List<StaticError> expected, List<StaticError> actual,
String? expectedValidation) {
var actualValidation = StaticError.validateExpectations(expected, actual);
if (expectedValidation == null) {
Expect.isNull(actualValidation);
} else {
Expect.isNotNull(actualValidation);
Expect.stringEquals(expectedValidation, actualValidation!);
}
}