@@ -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 {
0 commit comments