blob: 77604160c7ecd8de628a1e4154e50b1ea0185115 [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.
@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);
}
''';