// 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/material.dart';
import 'package:flutter_api_samples/widgets/scroll_end_notification/scroll_end_notification.1.dart'
    as example;
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('SliverAutoScroll example', (WidgetTester tester) async {
    await tester.pumpWidget(const example.SliverAutoScrollExampleApp());

    final double itemHeight = tester
        .getSize(find.widgetWithText(Card, 'Item 0.15'))
        .height;

    // The scroll view is 600 pixels high and the big orange
    // "AlignedItem" is preceded by 15 regular items. Scroll up enough
    // to make it partially visible.
    await tester.drag(
      find.byType(CustomScrollView),
      Offset(0, 600 - 15.5 * itemHeight),
    );
    await tester.pumpAndSettle();

    final Finder alignedItem = find.widgetWithText(Card, 'Aligned Item');

    // The "AlignedItem" is now bottom aligned.
    expect(tester.getRect(alignedItem).bottom, 600);

    // Scrolling down a little (less then the big orange item's height) and no
    // auto-scroll occurs.
    await tester.drag(find.byType(CustomScrollView), Offset(0, itemHeight));
    await tester.pumpAndSettle();
    expect(tester.getRect(alignedItem).bottom, 600 + itemHeight);

    // Scroll up a little and the "AlignedItem" does not auto-scroll, because
    // it's fully visible.
    await tester.drag(
      find.byType(CustomScrollView),
      Offset(0, -2 * itemHeight),
    );
    await tester.pumpAndSettle();
    expect(tester.getRect(alignedItem).bottom, 600 - itemHeight);

    // Scroll up far enough to make the AlignedItem partially visible and to trigger
    // an auto-scroll that aligns it with the top of the viewport.
    await tester.drag(
      find.byType(CustomScrollView),
      Offset(0, -600 + itemHeight * 1.5),
    );
    await tester.pumpAndSettle();
    expect(tester.getRect(alignedItem).top, 0);

    // Scroll down a little and the "AlignedItem" does not auto-scroll because
    // it's fully visible.
    await tester.drag(find.byType(CustomScrollView), Offset(0, itemHeight));
    await tester.pumpAndSettle();
    expect(tester.getRect(alignedItem).top, itemHeight);
  });
}
