31 lines
956 B
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]()
|
|
}
|