// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/flutter_manifest.dart'; import '../src/common.dart'; void main() { group('parsing of assets section in flutter manifests with asset transformers', () { testWithoutContext('parses an asset with a simple transformation', () async { final logger = BufferLogger.test(); const manifest = ''' name: test dependencies: flutter: sdk: flutter flutter: uses-material-design: true assets: - path: asset/hello.txt transformers: - package: my_package '''; final FlutterManifest? parsedManifest = FlutterManifest.createFromString( manifest, logger: logger, ); expect(parsedManifest!.assets, [ AssetsEntry( uri: Uri.parse('asset/hello.txt'), transformers: const [ AssetTransformerEntry(package: 'my_package', args: []), ], ), ]); expect(logger.errorText, isEmpty); }); testWithoutContext('parses an asset with a transformation that has args', () async { final logger = BufferLogger.test(); const manifest = ''' name: test dependencies: flutter: sdk: flutter flutter: uses-material-design: true assets: - path: asset/hello.txt transformers: - package: my_package args: ["-e", "--color", "purple"] '''; final FlutterManifest? parsedManifest = FlutterManifest.createFromString( manifest, logger: logger, ); expect(parsedManifest!.assets, [ AssetsEntry( uri: Uri.parse('asset/hello.txt'), transformers: const [ AssetTransformerEntry(package: 'my_package', args: ['-e', '--color', 'purple']), ], ), ]); expect(logger.errorText, isEmpty); }); testWithoutContext('fails when a transformers section is not a list', () async { final logger = BufferLogger.test(); const manifest = ''' name: test dependencies: flutter: sdk: flutter flutter: uses-material-design: true assets: - path: asset/hello.txt transformers: - my_transformer '''; FlutterManifest.createFromString(manifest, logger: logger); expect( logger.errorText, 'Unable to parse assets section.\n' 'In transformers section of asset "asset/hello.txt": Expected ' 'transformers list to be a list of Map, but element at index 0 was a String.\n', ); }); testWithoutContext('fails when a transformers section package is not a string', () async { final logger = BufferLogger.test(); const manifest = ''' name: test dependencies: flutter: sdk: flutter flutter: uses-material-design: true assets: - path: asset/hello.txt transformers: - package: i am a key: i am a value '''; FlutterManifest.createFromString(manifest, logger: logger); expect( logger.errorText, 'Unable to parse assets section.\n' 'In transformers section of asset "asset/hello.txt": ' 'Expected "package" to be a String. Found YamlMap instead.\n', ); }); testWithoutContext('fails when a transformer is missing the package field', () async { final logger = BufferLogger.test(); const manifest = ''' name: test dependencies: flutter: sdk: flutter flutter: uses-material-design: true assets: - path: asset/hello.txt transformers: - args: ["-e"] '''; FlutterManifest.createFromString(manifest, logger: logger); expect( logger.errorText, 'Unable to parse assets section.\n' 'In transformers section of asset "asset/hello.txt": Expected "package" to be a ' 'String. Found Null instead.\n', ); }); testWithoutContext( 'fails when a transformer has args field that is not a list of strings', () async { final logger = BufferLogger.test(); const manifest = ''' name: test dependencies: flutter: sdk: flutter flutter: uses-material-design: true assets: - path: asset/hello.txt transformers: - package: my_transformer args: hello '''; FlutterManifest.createFromString(manifest, logger: logger); expect( logger.errorText, 'Unable to parse assets section.\n' 'In transformers section of asset "asset/hello.txt": In args section ' 'of transformer using package "my_transformer": Expected args to be a ' 'list of String, but got hello (String).\n', ); }, ); }); }