File: System\Windows\Forms\ButtonPopupAdapterTests.cs
Web Access
Project: src\src\test\unit\System.Windows.Forms\System.Windows.Forms.Tests.csproj (System.Windows.Forms.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Drawing;
using System.Windows.Forms.ButtonInternal;
using static System.Windows.Forms.ButtonInternal.ButtonBaseAdapter;
 
namespace System.Windows.Forms.Tests;
 
public class ButtonPopupAdapterTests : IDisposable
{
    public ButtonBase button { get; }
    internal ButtonPopupAdapter adapter { get; }
 
    public ButtonPopupAdapterTests()
    {
        button = new TestButtonBase();
        adapter = new(button);
    }
 
    public void Dispose() => button.Dispose();
 
    public static TheoryData<CheckState> PaintStates => new()
    {
        CheckState.Unchecked,
        CheckState.Checked,
        CheckState.Indeterminate
    };
 
    private class TestButtonBase : ButtonBase
    {
        public bool IsDefaultSet { get; set; }
        public Rectangle ClientRectangleValue { get; set; } = new(0, 0, 100, 30);
 
        internal override Rectangle OverChangeRectangle => ClientRectangleValue;
 
        internal override ButtonBaseAdapter CreateStandardAdapter() => new ButtonPopupAdapter(this);
 
        internal override StringFormat CreateStringFormat() => new StringFormat();
 
        internal override TextFormatFlags CreateTextFormatFlags() => TextFormatFlags.Default;
    }
 
    [WinFormsTheory]
    [MemberData(nameof(PaintStates))]
    public void PaintUp_DoesNotThrow(CheckState state)
    {
        using Bitmap bitmap = new(100, 30);
        using Graphics graphics = Graphics.FromImage(bitmap);
        PaintEventArgs e = new(graphics, new Rectangle(0, 0, 100, 30));
 
        Exception? exception = Record.Exception(() => adapter.PaintUp(e, state));
 
        exception.Should().BeNull();
    }
 
    [WinFormsTheory]
    [MemberData(nameof(PaintStates))]
    public void PaintOver_DoesNotThrow(CheckState state)
    {
        using Bitmap bitmap = new(100, 30);
        using Graphics graphics = Graphics.FromImage(bitmap);
        PaintEventArgs e = new(graphics, new Rectangle(0, 0, 100, 30));
 
        Exception? exception = Record.Exception(() => adapter.PaintOver(e, state));
 
        exception.Should().BeNull();
    }
 
    [WinFormsTheory]
    [MemberData(nameof(PaintStates))]
    public void PaintDown_DoesNotThrow(CheckState state)
    {
        using Bitmap bitmap = new(100, 30);
        using Graphics graphics = Graphics.FromImage(bitmap);
        PaintEventArgs e = new(graphics, new Rectangle(0, 0, 100, 30));
 
        Exception? exception = Record.Exception(() => adapter.PaintDown(e, state));
 
        exception.Should().BeNull();
    }
 
    [Fact]
    public void PaintPopupLayout_ReturnsLayoutOptions_WithExpectedBorderAndPadding()
    {
        Rectangle clientRectangle = new(0, 0, 100, 30);
        Padding padding = new(2);
        bool isDefault = false;
        using Font font = SystemFonts.DefaultFont;
        string text = "Test";
        bool enabled = true;
        ContentAlignment textAlign = ContentAlignment.MiddleCenter;
        RightToLeft rightToLeft = RightToLeft.No;
 
        LayoutOptions layoutOptions = ButtonPopupAdapter.PaintPopupLayout(
            up: true,
            paintedBorder: 1,
            clientRectangle,
            padding,
            isDefault,
            font,
            text,
            enabled,
            textAlign,
            rightToLeft);
 
        layoutOptions.BorderSize.Should().Be(1);
        layoutOptions.PaddingSize.Should().Be(1);
        layoutOptions.HintTextUp.Should().BeFalse();
        layoutOptions.TextOffset.Should().BeFalse();
        layoutOptions.ShadowedText.Should().Be(SystemInformation.HighContrast);
    }
 
    [Theory]
    [InlineData(true, 0)]
    [InlineData(false, 2)]
    public void PaintPopupLayout_BorderAndPaddingSumIsTwo(bool up, int paintedBorder)
    {
        Rectangle clientRectangle = new(0, 0, 100, 30);
        Padding padding = new(0);
        bool isDefault = false;
        using Font font = SystemFonts.DefaultFont;
        string text = string.Empty;
        bool enabled = false;
        ContentAlignment textAlign = ContentAlignment.TopLeft;
        RightToLeft rightToLeft = RightToLeft.No;
 
        LayoutOptions layoutOptions = ButtonPopupAdapter.PaintPopupLayout(
            up,
            paintedBorder,
            clientRectangle,
            padding,
            isDefault,
            font,
            text,
            enabled,
            textAlign,
            rightToLeft);
 
        int sum = layoutOptions.BorderSize + layoutOptions.PaddingSize;
 
        sum.Should().Be(2);
    }
}