@@ -422,4 +422,130 @@ subgraph inner
422422 Assert . Contains ( "A" , outer . ChildNodeIds ) ;
423423 Assert . Contains ( "B" , outer . ChildNodeIds ) ;
424424 }
425+
426+ // ── Mindmap: CanParse ─────────────────────────────────────────────────────
427+
428+ [ Fact ]
429+ public void CanParse_ReturnsTrue_ForMindmap ( )
430+ {
431+ const string text = """
432+ mindmap
433+ root((Product))
434+ Engineering
435+ """ ;
436+
437+ Assert . True ( _parser . CanParse ( text ) ) ;
438+ }
439+
440+ // ── Mindmap: Parse ────────────────────────────────────────────────────────
441+
442+ [ Fact ]
443+ public void Parse_Mindmap_DiagramTypeIsMindmap ( )
444+ {
445+ const string text = """
446+ mindmap
447+ root((Product))
448+ Engineering
449+ """ ;
450+
451+ var diagram = _parser . Parse ( text ) ;
452+
453+ Assert . Equal ( "mindmap" , diagram . DiagramType ) ;
454+ Assert . Equal ( "mermaid" , diagram . SourceSyntax ) ;
455+ }
456+
457+ [ Fact ]
458+ public void Parse_Mindmap_RootHasNoParent ( )
459+ {
460+ const string text = """
461+ mindmap
462+ root((Product))
463+ Engineering
464+ """ ;
465+
466+ var diagram = _parser . Parse ( text ) ;
467+
468+ // The root node (node_0) must have no incoming edges.
469+ var rootNode = diagram . Nodes . Values . First ( ) ;
470+ Assert . DoesNotContain ( diagram . Edges , e => e . TargetId == rootNode . Id ) ;
471+ }
472+
473+ [ Fact ]
474+ public void Parse_Mindmap_ChildrenLinkedToParent ( )
475+ {
476+ const string text = """
477+ mindmap
478+ root((Product))
479+ Engineering
480+ Design
481+ """ ;
482+
483+ var diagram = _parser . Parse ( text ) ;
484+
485+ // root → Engineering, root → Design
486+ Assert . Equal ( 2 , diagram . Edges . Count ) ;
487+ var rootId = diagram . Nodes . Values . First ( n => n . Label . Text == "Product" ) . Id ;
488+ Assert . All ( diagram . Edges , e => Assert . Equal ( rootId , e . SourceId ) ) ;
489+ }
490+
491+ [ Fact ]
492+ public void Parse_Mindmap_GrandchildLinkedToChild ( )
493+ {
494+ const string text = """
495+ mindmap
496+ root((Product))
497+ Engineering
498+ Backend
499+ Frontend
500+ """ ;
501+
502+ var diagram = _parser . Parse ( text ) ;
503+
504+ var engineeringId = diagram . Nodes . Values . First ( n => n . Label . Text == "Engineering" ) . Id ;
505+ var backendId = diagram . Nodes . Values . First ( n => n . Label . Text == "Backend" ) . Id ;
506+ var frontendId = diagram . Nodes . Values . First ( n => n . Label . Text == "Frontend" ) . Id ;
507+
508+ Assert . Contains ( diagram . Edges , e => e . SourceId == engineeringId && e . TargetId == backendId ) ;
509+ Assert . Contains ( diagram . Edges , e => e . SourceId == engineeringId && e . TargetId == frontendId ) ;
510+ }
511+
512+ [ Fact ]
513+ public void Parse_Mindmap_NodeShapes_AreRecognized ( )
514+ {
515+ const string text = """
516+ mindmap
517+ root((Circle))
518+ square[Square]
519+ rounded(Rounded)
520+ """ ;
521+
522+ var diagram = _parser . Parse ( text ) ;
523+
524+ var circle = diagram . Nodes . Values . First ( n => n . Label . Text == "Circle" ) ;
525+ var square = diagram . Nodes . Values . First ( n => n . Label . Text == "Square" ) ;
526+ var rounded = diagram . Nodes . Values . First ( n => n . Label . Text == "Rounded" ) ;
527+
528+ Assert . Equal ( Shape . Circle , circle . Shape ) ;
529+ Assert . Equal ( Shape . Rectangle , square . Shape ) ;
530+ Assert . Equal ( Shape . RoundedRectangle , rounded . Shape ) ;
531+ }
532+
533+ [ Fact ]
534+ public void Parse_Mindmap_NodeCount_MatchesTreeSize ( )
535+ {
536+ const string text = """
537+ mindmap
538+ root((Product))
539+ Engineering
540+ Backend
541+ Frontend
542+ Design
543+ Product
544+ """ ;
545+
546+ var diagram = _parser . Parse ( text ) ;
547+
548+ Assert . Equal ( 6 , diagram . Nodes . Count ) ;
549+ Assert . Equal ( 5 , diagram . Edges . Count ) ;
550+ }
425551}
0 commit comments