blob: e76ae3e918a3e5b99f47d33b8e53ec49f6b1bc9b [file]
// Copyright (c) 2026, 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:hooks/hooks.dart';
import 'package:test/test.dart';
void main() {
BuildInput makeInput(Map<String, Object?> defines, Uri basePath) {
final tempUri = Directory.systemTemp.uri;
final builder = BuildInputBuilder()
..setupShared(
packageName: 'my_package',
packageRoot: tempUri.resolve('my_package/'),
outputFile: tempUri.resolve('output.json'),
outputDirectoryShared: tempUri.resolve('out_shared/'),
userDefines: PackageUserDefines(
workspacePubspec: PackageUserDefinesSource(
defines: defines,
basePath: basePath,
),
),
)
..config.addBuildAssetTypes(['my-asset-type'])
..config.setupBuild(linkingEnabled: false);
return builder.build();
}
group('path() on Windows', () {
final basePath = Uri.parse('file:///D:/proj/example/pubspec.yaml');
// Skips are done with early returns instead of `testOn`, because these
// tests also run on the Dart SDK CI which does not respect `package:test`
// annotations.
test('absolute path with Windows separators is returned as-is', () {
if (!Platform.isWindows) return;
final input = makeInput({'lib': r'D:\some\dir\lib.dll'}, basePath);
final uri = input.userDefines.path('lib')!;
expect(uri, Uri.parse('file:///D:/some/dir/lib.dll'));
expect(uri.toFilePath(), r'D:\some\dir\lib.dll');
});
test('absolute path with forward slashes is returned as-is', () {
if (!Platform.isWindows) return;
final input = makeInput({'lib': 'D:/some/dir/lib.dll'}, basePath);
final uri = input.userDefines.path('lib')!;
expect(uri, Uri.parse('file:///D:/some/dir/lib.dll'));
expect(uri.toFilePath(), r'D:\some\dir\lib.dll');
});
test('UNC path is returned as-is', () {
if (!Platform.isWindows) return;
final input = makeInput({'lib': r'\\server\share\lib.dll'}, basePath);
final uri = input.userDefines.path('lib')!;
expect(uri, Uri.parse('file://server/share/lib.dll'));
expect(uri.toFilePath(), r'\\server\share\lib.dll');
});
test('relative path with Linux separators resolves against basePath', () {
if (!Platform.isWindows) return;
final input = makeInput({'file': 'some/dir/model.bin'}, basePath);
final uri = input.userDefines.path('file')!;
expect(uri, Uri.parse('file:///D:/proj/example/some/dir/model.bin'));
expect(uri.toFilePath(), r'D:\proj\example\some\dir\model.bin');
});
test('relative path with Windows separators resolves against basePath', () {
if (!Platform.isWindows) return;
final input = makeInput({'file': r'some\dir\model.bin'}, basePath);
final uri = input.userDefines.path('file')!;
expect(uri, Uri.parse('file:///D:/proj/example/some/dir/model.bin'));
expect(uri.toFilePath(), r'D:\proj\example\some\dir\model.bin');
});
});
group('path() on POSIX', () {
final basePath = Uri.parse('file:///home/user/proj/example/pubspec.yaml');
test('absolute path is returned as-is', () {
if (Platform.isWindows) return;
final input = makeInput({'lib': '/some/dir/lib.so'}, basePath);
final uri = input.userDefines.path('lib')!;
expect(uri, Uri.parse('file:///some/dir/lib.so'));
expect(uri.toFilePath(), '/some/dir/lib.so');
});
test('relative path resolves against basePath', () {
if (Platform.isWindows) return;
final input = makeInput({'file': 'some/dir/model.bin'}, basePath);
final uri = input.userDefines.path('file')!;
expect(
uri,
Uri.parse('file:///home/user/proj/example/some/dir/model.bin'),
);
expect(uri.toFilePath(), '/home/user/proj/example/some/dir/model.bin');
});
test('relative path with Windows separators resolves against basePath', () {
if (Platform.isWindows) return;
final input = makeInput({'file': r'some\dir\model.bin'}, basePath);
final uri = input.userDefines.path('file')!;
expect(
uri,
Uri.parse('file:///home/user/proj/example/some/dir/model.bin'),
);
expect(uri.toFilePath(), '/home/user/proj/example/some/dir/model.bin');
});
});
group('path()', () {
final basePath = Uri.parse('file:///base/dir/pubspec.yaml');
test('returns null for a missing key', () {
final input = makeInput({}, basePath);
expect(input.userDefines.path('missing'), isNull);
});
test('returns null for a non-String value', () {
final input = makeInput({'key': 1}, basePath);
expect(input.userDefines.path('key'), isNull);
});
test('returns null without user-defines', () {
final tempUri = Directory.systemTemp.uri;
final builder = BuildInputBuilder()
..setupShared(
packageName: 'my_package',
packageRoot: tempUri.resolve('my_package/'),
outputFile: tempUri.resolve('output.json'),
outputDirectoryShared: tempUri.resolve('out_shared/'),
)
..config.addBuildAssetTypes(['my-asset-type'])
..config.setupBuild(linkingEnabled: false);
expect(builder.build().userDefines.path('key'), isNull);
});
});
}