blob: 8bf2a0350016f44ec260ec5389764b89129a4ce1 [file] [log] [blame]
// Copyright (c) 2025, 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:path/path.dart' as p;
import 'package:test_runner/src/utils.dart';
void main() async {
const testNamePartsCfe = [
'language',
'compile_time_constant',
'compile_time_constant_test'
];
const testNamePartsWeb = ['web', 'extension_type_assert_error_test'];
const expectedLineCfe = 'Running CFE on 1 file...';
final expectedUpdateTextCfe = '${testNamePartsCfe.last}.dart (2 errors)';
final expectedLineCfeWeb =
'Running dart2js on ${toFileNameParts(testNamePartsCfe).join('/')}...';
final expectedLineWeb =
'Running dart2js on ${toFileNameParts(testNamePartsWeb).join('/')}...';
final expectedUpdateTextWeb = '${testNamePartsWeb.last}.dart (1 error)';
await doTest(toFileNameParts(testNamePartsCfe), testNamePartsCfe,
'--update=cfe', [expectedLineCfe], expectedUpdateTextCfe);
await doTest(
toFileNameParts(testNamePartsCfe),
testNamePartsCfe,
'--update=cfe,web',
[expectedLineCfe, expectedLineCfeWeb],
expectedUpdateTextCfe,
runAll: false);
await doTest(toFileNameParts(testNamePartsWeb), testNamePartsWeb,
'--update=web', [expectedLineWeb], expectedUpdateTextWeb,
runAll: false);
await doTest(
toFileNameParts(testNamePartsWeb),
testNamePartsWeb,
'--update=web,cfe',
[expectedLineCfe, expectedLineWeb],
expectedUpdateTextWeb,
runAll: false);
}
List<String> toFileNameParts(List<String> testNameParts) => [
'tests',
...testNameParts.take(testNameParts.length - 1),
'${testNameParts.last}.dart',
];
String toFileName(List<String> fileNameParts) => p.joinAll(fileNameParts);
Future<void> doTest(List<String> fileNameParts, List<String> testNameParts,
String target, List<String> expectedLines, String expectedUpdateText,
{bool runAll = true}) async {
var testFile = File(toFileName(fileNameParts));
var testContent = testFile.readAsStringSync();
try {
var errorFound = false;
var testName = testNameParts.join('/');
errorFound |=
await run(testName, target, expectedLines, expectedUpdateText);
if (runAll) {
var relativeNativePath = p.joinAll(fileNameParts);
errorFound |= await run(
relativeNativePath, target, expectedLines, expectedUpdateText);
var relativeUriPath = fileNameParts.join('/');
errorFound |=
await run(relativeUriPath, target, expectedLines, expectedUpdateText);
var absoluteNativePath = File(relativeNativePath).absolute.path;
errorFound |= await run(
absoluteNativePath, target, expectedLines, expectedUpdateText);
}
if (errorFound) {
print('----------------------------------------------------------------');
throw 'Error found!';
}
} finally {
// Restore original test content.
testFile.writeAsStringSync(testContent);
}
}
Future<bool> run(String input, String target, List<String> expectedLines,
String expectedUpdateText) async {
const commonArguments = [
'run',
'pkg/test_runner/tool/update_static_error_tests.dart',
];
var executable = Platform.resolvedExecutable;
var arguments = [...commonArguments, target, input];
print('--------------------------------------------------------------------');
print('Running: $executable ${arguments.join(' ')}');
var process = await Process.start(executable, runInShell: true, arguments);
var lines = <String>[];
process.stdout.forEach((e) => lines.add(decodeUtf8(e)));
process.stderr.forEach((e) => lines.add(decodeUtf8(e)));
var exitCode = await process.exitCode;
var output = lines.join();
print(output);
print('Exit code: $exitCode');
var hasError = false;
for (var expectedLine in expectedLines) {
if (!output.contains(expectedLine)) {
print('Error: Expected output: $expectedLine');
hasError = true;
}
}
if (!output.contains(expectedUpdateText)) {
print('Error: Expected update: $expectedUpdateText');
hasError = true;
}
if (exitCode != 0) {
print('Error: Expected exit code: 0');
hasError = true;
}
return hasError;
}