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

public class MaskedTextBoxTextEditorDropDownTests
{
    [Fact]
    public void Value_ReturnsNull_WhenCancelled()
    {
        using MaskedTextBox maskedTextBox = new();
        using MaskedTextBoxTextEditorDropDown dropDown = new(maskedTextBox);
        dropDown.TestAccessor.Dynamic._cancel = true;

        dropDown.Value.Should().BeNull();
    }

    [Fact]
    public void Value_ReturnsText_WhenNotCancelled()
    {
        using MaskedTextBox maskedTextBox = new("00000");
        maskedTextBox.Text = "12345";
        using MaskedTextBoxTextEditorDropDown dropDown = new(maskedTextBox);
        dropDown.TestAccessor.Dynamic._cancel = false;

        dropDown.Value.Should().Be("12345");
    }

    [Fact]
    public void ProcessDialogKey_SetsCancel_WhenEscapePressed()
    {
        using MaskedTextBox maskedTextBox = new();
        using MaskedTextBoxTextEditorDropDown dropDown = new(maskedTextBox);
        bool processDialogKey = dropDown.TestAccessor.Dynamic.ProcessDialogKey(Keys.Escape);
        bool cancel = dropDown.TestAccessor.Dynamic._cancel;

        cancel.Should().BeTrue();
        processDialogKey.Should().BeFalse();
    }

    [Fact]
    public void MaskInputRejected_SetsError_WhenInputRejected()
    {
        using MaskedTextBox maskedTextBox = new("00:00");
        using MaskedTextBoxTextEditorDropDown dropDown = new(maskedTextBox);
        using ErrorProvider errorProvider = dropDown.TestAccessor.Dynamic._errorProvider;

        // No error when setting a correct format value.
        using MaskedTextBox dropDownMaskedTextBox = dropDown.TestAccessor.Dynamic._cloneMtb;
        dropDownMaskedTextBox.Text = "12:20";
        errorProvider.GetError(dropDownMaskedTextBox).Should().Be(string.Empty);

        // Incorrectly formatted values will result in the error "Error at position 0: expected number".
        dropDownMaskedTextBox.Text = "invalid";
        errorProvider.GetError(dropDownMaskedTextBox).Should().Contain(SR.MaskedTextBoxHintDigitExpected);
    }
}
