Skip to content

Commit

Permalink
add test
Browse files Browse the repository at this point in the history
  • Loading branch information
DieMyst committed Jul 25, 2023
1 parent 934ce73 commit 8199d74
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 17 deletions.
14 changes: 1 addition & 13 deletions compiler/src/main/scala/aqua/compiler/CompilerAPI.scala
Original file line number Diff line number Diff line change
Expand Up @@ -63,19 +63,7 @@ object CompilerAPI extends Logging {
)
.rawContextMonoid

implicit val headerSemMonoid: Monoid[HeaderSem[S, RawContext]] =
new Monoid[HeaderSem[S, RawContext]] {
override def empty: HeaderSem[S, RawContext] = HeaderSem(rc.empty, (c, _) => validNec(c))

override def combine(
a: HeaderSem[S, RawContext],
b: HeaderSem[S, RawContext]
): HeaderSem[S, RawContext] =
HeaderSem(
a.initCtx |+| b.initCtx,
(c, i) => a.finInitCtx(c, i).andThen(b.finInitCtx(_, i))
)
}
implicit val headerSemMonoid: Monoid[HeaderSem[S, RawContext]] = HeaderSem.headerSemMonoid[S]

val semantics = new RawSemantics[S]()

Expand Down
23 changes: 23 additions & 0 deletions semantics/src/main/scala/aqua/semantics/header/HeaderSem.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package aqua.semantics.header

import aqua.raw.RawContext
import aqua.semantics.SemanticError
import cats.{Comonad, Monoid}
import cats.data.*
import cats.syntax.monoid.*
import cats.data.Validated.validNec

case class HeaderSem[S[_], C](
initCtx: C,
Expand All @@ -11,3 +15,22 @@ case class HeaderSem[S[_], C](
def finCtx: C => ValidatedNec[SemanticError[S], C] =
finInitCtx(_, initCtx)
}

object HeaderSem {

implicit def headerSemMonoid[S[_]: Comonad](implicit
rc: Monoid[RawContext]
): Monoid[HeaderSem[S, RawContext]] =
new Monoid[HeaderSem[S, RawContext]] {
override def empty: HeaderSem[S, RawContext] = HeaderSem(rc.empty, (c, _) => validNec(c))

override def combine(
a: HeaderSem[S, RawContext],
b: HeaderSem[S, RawContext]
): HeaderSem[S, RawContext] =
HeaderSem(
a.initCtx |+| b.initCtx,
(c, i) => a.finInitCtx(c, i).andThen(b.finInitCtx(_, i))
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ class NamesInterpreter[S[_], X](implicit
).as(true)
}.flatTap(_ => locations.addToken(name.value, name))

override def defineArrow(name: Name[S], gen: ArrowType, isRoot: Boolean): SX[Boolean] =
override def defineArrow(name: Name[S], arrowType: ArrowType, isRoot: Boolean): SX[Boolean] =
readName(name.value).flatMap {
case Some(_) =>
getState.map(_.definitions.get(name.value).exists(_ == name)).flatMap {
Expand Down
50 changes: 50 additions & 0 deletions semantics/src/test/scala/aqua/semantics/HeaderSpec.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package aqua.semantics

import aqua.parser.head.{ExportExpr, FromExpr, HeaderExpr}
import aqua.parser.lexer.Name
import aqua.raw.RawContext
import aqua.raw.arrow.{ArrowRaw, FuncRaw}
import aqua.raw.ops.RawTag
import aqua.raw.value.VarRaw
import aqua.semantics.header.{HeaderHandler, HeaderSem}
import aqua.types.{ArrowType, NilType, ProductType}
import cats.data.{Chain, NonEmptyList}
import cats.free.Cofree
import cats.{Eval, Id, Monoid}
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class HeaderSpec extends AnyFlatSpec with Matchers {

"header handler" should "generate an error on exported function that returns arrow or ability" in {
implicit val rc: Monoid[RawContext] = RawContext.implicits(RawContext.blank).rawContextMonoid

implicit val headerSemMonoid: Monoid[HeaderSem[Id, RawContext]] = HeaderSem.headerSemMonoid

val handler = new HeaderHandler[Id, RawContext]()

val funcName = "funcName"

val exp: FromExpr.NameOrAbAs[Id] = Left((Name[Id](funcName), None))
val ast =
Cofree[Chain, HeaderExpr[Id]](ExportExpr[Id](NonEmptyList.of(exp)), Eval.now(Chain.empty))

val retArrowType = ArrowType(NilType, NilType)
val arrowType = ArrowType(NilType, ProductType.apply(retArrowType :: Nil))

val initCtx = RawContext(parts =
Chain.one(
(
RawContext.blank,
FuncRaw(funcName, ArrowRaw(arrowType, VarRaw("", retArrowType) :: Nil, RawTag.empty))
)
)
)

val result = handler.sem(Map.empty, ast).andThen(_.finCtx(initCtx))
result.isInvalid shouldBe true

val error = result.toEither.left.get.head
error shouldBe a [HeaderError[Id]]
}
}
5 changes: 2 additions & 3 deletions utils/logging/src/main/scala/aqua/logging/LogLevels.scala
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package aqua.logging

import cats.data.Validated.{invalidNel, validNel}
import cats.data.{NonEmptyList, Validated, ValidatedNel}
import scribe.Level
import cats.data.Validated.{invalid, invalidNec, invalidNel, valid, validNec, validNel}
import cats.data.{Validated, ValidatedNel}
import cats.data.NonEmptyList

case class LogLevels(
compiler: Level = Level.Error,
Expand Down

0 comments on commit 8199d74

Please sign in to comment.