blob: be1baeeb289560ce023adea2e9eaf709cea5546b [file] [log] [blame]
// Copyright (c) 2024, 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 'dart:io';
import 'package:expect/expect.dart';
import 'package:path/path.dart' as p;
import 'package:test_runner/src/command_output.dart';
import 'package:test_runner/src/static_error.dart';
void _checkError(StaticError error,
{required String path,
required int line,
required int column,
required String message}) {
Expect.equals(p.relative(path, from: Directory.current.path), error.path);
Expect.equals(line, error.line);
Expect.equals(column, error.column);
Expect.equals(message, error.message);
}
void main() {
// TODO(55202): Add general testing of CFE and analyzer error parsing.
testCfeErrors();
testDart2jsCompilerErrors();
testDart2WasmCompilerErrors();
testDevCompilerErrors();
}
void testCfeErrors() {
_testMultipleCfeErrors();
}
/// Regression test for parsing multiple errors.
void _testMultipleCfeErrors() {
var errors = <StaticError>[];
var warnings = <StaticError>[];
FastaCommandOutput.parseErrors('''
tests/language/explicit_type_instantiation_parsing_test.dart:171:26: Error: Cannot access static member on an instantiated generic class.
Try removing the type arguments or placing them after the member name.
expect1<Class>(Z<X, X>.instance);
^^^^^^^^
tests/language/explicit_type_instantiation_parsing_test.dart:232:6: Error: A comparison expression can't be an operand of another comparison expression.
Try putting parentheses around one of the comparisons.
X<2>(2);
^
tests/language/explicit_type_instantiation_parsing_test.dart:236:6: Error: A comparison expression can't be an operand of another comparison expression.
Try putting parentheses around one of the comparisons.
X<2>;
^
tests/language/explicit_type_instantiation_parsing_test.dart:236:7: Error: Expected an identifier, but got ';'.
Try inserting an identifier before ';'.
X<2>;
^
tests/language/explicit_type_instantiation_parsing_test.dart:242:6: Error: A comparison expression can't be an operand of another comparison expression.
Try putting parentheses around one of the comparisons.
X<2>.instance; // Not type argument.
^
tests/language/explicit_type_instantiation_parsing_test.dart:242:7: Error: Expected an identifier, but got '.'.
Try inserting an identifier before '.'.
X<2>.instance; // Not type argument.
^
tests/language/explicit_type_instantiation_parsing_test.dart:248:6: Error: A comparison expression can't be an operand of another comparison expression.
Try putting parentheses around one of the comparisons.
X<2>.any;
^
tests/language/explicit_type_instantiation_parsing_test.dart:248:7: Error: Expected an identifier, but got '.'.
Try inserting an identifier before '.'.
X<2>.any;
^
tests/language/explicit_type_instantiation_parsing_test.dart:255:8: Error: Member not found: 'any'.
X<X>.any; // Invalid, Class does not have any static `any` member.
^^^
tests/language/explicit_type_instantiation_parsing_test.dart:259:8: Error: Cannot access static member on an instantiated generic class.
Try removing the type arguments or placing them after the member name.
X<X>.instance; // Does have static `instance` member, can't access this way.
^^^^^^^^
tests/language/explicit_type_instantiation_parsing_test.dart:265:6: Error: A comparison expression can't be an operand of another comparison expression.
Try putting parentheses around one of the comparisons.
X<X>2;
^
tests/language/explicit_type_instantiation_parsing_test.dart:272:6: Error: A comparison expression can't be an operand of another comparison expression.
Try putting parentheses around one of the comparisons.
X<X>-1;
^
tests/language/explicit_type_instantiation_parsing_test.dart:277:7: Error: A comparison expression can't be an operand of another comparison expression.
Try putting parentheses around one of the comparisons.
f1<X> - 1;
^
tests/language/explicit_type_instantiation_parsing_test.dart:207:12: Warning: Operand of null-aware operation '!' has type 'Type' which excludes null.
- 'Type' is from 'dart:core'.
expect1((Z<X, X>)![1].asBool); // ignore: unnecessary_non_null_assertion
^
''', errors, warnings);
var path = 'tests/language/explicit_type_instantiation_parsing_test.dart';
Expect.equals(13, errors.length);
Expect.equals(1, warnings.length);
_checkError(errors[0],
path: path,
line: 171,
column: 26,
message: "Cannot access static member on an instantiated generic class.");
_checkError(errors[1],
path: path,
line: 232,
column: 6,
message:
"A comparison expression can't be an operand of another comparison expression.");
_checkError(errors[2],
path: path,
line: 236,
column: 6,
message:
"A comparison expression can't be an operand of another comparison expression.");
_checkError(errors[3],
path: path,
line: 236,
column: 7,
message: "Expected an identifier, but got ';'.");
_checkError(errors[4],
path: path,
line: 242,
column: 6,
message:
"A comparison expression can't be an operand of another comparison expression.");
_checkError(errors[5],
path: path,
line: 242,
column: 7,
message: "Expected an identifier, but got '.'.");
_checkError(errors[6],
path: path,
line: 248,
column: 6,
message:
"A comparison expression can't be an operand of another comparison expression.");
_checkError(errors[7],
path: path,
line: 248,
column: 7,
message: "Expected an identifier, but got '.'.");
_checkError(errors[8],
path: path, line: 255, column: 8, message: "Member not found: 'any'.");
_checkError(errors[9],
path: path,
line: 259,
column: 8,
message: "Cannot access static member on an instantiated generic class.");
_checkError(errors[10],
path: path,
line: 265,
column: 6,
message:
"A comparison expression can't be an operand of another comparison expression.");
_checkError(errors[11],
path: path,
line: 272,
column: 6,
message:
"A comparison expression can't be an operand of another comparison expression.");
_checkError(errors[12],
path: path,
line: 277,
column: 7,
message:
"A comparison expression can't be an operand of another comparison expression.");
_checkError(warnings[0],
path: path,
line: 207,
column: 12,
message:
"Operand of null-aware operation '!' has type 'Type' which excludes null.");
}
void testDart2jsCompilerErrors() {
_testMultipleDart2jsCompilerErrors();
}
void _testMultipleDart2jsCompilerErrors() {
var errors = <StaticError>[];
Dart2jsCompilerCommandOutput.parseErrors('''
tests/language/explicit_type_instantiation_parsing_test.dart:171:26:
Error: Cannot access static member on an instantiated generic class.
Try removing the type arguments or placing them after the member name.
expect1<Class>(Z<X, X>.instance);
^^^^^^^^
tests/language/explicit_type_instantiation_parsing_test.dart:232:6:
Error: A comparison expression can't be an operand of another comparison expression.
Try putting parentheses around one of the comparisons.
X<2>(2);
^
''', errors);
var path = 'tests/language/explicit_type_instantiation_parsing_test.dart';
Expect.equals(2, errors.length);
_checkError(errors[0],
path: path,
line: 171,
column: 26,
message: "Cannot access static member on an instantiated generic class.");
_checkError(errors[1],
path: path,
line: 232,
column: 6,
message:
"A comparison expression can't be an operand of another comparison expression.");
}
void testDart2WasmCompilerErrors() {
_testMultipleDart2WasmCompilerErrors();
}
void _testMultipleDart2WasmCompilerErrors() {
var errors = <StaticError>[];
Dart2WasmCompilerCommandOutput.parseErrors('''
tests/language/explicit_type_instantiation_parsing_test.dart:171:26: Error: Cannot access static member on an instantiated generic class.
Try removing the type arguments or placing them after the member name.
expect1<Class>(Z<X, X>.instance);
^^^^^^^^
tests/language/explicit_type_instantiation_parsing_test.dart:232:6: Error: A comparison expression can't be an operand of another comparison expression.
Try putting parentheses around one of the comparisons.
X<2>(2);
^
''', errors);
var path = 'tests/language/explicit_type_instantiation_parsing_test.dart';
Expect.equals(2, errors.length);
_checkError(errors[0],
path: path,
line: 171,
column: 26,
message: "Cannot access static member on an instantiated generic class.");
_checkError(errors[1],
path: path,
line: 232,
column: 6,
message:
"A comparison expression can't be an operand of another comparison expression.");
}
void testDevCompilerErrors() {
_testMultipleDevCompilerErrors();
}
void _testMultipleDevCompilerErrors() {
var errors = <StaticError>[];
DevCompilerCommandOutput.parseErrors('''
org-dartlang-app:/tests/language/explicit_type_instantiation_parsing_test.dart:171:26: Error: Cannot access static member on an instantiated generic class.
Try removing the type arguments or placing them after the member name.
expect1<Class>(Z<X, X>.instance);
^^^^^^^^
org-dartlang-app:/tests/language/explicit_type_instantiation_parsing_test.dart:232:6: Error: A comparison expression can't be an operand of another comparison expression.
Try putting parentheses around one of the comparisons.
X<2>(2);
^
''', errors);
var path = 'tests/language/explicit_type_instantiation_parsing_test.dart';
Expect.equals(2, errors.length);
_checkError(errors[0],
path: path,
line: 171,
column: 26,
message: "Cannot access static member on an instantiated generic class.");
_checkError(errors[1],
path: path,
line: 232,
column: 6,
message:
"A comparison expression can't be an operand of another comparison expression.");
}