Skip to content

Commit

Permalink
Create a separate test file for vectors and matrices
Browse files Browse the repository at this point in the history
  • Loading branch information
cannorin committed Sep 22, 2024
1 parent 6644a01 commit c9af144
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 51 deletions.
1 change: 1 addition & 0 deletions tests/FSharpPlus.Tests/FSharpPlus.Tests.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
<Compile Include="Lens.fs" />
<Compile Include="Extensions.fs" />
<Compile Include="BifoldableTests.fs" />
<Compile Include="Matrix.fs" />
<Compile Include="TypeLevel.fs" />
</ItemGroup>
<ItemGroup>
Expand Down
98 changes: 98 additions & 0 deletions tests/FSharpPlus.Tests/Matrix.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
namespace FSharpPlus.Tests

open System
open NUnit.Framework
open Helpers

open FSharpPlus
open FSharpPlus.Data
open FSharpPlus.TypeLevel

module VectorTests =
[<Test>]
let constructorAndDeconstructorWorks() =
let v1 = vector (1,2,3,4,5)
let v2 = vector (1,2,3,4,5,6,7,8,9,0,1,2,3,4,5)
let (Vector(_,_,_,_,_)) = v1
let (Vector(_,_,_,_,_,_,_,_,_,_,_,_,_,_,_)) = v2
()

[<Test>]
let applicativeWorks() =
let v = vector ((fun i -> i + 1), (fun i -> i * 2))
let u = vector (2, 3)
let vu = v <*> u
NUnit.Framework.Assert.IsInstanceOf<Option<Vector<int,S<S<Z>>>>> (Some vu)
CollectionAssert.AreEqual ([|3; 6|], Vector.toArray vu)

[<Test>]
let satisfiesApplicativeLaws() =
let u = vector ((fun i -> i - 1), (fun i -> i * 2))
let v = vector ((fun i -> i + 1), (fun i -> i * 3))
let w = vector (1, 1)

areEqual (result id <*> v) v
areEqual (result (<<) <*> u <*> v <*> w) (u <*> (v <*> w))
areEqual (result 2) ((result (fun i -> i + 1) : Vector<int -> int, S<S<Z>>>) <*> result 1)
areEqual (u <*> result 1) (result ((|>) 1) <*> u)

[<Test>]
let satisfiesMonadLaws() =
let k = fun (a: int) -> vector (a - 1, a * 2)
let h = fun (a: int) -> vector (a + 1, a * 3)
let m = vector (1, 2)

areEqual (result 2 >>= k) (k 2)
areEqual (m >>= result) m
areEqual (m >>= (fun x -> k x >>= h)) ((m >>= k) >>= h)

module MatrixTests =
[<Test>]
let constructorAndDeconstructorWorks() =
let m1 =
matrix (
(1,0,0,0),
(0,1,0,0),
(0,0,1,0)
)
let m2 =
matrix (
(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0),
(0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0)
)
let (Matrix(_x1,_x2,_x3)) = m1
let (Matrix(_y1: int*int*int*int*int*int*int*int*int*int*int*int*int*int*int*int,_y2,_y3,_y4,_y5,_y6,_y7,_y8)) = m2
()

[<Test>]
let satisfiesApplicativeLaws() =
let u = matrix (
((fun i -> i - 1), (fun i -> i * 2)),
((fun i -> i + 1), (fun i -> i * 3))
)
let v = matrix (
((fun i -> i - 2), (fun i -> i * 5)),
((fun i -> i + 2), (fun i -> i * 7))
)
let w = matrix ((1, 1), (1, 2))

areEqual (result id <*> v) v
areEqual (result (<<) <*> u <*> v <*> w) (u <*> (v <*> w))
areEqual ((result (fun i -> i + 1) : Matrix<int -> int, S<S<Z>>, S<S<Z>>>) <*> result 1) (result 2)
areEqual (u <*> result 1) (result ((|>) 1) <*> u)

[<Test>]
let satisfiesMonadLaws() =
let k = fun (a: int) -> matrix ((a - 1, a * 2), (a + 1, a * 3))
let h = fun (a: int) -> matrix ((a - 2, a * 5), (a + 2, a * 7))
let m = matrix ((1, 1), (1, 2))

areEqual (result 2 >>= k) (k 2)
areEqual (m >>= result) m
areEqual (m >>= (fun x -> k x >>= h)) ((m >>= k) >>= h)
52 changes: 1 addition & 51 deletions tests/FSharpPlus.Tests/TypeLevel.fs
Original file line number Diff line number Diff line change
Expand Up @@ -150,38 +150,8 @@ module NatTests =
Assert (g2 =^ S(S(S(S(S(S Z))))))


open FSharpPlus.Data

module MatrixTests =
[<Test>]
let matrixTests =
let v1 = vector (1,2,3,4,5)
let v2 = vector (1,2,3,4,5,6,7,8,9,0,1,2,3,4,5)
let (Vector(_,_,_,_,_)) = v1
let (Vector(_,_,_,_,_,_,_,_,_,_,_,_,_,_,_)) = v2

let m1 =
matrix (
(1,0,0,0),
(0,1,0,0),
(0,0,1,0)
)
let m2 =
matrix (
(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0),
(0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0)
)
let (Matrix(_x1,_x2,_x3)) = m1
let (Matrix(_y1: int*int*int*int*int*int*int*int*int*int*int*int*int*int*int*int,_y2,_y3,_y4,_y5,_y6,_y7,_y8)) = m2
()

open Helpers
open FSharpPlus.Data

module TypeProviderTests =
type ``0`` = TypeNat<0>
Expand All @@ -206,23 +176,3 @@ module TypeProviderTests =
Assert (Matrix.colLength row1 =^ (Z |> S |> S |> S))
areEqual 5 (Matrix.get Z (S Z) row1)
areEqual [3; 6; 9] (Vector.toList col2)

module TestFunctors1 =
[<Test>]
let applicativeOperatorWorks() =
let v = vector ((fun i -> i + 1), (fun i -> i * 2))
let u = vector (2, 3)
let vu = v <*> u
NUnit.Framework.Assert.IsInstanceOf<Option<Vector<int,S<S<Z>>>>> (Some vu)
CollectionAssert.AreEqual ([|3; 6|], Vector.toArray vu)

module TestFunctors2 =
open FSharpPlus

[<Test>]
let applicativeWorksWithoutSubsumption() =
let v = vector ((fun i -> i + 1), (fun i -> i * 2))
let u = vector (2, 3)
let vu = v <*> u
NUnit.Framework.Assert.IsInstanceOf<Option<Vector<int,S<S<Z>>>>> (Some vu)
CollectionAssert.AreEqual ([|3; 6|], Vector.toArray vu)

0 comments on commit c9af144

Please sign in to comment.