mirror of
https://github.com/fluencelabs/aqua.git
synced 2024-12-04 14:40:17 +00:00
add unit tests
This commit is contained in:
parent
4231c2f55c
commit
4528e80c3a
@ -5,9 +5,12 @@ import aqua.semantics.rules.report.ReportAlgebra
|
|||||||
import aqua.types.{BoxType, StreamType, Type}
|
import aqua.types.{BoxType, StreamType, Type}
|
||||||
import cats.data.State
|
import cats.data.State
|
||||||
|
|
||||||
|
import scala.annotation.tailrec
|
||||||
|
|
||||||
object TypesChecker {
|
object TypesChecker {
|
||||||
|
|
||||||
// check if this type can exist in aqua code
|
// check if this type can exist in aqua code
|
||||||
|
@tailrec
|
||||||
def checkType[S[_], X](name: Token[S], `type`: Type)(using report: ReportAlgebra[S, State[X, *]]): State[X, Unit] = {
|
def checkType[S[_], X](name: Token[S], `type`: Type)(using report: ReportAlgebra[S, State[X, *]]): State[X, Unit] = {
|
||||||
`type` match {
|
`type` match {
|
||||||
case StreamType(StreamType(_)) =>
|
case StreamType(StreamType(_)) =>
|
||||||
@ -21,7 +24,7 @@ object TypesChecker {
|
|||||||
case _ =>
|
case _ =>
|
||||||
State.pure(())
|
State.pure(())
|
||||||
}
|
}
|
||||||
case t =>
|
case _ =>
|
||||||
State.pure(())
|
State.pure(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -138,7 +138,8 @@ class TypesInterpreter[S[_], X](using
|
|||||||
case (field, (fieldName, t: DataType)) =>
|
case (field, (fieldName, t: DataType)) =>
|
||||||
t match {
|
t match {
|
||||||
case _: StreamType =>
|
case _: StreamType =>
|
||||||
report.error(fieldName, s"Field '$field' has stream type. This is forbidden for data structures.").as(none)
|
// TODO: move these checks into TypesChecker?
|
||||||
|
report.error(fieldName, s"Field '$field' has stream type. This is forbidden for data structures").as(none)
|
||||||
case _ =>
|
case _ =>
|
||||||
TypesChecker.checkType(fieldName, t) >> (field -> t).some.pure[ST]
|
TypesChecker.checkType(fieldName, t) >> (field -> t).some.pure[ST]
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,48 @@
|
|||||||
|
package aqua.semantics
|
||||||
|
|
||||||
|
import aqua.parser.lexer.Name
|
||||||
|
import aqua.semantics.rules.report.{ReportAlgebra, ReportInterpreter, ReportState}
|
||||||
|
import aqua.semantics.rules.types.TypesChecker
|
||||||
|
import aqua.types.{ArrayType, OptionType, ScalarType, StreamType, Type}
|
||||||
|
import cats.Id
|
||||||
|
import cats.data.State
|
||||||
|
import monocle.{Iso, Lens}
|
||||||
|
import org.scalatest.matchers.should.Matchers
|
||||||
|
import org.scalatest.Inside
|
||||||
|
import org.scalatest.flatspec.AnyFlatSpec
|
||||||
|
|
||||||
|
class TypesCheckerSpec extends AnyFlatSpec with Matchers with Inside {
|
||||||
|
|
||||||
|
val emptyR = ReportState[Id]()
|
||||||
|
|
||||||
|
def checkType(t: Type) = {
|
||||||
|
type Interpreter[A] = State[ReportState[Id], A]
|
||||||
|
|
||||||
|
given Lens[ReportState[Id], ReportState[Id]] = Iso.id[ReportState[Id]]
|
||||||
|
|
||||||
|
given ReportAlgebra[Id, Interpreter] =
|
||||||
|
new ReportInterpreter[Id, ReportState[Id]]
|
||||||
|
|
||||||
|
TypesChecker.checkType[Id, ReportState[Id]](Name[Id]("t"), t).run(emptyR).value._1.errors.headOption
|
||||||
|
}
|
||||||
|
|
||||||
|
"checker" should "report an error on invalid types" in {
|
||||||
|
// **string
|
||||||
|
checkType(StreamType(StreamType(ScalarType.string))) should not be empty
|
||||||
|
|
||||||
|
// []*string
|
||||||
|
checkType(ArrayType(StreamType(ScalarType.string))) should not be empty
|
||||||
|
|
||||||
|
// ?*string
|
||||||
|
checkType(OptionType(StreamType(ScalarType.string))) should not be empty
|
||||||
|
|
||||||
|
// ?[]*string
|
||||||
|
checkType(OptionType(ArrayType(StreamType(ScalarType.string)))) should not be empty
|
||||||
|
|
||||||
|
// [][]*string
|
||||||
|
checkType(OptionType(ArrayType(StreamType(ScalarType.string)))) should not be empty
|
||||||
|
|
||||||
|
// string
|
||||||
|
checkType(ScalarType.string) shouldBe empty
|
||||||
|
}
|
||||||
|
}
|
@ -50,6 +50,10 @@ object Utils {
|
|||||||
prog.apply(emptyS).run(blankCS).value._2
|
prog.apply(emptyS).run(blankCS).value._2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def getState(prog: Prog[State[CompilerState[cats.Id], *], Raw]): CompilerState[Id] = {
|
||||||
|
prog.apply(emptyS).run(blankCS).value._1
|
||||||
|
}
|
||||||
|
|
||||||
def getState(
|
def getState(
|
||||||
startState: Raw
|
startState: Raw
|
||||||
)(prog: Prog[State[CompilerState[cats.Id], *], Raw]): CompilerState[Id] = {
|
)(prog: Prog[State[CompilerState[cats.Id], *], Raw]): CompilerState[Id] = {
|
||||||
|
Loading…
Reference in New Issue
Block a user