// 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/material.dart';
import 'package:flutter_test/flutter_test.dart';

import '../lib/expansion_tile_sample.dart' as expansion_tile_sample;
import '../lib/expansion_tile_sample.dart' show Entry;

void main() {
  testWidgets('expansion_tile sample smoke test', (WidgetTester tester) async {
    expansion_tile_sample.main();
    await tester.pump();

    // Initially only the top level EntryItems (the "chapters") are present.
    for (Entry chapter in expansion_tile_sample.data) {
      expect(find.text(chapter.title), findsOneWidget);
      for (Entry section in chapter.children) {
        expect(find.text(section.title), findsNothing);
        for (Entry item in section.children)
          expect(find.text(item.title), findsNothing);
      }
    }

    Future<Null> scrollUpOneEntry() async {
      await tester.dragFrom(const Offset(200.0, 200.0), const Offset(0.0, -88.00));
      await tester.pumpAndSettle();
    }

    Future<Null> tapEntry(String title) async {
      await tester.tap(find.text(title));
      await tester.pumpAndSettle();
    }

    // Expand the chapters. Now the chapter and sections, but not the
    // items, should be present.
    for (Entry chapter in expansion_tile_sample.data.reversed)
      await tapEntry(chapter.title);

    for (Entry chapter in expansion_tile_sample.data) {
      expect(find.text(chapter.title), findsOneWidget);
      for (Entry section in chapter.children) {
        expect(find.text(section.title), findsOneWidget);
        await scrollUpOneEntry();
        for (Entry item in section.children)
          expect(find.text(item.title), findsNothing);
      }
      await scrollUpOneEntry();
    }

    // - scroll to the top -
    await tester.flingFrom(const Offset(200.0, 200.0), const Offset(0.0, 100.0), 5000.0);
    await tester.pumpAndSettle();

    // Expand the sections. Now Widgets for all three levels should be present.
    for (Entry chapter in expansion_tile_sample.data) {
      for (Entry section in chapter.children) {
        await tapEntry(section.title);
        await scrollUpOneEntry();
      }
      await scrollUpOneEntry();
    }

    // We're scrolled to the bottom so the very last item is visible.
    // Working in reverse order, so we don't need to do anymore scrolling,
    // check that everything is visible and close the sections and
    // chapters as we go up.
    for (Entry chapter in expansion_tile_sample.data.reversed) {
      expect(find.text(chapter.title), findsOneWidget);
      for (Entry section in chapter.children.reversed) {
        expect(find.text(section.title), findsOneWidget);
        for (Entry item in section.children.reversed)
          expect(find.text(item.title), findsOneWidget);
        await tapEntry(section.title); // close the section
      }
      await tapEntry(chapter.title); // close the chapter
    }

    // Finally only the top level EntryItems (the "chapters") are present.
    for (Entry chapter in expansion_tile_sample.data) {
      expect(find.text(chapter.title), findsOneWidget);
      for (Entry section in chapter.children) {
        expect(find.text(section.title), findsNothing);
        for (Entry item in section.children)
          expect(find.text(item.title), findsNothing);
      }
    }

  });
}
