list_section_test.dart 8.26 KB
Newer Older
1 2 3 4 5 6 7 8
// 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 'package:flutter/cupertino.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
9
  testWidgets('shows header', (WidgetTester tester) async {
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
    await tester.pumpWidget(
      CupertinoApp(
        home: Center(
          child: CupertinoListSection(
            header: const Text('Header'),
            children: const <Widget>[
              CupertinoListTile(title: Text('CupertinoListTile')),
            ],
          ),
        ),
      ),
    );

    expect(find.text('Header'), findsOneWidget);
  });

26
  testWidgets('shows footer', (WidgetTester tester) async {
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
    await tester.pumpWidget(
      CupertinoApp(
        home: Center(
          child: CupertinoListSection(
            footer: const Text('Footer'),
            children: const <Widget>[
              CupertinoListTile(title: Text('CupertinoListTile')),
            ],
          ),
        ),
      ),
    );

    expect(find.text('Footer'), findsOneWidget);
  });

43
  testWidgets('shows long dividers in edge-to-edge section part 1', (WidgetTester tester) async {
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
    await tester.pumpWidget(
      CupertinoApp(
        home: Center(
          child: CupertinoListSection(
            children: const <Widget>[
              CupertinoListTile(title: Text('CupertinoListTile')),
            ],
          ),
        ),
      ),
    );

    // Since the children list is reconstructed with dividers in it, the column
    // retrieved should have 3 items for an input [children] param with 1 child.
    final Column childrenColumn = tester.widget(find.byType(Column).at(1));
    expect(childrenColumn.children.length, 3);
  });

62
  testWidgets('shows long dividers in edge-to-edge section part 2', (WidgetTester tester) async {
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
    await tester.pumpWidget(
      CupertinoApp(
        home: Center(
          child: CupertinoListSection(
            children: const <Widget>[
              CupertinoListTile(title: Text('CupertinoListTile')),
              CupertinoListTile(title: Text('CupertinoListTile')),
            ],
          ),
        ),
      ),
    );

    // Since the children list is reconstructed with dividers in it, the column
    // retrieved should have 5 items for an input [children] param with 2
    // children. Two long dividers, two rows, and one short divider.
    final Column childrenColumn = tester.widget(find.byType(Column).at(1));
    expect(childrenColumn.children.length, 5);
  });

83
  testWidgets('does not show long dividers in insetGrouped section part 1', (WidgetTester tester) async {
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
    await tester.pumpWidget(
      CupertinoApp(
        home: Center(
          child: CupertinoListSection.insetGrouped(
            children: const <Widget>[
              CupertinoListTile(title: Text('CupertinoListTile')),
            ],
          ),
        ),
      ),
    );

    // Since the children list is reconstructed without long dividers in it, the
    // column retrieved should have 1 item for an input [children] param with 1
    // child.
    final Column childrenColumn = tester.widget(find.byType(Column).at(1));
    expect(childrenColumn.children.length, 1);
  });

103
  testWidgets('does not show long dividers in insetGrouped section part 2', (WidgetTester tester) async {
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
    await tester.pumpWidget(
      CupertinoApp(
        home: Center(
          child: CupertinoListSection.insetGrouped(
            children: const <Widget>[
              CupertinoListTile(title: Text('CupertinoListTile')),
              CupertinoListTile(title: Text('CupertinoListTile')),
            ],
          ),
        ),
      ),
    );

    // Since the children list is reconstructed with short dividers in it, the
    // column retrieved should have 3 items for an input [children] param with 2
    // children. Two long dividers, two rows, and one short divider.
    final Column childrenColumn = tester.widget(find.byType(Column).at(1));
    expect(childrenColumn.children.length, 3);
  });

124
  testWidgets('sets background color for section', (WidgetTester tester) async {
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
    const Color backgroundColor = CupertinoColors.systemBlue;

    await tester.pumpWidget(
      Directionality(
        textDirection: TextDirection.ltr,
        child: MediaQuery(
          data: const MediaQueryData(),
          child: CupertinoListSection(
            backgroundColor: backgroundColor,
            children: const <Widget>[
              CupertinoListTile(title: Text('CupertinoListTile')),
            ],
          ),
        ),
      ),
    );

    final DecoratedBox decoratedBox = tester.widget(find.byType(DecoratedBox).first);
    final BoxDecoration boxDecoration = decoratedBox.decoration as BoxDecoration;
    expect(boxDecoration.color, backgroundColor);
  });

147
  testWidgets('setting clipBehavior clips children section', (WidgetTester tester) async {
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
    await tester.pumpWidget(
      CupertinoApp(
        home: Center(
          child: CupertinoListSection(
            clipBehavior: Clip.antiAlias,
            children: const <Widget>[
              CupertinoListTile(title: Text('CupertinoListTile')),
            ],
          ),
        ),
      ),
    );

    expect(find.byType(ClipRRect), findsOneWidget);
  });

164
  testWidgets('not setting clipBehavior does not clip children section', (WidgetTester tester) async {
165 166 167 168 169 170 171 172 173 174 175 176 177 178
    await tester.pumpWidget(
      CupertinoApp(
        home: Center(
          child: CupertinoListSection(
            children: const <Widget>[
              CupertinoListTile(title: Text('CupertinoListTile')),
            ],
          ),
        ),
      ),
    );

    expect(find.byType(ClipRRect), findsNothing);
  });
179

180
  testWidgets('CupertinoListSection respects separatorColor', (WidgetTester tester) async {
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
    await tester.pumpWidget(
      CupertinoApp(
        home: Center(
          child: CupertinoListSection(
            separatorColor: const Color.fromARGB(255, 143, 193, 51),
            children: const <Widget>[
              CupertinoListTile(title: Text('CupertinoListTile')),
              CupertinoListTile(title: Text('CupertinoListTile')),
            ],
          ),
        ),
      ),
    );

    final Column childrenColumn = tester.widget(find.byType(Column).at(1));
    for (final Widget e in childrenColumn.children) {
      if (e is Container) {
        expect(e.color, const Color.fromARGB(255, 143, 193, 51));
      }
    }
  });

203
  testWidgets('CupertinoListSection.separatorColor defaults CupertinoColors.separator', (WidgetTester tester) async {
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
    await tester.pumpWidget(
      CupertinoApp(
        home: Center(
          child: CupertinoListSection(
            children: const <Widget>[
              CupertinoListTile(title: Text('CupertinoListTile')),
              CupertinoListTile(title: Text('CupertinoListTile')),
            ],
          ),
        ),
      ),
    );

    final BuildContext context = tester.element(find.byType(CupertinoListSection));
    final Column childrenColumn = tester.widget(find.byType(Column).at(1));
    for (final Widget e in childrenColumn.children) {
      if (e is Container) {
        expect(e.color, CupertinoColors.separator.resolveFrom(context));
      }
    }
  });
225

226
  testWidgets('does not show margin by default', (WidgetTester tester) async {
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
    const Widget child = CupertinoListTile(title: Text('CupertinoListTile'));

    await tester.pumpWidget(
      CupertinoApp(
        home: Center(
          child: CupertinoListSection(
            header: const Text('Header'),
            children: const <Widget>[
              child,
            ],
          ),
        ),
      ),
    );

    expect(tester.getTopLeft(find.byWidget(child)), offsetMoreOrLessEquals(const Offset(0, 41), epsilon: 1));
  });

245
  testWidgets('shows custom margin', (WidgetTester tester) async {
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
    const Widget child = CupertinoListTile(title: Text('CupertinoListTile'));
    const double margin = 10;

    await tester.pumpWidget(
      CupertinoApp(
        home: Center(
          child: CupertinoListSection(
            header: const Text('Header'),
            margin: const EdgeInsets.all(margin),
            children: const <Widget>[
              child,
            ],
          ),
        ),
      ),
    );

    expect(tester.getTopLeft(find.byWidget(child)), offsetMoreOrLessEquals(const Offset(margin, 41 + margin), epsilon: 1));
  });
265
}