// 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';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  initTimelineTests();
  test('Widgets with updated keys produce well formed timelines', () async {
    await runFrame(() { runApp(const TestRoot()); });
    await SchedulerBinding.instance.endOfFrame;

    debugProfileBuildsEnabled = true;

    await runFrame(() {
      TestRoot.state.updateKey();
    });

    int buildCount = 0;
    for (final TimelineEvent event in await fetchTimelineEvents()) {
      if (event.json!['name'] == 'BUILD') {
        final String ph = event.json!['ph'] as String;
        if (ph == 'B') {
          buildCount++;
        } else if (ph == 'E') {
          buildCount--;
        }
      }
    }
    expect(buildCount, 0);

    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> {
  final Key _globalKey = GlobalKey();
  Key _localKey = UniqueKey();

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

  void updateKey() {
    setState(() {
      _localKey = UniqueKey();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      key: _localKey,
      child: SizedBox(
        key: _globalKey,
        width: 100,
        height: 100,
      ),
    );
  }
}