File: AttributeDictionaryTest.cs
Web Access
Project: src\src\Mvc\Mvc.ViewFeatures\test\Microsoft.AspNetCore.Mvc.ViewFeatures.Test.csproj (Microsoft.AspNetCore.Mvc.ViewFeatures.Test)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
 
public class AttributeDictionaryTest
{
    [Fact]
    public void AttributeDictionary_AddItems()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        // Act
        attributes.Add("zero", "0");
        attributes.Add("one", "1");
        attributes.Add("two", "2");
 
        // Assert
        Assert.Equal(3, attributes.Count);
        Assert.Collection(
            attributes,
            kvp => Assert.Equal(new KeyValuePair<string, string>("one", "1"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("two", "2"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("zero", "0"), kvp));
    }
 
    [Fact]
    public void AttributeDictionary_AddItems_AsKeyValuePairs()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        // Act
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Assert
        Assert.Equal(3, attributes.Count);
        Assert.Collection(
            attributes,
            kvp => Assert.Equal(new KeyValuePair<string, string>("one", "1"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("two", "2"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("zero", "0"), kvp));
    }
 
    [Fact]
    public void AttributeDictionary_Add_DuplicateKey()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add("zero", "0");
        attributes.Add("one", "1");
        attributes.Add("two", "2");
 
        // Act & Assert
        Assert.Throws<InvalidOperationException>(() => attributes.Add("one", "15"));
    }
 
    [Fact]
    public void AttributeDictionary_Clear()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        attributes.Clear();
 
        // Assert
        Assert.Empty(attributes);
        Assert.Empty(attributes);
    }
 
    [Fact]
    public void AttributeDictionary_Contains_Success()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        var result = attributes.Contains(new KeyValuePair<string, string>("zero", "0"));
 
        // Assert
        Assert.True(result);
    }
 
    [Fact]
    public void AttributeDictionary_Contains_Failure()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        var result = attributes.Contains(new KeyValuePair<string, string>("zero", "nada"));
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void AttributeDictionary_ContainsKey_Success()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        var result = attributes.ContainsKey("one");
 
        // Assert
        Assert.True(result);
    }
 
    [Fact]
    public void AttributeDictionary_ContainsKey_Failure()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        var result = attributes.ContainsKey("one!");
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void AttributeDictionary_CopyTo()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        var array = new KeyValuePair<string, string>[attributes.Count + 1];
 
        // Act
        attributes.CopyTo(array, 1);
 
        // Assert
        Assert.Collection(
            array,
            kvp => Assert.Equal(default(KeyValuePair<string, string>), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("one", "1"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("two", "2"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("zero", "0"), kvp));
    }
 
    [Fact]
    public void AttributeDictionary_IsReadOnly()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        // Act
        var result = attributes.IsReadOnly;
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void AttributeDictionary_Keys()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        var keys = attributes.Keys;
 
        // Assert
        Assert.Equal(3, keys.Count);
        Assert.Collection(
            keys,
            key => Assert.Equal("one", key),
            key => Assert.Equal("two", key),
            key => Assert.Equal("zero", key));
    }
 
    [Fact]
    public void AttributeDictionary_Remove_Success()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        var result = attributes.Remove("one");
 
        // Assert
        Assert.True(result);
        Assert.Equal(2, attributes.Count);
        Assert.Collection(
            attributes,
            kvp => Assert.Equal(new KeyValuePair<string, string>("two", "2"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("zero", "0"), kvp));
    }
 
    [Fact]
    public void AttributeDictionary_Remove_Failure()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        var result = attributes.Remove("nada");
 
        // Assert
        Assert.False(result);
        Assert.Equal(3, attributes.Count);
        Assert.Collection(
            attributes,
            kvp => Assert.Equal(new KeyValuePair<string, string>("one", "1"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("two", "2"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("zero", "0"), kvp));
    }
 
    [Fact]
    public void AttributeDictionary_Remove_KeyValuePair_Success()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        var result = attributes.Remove(new KeyValuePair<string, string>("one", "1"));
 
        // Assert
        Assert.True(result);
        Assert.Equal(2, attributes.Count);
        Assert.Collection(
            attributes,
            kvp => Assert.Equal(new KeyValuePair<string, string>("two", "2"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("zero", "0"), kvp));
    }
 
    [Fact]
    public void AttributeDictionary_Remove_KeyValuePair_Failure()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        var result = attributes.Remove(new KeyValuePair<string, string>("one", "0"));
 
        // Assert
        Assert.False(result);
        Assert.Equal(3, attributes.Count);
        Assert.Collection(
            attributes,
            kvp => Assert.Equal(new KeyValuePair<string, string>("one", "1"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("two", "2"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("zero", "0"), kvp));
    }
 
    [Fact]
    public void AttributeDictionary_TryGetValue_Success()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        string value;
 
        // Act
        var result = attributes.TryGetValue("two", out value);
 
        // Assert
        Assert.True(result);
        Assert.Equal("2", value);
    }
 
    [Fact]
    public void AttributeDictionary_TryGetValue_Failure()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        string value;
 
        // Act
        var result = attributes.TryGetValue("nada", out value);
 
        // Assert
        Assert.False(result);
        Assert.Null(value);
    }
 
    [Fact]
    public void AttributeDictionary_Values()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        var values = attributes.Values;
 
        // Assert
        Assert.Equal(3, values.Count);
        Assert.Collection(
            values,
            key => Assert.Equal("1", key),
            key => Assert.Equal("2", key),
            key => Assert.Equal("0", key));
    }
 
    [Fact]
    public void AttributeDictionary_Indexer_Success()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        var value = attributes["two"];
 
        // Assert
        Assert.Equal("2", value);
    }
 
    [Fact]
    public void AttributeDictionary_Indexer_Fails()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act & Assert
        Assert.Throws<KeyNotFoundException>(() => attributes["nada"]);
    }
 
    [Fact]
    public void AttributeDictionary_Indexer_SetValue()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        attributes["one"] = "1!";
 
        // Assert
        Assert.Equal(3, attributes.Count);
        Assert.Collection(
            attributes,
            kvp => Assert.Equal(new KeyValuePair<string, string>("one", "1!"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("two", "2"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("zero", "0"), kvp));
    }
 
    [Fact]
    public void AttributeDictionary_Indexer_Insert()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        attributes["exciting!"] = "1!";
 
        // Assert
        Assert.Equal(4, attributes.Count);
        Assert.Collection(
            attributes,
            kvp => Assert.Equal(new KeyValuePair<string, string>("exciting!", "1!"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("one", "1"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("two", "2"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("zero", "0"), kvp));
    }
 
    [Fact]
    public void AttributeDictionary_CaseInsensitive()
    {
        // Arrange
        var attributes = new AttributeDictionary();
 
        attributes.Add(new KeyValuePair<string, string>("zero", "0"));
        attributes.Add(new KeyValuePair<string, string>("one", "1"));
        attributes.Add(new KeyValuePair<string, string>("two", "2"));
 
        // Act
        attributes["oNe"] = "1!";
 
        // Assert
        Assert.Equal(3, attributes.Count);
        Assert.Collection(
            attributes,
            kvp => Assert.Equal(new KeyValuePair<string, string>("oNe", "1!"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("two", "2"), kvp),
            kvp => Assert.Equal(new KeyValuePair<string, string>("zero", "0"), kvp));
    }
}