page_view_test.dart 23.1 KB
Newer Older
Adam Barth's avatar
Adam Barth committed
1 2 3 4 5
// 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_test/flutter_test.dart';
6
import 'package:flutter/material.dart';
7
import 'package:flutter/rendering.dart';
Adam Barth's avatar
Adam Barth committed
8 9
import 'package:flutter/widgets.dart';

10
import 'semantics_tester.dart';
Adam Barth's avatar
Adam Barth committed
11 12 13 14 15 16
import 'states.dart';

const Duration _frameDuration = const Duration(milliseconds: 100);

void main() {
  testWidgets('PageView control test', (WidgetTester tester) async {
17
    final List<String> log = <String>[];
Adam Barth's avatar
Adam Barth committed
18

19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new PageView(
        children: kStates.map<Widget>((String state) {
          return new GestureDetector(
            onTap: () {
              log.add(state);
            },
            child: new Container(
              height: 200.0,
              color: const Color(0xFF0000FF),
              child: new Text(state),
            ),
          );
        }).toList(),
      ),
Adam Barth's avatar
Adam Barth committed
35 36 37 38 39 40 41 42
    ));

    await tester.tap(find.text('Alabama'));
    expect(log, equals(<String>['Alabama']));
    log.clear();

    expect(find.text('Alaska'), findsNothing);

43
    await tester.drag(find.byType(PageView), const Offset(-20.0, 0.0));
Adam Barth's avatar
Adam Barth committed
44 45 46 47 48 49
    await tester.pump();

    expect(find.text('Alabama'), findsOneWidget);
    expect(find.text('Alaska'), findsOneWidget);
    expect(find.text('Arizona'), findsNothing);

50
    await tester.pumpAndSettle(_frameDuration);
Adam Barth's avatar
Adam Barth committed
51 52 53 54

    expect(find.text('Alabama'), findsOneWidget);
    expect(find.text('Alaska'), findsNothing);

55 56
    await tester.drag(find.byType(PageView), const Offset(-401.0, 0.0));
    await tester.pumpAndSettle(_frameDuration);
Adam Barth's avatar
Adam Barth committed
57 58 59 60 61 62 63 64 65

    expect(find.text('Alabama'), findsNothing);
    expect(find.text('Alaska'), findsOneWidget);
    expect(find.text('Arizona'), findsNothing);

    await tester.tap(find.text('Alaska'));
    expect(log, equals(<String>['Alaska']));
    log.clear();

66
    await tester.fling(find.byType(PageView), const Offset(-200.0, 0.0), 1000.0);
67
    await tester.pumpAndSettle(_frameDuration);
Adam Barth's avatar
Adam Barth committed
68 69 70 71 72 73

    expect(find.text('Alabama'), findsNothing);
    expect(find.text('Alaska'), findsNothing);
    expect(find.text('Arizona'), findsOneWidget);

    await tester.fling(find.byType(PageView), const Offset(200.0, 0.0), 1000.0);
74
    await tester.pumpAndSettle(_frameDuration);
Adam Barth's avatar
Adam Barth committed
75 76 77 78 79

    expect(find.text('Alabama'), findsNothing);
    expect(find.text('Alaska'), findsOneWidget);
    expect(find.text('Arizona'), findsNothing);
  });
80

81 82
  testWidgets('PageView does not squish when overscrolled',
      (WidgetTester tester) async {
83 84 85 86 87 88
    await tester.pumpWidget(new MaterialApp(
      theme: new ThemeData(platform: TargetPlatform.iOS),
      home: new PageView(
        children: new List<Widget>.generate(10, (int i) {
          return new Container(
            key: new ValueKey<int>(i),
89
            color: const Color(0xFF0000FF),
90 91 92 93 94 95
          );
        }),
      ),
    ));

    Size sizeOf(int i) => tester.getSize(find.byKey(new ValueKey<int>(i)));
96
    double leftOf(int i) => tester.getTopLeft(find.byKey(new ValueKey<int>(i))).dx;
97 98 99 100

    expect(leftOf(0), equals(0.0));
    expect(sizeOf(0), equals(const Size(800.0, 600.0)));

101
    // Going into overscroll.
102
    await tester.drag(find.byType(PageView), const Offset(100.0, 0.0));
103 104
    await tester.pump();

105
    expect(leftOf(0), greaterThan(0.0));
106 107
    expect(sizeOf(0), equals(const Size(800.0, 600.0)));

108
    // Easing overscroll past overscroll limit.
109
    await tester.drag(find.byType(PageView), const Offset(-200.0, 0.0));
110 111
    await tester.pump();

112
    expect(leftOf(0), lessThan(0.0));
113 114
    expect(sizeOf(0), equals(const Size(800.0, 600.0)));
  });
115 116

  testWidgets('PageController control test', (WidgetTester tester) async {
117
    final PageController controller = new PageController(initialPage: 4);
118

119 120 121 122 123 124 125 126 127 128
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new Center(
        child: new SizedBox(
          width: 600.0,
          height: 400.0,
          child: new PageView(
            controller: controller,
            children: kStates.map<Widget>((String state) => new Text(state)).toList(),
          ),
129 130 131 132 133 134
        ),
      ),
    ));

    expect(find.text('California'), findsOneWidget);

135 136
    controller.nextPage(duration: const Duration(milliseconds: 150), curve: Curves.ease);
    await tester.pumpAndSettle(const Duration(milliseconds: 100));
137 138 139

    expect(find.text('Colorado'), findsOneWidget);

140 141 142 143 144 145 146 147 148 149
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new Center(
        child: new SizedBox(
          width: 300.0,
          height: 400.0,
          child: new PageView(
            controller: controller,
            children: kStates.map<Widget>((String state) => new Text(state)).toList(),
          ),
150 151 152 153 154 155
        ),
      ),
    ));

    expect(find.text('Colorado'), findsOneWidget);

156 157
    controller.previousPage(duration: const Duration(milliseconds: 150), curve: Curves.ease);
    await tester.pumpAndSettle(const Duration(milliseconds: 100));
158 159 160 161 162

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

  testWidgets('PageController page stability', (WidgetTester tester) async {
163 164 165 166 167 168 169 170 171 172
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new Center(
        child: new SizedBox(
          width: 600.0,
          height: 400.0,
          child: new PageView(
            children: kStates.map<Widget>((String state) => new Text(state)).toList(),
          ),
        )
173 174 175 176 177
      ),
    ));

    expect(find.text('Alabama'), findsOneWidget);

178 179
    await tester.drag(find.byType(PageView), const Offset(-1250.0, 0.0));
    await tester.pumpAndSettle(const Duration(milliseconds: 100));
180 181 182

    expect(find.text('Arizona'), findsOneWidget);

183 184 185 186 187 188 189 190 191
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new Center(
        child: new SizedBox(
          width: 250.0,
          height: 100.0,
          child: new PageView(
            children: kStates.map<Widget>((String state) => new Text(state)).toList(),
          ),
192 193 194 195 196 197
        ),
      ),
    ));

    expect(find.text('Arizona'), findsOneWidget);

198 199 200 201 202 203 204 205 206
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new Center(
        child: new SizedBox(
          width: 450.0,
          height: 400.0,
          child: new PageView(
            children: kStates.map<Widget>((String state) => new Text(state)).toList(),
          ),
207 208 209 210 211 212
        ),
      ),
    ));

    expect(find.text('Arizona'), findsOneWidget);
  });
213

214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
  testWidgets('PageController nextPage and previousPage return Futures that resolve', (WidgetTester tester) async {
    final PageController controller = new PageController();
    await tester.pumpWidget(new Directionality(
        textDirection: TextDirection.ltr,
        child: new PageView(
          controller: controller,
          children: kStates.map<Widget>((String state) => new Text(state)).toList(),
        ),
    ));

    bool nextPageCompleted = false;
    controller.nextPage(duration: const Duration(milliseconds: 150), curve: Curves.ease)
        .then((_) => nextPageCompleted = true);

    expect(nextPageCompleted, false);
    await tester.pump(const Duration(milliseconds: 200));
    expect(nextPageCompleted, false);
    await tester.pump(const Duration(milliseconds: 200));
    expect(nextPageCompleted, true);


    bool previousPageCompleted = false;
    controller.previousPage(duration: const Duration(milliseconds: 150), curve: Curves.ease)
        .then((_) => previousPageCompleted = true);

    expect(previousPageCompleted, false);
    await tester.pump(const Duration(milliseconds: 200));
    expect(previousPageCompleted, false);
    await tester.pump(const Duration(milliseconds: 200));
    expect(previousPageCompleted, true);
  });

246
  testWidgets('PageView in zero-size container', (WidgetTester tester) async {
247 248 249 250 251 252 253 254 255
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new Center(
        child: new SizedBox(
          width: 0.0,
          height: 0.0,
          child: new PageView(
            children: kStates.map<Widget>((String state) => new Text(state)).toList(),
          ),
256 257 258 259 260
        ),
      ),
    ));

    expect(find.text('Alabama'), findsOneWidget);
261

262 263 264 265 266 267 268 269 270
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new Center(
        child: new SizedBox(
          width: 200.0,
          height: 200.0,
          child: new PageView(
            children: kStates.map<Widget>((String state) => new Text(state)).toList(),
          ),
271 272 273 274 275
        ),
      ),
    ));

    expect(find.text('Alabama'), findsOneWidget);
276
  });
277 278 279

  testWidgets('Page changes at halfway point', (WidgetTester tester) async {
    final List<int> log = <int>[];
280 281 282 283 284 285
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new PageView(
        onPageChanged: log.add,
        children: kStates.map<Widget>((String state) => new Text(state)).toList(),
      ),
286 287 288 289
    ));

    expect(log, isEmpty);

290
    final TestGesture gesture =
291
        await tester.startGesture(const Offset(100.0, 100.0));
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
    // The page view is 800.0 wide, so this move is just short of halfway.
    await gesture.moveBy(const Offset(-380.0, 0.0));

    expect(log, isEmpty);

    // We've crossed the halfway mark.
    await gesture.moveBy(const Offset(-40.0, 0.0));

    expect(log, equals(const <int>[1]));
    log.clear();

    // Moving a bit more should not generate redundant notifications.
    await gesture.moveBy(const Offset(-40.0, 0.0));

    expect(log, isEmpty);

    await gesture.moveBy(const Offset(-40.0, 0.0));
    await tester.pump();

    await gesture.moveBy(const Offset(-40.0, 0.0));
    await tester.pump();

    await gesture.moveBy(const Offset(-40.0, 0.0));
    await tester.pump();

    expect(log, isEmpty);

    await gesture.up();
320
    await tester.pumpAndSettle();
321 322 323 324 325 326 327

    expect(log, isEmpty);

    expect(find.text('Alabama'), findsNothing);
    expect(find.text('Alaska'), findsOneWidget);
  });

328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
  testWidgets('Bouncing scroll physics ballistics does not overshoot', (WidgetTester tester) async {
    final List<int> log = <int>[];
    final PageController controller = new PageController(viewportFraction: 0.9);

    Widget build(PageController controller, {Size size}) {
      final Widget pageView = new Directionality(
        textDirection: TextDirection.ltr,
        child: new PageView(
          controller: controller,
          onPageChanged: log.add,
          physics: const BouncingScrollPhysics(),
          children: kStates.map<Widget>((String state) => new Text(state)).toList(),
        ),
      );

      if (size != null) {
        return new OverflowBox(
          child: pageView,
          minWidth: size.width,
          minHeight: size.height,
          maxWidth: size.width,
          maxHeight: size.height,
        );
      } else {
        return pageView;
      }
    }

    await tester.pumpWidget(build(controller));
    expect(log, isEmpty);

    // Fling right to move to a non-existent page at the beginning of the
    // PageView, and confirm that the PageView settles back on the first page.
    await tester.fling(find.byType(PageView), const Offset(100.0, 0.0), 800.0);
    await tester.pumpAndSettle();
    expect(log, isEmpty);

    expect(find.text('Alabama'), findsOneWidget);
    expect(find.text('Alaska'), findsOneWidget);
    expect(find.text('Arizona'), findsNothing);

    // Try again with a Cupertino "Plus" device size.
    await tester.pumpWidget(build(controller, size: const Size(414.0, 736.0)));
    expect(log, isEmpty);

    await tester.fling(find.byType(PageView), const Offset(100.0, 0.0), 800.0);
    await tester.pumpAndSettle();
    expect(log, isEmpty);

    expect(find.text('Alabama'), findsOneWidget);
    expect(find.text('Alaska'), findsOneWidget);
    expect(find.text('Arizona'), findsNothing);
  });

382 383 384 385
  testWidgets('PageView viewportFraction', (WidgetTester tester) async {
    PageController controller = new PageController(viewportFraction: 7/8);

    Widget build(PageController controller) {
386 387 388 389 390 391 392 393 394 395 396 397 398 399 400
      return new Directionality(
        textDirection: TextDirection.ltr,
        child: new PageView.builder(
          controller: controller,
          itemCount: kStates.length,
          itemBuilder: (BuildContext context, int index) {
            return new Container(
              height: 200.0,
              color: index % 2 == 0
                  ? const Color(0xFF0000FF)
                  : const Color(0xFF00FF00),
              child: new Text(kStates[index]),
            );
          },
        ),
401 402 403 404 405
      );
    }

    await tester.pumpWidget(build(controller));

406 407
    expect(tester.getTopLeft(find.text('Alabama')), const Offset(50.0, 0.0));
    expect(tester.getTopLeft(find.text('Alaska')), const Offset(750.0, 0.0));
408 409 410 411

    controller.jumpToPage(10);
    await tester.pump();

412 413 414
    expect(tester.getTopLeft(find.text('Georgia')), const Offset(-650.0, 0.0));
    expect(tester.getTopLeft(find.text('Hawaii')), const Offset(50.0, 0.0));
    expect(tester.getTopLeft(find.text('Idaho')), const Offset(750.0, 0.0));
415 416 417 418 419

    controller = new PageController(viewportFraction: 39/40);

    await tester.pumpWidget(build(controller));

420 421 422
    expect(tester.getTopLeft(find.text('Georgia')), const Offset(-770.0, 0.0));
    expect(tester.getTopLeft(find.text('Hawaii')), const Offset(10.0, 0.0));
    expect(tester.getTopLeft(find.text('Idaho')), const Offset(790.0, 0.0));
423 424
  });

425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487
  testWidgets('Page snapping disable and reenable', (WidgetTester tester) async {
    final List<int> log = <int>[];

    Widget build({ bool pageSnapping }) {
      return new Directionality(
        textDirection: TextDirection.ltr,
        child: new PageView(
          pageSnapping: pageSnapping,
          onPageChanged: log.add,
          children:
              kStates.map<Widget>((String state) => new Text(state)).toList(),
        ),
      );
    }

    await tester.pumpWidget(build(pageSnapping: true));
    expect(log, isEmpty);

    // Drag more than halfway to the next page, to confirm the default behavior.
    TestGesture gesture = await tester.startGesture(const Offset(100.0, 100.0));
    // The page view is 800.0 wide, so this move is just beyond halfway.
    await gesture.moveBy(const Offset(-420.0, 0.0));

    expect(log, equals(const <int>[1]));
    log.clear();

    // Release the gesture, confirm that the page settles on the next.
    await gesture.up();
    await tester.pumpAndSettle();

    expect(find.text('Alabama'), findsNothing);
    expect(find.text('Alaska'), findsOneWidget);

    // Disable page snapping, and try moving halfway. Confirm it doesn't snap.
    await tester.pumpWidget(build(pageSnapping: false));
    gesture = await tester.startGesture(const Offset(100.0, 100.0));
    // Move just beyond halfway, again.
    await gesture.moveBy(const Offset(-420.0, 0.0));

    // Page notifications still get sent.
    expect(log, equals(const <int>[2]));
    log.clear();

    // Release the gesture, confirm that both pages are visible.
    await gesture.up();
    await tester.pumpAndSettle();

    expect(find.text('Alabama'), findsNothing);
    expect(find.text('Alaska'), findsOneWidget);
    expect(find.text('Arizona'), findsOneWidget);
    expect(find.text('Arkansas'), findsNothing);

    // Now re-enable snapping, confirm that we've settled on a page.
    await tester.pumpWidget(build(pageSnapping: true));
    await tester.pumpAndSettle();

    expect(log, isEmpty);

    expect(find.text('Alaska'), findsNothing);
    expect(find.text('Arizona'), findsOneWidget);
    expect(find.text('Arkansas'), findsNothing);
  });

488
  testWidgets('PageView small viewportFraction', (WidgetTester tester) async {
489
    final PageController controller = new PageController(viewportFraction: 1/8);
490 491

    Widget build(PageController controller) {
492 493 494 495 496 497 498 499 500 501 502 503 504 505 506
      return new Directionality(
        textDirection: TextDirection.ltr,
        child: new PageView.builder(
          controller: controller,
          itemCount: kStates.length,
          itemBuilder: (BuildContext context, int index) {
            return new Container(
              height: 200.0,
              color: index % 2 == 0
                  ? const Color(0xFF0000FF)
                  : const Color(0xFF00FF00),
              child: new Text(kStates[index]),
            );
          },
        ),
507 508 509 510 511
      );
    }

    await tester.pumpWidget(build(controller));

512 513 514 515 516
    expect(tester.getTopLeft(find.text('Alabama')), const Offset(350.0, 0.0));
    expect(tester.getTopLeft(find.text('Alaska')), const Offset(450.0, 0.0));
    expect(tester.getTopLeft(find.text('Arizona')), const Offset(550.0, 0.0));
    expect(tester.getTopLeft(find.text('Arkansas')), const Offset(650.0, 0.0));
    expect(tester.getTopLeft(find.text('California')), const Offset(750.0, 0.0));
517 518 519 520

    controller.jumpToPage(10);
    await tester.pump();

521 522 523 524 525 526 527 528 529
    expect(tester.getTopLeft(find.text('Connecticut')), const Offset(-50.0, 0.0));
    expect(tester.getTopLeft(find.text('Delaware')), const Offset(50.0, 0.0));
    expect(tester.getTopLeft(find.text('Florida')), const Offset(150.0, 0.0));
    expect(tester.getTopLeft(find.text('Georgia')), const Offset(250.0, 0.0));
    expect(tester.getTopLeft(find.text('Hawaii')), const Offset(350.0, 0.0));
    expect(tester.getTopLeft(find.text('Idaho')), const Offset(450.0, 0.0));
    expect(tester.getTopLeft(find.text('Illinois')), const Offset(550.0, 0.0));
    expect(tester.getTopLeft(find.text('Indiana')), const Offset(650.0, 0.0));
    expect(tester.getTopLeft(find.text('Iowa')), const Offset(750.0, 0.0));
530 531 532
  });

  testWidgets('PageView large viewportFraction', (WidgetTester tester) async {
533 534
    final PageController controller =
        new PageController(viewportFraction: 5/4);
535 536

    Widget build(PageController controller) {
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551
      return new Directionality(
        textDirection: TextDirection.ltr,
        child: new PageView.builder(
          controller: controller,
          itemCount: kStates.length,
          itemBuilder: (BuildContext context, int index) {
            return new Container(
              height: 200.0,
              color: index % 2 == 0
                  ? const Color(0xFF0000FF)
                  : const Color(0xFF00FF00),
              child: new Text(kStates[index]),
            );
          },
        ),
552 553 554 555 556
      );
    }

    await tester.pumpWidget(build(controller));

557 558
    expect(tester.getTopLeft(find.text('Alabama')), const Offset(-100.0, 0.0));
    expect(tester.getBottomRight(find.text('Alabama')), const Offset(900.0, 600.0));
559 560 561 562

    controller.jumpToPage(10);
    await tester.pump();

563
    expect(tester.getTopLeft(find.text('Hawaii')), const Offset(-100.0, 0.0));
564
  });
565 566 567

  testWidgets('PageView does not report page changed on overscroll',
      (WidgetTester tester) async {
568 569 570
    final PageController controller = new PageController(
      initialPage: kStates.length - 1,
    );
571 572
    int changeIndex = 0;
    Widget build() {
573 574 575 576 577 578 579 580 581 582
      return new Directionality(
        textDirection: TextDirection.ltr,
        child: new PageView(
          children:
              kStates.map<Widget>((String state) => new Text(state)).toList(),
          controller: controller,
          onPageChanged: (int page) {
            changeIndex = page;
          },
        ),
583 584 585 586 587 588 589 590 591 592
      );
    }

    await tester.pumpWidget(build());
    controller.jumpToPage(kStates.length * 2); // try to move beyond max range
    // change index should be zero, shouldn't fire onPageChanged
    expect(changeIndex, 0);
    await tester.pump();
    expect(changeIndex, 0);
  });
593 594 595 596

  testWidgets('PageView can restore page',
      (WidgetTester tester) async {
    final PageController controller = new PageController();
597 598 599 600 601 602 603 604 605
    try {
      controller.page;
      fail('Accessing page before attaching should fail.');
    } on AssertionError catch (e) {
      expect(
        e.message,
        'PageController.page cannot be accessed before a PageView is built with it.',
      );
    }
606
    final PageStorageBucket bucket = new PageStorageBucket();
607 608 609
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new PageStorage(
610 611
        bucket: bucket,
        child: new PageView(
612
          key: const PageStorageKey<String>('PageView'),
613 614 615 616 617 618 619 620
          controller: controller,
          children: <Widget>[
            const Placeholder(),
            const Placeholder(),
            const Placeholder(),
          ],
        ),
      ),
621
    ));
622 623 624 625 626 627 628 629 630 631
    expect(controller.page, 0);
    controller.jumpToPage(2);
    expect(await tester.pumpAndSettle(const Duration(minutes: 1)), 1);
    expect(controller.page, 2);
    await tester.pumpWidget(
      new PageStorage(
        bucket: bucket,
        child: new Container(),
      ),
    );
632 633 634 635 636 637 638 639 640
    try {
      controller.page;
      fail('Accessing page after detaching all PageViews should fail.');
    } on AssertionError catch (e) {
      expect(
        e.message,
        'PageController.page cannot be accessed before a PageView is built with it.',
      );
    }
641 642 643
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new PageStorage(
644 645
        bucket: bucket,
        child: new PageView(
646
          key: const PageStorageKey<String>('PageView'),
647 648 649 650 651 652 653 654
          controller: controller,
          children: <Widget>[
            const Placeholder(),
            const Placeholder(),
            const Placeholder(),
          ],
        ),
      ),
655
    ));
656
    expect(controller.page, 2);
657 658

    final PageController controller2 = new PageController(keepPage: false);
659 660 661
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new PageStorage(
662 663
        bucket: bucket,
        child: new PageView(
664
          key: const PageStorageKey<String>('Check it again against your list and see consistency!'),
665
          controller: controller2,
666 667 668 669 670 671 672
          children: <Widget>[
            const Placeholder(),
            const Placeholder(),
            const Placeholder(),
          ],
        ),
      ),
673
    ));
674
    expect(controller2.page, 0);
675
  });
676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714

  testWidgets('PageView exposes semantics of children', (WidgetTester tester) async {
    final SemanticsTester semantics = new SemanticsTester(tester);

    final PageController controller = new PageController();
    await tester.pumpWidget(new Directionality(
      textDirection: TextDirection.ltr,
      child: new PageView(
          controller: controller,
          children: new List<Widget>.generate(3, (int i) {
            return new Semantics(
              child: new Text('Page #$i'),
              container: true,
            );
          })
        ),
    ));
    expect(controller.page, 0);

    expect(semantics, includesNodeWith(label: 'Page #0'));
    expect(semantics, isNot(includesNodeWith(label: 'Page #1')));
    expect(semantics, isNot(includesNodeWith(label: 'Page #2')));

    controller.jumpToPage(1);
    await tester.pumpAndSettle();

    expect(semantics, isNot(includesNodeWith(label: 'Page #0')));
    expect(semantics, includesNodeWith(label: 'Page #1'));
    expect(semantics, isNot(includesNodeWith(label: 'Page #2')));

    controller.jumpToPage(2);
    await tester.pumpAndSettle();

    expect(semantics, isNot(includesNodeWith(label: 'Page #0')));
    expect(semantics, isNot(includesNodeWith(label: 'Page #1')));
    expect(semantics, includesNodeWith(label: 'Page #2'));

    semantics.dispose();
  });
Adam Barth's avatar
Adam Barth committed
715
}