| // 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. |
| |
| @TestOn('vm') |
| library; |
| |
| import 'dart:convert'; |
| import 'dart:io'; |
| |
| import 'package:benchmark_harness/src/bench_command/bench_options.dart'; |
| import 'package:benchmark_harness/src/bench_command/compile_and_run.dart'; |
| import 'package:test/test.dart'; |
| |
| void main() { |
| test('readme', () async { |
| final output = |
| await Process.run(Platform.executable, ['bin/bench.dart', '--help']); |
| |
| expect(output.exitCode, 0); |
| // Sadly, the help output likes to include trailing spaces that don't |
| // copy paste nicely or consistently into the README. |
| final trimmed = LineSplitter.split(output.stdout as String) |
| .map((e) => e.trimRight()) |
| .join('\n'); |
| |
| final readmeFile = File('README.md').readAsStringSync(); |
| |
| expect( |
| readmeFile, |
| contains(trimmed), |
| ); |
| }); |
| |
| group('invoke the command', () { |
| late final Directory tempDir; |
| late final String testFilePath; |
| |
| setUpAll(() { |
| tempDir = Directory.systemTemp.createTempSync('benchtest_'); |
| testFilePath = tempDir.uri.resolve('input.dart').toFilePath(); |
| File(testFilePath) |
| ..create() |
| ..writeAsStringSync(_testDartFile); |
| }); |
| |
| tearDownAll(() { |
| tempDir.deleteSync(recursive: true); |
| }); |
| |
| group('BenchOptions.fromArgs', () { |
| test('options parsing', () async { |
| final options = BenchOptions.fromArgs( |
| ['--flavor', 'aot,jit', '--target', testFilePath], |
| ); |
| |
| await expectLater( |
| () => compileAndRun(options), |
| prints( |
| stringContainsInOrder([ |
| 'AOT - COMPILE', |
| testFilePath, |
| 'AOT - RUN', |
| 'JIT - RUN', |
| testFilePath, |
| ]), |
| ), |
| ); |
| }); |
| |
| test('rest args not supported', () async { |
| expect( |
| () => BenchOptions.fromArgs( |
| ['--flavor', 'aot,jit', testFilePath], |
| ), |
| throwsFormatException, |
| ); |
| }); |
| }); |
| |
| for (var bench in RuntimeFlavor.values) { |
| test('$bench', () async { |
| await expectLater( |
| () => compileAndRun( |
| BenchOptions(flavor: {bench}, target: testFilePath)), |
| prints( |
| stringContainsInOrder( |
| [ |
| if (bench != RuntimeFlavor.jit) ...[ |
| '${bench.name.toUpperCase()} - COMPILE', |
| testFilePath, |
| ], |
| '${bench.name.toUpperCase()} - RUN' |
| ], |
| ), |
| ), |
| ); |
| }, skip: _skipWasm(bench)); |
| } |
| }); |
| } |
| |
| // Can remove this once the min tested SDK on GitHub is >= 3.7 |
| String? _skipWasm(RuntimeFlavor flavor) { |
| if (flavor != RuntimeFlavor.wasm) { |
| return null; |
| } |
| final versionBits = Platform.version.split('.'); |
| final versionValues = versionBits.take(2).map(int.parse).toList(); |
| |
| return switch ((versionValues[0], versionValues[1])) { |
| // If major is greater than 3, it's definitely >= 3.7 |
| (int m, _) when m > 3 => null, |
| // If major is 3, check the minor version |
| (3, int n) when n >= 7 => null, |
| // All other cases (major < 3, or major is 3 but minor < 7) |
| _ => 'Requires Dart >= 3.7', |
| }; |
| } |
| |
| const _testDartFile = ''' |
| void main() { |
| // outputs 0 is JS |
| // 8589934592 everywhere else |
| print(1 << 33); |
| } |
| '''; |