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

namespace System.Windows.Forms.Tests;

public class ToolStripManagerModalMenuFilterHostedWindowsFormsMessageHookTests
{
    private static Type GetHookType()
    {
        Type? hookType = typeof(ToolStripManager).Assembly
            .GetType("System.Windows.Forms.ToolStripManager+ModalMenuFilter+HostedWindowsFormsMessageHook", throwOnError: false);

        ArgumentNullException.ThrowIfNull(hookType);

        return hookType;
    }

    [Fact]
    public void Constructor_DoesNotThrow()
    {
        Type hookType = GetHookType();

        object? hook = Activator.CreateInstance(hookType, nonPublic: true);

        hook.Should().BeOfType(hookType);
    }

    [WinFormsFact]
    public void UninstallMessageHook_DoesNotThrow_WhenCalledTwice()
    {
        Type hookType = GetHookType();

        object? hook = Activator.CreateInstance(hookType, nonPublic: true);

        hook?.TestAccessor.Dynamic.UninstallMessageHook();
        hook?.TestAccessor.Dynamic.UninstallMessageHook();

        bool isHooked = hook?.TestAccessor.Dynamic._isHooked;
        isHooked.Should().BeFalse();

        IntPtr messageHookHandle = hook?.TestAccessor.Dynamic._messageHookHandle;
        messageHookHandle.Should().Be(IntPtr.Zero);
    }
}
