-
|
I have some tests that do assertions on an abstract syntax tree with following expectations:
Using [Test]
public void Ignores_invalid_tags()
{
string input = "5 <REDACTED> Dye kits";
IEnumerable<MarkupToken> tokens = MarkupLexer.Tokenize(input);
RootNode actual = MarkupParser.Parse(tokens);
Assert.NotNull(actual);
Assert.Collection(actual.Children, node =>
{
TextNode text = Assert.IsType<TextNode>(node);
Assert.Equal("5 ", text.Text);
}, node =>
{
TextNode text = Assert.IsType<TextNode>(node);
Assert.Equal(" Dye kits", text.Text);
});
}How can I convert it to TUnit fluent syntax? What I tried: [Test]
public async Task Ignores_invalid_tags()
{
string input = "5 <REDACTED> Dye kits";
IEnumerable<MarkupToken> tokens = MarkupLexer.Tokenize(input);
RootNode actual = MarkupParser.Parse(tokens);
await TUnit.Assertions.Assert.That(actual).IsNotNull();
List<MarkupNode> children = [.. actual.Children];
await TUnit.Assertions.Assert.That(children)
.HasCount(2)
.And.Member(
children => children.ElementAt(0),
node => node.IsTypeOf<TextNode, MarkupNode>().And.Member(u => u.Text, t => t.IsEqualTo("5 "))
)
.And.Member(
children => children.ElementAt(1),
node => node.IsTypeOf<TextNode, MarkupNode>().And.Member(u => u.Text, t => t.IsEqualTo(" Dye kits"))
);
}However, it fails at runtime because
For simple cases like this, splitting this across multiple assertions instead of chaining is not a problem, but splitting gets complicated fast for multiple layers of -- A more complicated example: [Test]
public void Forgives_mismatched_tags()
{
string input = "<c=@reminder>This coat hides leg armor.<c>";
IEnumerable<MarkupToken> tokens = MarkupLexer.Tokenize(input);
RootNode actual = MarkupParser.Parse(tokens);
Assert.NotNull(actual);
MarkupNode firstChild = Assert.Single(actual.Children);
ColoredTextNode coloredText = Assert.IsType<ColoredTextNode>(firstChild);
Assert.Equal("@reminder", coloredText.Color);
MarkupNode coloredTextChild = Assert.Single(coloredText.Children);
TextNode text = Assert.IsType<TextNode>(coloredTextChild);
Assert.Equal("This coat hides leg armor.", text.Text);
}What I tried: [Test]
public async Task Forgives_mismatched_tags()
{
string input = "<c=@reminder>This coat hides leg armor.<c>";
IEnumerable<MarkupToken> tokens = MarkupLexer.Tokenize(input);
RootNode actual = MarkupParser.Parse(tokens);
await TUnit.Assertions.Assert.That(actual).IsNotNull()
.And.Member(
a => a.Children,
a => a.IsSingleElement()
.And.IsTypeOf<ColoredTextNode>()
.And.Member(n => n.Color, b => b.IsEqualTo("@reminder"))
.And.Member(n => n.Children, b => b.HasSingleItem()
.And.IsTypeOf<TextNode>()
.And.Member(c => c.Text, d => d.IsEqualTo("This coat hides leg armor.")))
);
}It fails with a similar runtime error:
|
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 1 reply
-
|
Something like this: string input = "5 <REDACTED> Dye kits";
IEnumerable<MarkupToken> tokens = MarkupLexer.Tokenize(input);
RootNode actual = MarkupParser.Parse(tokens);
await Assert.That(actual)
.IsNotNull()
.And.Member(a => a.Children, children => children.HasCount(2));
await Assert.That(actual.Children.ElementAt(0))
.IsTypeOf<TextNode>()
.And.Member(t => t.Text, text => text.IsEqualTo("5 "));
await Assert.That(actual.Children.ElementAt(1))
.IsTypeOf<TextNode>()
.And.Member(t => t.Text, text => text.IsEqualTo(" Dye kits"));or string input = "<c=@reminder>This coat hides leg armor.<c>";
IEnumerable<MarkupToken> tokens = MarkupLexer.Tokenize(input);
RootNode actual = MarkupParser.Parse(tokens);
await Assert.That(actual).IsNotNull();
var firstChild = await Assert.That(actual.Children).HasSingleItem();
var coloredText = await Assert.That(firstChild)
.IsTypeOf<ColoredTextNode>()
.And.Member(c => c.Color, color => color.IsEqualTo("@reminder"));
var coloredTextChild = await Assert.That(coloredText.Children).HasSingleItem();
await Assert.That(coloredTextChild)
.IsTypeOf<TextNode>()
.And.Member(t => t.Text, text => text.IsEqualTo("This coat hides leg armor.")); |
Beta Was this translation helpful? Give feedback.
Something like this:
or