Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Journey to >= 90% test coverage #941

Merged
merged 4 commits into from
Mar 28, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion core/src/main/scala/cats/Bitraverse.scala
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ trait Bitraverse[F[_, _]] extends Bifoldable[F] with Bifunctor[F] { self =>
bitraverse(fab)(identity, identity)

/** If F and G are both [[cats.Bitraverse]] then so is their composition F[G[_, _], G[_, _]] */
def compose[G[_, _]](implicit ev: Bitraverse[G]): Bifoldable[Lambda[(A, B) => F[G[A, B], G[A, B]]]] =
def compose[G[_, _]](implicit ev: Bitraverse[G]): Bitraverse[Lambda[(A, B) => F[G[A, B], G[A, B]]]] =
new CompositeBitraverse[F, G] {
val F = self
val G = ev
Expand Down
7 changes: 7 additions & 0 deletions laws/src/main/scala/cats/laws/discipline/Eq.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package laws
package discipline

import algebra.Eq
import cats.std.string._
import org.scalacheck.Arbitrary

object eq {
Expand All @@ -21,6 +22,12 @@ object eq {
}
}

/** Create an approximation of Eq[Show[A]] by using function1Eq[A, String] */
implicit def showEq[A: Arbitrary]: Eq[Show[A]] =
Eq.by[Show[A], A => String] { showInstance =>
(a: A) => showInstance.show(a)
}

// Temporary, see https://github.com/non/algebra/pull/82
implicit def tuple2Eq[A, B](implicit A: Eq[A], B: Eq[B]): Eq[(A, B)] =
new Eq[(A, B)] {
Expand Down
15 changes: 15 additions & 0 deletions tests/src/test/scala/cats/tests/BifoldableTests.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package cats
package tests

import cats.data.Xor
import cats.laws.discipline.{BifoldableTests, SerializableTests}
import cats.laws.discipline.arbitrary._

class BifoldableTest extends CatsSuite {
type EitherXor[A, B] = Either[Xor[A, B], Xor[A, B]]
val eitherComposeXor: Bifoldable[EitherXor] =
Bifoldable[Either].compose[Xor]

checkAll("Either compose Xor", BifoldableTests(eitherComposeXor).bifoldable[Int, Int, Int])
checkAll("Bifoldable[Either compose Xor]", SerializableTests.serializable(eitherComposeXor))
}
16 changes: 16 additions & 0 deletions tests/src/test/scala/cats/tests/BitraverseTests.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package cats
package tests

import cats.data.Xor
import cats.laws.discipline.{BitraverseTests, SerializableTests}
import cats.laws.discipline.arbitrary._
import cats.laws.discipline.eq.tuple2Eq

class BitraverseTest extends CatsSuite {
type XorTuple2[A, B] = Xor[(A, B), (A, B)]
val xorComposeTuple2: Bitraverse[XorTuple2] =
Bitraverse[Xor].compose[Tuple2]

checkAll("Xor compose Tuple2", BitraverseTests(xorComposeTuple2).bitraverse[Option, Int, Int, Int, String, String, String])
checkAll("Bitraverse[Xor compose Tuple2]", SerializableTests.serializable(xorComposeTuple2))
}
19 changes: 19 additions & 0 deletions tests/src/test/scala/cats/tests/CategoryTests.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package cats
package tests

import algebra.laws.GroupLaws

import cats.arrow.Category
import cats.laws.discipline.{MonoidKTests, SerializableTests}
import cats.laws.discipline.eq.function1Eq

class CategoryTest extends CatsSuite {
val functionCategory = Category[Function1]
type Endo[A] = Function1[A, A]

checkAll("Category[Function1].algebraK", MonoidKTests[Endo](functionCategory.algebraK).monoidK[Int])
checkAll("Category[Function1].algebraK", SerializableTests.serializable(functionCategory.algebraK))

val functionAlgebra = functionCategory.algebra[Int]
checkAll("Category[Function1].algebra[Int]", GroupLaws[Endo[Int]].monoid(functionAlgebra))
}
19 changes: 19 additions & 0 deletions tests/src/test/scala/cats/tests/ComposeTest.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package cats
package tests

import algebra.laws.GroupLaws

import cats.arrow.Compose
import cats.laws.discipline.{SemigroupKTests, SerializableTests}
import cats.laws.discipline.eq.function1Eq

class ComposeTest extends CatsSuite {
val functionCompose = Compose[Function1]
type Endo[A] = Function1[A, A]

checkAll("Compose[Function1].algebraK", SemigroupKTests[Endo](functionCompose.algebraK).semigroupK[Int])
checkAll("Compose[Function1].algebraK", SerializableTests.serializable(functionCompose.algebraK))

val functionAlgebra = functionCompose.algebra[Int]
checkAll("Compose[Function1].algebra[Int]", GroupLaws[Endo[Int]].semigroup(functionAlgebra))
}
23 changes: 23 additions & 0 deletions tests/src/test/scala/cats/tests/FunctorTests.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package cats
package tests

import cats.data.Xor
import cats.functor.Contravariant
import cats.laws.discipline.{ContravariantTests, FunctorTests, SerializableTests}
import cats.laws.discipline.arbitrary._
import cats.laws.discipline.eq.showEq

class FunctorTest extends CatsSuite {
type OptionXor[A] = Option[Xor[String, A]]

val optionXorFunctor: Functor[OptionXor] =
Functor[Option].compose[Xor[String, ?]]
checkAll("Option compose Xor", FunctorTests(optionXorFunctor).functor[Int, Int, Int])
checkAll("Functor[Option compose Xor]", SerializableTests.serializable(optionXorFunctor))

type OptionShow[A] = Option[Show[A]]
val optionShowContravariant: Contravariant[OptionShow] =
Functor[Option].composeWithContravariant[Show]
checkAll("Option composeWithContravariant Show", ContravariantTests(optionShowContravariant).contravariant[Int, Int, Int])
checkAll("Contravariant[Option composeWithContravariant Show]", SerializableTests.serializable(optionShowContravariant))
}
22 changes: 22 additions & 0 deletions tests/src/test/scala/cats/tests/MonadStateTests.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package cats
package tests

import cats.data.State

class MonadStateTest extends CatsSuite {
val testInstance = MonadState[State[Int, ?], Int]

test("MonadState#modify identity does not modify the state") {
forAll { (i: Int) =>
val x = testInstance.modify(identity).runS(i).value
x should === (i)
}
}

test("MonadState#inspect identity does not modify the state") {
forAll { (i: Int) =>
val x = testInstance.inspect(identity).runA(i).value
x should === (i)
}
}
}