package mill.eval import utest._ object TarjanTests extends TestSuite{ def check(input: Seq[Seq[Int]], expected: Seq[Seq[Int]]) = { val result = Tarjans(input).map(_.sorted) val sortedExpected = expected.map(_.sorted) assert(result == sortedExpected) } val tests = Tests{ // 'empty - check(Seq(), Seq()) // (0) 'singleton - check(Seq(Seq()), Seq(Seq(0))) // (0)-. // ^._/ 'selfCycle - check(Seq(Seq(0)), Seq(Seq(0))) // (0) <-> (1) 'simpleCycle- check(Seq(Seq(1), Seq(0)), Seq(Seq(1, 0))) // (0) (1) (2) 'multipleSingletons - check( Seq(Seq(), Seq(), Seq()), Seq(Seq(0), Seq(1), Seq(2)) ) // (0) -> (1) -> (2) 'straightLineNoCycles- check( Seq(Seq(1), Seq(2), Seq()), Seq(Seq(2), Seq(1), Seq(0)) ) // (0) <- (1) <- (2) 'straightLineNoCyclesReversed- check( Seq(Seq(), Seq(0), Seq(1)), Seq(Seq(0), Seq(1), Seq(2)) ) // (0) <-> (1) (2) -> (3) -> (4) // ^.____________/ 'independentSimpleCycles - check( Seq(Seq(1), Seq(0), Seq(3), Seq(4), Seq(2)), Seq(Seq(1, 0), Seq(4, 3, 2)) ) // ___________________ // v \ // (0) <-> (1) (2) -> (3) -> (4) // ^.____________/ 'independentLinkedCycles - check( Seq(Seq(1), Seq(0), Seq(3), Seq(4), Seq(2, 1)), Seq(Seq(1, 0), Seq(4, 3, 2)) ) // _____________ // / v // (0) <-> (1) (2) -> (3) -> (4) // ^.____________/ 'independentLinkedCycles2 - check( Seq(Seq(1, 2), Seq(0), Seq(3), Seq(4), Seq(2)), Seq(Seq(4, 3, 2), Seq(1, 0)) ) // _____________ // / v // (0) <-> (1) (2) -> (3) -> (4) // ^. ^.____________/ // \________________/ 'combinedCycles - check( Seq(Seq(1, 2), Seq(0), Seq(3), Seq(4), Seq(2, 1)), Seq(Seq(4, 3, 2, 1, 0)) ) // // (0) <-> (1) <- (2) <- (3) <-> (4) <- (5) // ^.____________/ / / // / / // (6) <- (7) <-/ (8) <-' // / / // v / // (9) <--------' 'combinedCycles - check( Seq(Seq(1), Seq(0), Seq(0, 1), Seq(2, 4, 7, 9), Seq(3), Seq(4, 8), Seq(9), Seq(6), Seq(), Seq()), Seq(Seq(0, 1), Seq(2), Seq(9), Seq(6), Seq(7), Seq(3, 4), Seq(8), Seq(5)) ) } }