// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using Xunit;

namespace Microsoft.AspNetCore.Components.Forms
{
    public class ValidationMessageStoreTest
    {
        [Fact]
        public void CannotUseNullEditContext()
        {
            var ex = Assert.Throws<ArgumentNullException>(() => new ValidationMessageStore(null));
            Assert.Equal("editContext", ex.ParamName);
        }

        [Fact]
        public void CanCreateForEditContext()
        {
            new ValidationMessageStore(new EditContext(new object()));
        }

        [Fact]
        public void CanAddMessages()
        {
            // Arrange
            var messages = new ValidationMessageStore(new EditContext(new object()));
            var field1 = new FieldIdentifier(new object(), "field1");
            var field2 = new FieldIdentifier(new object(), "field2");
            var field3 = new FieldIdentifier(new object(), "field3");
            
            // Act
            messages.Add(field1, "Field 1 message 1");
            messages.Add(field1, "Field 1 message 2");
            messages.Add(field2, "Field 2 message 1");

            // Assert
            Assert.Equal(new[] { "Field 1 message 1", "Field 1 message 2" }, messages[field1]);
            Assert.Equal(new[] { "Field 2 message 1" }, messages[field2]);
            Assert.Empty(messages[field3]);
        }

        [Fact]
        public void CanAddMessagesMultiple()
        {
            // Arrange
            var messages = new ValidationMessageStore(new EditContext(new object()));
            var field1 = new FieldIdentifier(new object(), "field1");
            var entries = new[] { "A", "B", "C" };

            // Act
            messages.Add(field1, entries);

            // Assert
            Assert.Equal(entries, messages[field1]);
        }

        [Fact]
        public void CanClearMessagesForSingleField()
        {
            // Arrange
            var messages = new ValidationMessageStore(new EditContext(new object()));
            var field1 = new FieldIdentifier(new object(), "field1");
            var field2 = new FieldIdentifier(new object(), "field2");
            messages.Add(field1, "Field 1 message 1");
            messages.Add(field1, "Field 1 message 2");
            messages.Add(field2, "Field 2 message 1");

            // Act
            messages.Clear(field1);

            // Assert
            Assert.Empty(messages[field1]);
            Assert.Equal(new[] { "Field 2 message 1" }, messages[field2]);
        }

        [Fact]
        public void CanClearMessagesForAllFields()
        {
            // Arrange
            var messages = new ValidationMessageStore(new EditContext(new object()));
            var field1 = new FieldIdentifier(new object(), "field1");
            var field2 = new FieldIdentifier(new object(), "field2");
            messages.Add(field1, "Field 1 message 1");
            messages.Add(field2, "Field 2 message 1");

            // Act
            messages.Clear();

            // Assert
            Assert.Empty(messages[field1]);
            Assert.Empty(messages[field2]);
        }
    }
}
