blob: e356b69174d0744c885726bc80ba2e44662c7657 [file]
// Copyright (c) 2024, 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:convert';
import 'dart:io';
import 'package:data_assets/data_assets.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:record_use/record_use_internal.dart';
import 'package:test/test.dart';
import '../helpers.dart';
import 'helpers.dart';
const Timeout longTimeout = Timeout(Duration(minutes: 5));
void main() async {
test('simple_link linking', timeout: longTimeout, () async {
await inTempDir((tempUri) async {
await copyTestProjects(targetUri: tempUri);
final packageUri = tempUri.resolve('simple_link/');
final resourcesUri = tempUri.resolve('treeshaking_info.json');
final recordings = Recordings(
metadata: Metadata(version: Version(1, 0, 0), comment: 'Empty'),
calls: {},
instances: {},
);
await File.fromUri(
resourcesUri,
).writeAsString(jsonEncode(recordings.toJson()));
// First, run `pub get`, we need pub to resolve our dependencies.
await runPubGet(workingDirectory: packageUri, logger: logger);
final buildResult = (await buildDataAssets(
packageUri,
linkingEnabled: true,
)).success;
Iterable<String> buildFiles() => Directory.fromUri(
packageUri.resolve('.dart_tool/hooks_runner/'),
).listSync(recursive: true).map((file) => file.path);
expect(buildFiles(), isNot(anyElement(endsWith('recorded_uses.json'))));
await link(
packageUri,
logger,
dartExecutable,
buildResult: buildResult,
resourceIdentifiers: resourcesUri,
buildAssetTypes: [BuildAssetType.data],
);
expect(buildFiles(), anyElement(endsWith('recorded_uses.json')));
});
});
test('record_use_filtering linking', timeout: longTimeout, () async {
await inTempDir((tempUri) async {
await copyTestProjects(targetUri: tempUri);
final packageUri = tempUri.resolve('pirate_adventure/');
final resourcesUri = tempUri.resolve('treeshaking_info.json');
await File.fromUri(
resourcesUri,
).writeAsString(jsonEncode(_pirateAdventureRecordings.toJson()));
// First, run `pub get`, we need pub to resolve our dependencies.
await runPubGet(workingDirectory: packageUri, logger: logger);
final buildResult = (await buildDataAssets(
packageUri,
linkingEnabled: true,
)).success;
final linkResult = (await link(
packageUri,
logger,
dartExecutable,
buildResult: buildResult,
resourceIdentifiers: resourcesUri,
buildAssetTypes: [BuildAssetType.data],
)).success;
// Verify outputs
final pirateSpeakAssets = linkResult.encodedAssets
.where((a) => a.asDataAsset.package == 'pirate_speak')
.toList();
expect(pirateSpeakAssets, hasLength(1));
final pirateSpeakFile = pirateSpeakAssets.first.asDataAsset.file;
final pirateSpeakContent = jsonDecode(
await File.fromUri(pirateSpeakFile).readAsString(),
);
expect(
pirateSpeakContent,
equals({'Hello': 'Ahoy', 'Money': 'Doubloons'}),
);
final pirateTechAssets = linkResult.encodedAssets
.where((a) => a.asDataAsset.package == 'pirate_technology')
.toList();
expect(pirateTechAssets, hasLength(1));
final pirateTechFile = pirateTechAssets.first.asDataAsset.file;
final pirateTechContent = jsonDecode(
await File.fromUri(pirateTechFile).readAsString(),
);
expect(
pirateTechContent,
equals({
'Cannon': {'range': 100, 'damage': 50},
}),
);
});
});
}
/// Expected result of the compiler when running from pirate_adventure
/// bin/pirate_adventure.dart.
final _pirateAdventureRecordings = Recordings(
metadata: Metadata(version: Version(1, 0, 0), comment: 'Filtering test'),
calls: {
const Identifier(
importUri: 'package:pirate_speak/src/definitions.dart',
name: 'pirateSpeak',
): [
const CallWithArguments(
loadingUnit: 'root',
positionalArguments: [StringConstant('Hello')],
namedArguments: {},
),
const CallWithArguments(
loadingUnit: 'root',
positionalArguments: [StringConstant('Money')],
namedArguments: {},
),
],
const Identifier(
importUri: 'package:pirate_technology/src/definitions.dart',
name: 'useCannon',
): [
const CallWithArguments(
loadingUnit: 'root',
positionalArguments: [],
namedArguments: {},
),
],
},
instances: {},
);