@@ -464,3 +464,85 @@ fn bub_lub() {
464
464
assert_eq ! ( relation. minimal_upper_bounds( & "a" , & "b" ) , vec![ & "x" ] ) ;
465
465
assert_eq ! ( relation. best_upper_bound( & "a" , & "b" ) , Some ( & "x" ) ) ;
466
466
}
467
+
468
+ #[ test]
469
+ fn mubs_intermediate_node_on_one_side_only ( ) {
470
+ // a -> c -> d
471
+ // ^
472
+ // |
473
+ // b
474
+
475
+ // "digraph { a -> c -> d; b -> d; }",
476
+ let mut relation = TransitiveRelation :: new ( ) ;
477
+ relation. add ( "a" , "c" ) ;
478
+ relation. add ( "c" , "d" ) ;
479
+ relation. add ( "b" , "d" ) ;
480
+
481
+ assert_eq ! ( relation. minimal_upper_bounds( & "a" , & "b" ) , vec![ & "d" ] ) ;
482
+ }
483
+
484
+ #[ test]
485
+ fn mubs_scc_1 ( ) {
486
+ // +-------------+
487
+ // | +----+ |
488
+ // | v | |
489
+ // a -> c -> d <-+
490
+ // ^
491
+ // |
492
+ // b
493
+
494
+ // "digraph { a -> c -> d; d -> c; a -> d; b -> d; }",
495
+ let mut relation = TransitiveRelation :: new ( ) ;
496
+ relation. add ( "a" , "c" ) ;
497
+ relation. add ( "c" , "d" ) ;
498
+ relation. add ( "d" , "c" ) ;
499
+ relation. add ( "a" , "d" ) ;
500
+ relation. add ( "b" , "d" ) ;
501
+
502
+ assert_eq ! ( relation. minimal_upper_bounds( & "a" , & "b" ) , vec![ & "c" ] ) ;
503
+ }
504
+
505
+ #[ test]
506
+ fn mubs_scc_2 ( ) {
507
+ // +----+
508
+ // v |
509
+ // a -> c -> d
510
+ // ^ ^
511
+ // | |
512
+ // +--- b
513
+
514
+ // "digraph { a -> c -> d; d -> c; b -> d; b -> c; }",
515
+ let mut relation = TransitiveRelation :: new ( ) ;
516
+ relation. add ( "a" , "c" ) ;
517
+ relation. add ( "c" , "d" ) ;
518
+ relation. add ( "d" , "c" ) ;
519
+ relation. add ( "b" , "d" ) ;
520
+ relation. add ( "b" , "c" ) ;
521
+
522
+ assert_eq ! ( relation. minimal_upper_bounds( & "a" , & "b" ) , vec![ & "c" ] ) ;
523
+ }
524
+
525
+ #[ test]
526
+ fn mubs_scc_3 ( ) {
527
+ // +---------+
528
+ // v |
529
+ // a -> c -> d -> e
530
+ // ^ ^
531
+ // | |
532
+ // b ---+
533
+
534
+ // "digraph { a -> c -> d -> e -> c; b -> d; b -> e; }",
535
+ let mut relation = TransitiveRelation :: new ( ) ;
536
+ relation. add ( "a" , "c" ) ;
537
+ relation. add ( "c" , "d" ) ;
538
+ relation. add ( "e" , "e" ) ;
539
+ relation. add ( "e" , "c" ) ;
540
+ relation. add ( "b" , "d" ) ;
541
+ relation. add ( "b" , "e" ) ;
542
+
543
+ assert_eq ! ( relation. minimal_upper_bounds( & "a" , & "b" ) , vec![ & "c" ] ) ;
544
+ }
545
+
546
+ /*
547
+ "digraph { a -> c -> d -> e -> c; a -> d; b -> e; }"
548
+ */
0 commit comments