@@ -10,6 +10,9 @@ namespace HtmlToOpenXml.Tests
10
10
[ TestFixture ]
11
11
public class NumberingTests : HtmlConverterTestBase
12
12
{
13
+ const int maxLevel = 8 ;
14
+
15
+
13
16
[ Test ( Description = "Skip any elements that is not a `li` tag" ) ]
14
17
public void NonLiElement_ShouldBeIgnored ( )
15
18
{
@@ -181,7 +184,6 @@ public void WithExistingNumbering_ReturnsUniqueInstanceId()
181
184
[ Test ( Description = "Word doesn't display more than 8 deep levels." ) ]
182
185
public void MaxNumberingLevel_ShouldBeIgnored ( )
183
186
{
184
- const int maxLevel = 8 ;
185
187
var sb = new System . Text . StringBuilder ( ) ;
186
188
for ( int i = 0 ; i <= maxLevel ; i ++ )
187
189
sb . AppendFormat ( "<ol><li>Item {0}" , i + 1 ) ;
@@ -333,16 +335,17 @@ public async Task DisableContinueNumbering_ReturnsSecondList_RestartingOrder()
333
335
/// Tiered numbering such as: 1, 1.1, 1.1.1
334
336
/// </summary>
335
337
[ Test ( Description = "Nested numbering (issue #81)" ) ]
336
- public void DecimalTieredStyle_ReturnsListWithTieredNumbering ( )
338
+ public async Task DecimalTieredStyle_ReturnsListWithTieredNumbering ( )
337
339
{
338
- var elements = converter . Parse (
340
+ await converter . ParseBody (
339
341
@"<ol style='list-style-type:decimal-tiered'>
340
342
<li>Item 1
341
343
<ol><li>Item 1.1</li></ol>
342
344
</li>
343
345
<li>Item 2</li>
344
346
</ol>" ) ;
345
347
348
+ var elements = mainPart . Document . Body ! . ChildElements ;
346
349
var absNum = mainPart . NumberingDefinitionsPart ? . Numbering
347
350
. Elements < AbstractNum > ( )
348
351
. SingleOrDefault ( ) ;
@@ -351,10 +354,15 @@ public void DecimalTieredStyle_ReturnsListWithTieredNumbering()
351
354
var instances = mainPart . NumberingDefinitionsPart ? . Numbering
352
355
. Elements < NumberingInstance > ( ) . Where ( i => i . AbstractNumId ! . Val == absNum . AbstractNumberId ) ;
353
356
Assert . That ( instances , Is . Not . Null ) ;
357
+ var levels = absNum . Elements < Level > ( ) ;
354
358
Assert . Multiple ( ( ) =>
355
359
{
356
360
Assert . That ( instances . Count ( ) , Is . EqualTo ( 1 ) ) ;
357
361
Assert . That ( instances . Select ( i => i . NumberID ? . HasValue ) , Has . All . True ) ;
362
+ Assert . That ( levels . Count ( ) , Is . EqualTo ( maxLevel + 1 ) ) ;
363
+ Assert . That ( levels . Select ( l => l . NumberingFormat ? . Val ? . Value ) , Has . All . EqualTo ( NumberFormatValues . Decimal ) ) ;
364
+ Assert . That ( levels . Select ( l => l . PreviousParagraphProperties ? . Indentation ? . Left ? . Value ) , Has . All . EqualTo ( "0" ) ,
365
+ "Decimal Tiered style must all be aligned on left with no indent" ) ;
358
366
} ) ;
359
367
360
368
Assert . That ( elements , Is . Not . Empty ) ;
@@ -363,6 +371,7 @@ public void DecimalTieredStyle_ReturnsListWithTieredNumbering()
363
371
e . ParagraphProperties ? . NumberingProperties ? . NumberingId ? . Val ? . Value ) ,
364
372
Has . All . EqualTo ( instances . First ( ) . NumberID ! . Value ) ,
365
373
"All paragraphs are linked to the same list instance" ) ;
374
+ AssertThatOpenXmlDocumentIsValid ( ) ;
366
375
}
367
376
368
377
[ Test ( Description = "Allow to specify another start value for the first item of a `ol` list" ) ]
@@ -503,5 +512,34 @@ public void WithRtl_ReturnsBidi(string dir, bool? expectedValue)
503
512
var bidi = elements . Last ( ) . GetFirstChild < ParagraphProperties > ( ) ? . BiDi ;
504
513
return bidi ? . Val ? . Value ;
505
514
}
515
+
516
+ [ Test ]
517
+ public void NestedNumberList_ReturnsIncrementalIdentation ( )
518
+ {
519
+ const int maxLevel = 8 ;
520
+ var sb = new System . Text . StringBuilder ( ) ;
521
+ for ( int i = 0 ; i < maxLevel ; i ++ )
522
+ sb . AppendFormat ( "<ol><li>Item {0}" , i + 1 ) ;
523
+ for ( int i = 0 ; i < maxLevel ; i ++ )
524
+ sb . Append ( "</li></ol>" ) ;
525
+
526
+ converter . Parse ( sb . ToString ( ) ) ;
527
+
528
+ var absNum = mainPart . NumberingDefinitionsPart ? . Numbering
529
+ . Elements < AbstractNum > ( )
530
+ . SingleOrDefault ( ) ;
531
+ Assert . That ( absNum , Is . Not . Null ) ;
532
+
533
+ var levels = absNum . Elements < Level > ( ) ;
534
+ Assert . That ( levels . Count ( ) , Is . EqualTo ( maxLevel + 1 ) ) ;
535
+ for ( int i = 0 ; i <= maxLevel ; i ++ )
536
+ {
537
+ var level = levels . ElementAt ( i ) ;
538
+ var ident = level . PreviousParagraphProperties ? . Indentation ;
539
+ Assert . That ( ident ? . Hanging ? . Value , Is . EqualTo ( "360" ) ) ;
540
+ Assert . That ( Convert . ToInt32 ( ident ? . Left ? . Value ) , Is . EqualTo ( ( i + 1 ) * 2 * 360 ) ) ;
541
+ TestContext . Out . WriteLine ( $ "{ i } . { ident ? . Left ? . Value } ") ;
542
+ }
543
+ }
506
544
}
507
545
}
0 commit comments