| // 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; |
| } |