import 'package:flutter/widgets.dart';
import 'package:test/test.dart';

import 'widget_tester.dart';

const Size pageSize = const Size(800.0, 600.0);
const List<int> pages = const <int>[0, 1, 2, 3, 4, 5];
int currentPage = null;
bool itemsWrap = false;

Widget buildPage(BuildContext context, int page) {
  return new Container(
    key: new ValueKey<int>(page),
    width: pageSize.width,
    height: pageSize.height,
    child: new Text(page.toString())
  );
}

Widget buildFrame() {
  // The test framework forces the frame (and so the PageableList)
  // to be 800x600. The pageSize constant reflects this.
  return new PageableList<int>(
    items: pages,
    itemBuilder: buildPage,
    itemsWrap: itemsWrap,
    itemExtent: pageSize.width,
    scrollDirection: ScrollDirection.horizontal,
    onPageChanged: (int page) { currentPage = page; }
  );
}

void page(WidgetTester tester, Offset offset) {
  String itemText = currentPage != null ? currentPage.toString() : '0';
  tester.scroll(tester.findText(itemText), offset);
  // One frame to start the animation, a second to complete it.
  tester.pump();
  tester.pump(const Duration(seconds: 1));
}

void pageLeft(WidgetTester tester) {
  page(tester, new Offset(-pageSize.width, 0.0));
}

void pageRight(WidgetTester tester) {
  page(tester, new Offset(pageSize.width, 0.0));
}

void main() {
  // PageableList with itemsWrap: false

  test('Scroll left from page 0 to page 1', () {
    testWidgets((WidgetTester tester) {
      currentPage = null;
      itemsWrap = false;
      tester.pumpWidget(buildFrame());
      expect(currentPage, isNull);
      pageLeft(tester);
      expect(currentPage, equals(1));
    });
  });

  test('Scroll right from page 1 to page 0', () {
    testWidgets((WidgetTester tester) {
      itemsWrap = false;
      tester.pumpWidget(buildFrame());
      expect(currentPage, equals(1));
      pageRight(tester);
      expect(currentPage, equals(0));
    });
  });

  test('Scroll right from page 0 does nothing (underscroll)', () {
    testWidgets((WidgetTester tester) {
      itemsWrap = false;
      tester.pumpWidget(buildFrame());
      expect(currentPage, equals(0));
      pageRight(tester);
      expect(currentPage, equals(0));
    });
  });

  // PageableList with itemsWrap: true

  test('Scroll left page 0 to page 1, itemsWrap: true', () {
    testWidgets((WidgetTester tester) {
      tester.pumpWidget(new Container());
      currentPage = null;
      itemsWrap = true;
      tester.pumpWidget(buildFrame());
      expect(currentPage, isNull);
      pageLeft(tester);
      expect(currentPage, equals(1));
    });
  });

  test('Scroll right from page 1 to page 0, itemsWrap: true', () {
    testWidgets((WidgetTester tester) {
      tester.pumpWidget(buildFrame());
      expect(currentPage, equals(1));
      pageRight(tester);
      expect(currentPage, equals(0));
    });
  });

  test('Scroll right from page 0 to page 5, itemsWrap: true (underscroll)', () {
    testWidgets((WidgetTester tester) {
      tester.pumpWidget(buildFrame());
      expect(currentPage, equals(0));
      pageRight(tester);
      expect(currentPage, equals(5));
    });
  });
}