|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
#nullable disable
using System;
using Xunit;
namespace Microsoft.AspNetCore.Razor.Language.Intermediate;
public class IntermediateNodeReferenceTest
{
[Fact]
public void InsertAfter_SingleNode_AddsNodeAfterNode()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var node2 = new BasicIntermediateNode("Node2");
var node3 = new BasicIntermediateNode("Node3");
parent.Children.Add(node1);
parent.Children.Add(node3);
var reference = new IntermediateNodeReference(node1, parent);
// Act
reference.InsertAfter(node2);
// Assert
Assert.Equal(new[] { node1, node2, node3, }, parent.Children);
}
[Fact]
public void InsertAfter_SingleNode_AddsNodeAfterNode_AtEnd()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var node2 = new BasicIntermediateNode("Node2");
var node3 = new BasicIntermediateNode("Node3");
parent.Children.Add(node1);
parent.Children.Add(node2);
var reference = new IntermediateNodeReference(node2, parent);
// Act
reference.InsertAfter(node3);
// Assert
Assert.Equal(new[] { node1, node2, node3, }, parent.Children);
}
[Fact]
public void InsertAfter_MultipleNodes_AddsNodesAfterNode()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var node2 = new BasicIntermediateNode("Node2");
var node3 = new BasicIntermediateNode("Node3");
var node4 = new BasicIntermediateNode("Node4");
parent.Children.Add(node1);
parent.Children.Add(node4);
var reference = new IntermediateNodeReference(node1, parent);
// Act
reference.InsertAfter(new[] { node2, node3 });
// Assert
Assert.Equal(new[] { node1, node2, node3, node4, }, parent.Children);
}
[Fact]
public void InsertAfter_MultipleNodes_AddsNodesAfterNode_AtEnd()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var node2 = new BasicIntermediateNode("Node2");
var node3 = new BasicIntermediateNode("Node3");
var node4 = new BasicIntermediateNode("Node4");
parent.Children.Add(node1);
parent.Children.Add(node2);
var reference = new IntermediateNodeReference(node2, parent);
// Act
reference.InsertAfter(new[] { node3, node4 });
// Assert
Assert.Equal(new[] { node1, node2, node3, node4, }, parent.Children);
}
[Fact]
public void InsertBefore_SingleNode_AddsNodeBeforeNode()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var node2 = new BasicIntermediateNode("Node2");
var node3 = new BasicIntermediateNode("Node3");
parent.Children.Add(node1);
parent.Children.Add(node3);
var reference = new IntermediateNodeReference(node3, parent);
// Act
reference.InsertBefore(node2);
// Assert
Assert.Equal(new[] { node1, node2, node3, }, parent.Children);
}
[Fact]
public void InsertBefore_SingleNode_AddsNodeBeforeNode_AtBeginning()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var node2 = new BasicIntermediateNode("Node2");
var node3 = new BasicIntermediateNode("Node3");
parent.Children.Add(node2);
parent.Children.Add(node3);
var reference = new IntermediateNodeReference(node2, parent);
// Act
reference.InsertBefore(node1);
// Assert
Assert.Equal(new[] { node1, node2, node3, }, parent.Children);
}
[Fact]
public void InsertBefore_MultipleNodes_AddsNodesBeforeNode()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var node2 = new BasicIntermediateNode("Node2");
var node3 = new BasicIntermediateNode("Node3");
var node4 = new BasicIntermediateNode("Node4");
parent.Children.Add(node1);
parent.Children.Add(node4);
var reference = new IntermediateNodeReference(node4, parent);
// Act
reference.InsertBefore(new[] { node2, node3 });
// Assert
Assert.Equal(new[] { node1, node2, node3, node4, }, parent.Children);
}
[Fact]
public void InsertAfter_MultipleNodes_AddsNodesBeforeNode_AtBeginning()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var node2 = new BasicIntermediateNode("Node2");
var node3 = new BasicIntermediateNode("Node3");
var node4 = new BasicIntermediateNode("Node4");
parent.Children.Add(node3);
parent.Children.Add(node4);
var reference = new IntermediateNodeReference(node3, parent);
// Act
reference.InsertBefore(new[] { node1, node2 });
// Assert
Assert.Equal(new[] { node1, node2, node3, node4, }, parent.Children);
}
[Fact]
public void Remove_RemovesNode()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var node2 = new BasicIntermediateNode("Node2");
var node3 = new BasicIntermediateNode("Node3");
parent.Children.Add(node1);
parent.Children.Add(node3);
parent.Children.Add(node2);
var reference = new IntermediateNodeReference(node3, parent);
// Act
reference.Remove();
// Assert
Assert.Equal(new[] { node1, node2, }, parent.Children);
}
[Fact]
public void Replace_ReplacesNode()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var node2 = new BasicIntermediateNode("Node2");
var node3 = new BasicIntermediateNode("Node3");
var node4 = new BasicIntermediateNode("Node4");
parent.Children.Add(node1);
parent.Children.Add(node4);
parent.Children.Add(node3);
var reference = new IntermediateNodeReference(node4, parent);
// Act
reference.Replace(node2);
// Assert
Assert.Equal(new[] { node1, node2, node3, }, parent.Children);
}
[Fact]
public void InsertAfter_SingleNode_ThrowsForReferenceNotInitialized()
{
// Arrange
var reference = new IntermediateNodeReference();
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.InsertAfter(new BasicIntermediateNode("_")));
Assert.Equal("The reference is invalid. References initialized with the default constructor cannot modify nodes.", exception.Message);
}
[Fact]
public void InsertAfter_MulipleNodes_ThrowsForReferenceNotInitialized()
{
// Arrange
var reference = new IntermediateNodeReference();
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.InsertAfter(new[] { new BasicIntermediateNode("_") }));
Assert.Equal("The reference is invalid. References initialized with the default constructor cannot modify nodes.", exception.Message);
}
[Fact]
public void InsertBefore_SingleNode_ThrowsForReferenceNotInitialized()
{
// Arrange
var reference = new IntermediateNodeReference();
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.InsertBefore(new BasicIntermediateNode("_")));
Assert.Equal("The reference is invalid. References initialized with the default constructor cannot modify nodes.", exception.Message);
}
[Fact]
public void InsertBefore_MulipleNodes_ThrowsForReferenceNotInitialized()
{
// Arrange
var reference = new IntermediateNodeReference();
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.InsertBefore(new[] { new BasicIntermediateNode("_") }));
Assert.Equal("The reference is invalid. References initialized with the default constructor cannot modify nodes.", exception.Message);
}
[Fact]
public void Remove_ThrowsForReferenceNotInitialized()
{
// Arrange
var reference = new IntermediateNodeReference();
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.Remove());
Assert.Equal("The reference is invalid. References initialized with the default constructor cannot modify nodes.", exception.Message);
}
[Fact]
public void Replace_ThrowsForReferenceNotInitialized()
{
// Arrange
var reference = new IntermediateNodeReference();
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.Replace(new BasicIntermediateNode("_")));
Assert.Equal("The reference is invalid. References initialized with the default constructor cannot modify nodes.", exception.Message);
}
[Fact]
public void InsertAfter_SingleNode_ThrowsForReadOnlyCollection()
{
// Arrange
var parent = new BasicIntermediateNode("Parent", IntermediateNodeCollection.ReadOnly);
var node1 = new BasicIntermediateNode("Node1");
var reference = new IntermediateNodeReference(node1, parent);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.InsertAfter(new BasicIntermediateNode("_")));
Assert.Equal("The node 'Parent' has a read-only child collection and cannot be modified.", exception.Message);
}
[Fact]
public void InsertAfter_MulipleNodes_ThrowsForReadOnlyCollection()
{
// Arrange
var parent = new BasicIntermediateNode("Parent", IntermediateNodeCollection.ReadOnly);
var node1 = new BasicIntermediateNode("Node1");
var reference = new IntermediateNodeReference(node1, parent);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.InsertAfter(new[] { new BasicIntermediateNode("_") }));
Assert.Equal("The node 'Parent' has a read-only child collection and cannot be modified.", exception.Message);
}
[Fact]
public void InsertBefore_SingleNode_ThrowsForReadOnlyCollection()
{
// Arrange
var parent = new BasicIntermediateNode("Parent", IntermediateNodeCollection.ReadOnly);
var node1 = new BasicIntermediateNode("Node1");
var reference = new IntermediateNodeReference(node1, parent);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.InsertBefore(new BasicIntermediateNode("_")));
Assert.Equal("The node 'Parent' has a read-only child collection and cannot be modified.", exception.Message);
}
[Fact]
public void InsertBefore_MulipleNodes_ThrowsForReadOnlyCollection()
{
// Arrange
var parent = new BasicIntermediateNode("Parent", IntermediateNodeCollection.ReadOnly);
var node1 = new BasicIntermediateNode("Node1");
var reference = new IntermediateNodeReference(node1, parent);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.InsertBefore(new[] { new BasicIntermediateNode("_") }));
Assert.Equal("The node 'Parent' has a read-only child collection and cannot be modified.", exception.Message);
}
[Fact]
public void Remove_ThrowsForReadOnlyCollection()
{
// Arrange
var parent = new BasicIntermediateNode("Parent", IntermediateNodeCollection.ReadOnly);
var node1 = new BasicIntermediateNode("Node1");
var reference = new IntermediateNodeReference(node1, parent);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.Remove());
Assert.Equal("The node 'Parent' has a read-only child collection and cannot be modified.", exception.Message);
}
[Fact]
public void Replace_ThrowsForReadOnlyCollection()
{
// Arrange
var parent = new BasicIntermediateNode("Parent", IntermediateNodeCollection.ReadOnly);
var node1 = new BasicIntermediateNode("Node1");
var reference = new IntermediateNodeReference(node1, parent);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.Replace(new BasicIntermediateNode("_")));
Assert.Equal("The node 'Parent' has a read-only child collection and cannot be modified.", exception.Message);
}
[Fact]
public void InsertAfter_SingleNode_ThrowsForNodeNotFound()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var reference = new IntermediateNodeReference(node1, parent);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.InsertAfter(new BasicIntermediateNode("_")));
Assert.Equal("The reference is invalid. The node 'Node1' could not be found as a child of 'Parent'.", exception.Message);
}
[Fact]
public void InsertAfter_MulipleNodes_ThrowsForNodeNotFound()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var reference = new IntermediateNodeReference(node1, parent);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.InsertAfter(new[] { new BasicIntermediateNode("_") }));
Assert.Equal("The reference is invalid. The node 'Node1' could not be found as a child of 'Parent'.", exception.Message);
}
[Fact]
public void InsertBefore_SingleNode_ThrowsForNodeNotFound()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var reference = new IntermediateNodeReference(node1, parent);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.InsertBefore(new BasicIntermediateNode("_")));
Assert.Equal("The reference is invalid. The node 'Node1' could not be found as a child of 'Parent'.", exception.Message);
}
[Fact]
public void InsertBefore_MulipleNodes_ThrowsForNodeNotFound()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var reference = new IntermediateNodeReference(node1, parent);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.InsertBefore(new[] { new BasicIntermediateNode("_") }));
Assert.Equal("The reference is invalid. The node 'Node1' could not be found as a child of 'Parent'.", exception.Message);
}
[Fact]
public void Remove_ThrowsForNodeNotFound()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var reference = new IntermediateNodeReference(node1, parent);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.Remove());
Assert.Equal("The reference is invalid. The node 'Node1' could not be found as a child of 'Parent'.", exception.Message);
}
[Fact]
public void Replace_ThrowsForNodeNotFound()
{
// Arrange
var parent = new BasicIntermediateNode("Parent");
var node1 = new BasicIntermediateNode("Node1");
var reference = new IntermediateNodeReference(node1, parent);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => reference.Replace(new BasicIntermediateNode("_")));
Assert.Equal("The reference is invalid. The node 'Node1' could not be found as a child of 'Parent'.", exception.Message);
}
private class BasicIntermediateNode : IntermediateNode
{
public BasicIntermediateNode(string name)
: this(name, new IntermediateNodeCollection())
{
Name = name;
}
public BasicIntermediateNode(string name, IntermediateNodeCollection children)
{
Name = name;
Children = children;
}
public string Name { get; }
public override IntermediateNodeCollection Children { get; }
public override void Accept(IntermediateNodeVisitor visitor)
{
throw new System.NotImplementedException();
}
public override string ToString() => Name;
}
}
|