icon_test.dart 6.21 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
import 'package:flutter/material.dart';
6
import 'package:flutter_test/flutter_test.dart';
7
import 'package:flutter/widgets.dart';
8

9 10
import 'semantics_tester.dart';

11
void main() {
12 13
  testWidgets('Can set opacity for an Icon', (WidgetTester tester) async {
    await tester.pumpWidget(
Ian Hickson's avatar
Ian Hickson committed
14 15
      const Directionality(
        textDirection: TextDirection.ltr,
16 17 18
        child: IconTheme(
          data: IconThemeData(
            color: Color(0xFF666666),
19
            opacity: 0.5,
Ian Hickson's avatar
Ian Hickson committed
20
          ),
21
          child: Icon(IconData(0xd0a0, fontFamily: 'Arial')),
22
        ),
Ian Hickson's avatar
Ian Hickson committed
23
      ),
24
    );
25
    final RichText text = tester.widget(find.byType(RichText));
26
    expect(text.text.style!.color, const Color(0xFF666666).withOpacity(0.5));
27 28 29 30
  });

  testWidgets('Icon sizing - no theme, default size', (WidgetTester tester) async {
    await tester.pumpWidget(
Ian Hickson's avatar
Ian Hickson committed
31 32
      const Directionality(
        textDirection: TextDirection.ltr,
33 34
        child: Center(
          child: Icon(null),
Ian Hickson's avatar
Ian Hickson committed
35
        ),
36 37 38 39 40 41 42 43 44
      ),
    );

    final RenderBox renderObject = tester.renderObject(find.byType(Icon));
    expect(renderObject.size, equals(const Size.square(24.0)));
  });

  testWidgets('Icon sizing - no theme, explicit size', (WidgetTester tester) async {
    await tester.pumpWidget(
Ian Hickson's avatar
Ian Hickson committed
45 46
      const Directionality(
        textDirection: TextDirection.ltr,
47 48
        child: Center(
          child: Icon(
Ian Hickson's avatar
Ian Hickson committed
49 50 51
            null,
            size: 96.0,
          ),
52 53 54 55 56 57 58 59 60 61
        ),
      ),
    );

    final RenderBox renderObject = tester.renderObject(find.byType(Icon));
    expect(renderObject.size, equals(const Size.square(96.0)));
  });

  testWidgets('Icon sizing - sized theme', (WidgetTester tester) async {
    await tester.pumpWidget(
Ian Hickson's avatar
Ian Hickson committed
62 63
      const Directionality(
        textDirection: TextDirection.ltr,
64 65 66 67
        child: Center(
          child: IconTheme(
            data: IconThemeData(size: 36.0),
            child: Icon(null),
Ian Hickson's avatar
Ian Hickson committed
68
          ),
69 70 71 72 73 74 75 76 77 78
        ),
      ),
    );

    final RenderBox renderObject = tester.renderObject(find.byType(Icon));
    expect(renderObject.size, equals(const Size.square(36.0)));
  });

  testWidgets('Icon sizing - sized theme, explicit size', (WidgetTester tester) async {
    await tester.pumpWidget(
Ian Hickson's avatar
Ian Hickson committed
79 80
      const Directionality(
        textDirection: TextDirection.ltr,
81 82 83 84
        child: Center(
          child: IconTheme(
            data: IconThemeData(size: 36.0),
            child: Icon(
Ian Hickson's avatar
Ian Hickson committed
85 86 87
              null,
              size: 48.0,
            ),
88 89
          ),
        ),
90
      ),
91 92 93 94 95 96 97 98
    );

    final RenderBox renderObject = tester.renderObject(find.byType(Icon));
    expect(renderObject.size, equals(const Size.square(48.0)));
  });

  testWidgets('Icon sizing - sizeless theme, default size', (WidgetTester tester) async {
    await tester.pumpWidget(
Ian Hickson's avatar
Ian Hickson committed
99 100
      const Directionality(
        textDirection: TextDirection.ltr,
101 102 103 104
        child: Center(
          child: IconTheme(
            data: IconThemeData(),
            child: Icon(null),
Ian Hickson's avatar
Ian Hickson committed
105
          ),
106 107 108 109 110 111 112 113 114 115 116
        ),
      ),
    );

    final RenderBox renderObject = tester.renderObject(find.byType(Icon));
    expect(renderObject.size, equals(const Size.square(24.0)));
  });


  testWidgets('Icon with custom font', (WidgetTester tester) async {
    await tester.pumpWidget(
Ian Hickson's avatar
Ian Hickson committed
117 118
      const Directionality(
        textDirection: TextDirection.ltr,
119 120
        child: Center(
          child: Icon(IconData(0x41, fontFamily: 'Roboto')),
Ian Hickson's avatar
Ian Hickson committed
121
        ),
122 123 124 125
      ),
    );

    final RichText richText = tester.firstWidget(find.byType(RichText));
126
    expect(richText.text.style!.fontFamily, equals('Roboto'));
127
  });
128 129

  testWidgets('Icon with semantic label', (WidgetTester tester) async {
130
    final SemanticsTester semantics = SemanticsTester(tester);
131 132 133 134

    await tester.pumpWidget(
      const Directionality(
        textDirection: TextDirection.ltr,
135 136
        child: Center(
          child: Icon(
137 138 139 140 141 142 143
            Icons.title,
            semanticLabel: 'a label',
          ),
        ),
      ),
    );

144
    expect(semantics, includesNodeWith(label: 'a label'));
145 146

    semantics.dispose();
147 148 149
  });

  testWidgets('Null icon with semantic label', (WidgetTester tester) async {
150
    final SemanticsTester semantics = SemanticsTester(tester);
151 152 153 154

    await tester.pumpWidget(
      const Directionality(
        textDirection: TextDirection.ltr,
155 156
        child: Center(
          child: Icon(
157 158 159 160 161 162 163
            null,
            semanticLabel: 'a label',
          ),
        ),
      ),
    );

164
    expect(semantics, includesNodeWith(label: 'a label'));
165 166

    semantics.dispose();
167
  });
168

169
  testWidgets("Changing semantic label from null doesn't rebuild tree ", (WidgetTester tester) async {
170 171 172
    await tester.pumpWidget(
      const Directionality(
        textDirection: TextDirection.ltr,
173 174
        child: Center(
          child: Icon(Icons.time_to_leave),
175 176 177 178 179 180 181 182 183
        ),
      ),
    );

    final Element richText1 = tester.element(find.byType(RichText));

    await tester.pumpWidget(
      const Directionality(
        textDirection: TextDirection.ltr,
184 185
        child: Center(
          child: Icon(
186 187 188 189 190 191 192 193 194 195 196 197 198
            Icons.time_to_leave,
            semanticLabel: 'a label',
          ),
        ),
      ),
    );

    final Element richText2 = tester.element(find.byType(RichText));

    // Compare a leaf Element in the Icon subtree before and after changing the
    // semanticLabel to make sure the subtree was not rebuilt.
    expect(richText2, same(richText1));
  });
199 200 201 202 203 204 205 206 207 208 209 210

  testWidgets('IconData comparison', (WidgetTester tester) async {
    expect(const IconData(123), const IconData(123));
    expect(const IconData(123), isNot(const IconData(123, matchTextDirection: true)));
    expect(const IconData(123), isNot(const IconData(123, fontFamily: 'f')));
    expect(const IconData(123), isNot(const IconData(123, fontPackage: 'p')));
    expect(const IconData(123).hashCode, const IconData(123).hashCode);
    expect(const IconData(123).hashCode, isNot(const IconData(123, matchTextDirection: true).hashCode));
    expect(const IconData(123).hashCode, isNot(const IconData(123, fontFamily: 'f').hashCode));
    expect(const IconData(123).hashCode, isNot(const IconData(123, fontPackage: 'p').hashCode));
    expect(const IconData(123).toString(), 'IconData(U+0007B)');
  });
211
}