// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

using System.Drawing;

namespace System.Windows.Forms.Tests;

public class ToolStripArrowRenderEventArgsTests
{
    [WinFormsFact]
    public void ToolStripArrowRenderEventArgs_NullGraphics_ThrowsArgumentNullException()
    {
        using ToolStripButton toolStripButton = new();
        Assert.Throws<ArgumentNullException>(() => new ToolStripArrowRenderEventArgs(null, toolStripButton, Rectangle.Empty, Color.Empty, ArrowDirection.Up));
    }

    public static IEnumerable<object[]> Ctor_Graphics_ToolStripItem_Rectangle_Color_ArrowDirection_TestData()
    {
        Bitmap image = new(10, 10);
        Graphics graphics = Graphics.FromImage(image);
        yield return new object[] { graphics, null, Rectangle.Empty, Color.Empty, ArrowDirection.Down + 1 };
        yield return new object[] { graphics, new ToolStripButton(), new Rectangle(1, 2, 3, 4), Color.Blue, ArrowDirection.Down };
        yield return new object[] { graphics, new ToolStripButton(), new Rectangle(-1, -2, -3, -4), Color.Blue, ArrowDirection.Down };
    }

    [WinFormsTheory]
    [MemberData(nameof(Ctor_Graphics_ToolStripItem_Rectangle_Color_ArrowDirection_TestData))]
    public void Ctor_Graphics_ToolStripItem_Rectangle_Color_ArrowDirection(Graphics g, ToolStripItem toolStripItem, Rectangle arrowRectangle, Color arrowColor, ArrowDirection arrowDirection)
    {
        ToolStripArrowRenderEventArgs e = new(g, toolStripItem, arrowRectangle, arrowColor, arrowDirection);
        Assert.Equal(g, e.Graphics);
        Assert.Equal(arrowRectangle, e.ArrowRectangle);
        Assert.Equal(toolStripItem, e.Item);
        Assert.Equal(arrowColor, e.ArrowColor);
        Assert.Equal(arrowDirection, e.Direction);
    }

    public static IEnumerable<object[]> ArrowRectangle_TestData()
    {
        yield return new object[] { Rectangle.Empty };
        yield return new object[] { new Rectangle(1, 2, 3, 4) };
        yield return new object[] { new Rectangle(-1, -2, -3, -4) };
    }

    [WinFormsTheory]
    [MemberData(nameof(ArrowRectangle_TestData))]
    public void ArrowRectangle_Set_GetReturnsExpected(Rectangle value)
    {
        using Bitmap image = new(10, 10);
        using Graphics graphics = Graphics.FromImage(image);
        using ToolStripButton button = new();
        ToolStripArrowRenderEventArgs e = new(graphics, button, new Rectangle(1, 2, 3, 4), Color.Blue, ArrowDirection.Down)
        {
            ArrowRectangle = value
        };
        Assert.Equal(value, e.ArrowRectangle);
    }

    public static IEnumerable<object[]> ArrowColor_TestData()
    {
        yield return new object[] { Color.Empty };
        yield return new object[] { Color.Red };
    }

    [WinFormsTheory]
    [MemberData(nameof(ArrowColor_TestData))]
    public void ArrowColor_Set_GetReturnsExpected(Color value)
    {
        using Bitmap image = new(10, 10);
        using Graphics graphics = Graphics.FromImage(image);
        using ToolStripButton button = new();
        ToolStripArrowRenderEventArgs e = new(graphics, button, new Rectangle(1, 2, 3, 4), Color.Blue, ArrowDirection.Down)
        {
            ArrowColor = value
        };
        Assert.Equal(value, e.ArrowColor);
    }

    [WinFormsTheory]
    [InlineData((ArrowDirection.Down + 1))]
    [InlineData(ArrowDirection.Up)]
    public void Direction_Set_GetReturnsExpected(ArrowDirection value)
    {
        using Bitmap image = new(10, 10);
        using Graphics graphics = Graphics.FromImage(image);
        using ToolStripButton button = new();
        ToolStripArrowRenderEventArgs e = new(graphics, button, new Rectangle(1, 2, 3, 4), Color.Blue, ArrowDirection.Down)
        {
            Direction = value
        };
        Assert.Equal(value, e.Direction);
    }
}
