// 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_cross_axis_group.0.dart'
  as example;
import 'package:flutter_test/flutter_test.dart';

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

    final RenderSliverCrossAxisGroup renderSliverGroup = tester.renderObject(find.byType(SliverCrossAxisGroup));
    expect(renderSliverGroup, isNotNull);

    final double crossAxisExtent = renderSliverGroup.constraints.crossAxisExtent;

    final List<RenderSliverList> renderSliverLists = tester.renderObjectList<RenderSliverList>(find.byType(SliverList)).toList();
    final RenderSliverList firstList = renderSliverLists[0];
    final RenderSliverList secondList = renderSliverLists[1];
    final RenderSliverList thirdList = renderSliverLists[2];

    final double expectedFirstExtent = (crossAxisExtent - 200) / 3;
    const double expectedSecondExtent = 200;
    final double expectedThirdExtent = 2 * (crossAxisExtent - 200) / 3;
    expect(firstList.constraints.crossAxisExtent, equals(expectedFirstExtent));
    expect(secondList.constraints.crossAxisExtent, equals(expectedSecondExtent));
    expect(thirdList.constraints.crossAxisExtent, equals(expectedThirdExtent));

    // Also check that the paint offsets are correct.
    final RenderSliverConstrainedCrossAxis renderConstrained = tester.renderObject<RenderSliverConstrainedCrossAxis>(
      find.byType(SliverConstrainedCrossAxis)
    );

    expect((firstList.parentData! as SliverPhysicalParentData).paintOffset.dx, equals(0));
    expect((renderConstrained.parentData! as SliverPhysicalParentData).paintOffset.dx, equals(expectedFirstExtent));
    expect((thirdList.parentData! as SliverPhysicalParentData).paintOffset.dx, equals(expectedFirstExtent + expectedSecondExtent));
  });
}