From fe87bc69b67a4846a9f915e7e0b3693e08ceac27 Mon Sep 17 00:00:00 2001 From: Pierre-Louis <6655696+guidezpl@users.noreply.github.com> Date: Thu, 21 Jan 2021 17:31:35 +0100 Subject: [PATCH] Add material icons golden test (#74131) * Create icons golden test * Update icons_test.dart * Update icons_test.dart * Update icons_test.dart * change test name * Add ability to load material icon font for golden tests * formatting * Skip test for browser * Add end of file newline * Rewrite with different method * Add skip for browser --- .../flutter/test/material/icons_test.dart | 62 +++++++++++++++++-- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/packages/flutter/test/material/icons_test.dart b/packages/flutter/test/material/icons_test.dart index 14067443b7..9b7033d793 100644 --- a/packages/flutter/test/material/icons_test.dart +++ b/packages/flutter/test/material/icons_test.dart @@ -2,8 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:file/file.dart'; +import 'package:file/local.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + import 'package:flutter_test/flutter_test.dart'; +import 'package:platform/platform.dart'; void main() { testWidgets('IconData object test', (WidgetTester tester) async { @@ -29,8 +34,7 @@ void main() { expect(Icons.access_time_sharp.matchTextDirection, false); }); - testWidgets('Adaptive icons are correct on cupertino platforms', - (WidgetTester tester) async { + testWidgets('Adaptive icons are correct on cupertino platforms', (WidgetTester tester) async { expect(Icons.adaptive.arrow_back, Icons.arrow_back_ios); expect(Icons.adaptive.arrow_back_outlined, Icons.arrow_back_ios_outlined); }, @@ -40,9 +44,7 @@ void main() { }), ); - testWidgets( - 'Adaptive icons are correct on non-cupertino platforms', - (WidgetTester tester) async { + testWidgets('Adaptive icons are correct on non-cupertino platforms', (WidgetTester tester) async { expect(Icons.adaptive.arrow_back, Icons.arrow_back); expect(Icons.adaptive.arrow_back_outlined, Icons.arrow_back_outlined); }, @@ -53,4 +55,54 @@ void main() { TargetPlatform.linux, }), ); + + testWidgets('A sample of icons look as expected', (WidgetTester tester) async { + await _loadIconFont(); + + await tester.pumpWidget(MaterialApp( + home: IconTheme( + data: const IconThemeData(size: 200), + child: Wrap( + children: const [ + Icon(Icons.ten_k), + Icon(Icons.ac_unit), + Icon(Icons.local_taxi), + Icon(Icons.local_taxi_outlined), + Icon(Icons.local_taxi_rounded), + Icon(Icons.local_taxi_sharp), + Icon(Icons.zoom_out_sharp), + ], + ), + ), + )); + + await expectLater(find.byType(Wrap), matchesGoldenFile('test.icons.sample.png')); + }, skip: isBrowser); // https://github.com/flutter/flutter/issues/39998 +} + +// Loads the cached material icon font. +// Only necessary for golden tests. Relies on the tool updating cached assets before +// running tests. +Future _loadIconFont() async { + const FileSystem fs = LocalFileSystem(); + const Platform platform = LocalPlatform(); + final Directory flutterRoot = fs.directory(platform.environment['FLUTTER_ROOT']); + + final File iconFont = flutterRoot.childFile( + fs.path.join( + 'bin', + 'cache', + 'artifacts', + 'material_fonts', + 'MaterialIcons-Regular.otf', + ), + ); + + final Future bytes = Future.value( + iconFont.readAsBytesSync() + .buffer + .asByteData() + ); + + await (FontLoader('MaterialIcons')..addFont(bytes)).load(); }