blob: 108515f4330d08d04add667bc2b5f2e1df5e7db9 [file] [log] [blame]
// 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 'dart:convert';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
class TestAssetBundle extends AssetBundle {
static const Map<String, List<Object>> _binManifestData = <String, List<Object>>{
'assets/foo.png': <Object>[
<String, Object>{
'asset': 'assets/foo.png',
},
<String, Object>{
'asset': 'assets/2x/foo.png',
'dpr': 2.0
},
],
'assets/bar.png': <Object>[
<String, Object>{
'asset': 'assets/bar.png',
},
],
};
@override
Future<ByteData> load(String key) async {
if (key == 'AssetManifest.bin') {
final ByteData data = const StandardMessageCodec().encodeMessage(_binManifestData)!;
return data;
}
if (key == 'AssetManifest.bin.json') {
// Encode the manifest data that will be used by the app
final ByteData data = const StandardMessageCodec().encodeMessage(_binManifestData)!;
// Simulate the behavior of NetworkAssetBundle.load here, for web tests
return ByteData.sublistView(
utf8.encode(
json.encode(
base64.encode(
// Encode only the actual bytes of the buffer, and no more...
data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes)
)
)
)
);
}
throw ArgumentError('Unexpected key');
}
@override
Future<T> loadStructuredData<T>(String key, Future<T> Function(String value) parser) async {
return parser(await loadString(key));
}
}
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
test('loadFromBundle correctly parses a binary asset manifest', () async {
final AssetManifest manifest = await AssetManifest.loadFromAssetBundle(TestAssetBundle());
expect(manifest.listAssets(), unorderedEquals(<String>['assets/foo.png', 'assets/bar.png']));
final List<AssetMetadata> fooVariants = manifest.getAssetVariants('assets/foo.png')!;
expect(fooVariants.length, 2);
final AssetMetadata firstFooVariant = fooVariants[0];
expect(firstFooVariant.key, 'assets/foo.png');
expect(firstFooVariant.targetDevicePixelRatio, null);
expect(firstFooVariant.main, true);
final AssetMetadata secondFooVariant = fooVariants[1];
expect(secondFooVariant.key, 'assets/2x/foo.png');
expect(secondFooVariant.targetDevicePixelRatio, 2.0);
expect(secondFooVariant.main, false);
final List<AssetMetadata> barVariants = manifest.getAssetVariants('assets/bar.png')!;
expect(barVariants.length, 1);
final AssetMetadata firstBarVariant = barVariants[0];
expect(firstBarVariant.key, 'assets/bar.png');
expect(firstBarVariant.targetDevicePixelRatio, null);
expect(firstBarVariant.main, true);
});
test('getAssetVariants returns null if the key not contained in the asset manifest', () async {
final AssetManifest manifest = await AssetManifest.loadFromAssetBundle(TestAssetBundle());
expect(manifest.getAssetVariants('invalid asset key'), isNull);
});
}