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

namespace System.Drawing.Tests;

public class BrushesTests
{
    public static IEnumerable<object[]> Brushes_TestData()
    {
        yield return Brush(() => Brushes.AliceBlue, Color.AliceBlue);
        yield return Brush(() => Brushes.AntiqueWhite, Color.AntiqueWhite);
        yield return Brush(() => Brushes.Aqua, Color.Aqua);
        yield return Brush(() => Brushes.Aquamarine, Color.Aquamarine);
        yield return Brush(() => Brushes.Azure, Color.Azure);
        yield return Brush(() => Brushes.Beige, Color.Beige);
        yield return Brush(() => Brushes.Bisque, Color.Bisque);
        yield return Brush(() => Brushes.Black, Color.Black);
        yield return Brush(() => Brushes.BlanchedAlmond, Color.BlanchedAlmond);
        yield return Brush(() => Brushes.Blue, Color.Blue);
        yield return Brush(() => Brushes.BlueViolet, Color.BlueViolet);
        yield return Brush(() => Brushes.Brown, Color.Brown);
        yield return Brush(() => Brushes.BurlyWood, Color.BurlyWood);
        yield return Brush(() => Brushes.CadetBlue, Color.CadetBlue);
        yield return Brush(() => Brushes.Chartreuse, Color.Chartreuse);
        yield return Brush(() => Brushes.Chocolate, Color.Chocolate);
        yield return Brush(() => Brushes.Coral, Color.Coral);
        yield return Brush(() => Brushes.CornflowerBlue, Color.CornflowerBlue);
        yield return Brush(() => Brushes.Cornsilk, Color.Cornsilk);
        yield return Brush(() => Brushes.Crimson, Color.Crimson);
        yield return Brush(() => Brushes.Cyan, Color.Cyan);
        yield return Brush(() => Brushes.DarkBlue, Color.DarkBlue);
        yield return Brush(() => Brushes.DarkCyan, Color.DarkCyan);
        yield return Brush(() => Brushes.DarkGoldenrod, Color.DarkGoldenrod);
        yield return Brush(() => Brushes.DarkGray, Color.DarkGray);
        yield return Brush(() => Brushes.DarkGreen, Color.DarkGreen);
        yield return Brush(() => Brushes.DarkKhaki, Color.DarkKhaki);
        yield return Brush(() => Brushes.DarkMagenta, Color.DarkMagenta);
        yield return Brush(() => Brushes.DarkOliveGreen, Color.DarkOliveGreen);
        yield return Brush(() => Brushes.DarkOrange, Color.DarkOrange);
        yield return Brush(() => Brushes.DarkOrchid, Color.DarkOrchid);
        yield return Brush(() => Brushes.DarkRed, Color.DarkRed);
        yield return Brush(() => Brushes.DarkSalmon, Color.DarkSalmon);
        yield return Brush(() => Brushes.DarkSeaGreen, Color.DarkSeaGreen);
        yield return Brush(() => Brushes.DarkSlateBlue, Color.DarkSlateBlue);
        yield return Brush(() => Brushes.DarkSlateGray, Color.DarkSlateGray);
        yield return Brush(() => Brushes.DarkTurquoise, Color.DarkTurquoise);
        yield return Brush(() => Brushes.DarkViolet, Color.DarkViolet);
        yield return Brush(() => Brushes.DeepPink, Color.DeepPink);
        yield return Brush(() => Brushes.DeepSkyBlue, Color.DeepSkyBlue);
        yield return Brush(() => Brushes.DimGray, Color.DimGray);
        yield return Brush(() => Brushes.DodgerBlue, Color.DodgerBlue);
        yield return Brush(() => Brushes.Firebrick, Color.Firebrick);
        yield return Brush(() => Brushes.FloralWhite, Color.FloralWhite);
        yield return Brush(() => Brushes.ForestGreen, Color.ForestGreen);
        yield return Brush(() => Brushes.Fuchsia, Color.Fuchsia);
        yield return Brush(() => Brushes.Gainsboro, Color.Gainsboro);
        yield return Brush(() => Brushes.GhostWhite, Color.GhostWhite);
        yield return Brush(() => Brushes.Gold, Color.Gold);
        yield return Brush(() => Brushes.Goldenrod, Color.Goldenrod);
        yield return Brush(() => Brushes.Gray, Color.Gray);
        yield return Brush(() => Brushes.Green, Color.Green);
        yield return Brush(() => Brushes.GreenYellow, Color.GreenYellow);
        yield return Brush(() => Brushes.Honeydew, Color.Honeydew);
        yield return Brush(() => Brushes.HotPink, Color.HotPink);
        yield return Brush(() => Brushes.IndianRed, Color.IndianRed);
        yield return Brush(() => Brushes.Indigo, Color.Indigo);
        yield return Brush(() => Brushes.Ivory, Color.Ivory);
        yield return Brush(() => Brushes.Khaki, Color.Khaki);
        yield return Brush(() => Brushes.Lavender, Color.Lavender);
        yield return Brush(() => Brushes.LavenderBlush, Color.LavenderBlush);
        yield return Brush(() => Brushes.LawnGreen, Color.LawnGreen);
        yield return Brush(() => Brushes.LemonChiffon, Color.LemonChiffon);
        yield return Brush(() => Brushes.LightBlue, Color.LightBlue);
        yield return Brush(() => Brushes.LightCoral, Color.LightCoral);
        yield return Brush(() => Brushes.LightCyan, Color.LightCyan);
        yield return Brush(() => Brushes.LightGoldenrodYellow, Color.LightGoldenrodYellow);
        yield return Brush(() => Brushes.LightGray, Color.LightGray);
        yield return Brush(() => Brushes.LightGreen, Color.LightGreen);
        yield return Brush(() => Brushes.LightPink, Color.LightPink);
        yield return Brush(() => Brushes.LightSalmon, Color.LightSalmon);
        yield return Brush(() => Brushes.LightSeaGreen, Color.LightSeaGreen);
        yield return Brush(() => Brushes.LightSkyBlue, Color.LightSkyBlue);
        yield return Brush(() => Brushes.LightSlateGray, Color.LightSlateGray);
        yield return Brush(() => Brushes.LightSteelBlue, Color.LightSteelBlue);
        yield return Brush(() => Brushes.LightYellow, Color.LightYellow);
        yield return Brush(() => Brushes.Lime, Color.Lime);
        yield return Brush(() => Brushes.LimeGreen, Color.LimeGreen);
        yield return Brush(() => Brushes.Linen, Color.Linen);
        yield return Brush(() => Brushes.Magenta, Color.Magenta);
        yield return Brush(() => Brushes.Maroon, Color.Maroon);
        yield return Brush(() => Brushes.MediumAquamarine, Color.MediumAquamarine);
        yield return Brush(() => Brushes.MediumBlue, Color.MediumBlue);
        yield return Brush(() => Brushes.MediumOrchid, Color.MediumOrchid);
        yield return Brush(() => Brushes.MediumPurple, Color.MediumPurple);
        yield return Brush(() => Brushes.MediumSeaGreen, Color.MediumSeaGreen);
        yield return Brush(() => Brushes.MediumSlateBlue, Color.MediumSlateBlue);
        yield return Brush(() => Brushes.MediumSpringGreen, Color.MediumSpringGreen);
        yield return Brush(() => Brushes.MediumTurquoise, Color.MediumTurquoise);
        yield return Brush(() => Brushes.MediumVioletRed, Color.MediumVioletRed);
        yield return Brush(() => Brushes.MidnightBlue, Color.MidnightBlue);
        yield return Brush(() => Brushes.MintCream, Color.MintCream);
        yield return Brush(() => Brushes.MistyRose, Color.MistyRose);
        yield return Brush(() => Brushes.Moccasin, Color.Moccasin);
        yield return Brush(() => Brushes.NavajoWhite, Color.NavajoWhite);
        yield return Brush(() => Brushes.Navy, Color.Navy);
        yield return Brush(() => Brushes.OldLace, Color.OldLace);
        yield return Brush(() => Brushes.Olive, Color.Olive);
        yield return Brush(() => Brushes.OliveDrab, Color.OliveDrab);
        yield return Brush(() => Brushes.Orange, Color.Orange);
        yield return Brush(() => Brushes.OrangeRed, Color.OrangeRed);
        yield return Brush(() => Brushes.Orchid, Color.Orchid);
        yield return Brush(() => Brushes.PaleGoldenrod, Color.PaleGoldenrod);
        yield return Brush(() => Brushes.PaleGreen, Color.PaleGreen);
        yield return Brush(() => Brushes.PaleTurquoise, Color.PaleTurquoise);
        yield return Brush(() => Brushes.PaleVioletRed, Color.PaleVioletRed);
        yield return Brush(() => Brushes.PapayaWhip, Color.PapayaWhip);
        yield return Brush(() => Brushes.PeachPuff, Color.PeachPuff);
        yield return Brush(() => Brushes.Peru, Color.Peru);
        yield return Brush(() => Brushes.Pink, Color.Pink);
        yield return Brush(() => Brushes.Plum, Color.Plum);
        yield return Brush(() => Brushes.PowderBlue, Color.PowderBlue);
        yield return Brush(() => Brushes.Purple, Color.Purple);
        yield return Brush(() => Brushes.Red, Color.Red);
        yield return Brush(() => Brushes.RosyBrown, Color.RosyBrown);
        yield return Brush(() => Brushes.RoyalBlue, Color.RoyalBlue);
        yield return Brush(() => Brushes.SaddleBrown, Color.SaddleBrown);
        yield return Brush(() => Brushes.Salmon, Color.Salmon);
        yield return Brush(() => Brushes.SandyBrown, Color.SandyBrown);
        yield return Brush(() => Brushes.SeaGreen, Color.SeaGreen);
        yield return Brush(() => Brushes.SeaShell, Color.SeaShell);
        yield return Brush(() => Brushes.Sienna, Color.Sienna);
        yield return Brush(() => Brushes.Silver, Color.Silver);
        yield return Brush(() => Brushes.SkyBlue, Color.SkyBlue);
        yield return Brush(() => Brushes.SlateBlue, Color.SlateBlue);
        yield return Brush(() => Brushes.SlateGray, Color.SlateGray);
        yield return Brush(() => Brushes.Snow, Color.Snow);
        yield return Brush(() => Brushes.SpringGreen, Color.SpringGreen);
        yield return Brush(() => Brushes.SteelBlue, Color.SteelBlue);
        yield return Brush(() => Brushes.Tan, Color.Tan);
        yield return Brush(() => Brushes.Teal, Color.Teal);
        yield return Brush(() => Brushes.Thistle, Color.Thistle);
        yield return Brush(() => Brushes.Tomato, Color.Tomato);
        yield return Brush(() => Brushes.Transparent, Color.Transparent);
        yield return Brush(() => Brushes.Turquoise, Color.Turquoise);
        yield return Brush(() => Brushes.Violet, Color.Violet);
        yield return Brush(() => Brushes.Wheat, Color.Wheat);
        yield return Brush(() => Brushes.White, Color.White);
        yield return Brush(() => Brushes.WhiteSmoke, Color.WhiteSmoke);
        yield return Brush(() => Brushes.Yellow, Color.Yellow);
        yield return Brush(() => Brushes.YellowGreen, Color.YellowGreen);
    }

    public static object[] Brush(Func<Brush> getBrush, Color expectedColor) => [getBrush, expectedColor];

    [Theory]
    [MemberData(nameof(Brushes_TestData))]
    public void Brushes_Get_ReturnsExpected(Func<Brush> getBrush, Color expectedColor)
    {
        SolidBrush brush = Assert.IsType<SolidBrush>(getBrush());
        Assert.Equal(expectedColor, brush.Color);

        Assert.Same(brush, getBrush());

        // Brushes are not immutable.
        Color color = brush.Color;
        try
        {
            brush.Color = Color.Red;
            Assert.Equal(Color.Red, brush.Color);
        }
        finally
        {
            brush.Color = color;
        }
    }
}
