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

void main() {
  testWidgets('provides a value to the layer tree', (WidgetTester tester) async {
    await tester.pumpWidget(
      const AnnotatedRegion<int>(
        value: 1,
        child: SizedBox(width: 100.0, height: 100.0),
      ),
    );
    final List<Layer> layers = tester.layers;
    final AnnotatedRegionLayer<int> layer = layers.whereType<AnnotatedRegionLayer<int>>().first;
    expect(layer.value, 1);
  });
  testWidgets('provides a value to the layer tree in a particular region', (WidgetTester tester) async {
    await tester.pumpWidget(
      Transform.translate(
        offset: const Offset(25.0, 25.0),
        child: const AnnotatedRegion<int>(
          value: 1,
          child: SizedBox(width: 100.0, height: 100.0),
        ),
      ),
    );
    int? result = RendererBinding.instance.renderView.debugLayer!.find<int>(Offset(
      10.0 * RendererBinding.instance.window.devicePixelRatio,
      10.0 * RendererBinding.instance.window.devicePixelRatio,
    ));
    expect(result, null);
    result = RendererBinding.instance.renderView.debugLayer!.find<int>(Offset(
      50.0 * RendererBinding.instance.window.devicePixelRatio,
      50.0 * RendererBinding.instance.window.devicePixelRatio,
    ));
    expect(result, 1);
  });
}
