// 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/rendering.dart';
import 'package:flutter_api_samples/widgets/sliver/sliver_main_axis_group.0.dart'
  as example;
import 'package:flutter_test/flutter_test.dart';

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

    final RenderSliverMainAxisGroup renderSliverGroup = tester.renderObject(find.byType(SliverMainAxisGroup));
    expect(renderSliverGroup, isNotNull);

    final RenderSliverPersistentHeader renderAppBar = tester.renderObject<RenderSliverPersistentHeader>(find.byType(SliverAppBar));
    final RenderSliverList renderSliverList = tester.renderObject<RenderSliverList>(find.byType(SliverList));
    final RenderSliverToBoxAdapter renderSliverAdapter = tester.renderObject<RenderSliverToBoxAdapter>(find.byType(SliverToBoxAdapter));

    // renderAppBar, renderSliverList, and renderSliverAdapter1 are part of the same sliver group.
    expect(renderAppBar.geometry!.scrollExtent, equals(70.0));
    expect(renderSliverList.geometry!.scrollExtent, equals(100.0 * 5));
    expect(renderSliverAdapter.geometry!.scrollExtent, equals(100.0));
    expect(renderSliverGroup.geometry!.scrollExtent, equals(70.0 + 100.0 * 5 + 100.0));
  });
}
