-
Notifications
You must be signed in to change notification settings - Fork 0
/
OptionTSpec.scala
97 lines (74 loc) · 2.49 KB
/
OptionTSpec.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package just.fp
import hedgehog._
import hedgehog.runner._
/**
* @author Kevin Lee
* @since 2019-09-19
*/
object OptionTSpec extends Properties {
type EitherStringOr[A] = Either[String, A]
type OptionTEither[A] = OptionT[EitherStringOr, A]
type OptionTId[A] = OptionT[Id, A]
override def tests: List[Test] = List(
property("testOptionTFunctorLaws", OptionTFunctorLaws.laws)
, property("testOptionTApplicativeLaws", OptionTApplicativeLaws.laws)
, property("testOptionTMonadLaws", OptionTMonadLaws.laws)
, property("testOptionTIdFunctorLaws", OptionTIdFunctorLaws.laws)
, property("testOptionTIdApplicativeLaws", OptionTIdApplicativeLaws.laws)
, property("testOptionTIdMonadLaws", OptionTIdMonadLaws.laws)
)
object OptionTFunctorLaws {
def genOptionT: Gen[OptionTEither[Int]] = Gens.genOptionT[EitherStringOr, Int](Gens.genIntFromMinToMax)
def laws: Property =
Specs.functorLaws.laws[OptionTEither](
genOptionT
, Gens.genIntToInt
)
}
object OptionTApplicativeLaws {
def genOptionT: Gen[OptionTEither[Int]] = Gens.genOptionT[EitherStringOr, Int](Gens.genIntFromMinToMax)
def laws: Property =
Specs.applicativeLaws.laws[OptionTEither](
genOptionT
, Gens.genIntFromMinToMax
, Gens.genIntToInt
)
}
object OptionTMonadLaws {
def genOptionT: Gen[OptionTEither[Int]] = Gens.genOptionT[EitherStringOr, Int](Gens.genIntFromMinToMax)
def laws: Property =
Specs.monadLaws.laws[OptionTEither](
genOptionT
, Gens.genIntFromMinToMax
, Gens.genIntToInt
, Gens.genAToMonadA(Gens.genIntToInt)
)
}
object OptionTIdFunctorLaws {
def genOptionT: Gen[OptionTId[Int]] = Gens.genOptionT(Gens.genIntFromMinToMax)
def laws: Property =
Specs.functorLaws.laws[OptionTId](
genOptionT
, Gens.genIntToInt
)
}
object OptionTIdApplicativeLaws {
def genOptionT: Gen[OptionTId[Int]] = Gens.genOptionT(Gens.genIntFromMinToMax)
def laws: Property =
Specs.applicativeLaws.laws[OptionTId](
genOptionT
, Gens.genIntFromMinToMax
, Gens.genIntToInt
)
}
object OptionTIdMonadLaws {
def genOptionT: Gen[OptionTId[Int]] = Gens.genOptionT(Gens.genIntFromMinToMax)
def laws: Property =
Specs.monadLaws.laws[OptionTId](
genOptionT
, Gens.genIntFromMinToMax
, Gens.genIntToInt
, Gens.genAToMonadA(Gens.genIntToInt)
)
}
}