Skip to content

Commit a8e979f

Browse files
bakeemawaytoysjbgi
authored andcommitted
Fixed the ArbitraryIO implementation and created a Properties object for testing the IO semigroup.
1 parent ef81130 commit a8e979f

2 files changed

Lines changed: 59 additions & 12 deletions

File tree

props-core-scalacheck/src/main/scala/fj/data/ArbitraryIO.scala

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,12 @@ import org.scalacheck.Arbitrary
77
*/
88
object ArbitraryIO {
99

10-
implicit def arbitraryIO[T](implicit arbT: Arbitrary[T]): Arbitrary[IO[T]] =
11-
Arbitrary(arbT.arbitrary.map(t => new IO[T]() {
12-
13-
override def run(): T = t
1410

15-
override def toString: String = t.toString
11+
private case class ArbIO[T](value: T) extends IO[T] {
12+
override def run(): T = value
13+
}
1614

17-
override def hashCode(): Int = t.hashCode()
18-
19-
override def equals(obj: scala.Any): Boolean = ???
20-
}))
15+
implicit def arbitraryIO[T](implicit arbT: Arbitrary[T]): Arbitrary[IO[T]] =
16+
Arbitrary(arbT.arbitrary.map(ArbIO(_)))
2117

2218
}

props-core-scalacheck/src/test/scala/fj/CheckSemigroup.scala

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@ import fj.data.ArbitraryNonEmptyList.arbitraryNonEmptyList
1111
import fj.data.ArbitraryOption.arbitraryOption
1212
import fj.data.ArbitrarySet.arbitrarySet
1313
import fj.data.ArbitraryStream.arbitraryStream
14+
import fj.data.IO
1415
import org.scalacheck.Arbitrary._
1516
import org.scalacheck.Prop._
1617
import org.scalacheck.{Arbitrary, Properties}
1718

1819
/**
19-
* Scalacheck [[Properties]] for [[Semigroup]] implementations.
20+
* Scalacheck [[Properties]] parameterized for [[Semigroup]] implementations.
2021
*
2122
* @param s a Semigroup implementation.
2223
* @param desc a description of the Semigroup implementation.
@@ -44,9 +45,59 @@ case class SemigroupProperties[T](s: Semigroup[T], desc: String)(implicit val ar
4445

4546
}
4647

48+
/**
49+
* A specialized Scalacheck [[Properties]] object for testing the [[Semigroup.ioSemigroup()]] method.
50+
*/
51+
object CheckIOSemigroup extends Properties("ioSemigroup") {
52+
53+
val s = Semigroup.ioSemigroup(Semigroup.stringSemigroup)
54+
55+
property("sum(x,y)") = forAll((x: IO[String], y: IO[String], z: IO[String]) =>
56+
s.sum(s.sum(x, y), z).run() == s.sum(x, s.sum(y, z)).run())
57+
58+
property("sum()") = forAll((x: IO[String], y: IO[String], z: IO[String]) => {
59+
val sf = s.sum()
60+
sf.f(sf.f(x).f(y)).f(z).run() == sf.f(x).f(sf.f(y).f(z)).run()
61+
})
62+
63+
property("dual()") = forAll((x: IO[String], y: IO[String], z: IO[String]) => {
64+
val sd = s.dual()
65+
sd.sum(sd.sum(x, y), z).run() == sd.sum(x, sd.sum(y, z)).run()
66+
})
67+
68+
property("sum(x)") = forAll((x: IO[String], y: IO[String]) =>
69+
s.sum(x).f(y).run() == s.sum(x, y).run())
70+
71+
}
72+
73+
object CheckStringBuilder extends Properties("stringBuilderSemigroup") {
74+
75+
val s: Semigroup[java.lang.StringBuilder] = Semigroup.stringBuilderSemigroup
76+
77+
implicit def toStringBuilder(str: String): java.lang.StringBuilder = new java.lang.StringBuilder(str)
78+
79+
property("sum(x,y)") = forAll((x: String, y: String, z: String) =>
80+
s.sum(s.sum(x, y), z).toString == s.sum(x, s.sum(y, z)).toString
81+
)
82+
83+
property("sum()") = forAll((x: String, y: String, z: String) => {
84+
val sf = s.sum()
85+
sf.f(sf.f(x).f(y)).f(z).toString == sf.f(x).f(sf.f(y).f(z.toString))
86+
})
87+
88+
property("dual()") = forAll((x: String, y: String, z: String) => {
89+
val sd = s.dual()
90+
sd.sum(sd.sum(x, y), z).toString == sd.sum(x, sd.sum(y, z).toString)
91+
})
92+
93+
property("sum(x)") = forAll((x: String, y: String) =>
94+
s.sum(x).f(y).toString == s.sum(x, y).toString)
95+
96+
}
97+
4798

4899
/**
49-
*
100+
* A Scalacheck [[Properties]] object that aggregates the tests for all [[Semigroup]] implementations.
50101
*/
51102
object CheckSemigroup extends Properties("Semigroup") {
52103

@@ -107,7 +158,7 @@ object CheckSemigroup extends Properties("Semigroup") {
107158
include(SemigroupProperties(Semigroup.intMaximumSemigroup, "intMaximumSemigroup"))
108159
include(SemigroupProperties(Semigroup.intMinimumSemigroup, "intMinimumSemigroup"))
109160

110-
include(SemigroupProperties(Semigroup.ioSemigroup[String](Semigroup.stringSemigroup), "ioSemigroup(Semigroup)"))
161+
include(CheckIOSemigroup)
111162

112163
include(SemigroupProperties(Semigroup.lastOptionSemigroup[Int](), "lastOptionSemigroup()"))
113164
include(SemigroupProperties(Semigroup.lastSemigroup[Int](), "lastSemigroup()"))

0 commit comments

Comments
 (0)