Skip to content

Commit

Permalink
Added tests, ready for release!
Browse files Browse the repository at this point in the history
  • Loading branch information
j-mie6 committed Dec 19, 2022
1 parent d74c852 commit 9d1f697
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 7 deletions.
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -130,15 +130,15 @@ jobs:
run: sbt 'project ${{ matrix.project }}' '++ ${{ matrix.scala }}' doc

- name: Make target directories
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v'))
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/master')
run: mkdir -p target .js/target parsley-cats/js/target .jvm/target .native/target parsley-cats/jvm/target parsley-cats/native/target project/target

- name: Compress target directories
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v'))
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/master')
run: tar cf targets.tar target .js/target parsley-cats/js/target .jvm/target .native/target parsley-cats/jvm/target parsley-cats/native/target project/target

- name: Upload target directories
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v'))
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/master')
uses: actions/upload-artifact@v2
with:
name: target-${{ matrix.os }}-${{ matrix.java }}-${{ matrix.scala }}-${{ matrix.project }}
Expand All @@ -147,7 +147,7 @@ jobs:
publish:
name: Publish Artifacts
needs: [build]
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v'))
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/master')
strategy:
matrix:
os: [ubuntu-latest]
Expand Down
9 changes: 8 additions & 1 deletion build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import org.scalajs.linker.interface.ESVersion

val projectName = "parsley-cats"
val Scala213 = "2.13.10"
val Scala212 = "2.12.17"
Expand All @@ -18,14 +20,15 @@ inThisBuild(List(
crossScalaVersions := Seq(Scala213, Scala212, Scala3),
scalaVersion := Scala213,
// CI Configuration
tlCiReleaseBranches := Seq(/*"master"*/), // TODO: enable when we are ready for first release!
tlCiReleaseBranches := Seq("master"),
tlSonatypeUseLegacyHost := true, // this needs to be switched off when we migrate parsley to the other server too
githubWorkflowJavaVersions := Seq(JavaSpec.temurin("8"), JavaSpec.temurin("11"), JavaSpec.temurin("17")),
))

lazy val root = tlCrossRootProject.aggregate(`parsley-cats`)

lazy val `parsley-cats` = crossProject(JVMPlatform, JSPlatform, NativePlatform)
.withoutSuffixFor(JVMPlatform)
.crossType(CrossType.Full)
.in(file("parsley-cats"))
.settings(
Expand All @@ -34,5 +37,9 @@ lazy val `parsley-cats` = crossProject(JVMPlatform, JSPlatform, NativePlatform)
"org.typelevel" %%% "cats-core" % "2.8.0" % Provided,
"com.github.j-mie6" %%% "parsley" % "4.0.0" % Provided,
"org.scalatest" %%% "scalatest" % "3.2.12" % Test,
"org.typelevel" %%% "cats-laws" % "2.8.0" % Test,
)
)
.jsSettings(
Test / scalaJSLinkerConfig := scalaJSLinkerConfig.value.withESFeatures(_.withESVersion(ESVersion.ES2018))
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ package parsley

import cats.{Functor, FunctorFilter}

private [parsley] trait FilterFunctorForParsley extends FunctorFilter[Parsley] { self: Functor[Parsley] =>
private [parsley] trait FunctorFilterForParsley extends FunctorFilter[Parsley] { self: Functor[Parsley] =>
override def functor: Functor[Parsley] = this

override def mapFilter[A, B](mx: Parsley[A])(f: A => Option[B]): Parsley[B] = mx.mapFilter(f)
Expand Down
2 changes: 1 addition & 1 deletion parsley-cats/shared/src/main/scala/parsley/cats.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,5 @@ object catsinstances {
new MonadForParsley with ApplicativeForParsley
with FunctorForParsley
with MonoidKForParsley
with FilterFunctorForParsley
with FunctorFilterForParsley
}
51 changes: 51 additions & 0 deletions parsley-cats/shared/src/test/scala/parsley/CatsSuite.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package parsley

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers._
import org.scalactic.source.Position

import parsley.character.{item, digit, char}
import parsley.catsinstances._

import cats.laws.{MonadLaws, MonoidKLaws, FunctorFilterLaws}
import cats.kernel.laws.IsEq

// TODO: More laws!
class CatsSuite extends AnyFlatSpec {
val monadLaws = MonadLaws[Parsley]
val monoidKLaws = MonoidKLaws[Parsley]
val filterFunctorLaws = FunctorFilterLaws[Parsley]

def applyLaw[A](law: IsEq[Parsley[A]]*)(inputs: String*)(implicit pos: Position): Unit = {
for (IsEq(p1, p2) <- law; input <- inputs) {
p1.parse(input) shouldBe p2.parse(input)
}
}

"Functor" should "adhere to laws" in {
applyLaw(monadLaws.covariantIdentity(item))("", "a", "b")
applyLaw(monadLaws.covariantComposition[Char, Int, Int](digit, _.asDigit, _ + 1))("", "0", "4", "a")
}

"Applicative" should "adhere to laws" in {
applyLaw(monadLaws.applicativeIdentity(item))("", "a", "b")
applyLaw(monadLaws.applicativeHomomorphism[Int, Int](5, _ + 1))("", "a")
applyLaw(monadLaws.applicativeInterchange[Int, String](7, item #> (_.toString)))("", "a", "b")
applyLaw(monadLaws.applicativeMap[Char, Int](digit, _.asDigit))("", "0", "4")
}

"FilterFunctor" should "adhere to laws" in {
applyLaw(filterFunctorLaws.mapFilterComposition[Char, Int, Int](
item,
c => Option.when(c.isDigit)(c.asDigit),
x => Option.when(x % 2 == 0)(x/2)))("", "a", "0", "8")
applyLaw(filterFunctorLaws.filterConsistentWithMapFilter[Char](
item,
_.isDigit))("", "a", "0", "8")
}

"MonoidK" should "adhere to laws" in {
applyLaw(monoidKLaws.monoidKLeftIdentity(item), monoidKLaws.monoidKRightIdentity(item))("", "a", "b")
applyLaw(monoidKLaws.combineAllK(Vector(char('a'), char('b'), char('c'))))("", "a", "b", "c")
}
}

0 comments on commit 9d1f697

Please sign in to comment.