using Avalonia.Controls.Shapes;
using Avalonia.Layout;
using Avalonia.Media;
using Avalonia.Rendering;
using Avalonia.UnitTests;
using Xunit;

namespace Avalonia.Skia.UnitTests
{
    public class HitTesting
    {
        [Fact]
        public void Hit_Test_Should_Respect_Fill()
        {
            using (AvaloniaLocator.EnterScope())
            {
                SkiaPlatform.Initialize();

                var root = new TestRoot
                {
                    Width = 100,
                    Height = 100,
                    Child = new Ellipse
                    {
                        Width = 100,
                        Height = 100,
                        Fill = Brushes.Red,
                        HorizontalAlignment = HorizontalAlignment.Center,
                        VerticalAlignment = VerticalAlignment.Center
                    }
                };

                root.Renderer = new DeferredRenderer(root, null);
                root.Measure(Size.Infinity);
                root.Arrange(new Rect(root.DesiredSize));

                var outsideResult = root.Renderer.HitTest(new Point(10, 10), root, null);
                var insideResult = root.Renderer.HitTest(new Point(50, 50), root, null);

                Assert.Empty(outsideResult);
                Assert.Equal(new[] {root.Child}, insideResult);
            }
        }

        [Fact]
        public void Hit_Test_Should_Respect_Stroke()
        {
            using (AvaloniaLocator.EnterScope())
            {
                SkiaPlatform.Initialize();

                var root = new TestRoot
                {
                    Width = 100,
                    Height = 100,
                    Child = new Ellipse
                    {
                        Width = 100,
                        Height = 100,
                        Stroke = Brushes.Red,
                        StrokeThickness = 5,
                        HorizontalAlignment = HorizontalAlignment.Center,
                        VerticalAlignment = VerticalAlignment.Center
                    }
                };

                root.Renderer = new DeferredRenderer(root, null);
                root.Measure(Size.Infinity);
                root.Arrange(new Rect(root.DesiredSize));

                var outsideResult = root.Renderer.HitTest(new Point(50, 50), root, null);
                var insideResult = root.Renderer.HitTest(new Point(1, 50), root, null);

                Assert.Empty(outsideResult);
                Assert.Equal(new[] { root.Child }, insideResult);
            }
        }
    }
}
