diff --git a/QuadTree.Tests/QuadTree.Tests.fsproj b/QuadTree.Tests/QuadTree.Tests.fsproj
index 96f4102..4de3d64 100644
--- a/QuadTree.Tests/QuadTree.Tests.fsproj
+++ b/QuadTree.Tests/QuadTree.Tests.fsproj
@@ -13,6 +13,7 @@
+
diff --git a/QuadTree.Tests/Tests.BFS.fs b/QuadTree.Tests/Tests.BFS.fs
index 6c40600..df5d0f3 100644
--- a/QuadTree.Tests/Tests.BFS.fs
+++ b/QuadTree.Tests/Tests.BFS.fs
@@ -64,7 +64,7 @@ let ``Simple level bfs.`` () =
)
let store = Vector.Storage(4UL, tree)
- Result.Success(SparseVector(4UL, 4UL, store))
+ Ok(SparseVector(4UL, 4UL, store))
let actual = Graph.BFS.bfs_level graph startVertices
diff --git a/QuadTree.Tests/Tests.Boruvka.fs b/QuadTree.Tests/Tests.Boruvka.fs
new file mode 100644
index 0000000..6f2e2a0
--- /dev/null
+++ b/QuadTree.Tests/Tests.Boruvka.fs
@@ -0,0 +1,1096 @@
+module Graph.Boruvka.Tests
+
+open System
+open Xunit
+
+open Matrix
+open Vector
+open Common
+
+let checkResult name actual expected =
+ match actual with
+ | Ok tree ->
+ let tree_transposed = Matrix.transpose tree
+
+ let actual =
+ Matrix.map2 tree tree_transposed (fun x y ->
+ match (x, y) with
+ | (Some(x), _)
+ | (_, Some x) -> Some x
+ | _ -> None)
+
+ Assert.Equal(expected, actual)
+ | x -> Assert.Fail(sprintf "Boruvka failed: %A" x)
+
+[]
+let ``Boruvka MST 2 nodes.`` () =
+
+ let graph =
+ let clist =
+ Matrix.CoordinateList(
+ 2UL,
+ 2UL,
+ [ 0UL, 1UL, 5UL; 1UL, 0UL, 5UL ]
+ )
+
+ Matrix.fromCoordinateList clist
+
+ let expected =
+ let clist =
+ Matrix.CoordinateList(
+ 2UL,
+ 2UL,
+ [ 0UL, 1UL, 5UL; 1UL, 0UL, 5UL ]
+ )
+
+ Matrix.fromCoordinateList clist |> Ok
+
+ checkResult (Graph.Boruvka.mst graph) expected
+
+
+[]
+let ``Boruvka MST 3 nodes line.`` () =
+
+ let graph =
+ let clist =
+ Matrix.CoordinateList(
+ 3UL,
+ 3UL,
+ [ 0UL, 1UL, 1UL
+ 1UL, 0UL, 1UL
+ 1UL, 2UL, 2UL
+ 2UL, 1UL, 2UL ]
+ )
+
+ Matrix.fromCoordinateList clist
+
+ let expected =
+ let clist =
+ Matrix.CoordinateList(
+ 3UL,
+ 3UL,
+ [ 0UL, 1UL, 1UL
+ 1UL, 0UL, 1UL
+ 1UL, 2UL, 2UL
+ 2UL, 1UL, 2UL ]
+ )
+
+ Matrix.fromCoordinateList clist |> Ok
+
+ checkResult (Graph.Boruvka.mst graph) expected
+
+
+
+[]
+let ``Boruvka MST 4 nodes line.`` () =
+
+ let graph =
+ let clist =
+ Matrix.CoordinateList(
+ 4UL,
+ 4UL,
+ [ 0UL, 1UL, 1UL
+ 1UL, 0UL, 1UL
+ 1UL, 2UL, 2UL
+ 2UL, 1UL, 2UL
+ 2UL, 3UL, 3UL
+ 3UL, 2UL, 3UL ]
+ )
+
+ Matrix.fromCoordinateList clist
+
+ let expected =
+ let clist =
+ Matrix.CoordinateList(
+ 4UL,
+ 4UL,
+ [ 0UL, 1UL, 1UL
+ 1UL, 0UL, 1UL
+ 1UL, 2UL, 2UL
+ 2UL, 1UL, 2UL
+ 2UL, 3UL, 3UL
+ 3UL, 2UL, 3UL ]
+ )
+
+ Matrix.fromCoordinateList clist |> Ok
+
+ checkResult (Graph.Boruvka.mst graph) expected
+
+
+[]
+let ``Boruvka MST 5 nodes line.`` () =
+
+ let graph =
+ let clist =
+ Matrix.CoordinateList(
+ 5UL,
+ 5UL,
+ [ 0UL, 1UL, 1UL
+ 1UL, 0UL, 1UL
+ 1UL, 2UL, 2UL
+ 2UL, 1UL, 2UL
+ 2UL, 3UL, 3UL
+ 3UL, 2UL, 3UL
+ 3UL, 4UL, 4UL
+ 4UL, 3UL, 4UL ]
+ )
+
+ Matrix.fromCoordinateList clist
+
+ let expected =
+ let clist =
+ Matrix.CoordinateList(
+ 5UL,
+ 5UL,
+ [ 0UL, 1UL, 1UL
+ 1UL, 0UL, 1UL
+ 1UL, 2UL, 2UL
+ 2UL, 1UL, 2UL
+ 2UL, 3UL, 3UL
+ 3UL, 2UL, 3UL
+ 3UL, 4UL, 4UL
+ 4UL, 3UL, 4UL ]
+ )
+
+ Matrix.fromCoordinateList clist |> Ok
+
+ checkResult (Graph.Boruvka.mst graph) expected
+
+
+[]
+let ``Boruvka MST 5 nodes star.`` () =
+
+ let graph =
+ let clist =
+ Matrix.CoordinateList(
+ 5UL,
+ 5UL,
+ [ 0UL, 1UL, 5UL
+ 1UL, 0UL, 5UL
+ 0UL, 2UL, 4UL
+ 2UL, 0UL, 4UL
+ 0UL, 3UL, 3UL
+ 3UL, 0UL, 3UL
+ 0UL, 4UL, 2UL
+ 4UL, 0UL, 2UL ]
+ )
+
+ Matrix.fromCoordinateList clist
+
+ let expected =
+ let clist =
+ Matrix.CoordinateList(
+ 5UL,
+ 5UL,
+ [ 0UL, 1UL, 5UL
+ 1UL, 0UL, 5UL
+ 0UL, 2UL, 4UL
+ 2UL, 0UL, 4UL
+ 0UL, 3UL, 3UL
+ 3UL, 0UL, 3UL
+ 0UL, 4UL, 2UL
+ 4UL, 0UL, 2UL ]
+ )
+
+ Matrix.fromCoordinateList clist |> Ok
+
+ checkResult (Graph.Boruvka.mst graph) expected
+
+
+[]
+let ``Boruvka MST 5 nodes complete.`` () =
+
+ let graph =
+ let clist =
+ Matrix.CoordinateList(
+ 5UL,
+ 5UL,
+ [ 0UL, 1UL, 1UL
+ 1UL, 0UL, 1UL
+ 0UL, 2UL, 2UL
+ 2UL, 0UL, 2UL
+ 0UL, 3UL, 3UL
+ 3UL, 0UL, 3UL
+ 0UL, 4UL, 4UL
+ 4UL, 0UL, 4UL
+ 1UL, 2UL, 5UL
+ 2UL, 1UL, 5UL
+ 1UL, 3UL, 6UL
+ 3UL, 1UL, 6UL
+ 1UL, 4UL, 7UL
+ 4UL, 1UL, 7UL
+ 2UL, 3UL, 8UL
+ 3UL, 2UL, 8UL
+ 2UL, 4UL, 9UL
+ 4UL, 2UL, 9UL
+ 3UL, 4UL, 10UL
+ 4UL, 3UL, 10UL ]
+ )
+
+ Matrix.fromCoordinateList clist
+
+ let expected =
+ let clist =
+ Matrix.CoordinateList(
+ 5UL,
+ 5UL,
+ [ 0UL, 1UL, 1UL
+ 1UL, 0UL, 1UL
+ 0UL, 2UL, 2UL
+ 2UL, 0UL, 2UL
+ 0UL, 3UL, 3UL
+ 3UL, 0UL, 3UL
+ 0UL, 4UL, 4UL
+ 4UL, 0UL, 4UL ]
+ )
+
+ Matrix.fromCoordinateList clist |> Ok
+
+ checkResult (Graph.Boruvka.mst graph) expected
+
+
+[]
+let ``Boruvka MST two components.`` () =
+
+ let graph =
+ let clist =
+ Matrix.CoordinateList(
+ 6UL,
+ 6UL,
+ [
+ // Component 1: vertices 0,1,2
+ 0UL, 1UL, 1UL
+ 1UL, 0UL, 1UL
+ 1UL, 2UL, 2UL
+ 2UL, 1UL, 2UL
+ 0UL, 2UL, 3UL
+ 2UL, 0UL, 3UL
+ // Component 2: vertices 3,4,5
+ 3UL, 4UL, 1UL
+ 4UL, 3UL, 1UL
+ 4UL, 5UL, 2UL
+ 5UL, 4UL, 2UL
+ 3UL, 5UL, 3UL
+ 5UL, 3UL, 3UL ]
+ )
+
+ Matrix.fromCoordinateList clist
+
+ let expected =
+ let clist =
+ Matrix.CoordinateList(
+ 6UL,
+ 6UL,
+ [ 0UL, 1UL, 1UL
+ 1UL, 0UL, 1UL
+ 1UL, 2UL, 2UL
+ 2UL, 1UL, 2UL
+ 3UL, 4UL, 1UL
+ 4UL, 3UL, 1UL
+ 4UL, 5UL, 2UL
+ 5UL, 4UL, 2UL ]
+ )
+
+ Matrix.fromCoordinateList clist |> Ok
+
+ checkResult (Graph.Boruvka.mst graph) expected
+
+
+[]
+let ``Boruvka MST cycle graph 6 nodes.`` () =
+
+ let graph =
+ let clist =
+ Matrix.CoordinateList(
+ 6UL,
+ 6UL,
+ [ 0UL, 1UL, 1UL
+ 1UL