// 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,
      ),
    );
  }
}
