// 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_test/flutter_test.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';

const BoxDecoration kBoxDecorationA = BoxDecoration(
  color: Color(0xFFFF0000),
);

const BoxDecoration kBoxDecorationB = BoxDecoration(
  color: Color(0xFF00FF00),
);

const BoxDecoration kBoxDecorationC = BoxDecoration(
  color: Color(0xFF0000FF),
);

class TestBuildCounter extends StatelessWidget {
  const TestBuildCounter({ Key? key }) : super(key: key);

  static int buildCount = 0;

  @override
  Widget build(BuildContext context) {
    buildCount += 1;
    return const DecoratedBox(decoration: kBoxDecorationA);
  }
}


class FlipWidget extends StatefulWidget {
  const FlipWidget({ Key? key, required this.left, required this.right }) : super(key: key);

  final Widget left;
  final Widget right;

  @override
  FlipWidgetState createState() => FlipWidgetState();
}

class FlipWidgetState extends State<FlipWidget> {
  bool _showLeft = true;

  void flip() {
    setState(() {
      _showLeft = !_showLeft;
    });
  }

  @override
  Widget build(BuildContext context) {
    return _showLeft ? widget.left : widget.right;
  }
}

void flipStatefulWidget(WidgetTester tester, { bool skipOffstage = true }) {
  tester.state<FlipWidgetState>(find.byType(FlipWidget, skipOffstage: skipOffstage)).flip();
}
