testBuildHook function

  1. @isTest
Future<void> testBuildHook({
  1. required String description,
  2. required dynamic mainMethod(
    1. List<String> arguments
    ),
  3. required void check(
    1. BuildConfig config,
    2. BuildOutput output
    ),
  4. BuildMode? buildMode,
  5. Architecture? targetArchitecture,
  6. OS? targetOS,
  7. IOSSdk? targetIOSSdk,
  8. int? targetIOSVersion,
  9. int? targetMacOSVersion,
  10. int? targetAndroidNdkApi,
  11. CCompilerConfig? cCompiler,
  12. LinkModePreference? linkModePreference,
  13. Iterable<String>? supportedAssetTypes,
  14. bool? linkingEnabled,
})

Implementation

@isTest
Future<void> testBuildHook({
  required String description,
  // ignore: inference_failure_on_function_return_type
  required Function(List<String> arguments) mainMethod,
  required void Function(BuildConfig config, BuildOutput output) check,
  BuildMode? buildMode,
  Architecture? targetArchitecture,
  OS? targetOS,
  IOSSdk? targetIOSSdk,
  int? targetIOSVersion,
  int? targetMacOSVersion,
  int? targetAndroidNdkApi,
  CCompilerConfig? cCompiler,
  LinkModePreference? linkModePreference,
  Iterable<String>? supportedAssetTypes,
  bool? linkingEnabled,
}) async {
  test(
    description,
    () async {
      final tempDir = await _tempDirForTest();

      final outputDirectory = tempDir.resolve('output/');
      await Directory.fromUri(outputDirectory).create();

      final buildConfig = BuildConfig.build(
        outputDirectory: outputDirectory,
        packageName: await _packageName(),
        packageRoot: Directory.current.uri,
        buildMode: buildMode ?? BuildMode.release,
        targetArchitecture: targetArchitecture ?? Architecture.current,
        targetOS: targetOS ?? OS.current,
        linkModePreference: linkModePreference ?? LinkModePreference.dynamic,
        linkingEnabled: linkingEnabled ?? true,
        cCompiler: cCompiler,
        supportedAssetTypes: supportedAssetTypes,
        targetAndroidNdkApi: targetAndroidNdkApi,
        targetIOSSdk: targetIOSSdk,
        targetIOSVersion: targetIOSVersion,
        targetMacOSVersion: targetMacOSVersion,
      ) as BuildConfigImpl;
      final buildConfigUri = tempDir.resolve('build_config.json');

      await _writeBuildConfig(buildConfigUri, buildConfig);

      await mainMethod(['--config=${buildConfigUri.toFilePath()}']);

      final hookOutput = await _readOutput(buildConfig);

      check(buildConfig, hookOutput);

      final allAssets = [
        ...hookOutput.assets,
        ...hookOutput.assetsForLinking.values.expand((e) => e)
      ];
      for (final asset in allAssets.where((asset) => asset.file != null)) {
        final file = File.fromUri(asset.file!);
        expect(await file.exists(), true);
      }
      if (allAssets.any((asset) => asset is NativeCodeAsset)) {
        expect(buildConfig.supportedAssetTypes, NativeCodeAsset.type);
      }
      if (allAssets.any((asset) => asset is DataAsset)) {
        expect(buildConfig.supportedAssetTypes, DataAsset.type);
      }
    },
  );
}