// 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.Imaging.Tests;

public class BitmapDataTests
{
    [Fact]
    public void Ctor_Default()
    {
        BitmapData bd = new();
        Assert.Equal(0, bd.Height);
        Assert.Equal(0, bd.Width);
        Assert.Equal(0, bd.Reserved);
        Assert.Equal(IntPtr.Zero, bd.Scan0);
        Assert.Equal(0, bd.Stride);
        Assert.Equal((PixelFormat)0, bd.PixelFormat);
    }

    [Theory]
    [InlineData(int.MaxValue)]
    [InlineData(0)]
    [InlineData(int.MinValue)]
    public void Height_SetValid_ReturnsExpected(int value)
    {
        BitmapData bd = new()
        {
            Height = value
        };
        Assert.Equal(value, bd.Height);
    }

    [Theory]
    [InlineData(int.MaxValue)]
    [InlineData(0)]
    [InlineData(int.MinValue)]
    public void Width_SetValid_ReturnsExpected(int value)
    {
        BitmapData bd = new()
        {
            Width = value
        };
        Assert.Equal(value, bd.Width);
    }

    [Theory]
    [InlineData(int.MaxValue)]
    [InlineData(0)]
    [InlineData(int.MinValue)]
    public void Reserved_SetValid_ReturnsExpected(int value)
    {
        BitmapData bd = new()
        {
            Reserved = value
        };
        Assert.Equal(value, bd.Reserved);
    }

    [Theory]
    [InlineData(int.MaxValue)]
    [InlineData(0)]
    [InlineData(int.MinValue)]
    public void Scan0_SetValid_ReturnsExpected(int value)
    {
        BitmapData bd = new()
        {
            Scan0 = new IntPtr(value)
        };
        Assert.Equal(new IntPtr(value), bd.Scan0);
    }

    [Theory]
    [InlineData(int.MaxValue)]
    [InlineData(0)]
    [InlineData(int.MinValue)]
    public void Stride_SetValid_ReturnsExpected(int value)
    {
        BitmapData bd = new()
        {
            Stride = value
        };
        Assert.Equal(value, bd.Stride);
    }

    [Theory]
    [InlineData(PixelFormat.DontCare)]
    [InlineData(PixelFormat.Max)]
    [InlineData(PixelFormat.Indexed)]
    [InlineData(PixelFormat.Gdi)]
    [InlineData(PixelFormat.Format16bppRgb555)]
    [InlineData(PixelFormat.Format16bppRgb565)]
    [InlineData(PixelFormat.Format24bppRgb)]
    [InlineData(PixelFormat.Format32bppRgb)]
    [InlineData(PixelFormat.Format1bppIndexed)]
    [InlineData(PixelFormat.Format4bppIndexed)]
    [InlineData(PixelFormat.Format8bppIndexed)]
    [InlineData(PixelFormat.Alpha)]
    [InlineData(PixelFormat.Format16bppArgb1555)]
    [InlineData(PixelFormat.PAlpha)]
    [InlineData(PixelFormat.Format32bppPArgb)]
    [InlineData(PixelFormat.Extended)]
    [InlineData(PixelFormat.Format16bppGrayScale)]
    [InlineData(PixelFormat.Format48bppRgb)]
    [InlineData(PixelFormat.Format64bppPArgb)]
    [InlineData(PixelFormat.Canonical)]
    [InlineData(PixelFormat.Format32bppArgb)]
    [InlineData(PixelFormat.Format64bppArgb)]
    public void PixelFormat_SetValid_ReturnsExpected(PixelFormat pixelFormat)
    {
        BitmapData bd = new()
        {
            PixelFormat = pixelFormat
        };
        Assert.Equal(pixelFormat, bd.PixelFormat);
    }

    [Fact]
    public void PixelFormat_SetInvalid_ThrowsInvalidEnumException()
    {
        BitmapData bd = new();
        Assert.ThrowsAny<ArgumentException>(() => bd.PixelFormat = (PixelFormat)(-1));
    }
}
