// 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 'dart:developer';

import 'package:flutter/foundation.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';

class TestWidget extends LeafRenderObjectWidget {
  const TestWidget({
    Key? key,
  }) : super(key: key);

  @override
  RenderObject createRenderObject(BuildContext context) => RenderTest();

  @override
  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
    super.debugFillProperties(properties);
    // This string is searched for verbatim by dev/bots/test.dart:
    properties.add(MessageProperty('test', 'TestWidget.debugFillProperties called'));
  }
}

class RenderTest extends RenderBox {
  @override
  bool get sizedByParent => true;

  @override
  void performResize() {
    Timeline.instantSync('RenderTest.performResize called');
    size = constraints.biggest;
  }

  @override
  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
    super.debugFillProperties(properties);
    // This string is searched for verbatim by dev/bots/test.dart:
    properties.add(MessageProperty('test', 'RenderTest.debugFillProperties called'));
  }
}


Future<void> main() async {
  // This section introduces strings that we can search for in dev/bots/test.dart
  // as a sanity check:
  if (kDebugMode) {
    print('BUILT IN DEBUG MODE');
  }
  if (kProfileMode) {
    print('BUILT IN PROFILE MODE');
  }
  if (kReleaseMode) {
    print('BUILT IN RELEASE MODE');
  }

  // The point of this file is to make sure that toTimelineArguments is not
  // called when we have debugProfileBuildsEnabled (et al) turned on. If that
  // method is not called then the debugFillProperties methods above should also
  // not get called and we should end up tree-shaking the entire Diagnostics
  // logic out of the app. The dev/bots/test.dart test checks for this by
  // looking for the strings in the methods above.

  debugProfileBuildsEnabled = true;
  debugProfileLayoutsEnabled = true;
  debugProfilePaintsEnabled = true;
  runApp(const TestWidget());
}
