// 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', () { testWithoutContext('ignores empty list of assets', () { final BufferLogger logger = BufferLogger.test(); const String manifest = ''' name: test dependencies: flutter: sdk: flutter flutter: assets: [] '''; final FlutterManifest? flutterManifest = FlutterManifest.createFromString( manifest, logger: logger, ); expect(flutterManifest, isNotNull); expect(flutterManifest!.assets, isEmpty); }); testWithoutContext('parses two simple asset declarations', () async { final BufferLogger logger = BufferLogger.test(); const String manifest = ''' name: test dependencies: flutter: sdk: flutter flutter: uses-material-design: true assets: - a/foo - a/bar '''; final FlutterManifest flutterManifest = FlutterManifest.createFromString( manifest, logger: logger, )!; expect(flutterManifest.assets, [ AssetsEntry(uri: Uri.parse('a/foo')), AssetsEntry(uri: Uri.parse('a/bar')), ]); }); testWithoutContext('does not crash on empty entry', () { final BufferLogger logger = BufferLogger.test(); const String manifest = ''' name: test dependencies: flutter: sdk: flutter flutter: uses-material-design: true assets: - lib/gallery/example_code.dart - '''; FlutterManifest.createFromString( manifest, logger: logger, ); expect(logger.errorText, contains('Asset manifest contains a null or empty uri.')); }); testWithoutContext('handles special characters in asset URIs', () { final BufferLogger logger = BufferLogger.test(); const String manifest = ''' name: test dependencies: flutter: sdk: flutter flutter: uses-material-design: true assets: - lib/gallery/abc#xyz - lib/gallery/abc?xyz - lib/gallery/aaa bbb '''; final FlutterManifest flutterManifest = FlutterManifest.createFromString( manifest, logger: logger, )!; final List assets = flutterManifest.assets; expect(assets, [ AssetsEntry(uri: Uri.parse('lib/gallery/abc%23xyz')), AssetsEntry(uri: Uri.parse('lib/gallery/abc%3Fxyz')), AssetsEntry(uri: Uri.parse('lib/gallery/aaa%20bbb')), ]); }); testWithoutContext('parses an asset with flavors', () async { final BufferLogger logger = BufferLogger.test(); const String manifest = ''' name: test dependencies: flutter: sdk: flutter flutter: uses-material-design: true assets: - path: a/foo flavors: - apple - strawberry '''; final FlutterManifest flutterManifest = FlutterManifest.createFromString( manifest, logger: logger, )!; expect(flutterManifest.assets, [ AssetsEntry( uri: Uri.parse('a/foo'), flavors: const {'apple', 'strawberry'}, ), ]); }); testWithoutContext("prints an error when an asset entry's flavor is not a string", () async { final BufferLogger logger = BufferLogger.test(); const String manifest = ''' name: test dependencies: flutter: sdk: flutter flutter: uses-material-design: true assets: - assets/folder/ - path: assets/vanilla/ flavors: - key1: value1 key2: value2 '''; FlutterManifest.createFromString(manifest, logger: logger); expect(logger.errorText, contains( 'Unable to parse assets section.\n' 'In flavors section of asset "assets/vanilla/": Expected flavors ' 'to be a list of String, but element at index 0 was a YamlMap.\n' )); }); }); }