embracing-nondeterminism-code/src/test/scala/green/thisfieldwas/embracingnondeterminism/stdlib/StringSpec.scala

31 lines
956 B
Scala

package green.thisfieldwas.embracingnondeterminism.stdlib
import green.thisfieldwas.embracingnondeterminism.data.{Monoid, MonoidLaws, SemigroupLaws}
import green.thisfieldwas.embracingnondeterminism.util.Laws
import org.scalacheck.{Arbitrary, Gen}
/** Proves that Scala's String conforms to a Semigroup and Monoid.
*/
class StringSpec extends Laws with SemigroupLaws with MonoidLaws {
implicit val arbitraryString: Arbitrary[String] = Arbitrary {
for {
length <- Gen.sized(Gen.choose(0, _))
string <- Gen.stringOfN(length, Gen.asciiChar)
} yield string
}
/** String forms a Semigroup under concatenation and a Monoid with an identity
* value of an empty string "".
*/
implicit val stringMonoid: Monoid[String] = new Monoid[String] {
override def empty: String = ""
override def combine(left: String, right: String): String = left + right
}
checkSemigroupLaws[String]()
checkMonoidLaws[String]()
}