Factor out flutter manifest logic (#12237)
diff --git a/packages/flutter_tools/test/flutter_manifest_test.dart b/packages/flutter_tools/test/flutter_manifest_test.dart
new file mode 100644
index 0000000..2395172
--- /dev/null
+++ b/packages/flutter_tools/test/flutter_manifest_test.dart
@@ -0,0 +1,336 @@
+// Copyright 2017 The Chromium 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/cache.dart';
+import 'package:flutter_tools/src/flutter_manifest.dart';
+
+import 'package:test/test.dart';
+
+import 'src/common.dart';
+import 'src/context.dart';
+
+void main() {
+ setUpAll(() {
+ Cache.flutterRoot = getFlutterRoot();
+ });
+
+ group('FlutterManifest', () {
+ test('has no fonts or assets when the "flutter" section is empty', () async {
+ final String manifest = '''
+name: test
+dependencies:
+ flutter:
+ sdk: flutter
+''';
+ final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest);
+ expect(flutterManifest, isNotNull);
+ expect(flutterManifest.appName, 'test');
+ expect(flutterManifest.usesMaterialDesign, false);
+ expect(flutterManifest.fontsDescriptor, isEmpty);
+ expect(flutterManifest.fonts, isEmpty);
+ expect(flutterManifest.assets, isEmpty);
+ });
+
+ test('knows if material design is used', () async {
+ final String manifest = '''
+name: test
+dependencies:
+ flutter:
+ sdk: flutter
+flutter:
+ uses-material-design: true
+''';
+ final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest);
+ expect(flutterManifest.usesMaterialDesign, true);
+ });
+
+ test('has two assets', () async {
+ final String manifest = '''
+name: test
+dependencies:
+ flutter:
+ sdk: flutter
+flutter:
+ uses-material-design: true
+ assets:
+ - a/foo
+ - a/bar
+''';
+ final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest);
+ expect(flutterManifest.assets, <String>['a/foo', 'a/bar']);
+ });
+
+ test('has one font family with one asset', () async {
+ final String manifest = '''
+name: test
+dependencies:
+ flutter:
+ sdk: flutter
+flutter:
+ uses-material-design: true
+ fonts:
+ - family: foo
+ fonts:
+ - asset: a/bar
+''';
+ final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest);
+
+ expect(flutterManifest.fontsDescriptor.toString(), '[{fonts: [{asset: a/bar}], family: foo}]');
+ final List<Font> fonts = flutterManifest.fonts;
+ expect(fonts.length, 1);
+ final Font font = fonts[0];
+ final String fontDescriptor = '{family: foo, fonts: [{asset: a/bar}]}';
+ expect(font.descriptor.toString(), fontDescriptor);
+ expect(font.familyName, 'foo');
+ final List<FontAsset> assets = font.fontAssets;
+ expect(assets.length, 1);
+ final FontAsset fontAsset = assets[0];
+ expect(fontAsset.asset, 'a/bar');
+ expect(fontAsset.weight, isNull);
+ expect(fontAsset.style, isNull);
+ });
+
+ test('has one font family with a simple asset and one with weight', () async {
+ final String manifest = '''
+name: test
+dependencies:
+ flutter:
+ sdk: flutter
+flutter:
+ uses-material-design: true
+ fonts:
+ - family: foo
+ fonts:
+ - asset: a/bar
+ - asset: a/bar
+ weight: 400
+''';
+ final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest);
+
+ final String expectedFontsDescriptor = '[{fonts: [{asset: a/bar}, {weight: 400, asset: a/bar}], family: foo}]';
+ expect(flutterManifest.fontsDescriptor.toString(), expectedFontsDescriptor);
+ final List<Font> fonts = flutterManifest.fonts;
+ expect(fonts.length, 1);
+ final Font font = fonts[0];
+ final String fontDescriptor = '{family: foo, fonts: [{asset: a/bar}, {weight: 400, asset: a/bar}]}';
+ expect(font.descriptor.toString(), fontDescriptor);
+ expect(font.familyName, 'foo');
+ final List<FontAsset> assets = font.fontAssets;
+ expect(assets.length, 2);
+ final FontAsset fontAsset0 = assets[0];
+ expect(fontAsset0.asset, 'a/bar');
+ expect(fontAsset0.weight, isNull);
+ expect(fontAsset0.style, isNull);
+ final FontAsset fontAsset1 = assets[1];
+ expect(fontAsset1.asset, 'a/bar');
+ expect(fontAsset1.weight, 400);
+ expect(fontAsset1.style, isNull);
+ });
+
+ test('has one font family with a simple asset and one with weight and style', () async {
+ final String manifest = '''
+name: test
+dependencies:
+ flutter:
+ sdk: flutter
+flutter:
+ uses-material-design: true
+ fonts:
+ - family: foo
+ fonts:
+ - asset: a/bar
+ - asset: a/bar
+ weight: 400
+ style: italic
+''';
+ final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest);
+
+ final String expectedFontsDescriptor = '[{fonts: [{asset: a/bar}, {style: italic, weight: 400, asset: a/bar}], family: foo}]';
+ expect(flutterManifest.fontsDescriptor.toString(), expectedFontsDescriptor);
+ final List<Font> fonts = flutterManifest.fonts;
+ expect(fonts.length, 1);
+ final Font font = fonts[0];
+ final String fontDescriptor = '{family: foo, fonts: [{asset: a/bar}, {weight: 400, style: italic, asset: a/bar}]}';
+ expect(font.descriptor.toString(), fontDescriptor);
+ expect(font.familyName, 'foo');
+ final List<FontAsset> assets = font.fontAssets;
+ expect(assets.length, 2);
+ final FontAsset fontAsset0 = assets[0];
+ expect(fontAsset0.asset, 'a/bar');
+ expect(fontAsset0.weight, isNull);
+ expect(fontAsset0.style, isNull);
+ final FontAsset fontAsset1 = assets[1];
+ expect(fontAsset1.asset, 'a/bar');
+ expect(fontAsset1.weight, 400);
+ expect(fontAsset1.style, 'italic');
+ });
+
+ test('has two font families, each with one simple asset and one with weight and style', () async {
+ final String manifest = '''
+name: test
+dependencies:
+ flutter:
+ sdk: flutter
+flutter:
+ uses-material-design: true
+ fonts:
+ - family: foo
+ fonts:
+ - asset: a/bar
+ - asset: a/bar
+ weight: 400
+ style: italic
+ - family: bar
+ fonts:
+ - asset: a/baz
+ - weight: 400
+ asset: a/baz
+ style: italic
+''';
+ final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest);
+
+ final String expectedFontsDescriptor = '[{fonts: [{asset: a/bar}, {style: italic, weight: 400, asset: a/bar}], family: foo},'
+ ' {fonts: [{asset: a/baz}, {style: italic, weight: 400, asset: a/baz}], family: bar}]';
+ expect(flutterManifest.fontsDescriptor.toString(), expectedFontsDescriptor);
+ final List<Font> fonts = flutterManifest.fonts;
+ expect(fonts.length, 2);
+
+ final Font fooFont = fonts[0];
+ final String barFontDescriptor = '{family: foo, fonts: [{asset: a/bar}, {weight: 400, style: italic, asset: a/bar}]}';
+ expect(fooFont.descriptor.toString(), barFontDescriptor);
+ expect(fooFont.familyName, 'foo');
+ final List<FontAsset> fooAassets = fooFont.fontAssets;
+ expect(fooAassets.length, 2);
+ final FontAsset fooFontAsset0 = fooAassets[0];
+ expect(fooFontAsset0.asset, 'a/bar');
+ expect(fooFontAsset0.weight, isNull);
+ expect(fooFontAsset0.style, isNull);
+ final FontAsset fooFontAsset1 = fooAassets[1];
+ expect(fooFontAsset1.asset, 'a/bar');
+ expect(fooFontAsset1.weight, 400);
+ expect(fooFontAsset1.style, 'italic');
+
+ final Font barFont = fonts[1];
+ final String fontDescriptor = '{family: bar, fonts: [{asset: a/baz}, {weight: 400, style: italic, asset: a/baz}]}';
+ expect(barFont.descriptor.toString(), fontDescriptor);
+ expect(barFont.familyName, 'bar');
+ final List<FontAsset> barAssets = barFont.fontAssets;
+ expect(barAssets.length, 2);
+ final FontAsset barFontAsset0 = barAssets[0];
+ expect(barFontAsset0.asset, 'a/baz');
+ expect(barFontAsset0.weight, isNull);
+ expect(barFontAsset0.style, isNull);
+ final FontAsset barFontAsset1 = barAssets[1];
+ expect(barFontAsset1.asset, 'a/baz');
+ expect(barFontAsset1.weight, 400);
+ expect(barFontAsset1.style, 'italic');
+ });
+
+ testUsingContext('has only one of two font familes when one declaration is missing the "family" option', () async {
+ final String manifest = '''
+name: test
+dependencies:
+ flutter:
+ sdk: flutter
+flutter:
+ uses-material-design: true
+ fonts:
+ - family: foo
+ fonts:
+ - asset: a/bar
+ - asset: a/bar
+ weight: 400
+ style: italic
+ - fonts:
+ - asset: a/baz
+ - asset: a/baz
+ weight: 400
+ style: italic
+''';
+ final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest);
+
+
+ final String expectedFontsDescriptor = '[{fonts: [{asset: a/bar}, {style: italic, weight: 400, asset: a/bar}], family: foo},'
+ ' {fonts: [{asset: a/baz}, {style: italic, weight: 400, asset: a/baz}]}]';
+ expect(flutterManifest.fontsDescriptor.toString(), expectedFontsDescriptor);
+ final List<Font> fonts = flutterManifest.fonts;
+ expect(fonts.length, 1);
+ final Font fooFont = fonts[0];
+ final String barFontDescriptor = '{family: foo, fonts: [{asset: a/bar}, {weight: 400, style: italic, asset: a/bar}]}';
+ expect(fooFont.descriptor.toString(), barFontDescriptor);
+ expect(fooFont.familyName, 'foo');
+ final List<FontAsset> fooAassets = fooFont.fontAssets;
+ expect(fooAassets.length, 2);
+ final FontAsset fooFontAsset0 = fooAassets[0];
+ expect(fooFontAsset0.asset, 'a/bar');
+ expect(fooFontAsset0.weight, isNull);
+ expect(fooFontAsset0.style, isNull);
+ final FontAsset fooFontAsset1 = fooAassets[1];
+ expect(fooFontAsset1.asset, 'a/bar');
+ expect(fooFontAsset1.weight, 400);
+ expect(fooFontAsset1.style, 'italic');
+ });
+
+ testUsingContext('has only one of two font familes when one declaration is missing the "fonts" option', () async {
+ final String manifest = '''
+name: test
+dependencies:
+ flutter:
+ sdk: flutter
+flutter:
+ uses-material-design: true
+ fonts:
+ - family: foo
+ fonts:
+ - asset: a/bar
+ - asset: a/bar
+ weight: 400
+ style: italic
+ - family: bar
+''';
+ final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest);
+
+ final String expectedFontsDescriptor = '[{fonts: [{asset: a/bar}, {style: italic, weight: 400, asset: a/bar}], family: foo},'
+ ' {family: bar}]';
+ expect(flutterManifest.fontsDescriptor.toString(), expectedFontsDescriptor);
+ final List<Font> fonts = flutterManifest.fonts;
+ expect(fonts.length, 1);
+ final Font fooFont = fonts[0];
+ final String barFontDescriptor = '{family: foo, fonts: [{asset: a/bar}, {weight: 400, style: italic, asset: a/bar}]}';
+ expect(fooFont.descriptor.toString(), barFontDescriptor);
+ expect(fooFont.familyName, 'foo');
+ final List<FontAsset> fooAassets = fooFont.fontAssets;
+ expect(fooAassets.length, 2);
+ final FontAsset fooFontAsset0 = fooAassets[0];
+ expect(fooFontAsset0.asset, 'a/bar');
+ expect(fooFontAsset0.weight, isNull);
+ expect(fooFontAsset0.style, isNull);
+ final FontAsset fooFontAsset1 = fooAassets[1];
+ expect(fooFontAsset1.asset, 'a/bar');
+ expect(fooFontAsset1.weight, 400);
+ expect(fooFontAsset1.style, 'italic');
+ });
+
+ testUsingContext('has no font family when declaration is missing the "asset" option', () async {
+ final String manifest = '''
+name: test
+dependencies:
+ flutter:
+ sdk: flutter
+flutter:
+ uses-material-design: true
+ fonts:
+ - family: foo
+ fonts:
+ - weight: 400
+''';
+ final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest);
+
+ final String expectedFontsDescriptor = '[{fonts: [{weight: 400}], family: foo}]';
+ expect(flutterManifest.fontsDescriptor.toString(), expectedFontsDescriptor);
+ final List<Font> fonts = flutterManifest.fonts;
+ expect(fonts.length, 0);
+ });
+ });
+}