// 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.

// @dart = 2.8

import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';

ChangerState changer;

class Changer extends StatefulWidget {
  const Changer(this.child, { Key key }) : super(key: key);

  final Widget child;

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

class ChangerState extends State<Changer> {
  bool _state = false;

  @override
  void initState() {
    super.initState();
    changer = this;
  }

  void test() { setState(() { _state = true; }); }

  @override
  Widget build(BuildContext context) => _state ? Wrapper(widget.child) : widget.child;
}

class Wrapper extends StatelessWidget {
  const Wrapper(this.child, { Key key }) : super(key: key);

  final Widget child;

  @override
  Widget build(BuildContext context) => child;
}

class Leaf extends StatefulWidget {
  const Leaf({ Key key }) : super(key: key);
  @override
  LeafState createState() => LeafState();
}

class LeafState extends State<Leaf> {
  @override
  Widget build(BuildContext context) => const Text('leaf', textDirection: TextDirection.ltr);
}

void main() {
  testWidgets('three-way setState() smoke test', (WidgetTester tester) async {
    await tester.pumpWidget(const Changer(Wrapper(Leaf())));
    await tester.pumpWidget(const Changer(Wrapper(Leaf())));
    changer.test();
    await tester.pump();
  });
}
