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

import 'common.dart';

final Set<String> interestingLabels = <String>{
  '$Row',
  '$TestRoot',
  '$TestChildWidget',
  '$Container',
};

void main() {
  ZoneIgnoringTestBinding.ensureInitialized();
  initTimelineTests();
  test('Children of MultiChildRenderObjectElement show up in tracing', () async {
    // We don't have expectations around the first frame because there's a race around
    // the warm-up frame that we don't want to get involved in here.
    await runFrame(() { runApp(const TestRoot()); });
    await SchedulerBinding.instance.endOfFrame;
    await fetchInterestingEvents(interestingLabels);

    debugProfileBuildsEnabled = true;

    await runFrame(() {
      TestRoot.state.showRow();
    });
    expect(
      await fetchInterestingEventNames(interestingLabels),
      <String>['TestRoot', 'Row', 'TestChildWidget', 'Container', 'TestChildWidget', 'Container'],
    );

    debugProfileBuildsEnabled = false;
  }, skip: isBrowser); // [intended] uses dart:isolate and io.
}

class TestRoot extends StatefulWidget {
  const TestRoot({super.key});

  static late TestRootState state;

  @override
  State<TestRoot> createState() => TestRootState();
}

class TestRootState extends State<TestRoot> {
  @override
  void initState() {
    super.initState();
    TestRoot.state = this;
  }

  bool _showRow = false;
  void showRow() {
    setState(() {
      _showRow = true;
    });
  }

  @override
  Widget build(BuildContext context) {
    return _showRow
      ? const Row(
          children: <Widget>[
            TestChildWidget(),
            TestChildWidget(),
          ],
        )
      : Container();
  }
}

class TestChildWidget extends StatelessWidget {
  const TestChildWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
