icons_test.dart 5.86 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5 6 7
// This file is run as part of a reduced test set in CI on Mac and Windows
// machines.
@Tags(<String>['reduced-test-set'])
8
library;
9

10 11
import 'package:file/file.dart';
import 'package:file/local.dart';
12
import 'package:flutter/material.dart';
13
import 'package:flutter/services.dart';
14
import 'package:flutter_test/flutter_test.dart';
15
import 'package:platform/platform.dart';
16 17 18 19 20 21 22

void main() {
  testWidgets('IconData object test', (WidgetTester tester) async {
    expect(Icons.account_balance, isNot(equals(Icons.account_box)));
    expect(Icons.account_balance.hashCode, isNot(equals(Icons.account_box.hashCode)));
    expect(Icons.account_balance, hasOneLineDescription);
  });
23 24 25 26 27

  testWidgets('Icons specify the material font', (WidgetTester tester) async {
    expect(Icons.clear.fontFamily, 'MaterialIcons');
    expect(Icons.search.fontFamily, 'MaterialIcons');
  });
Pierre-Louis's avatar
Pierre-Louis committed
28

29 30 31 32 33 34 35 36 37 38 39 40
  testWidgets('Certain icons (and their variants) match text direction', (WidgetTester tester) async {
    expect(Icons.arrow_back.matchTextDirection, true);
    expect(Icons.arrow_back_rounded.matchTextDirection, true);
    expect(Icons.arrow_back_outlined.matchTextDirection, true);
    expect(Icons.arrow_back_sharp.matchTextDirection, true);

    expect(Icons.access_time.matchTextDirection, false);
    expect(Icons.access_time_rounded.matchTextDirection, false);
    expect(Icons.access_time_outlined.matchTextDirection, false);
    expect(Icons.access_time_sharp.matchTextDirection, false);
  });

41
  testWidgets('Adaptive icons are correct on cupertino platforms', (WidgetTester tester) async {
Pierre-Louis's avatar
Pierre-Louis committed
42 43 44 45 46 47 48 49 50
      expect(Icons.adaptive.arrow_back, Icons.arrow_back_ios);
      expect(Icons.adaptive.arrow_back_outlined, Icons.arrow_back_ios_outlined);
    },
    variant: const TargetPlatformVariant(<TargetPlatform>{
      TargetPlatform.iOS,
      TargetPlatform.macOS,
    }),
  );

51
  testWidgets('Adaptive icons are correct on non-cupertino platforms', (WidgetTester tester) async {
Pierre-Louis's avatar
Pierre-Louis committed
52 53 54 55 56 57 58 59 60 61
      expect(Icons.adaptive.arrow_back, Icons.arrow_back);
      expect(Icons.adaptive.arrow_back_outlined, Icons.arrow_back_outlined);
    },
    variant: const TargetPlatformVariant(<TargetPlatform>{
      TargetPlatform.android,
      TargetPlatform.fuchsia,
      TargetPlatform.windows,
      TargetPlatform.linux,
    }),
  );
62 63 64 65

  testWidgets('A sample of icons look as expected', (WidgetTester tester) async {
    await _loadIconFont();

66
    await tester.pumpWidget(const MaterialApp(
67
      home: IconTheme(
68
        data: IconThemeData(size: 200),
69
        child: Wrap(
70
          children: <Icon>[
71 72 73 74 75 76 77 78 79 80 81 82 83 84
            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
85 86 87 88 89

  // Regression test for https://github.com/flutter/flutter/issues/95886
  testWidgets('Another sample of icons look as expected', (WidgetTester tester) async {
    await _loadIconFont();

90
    await tester.pumpWidget(const MaterialApp(
91
      home: IconTheme(
92
        data: IconThemeData(size: 200),
93
        child: Wrap(
94
          children: <Icon>[
95 96 97 98 99 100 101 102 103 104 105
            Icon(Icons.water_drop),
            Icon(Icons.water_drop_outlined),
            Icon(Icons.water_drop_rounded),
            Icon(Icons.water_drop_sharp),
          ],
        ),
      ),
    ));

    await expectLater(find.byType(Wrap), matchesGoldenFile('test.icons.sample2.png'));
  }, skip: isBrowser); // https://github.com/flutter/flutter/issues/39998
106 107 108 109

  testWidgets('Another sample of icons look as expected', (WidgetTester tester) async {
    await _loadIconFont();

110
    await tester.pumpWidget(const MaterialApp(
111
      home: IconTheme(
112
        data: IconThemeData(size: 200),
113
        child: Wrap(
114
          children: <Icon>[
115 116 117 118 119 120 121 122 123 124 125
            Icon(Icons.electric_bolt),
            Icon(Icons.electric_bolt_outlined),
            Icon(Icons.electric_bolt_rounded),
            Icon(Icons.electric_bolt_sharp),
          ],
        ),
      ),
    ));

    await expectLater(find.byType(Wrap), matchesGoldenFile('test.icons.sample3.png'));
  }, skip: isBrowser); // https://github.com/flutter/flutter/issues/39998
126 127 128 129 130

  // Regression test for https://github.com/flutter/flutter/issues/103202.
  testWidgets('Another sample of icons look as expected', (WidgetTester tester) async {
    await _loadIconFont();

131
    await tester.pumpWidget(const MaterialApp(
132
      home: IconTheme(
133
        data: IconThemeData(size: 200),
134
        child: Wrap(
135
          children: <Icon>[
136 137 138 139 140 141 142 143 144 145 146
            Icon(Icons.repeat_on),
            Icon(Icons.repeat_on_outlined),
            Icon(Icons.repeat_on_rounded),
            Icon(Icons.repeat_on_sharp),
          ],
        ),
      ),
    ));

    await expectLater(find.byType(Wrap), matchesGoldenFile('test.icons.sample4.png'));
  }, skip: isBrowser); // https://github.com/flutter/flutter/issues/39998
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
}

// Loads the cached material icon font.
// Only necessary for golden tests. Relies on the tool updating cached assets before
// running tests.
Future<void> _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<ByteData> bytes = Future<ByteData>.value(
168
      iconFont.readAsBytesSync().buffer.asByteData(),
169 170 171
  );

  await (FontLoader('MaterialIcons')..addFont(bytes)).load();
172
}