Skip to content

Commit f7c4510

Browse files
committed
fixed a markup bug
1 parent 560b765 commit f7c4510

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
1010

1111
### Changed
1212

13+
- Fixed a bug where unbalanced markup without text siblings or children would cause an error
14+
1315
### Removed
1416

1517
## [3.1.0] 2025-12-02

YarnSpinner.Tests/MarkupTests.cs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,96 @@ public void TestUnsquishedNestedMarkupIsValid()
367367
tree.children.Should().HaveCount(3);
368368
}
369369

370+
[Fact]
371+
public void TestUnsquishedImbalancedMarkupIsValidWhenImbalanceOccursAtEndOfLine()
372+
{
373+
var line = "start[a]ab[b]bc[c]cb[/b][/c][/a]";
374+
375+
/*
376+
root
377+
"start"
378+
a
379+
"ab"
380+
b
381+
"bc"
382+
c
383+
"cb"
384+
*/
385+
386+
var lineParser = new LineParser();
387+
var tokens = lineParser.LexMarkup(line);
388+
var result = lineParser.BuildMarkupTreeFromTokens(tokens, line);
389+
var tree = result.tree;
390+
var errors = result.diagnostics;
391+
errors.Should().BeEmpty();
392+
393+
tree.children.Should().HaveCount(2); // text and a node
394+
395+
// a has two kids
396+
Descendant(tree, 1).children.Should().HaveCount(2);
397+
398+
// first is text
399+
((LineParser.MarkupTextNode)Descendant(tree, 1, 0)).text.Should().Be("ab");
400+
401+
// b has two kids
402+
Descendant(tree, 1,1).children.Should().HaveCount(2);
403+
404+
// first is text
405+
((LineParser.MarkupTextNode)Descendant(tree, 1,1,0)).text.Should().Be("bc");
406+
407+
// c has one child and it's text
408+
Descendant(tree, 1,1,1).children.Should().HaveCount(1);
409+
((LineParser.MarkupTextNode)Descendant(tree, 1,1,1,0)).text.Should().Be("cb");
410+
}
411+
412+
[Fact]
413+
public void TestUnsquishedImbalancedMarkupWithExcessCloseIsInvalid()
414+
{
415+
var line = "start[a]ab[b]bc[c]cb[/b][/c][/a][/d]";
416+
417+
var lineParser = new LineParser();
418+
var tokens = lineParser.LexMarkup(line);
419+
var result = lineParser.BuildMarkupTreeFromTokens(tokens, line);
420+
var errors = result.diagnostics;
421+
errors.Should().HaveCount(1);
422+
}
423+
424+
[Fact]
425+
public void TestUnsquishedImbalancedMarkupWithExcessCloseAndOpenIsInvalid()
426+
{
427+
var line = "start[a]ab[b]bc[c]cb[/b][/c][/d]";
428+
429+
var lineParser = new LineParser();
430+
var tokens = lineParser.LexMarkup(line);
431+
var result = lineParser.BuildMarkupTreeFromTokens(tokens, line);
432+
var errors = result.diagnostics;
433+
errors.Should().HaveCount(1);
434+
}
435+
436+
[Fact]
437+
public void TestUnclosedMarkupIsInvalid()
438+
{
439+
var line = "start[a]end";
440+
441+
var lineParser = new LineParser();
442+
var tokens = lineParser.LexMarkup(line);
443+
var result = lineParser.BuildMarkupTreeFromTokens(tokens, line);
444+
var errors = result.diagnostics;
445+
errors.Should().HaveCount(1);
446+
}
447+
448+
[Fact]
449+
public void TestUnopenedMarkupIsInvalid()
450+
{
451+
var line = "end[/a]";
452+
453+
var lineParser = new LineParser();
454+
var tokens = lineParser.LexMarkup(line);
455+
var result = lineParser.BuildMarkupTreeFromTokens(tokens, line);
456+
var errors = result.diagnostics;
457+
errors.Should().HaveCount(1);
458+
}
459+
370460
[Fact]
371461
public void TestUnsquishedImbalancedMarkupIsValid()
372462
{

YarnSpinner/YarnSpinner.Markup/LineParser.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,6 +1362,10 @@ string ValueFromInterpolatedToken(LexerToken token)
13621362
// we have now run off the end of the line
13631363
// if we have any unmatched closes still lying around we want to close them off now
13641364
// because at this stage it doesn't matter about ordering
1365+
if (unmatchedCloses.Count > 1)
1366+
{
1367+
CleanUpUnmatchedCloses(openNodes, unmatchedCloses, diagnostics);
1368+
}
13651369

13661370
// ok last thing to check is is there only one element left on the stack of open nodes
13671371
if (openNodes.Count > 1)

0 commit comments

Comments
 (0)