add tests

This commit is contained in:
DieMyst 2023-10-30 16:49:57 +07:00
parent 4f94de8efe
commit 6a3dd53b6b
8 changed files with 78 additions and 56 deletions

View File

@ -1,3 +1,3 @@
func z() -> string: func z() -> string:
arr = nil arr = []
<- arr! <- arr!

View File

@ -1,7 +1,7 @@
package aqua.semantics package aqua.semantics
import aqua.parser.expr.func.ArrowExpr import aqua.parser.expr.func.ArrowExpr
import aqua.parser.lexer.{BasicTypeToken, Name} import aqua.parser.lexer.BasicTypeToken
import aqua.raw.Raw import aqua.raw.Raw
import aqua.raw.arrow.ArrowRaw import aqua.raw.arrow.ArrowRaw
import aqua.raw.ops.* import aqua.raw.ops.*
@ -12,20 +12,17 @@ import aqua.types.*
import aqua.types.ScalarType.* import aqua.types.ScalarType.*
import cats.Id import cats.Id
import cats.syntax.applicative.*
import cats.data.{NonEmptyList, NonEmptyMap, State} import cats.data.{NonEmptyList, NonEmptyMap, State}
import org.scalatest.EitherValues import cats.syntax.applicative.*
import org.scalatest.{EitherValues, Inside}
import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers import org.scalatest.matchers.should.Matchers
import org.scalatest.Inside
class ArrowSemSpec extends AnyFlatSpec with Matchers with EitherValues with Inside { class ArrowSemSpec extends AnyFlatSpec with Matchers with EitherValues with Inside {
import Utils.{given, *} import Utils.{*, given}
def program(arrowStr: String): Prog[State[CompilerState[cats.Id], *], Raw] = { def program(arrowStr: String): Prog[State[CompilerState[cats.Id], *], Raw] = {
import CompilerState.*
val expr = ArrowExpr.p.parseAll(arrowStr).value.mapK(spanToId) val expr = ArrowExpr.p.parseAll(arrowStr).value.mapK(spanToId)
val sem = new ArrowSem[Id](expr) val sem = new ArrowSem[Id](expr)

View File

@ -0,0 +1,48 @@
package aqua.semantics
import aqua.parser.expr.func.{AssignmentExpr, ClosureExpr}
import aqua.parser.lexer.CollectionToken.Mode.ArrayMode
import aqua.parser.lexer.{CollectionToken, Name, VarToken}
import aqua.parser.lift.Span
import aqua.raw.Raw
import aqua.semantics.expr.func.{AssignmentSem, ClosureSem}
import cats.Id
import cats.data.State
import org.scalatest.Inside
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
class AssignmentSemSpec extends AnyFlatSpec with Matchers with Inside {
import Utils.{*, given}
val program: Prog[State[CompilerState[cats.Id], *], Raw] = {
val expr = ClosureExpr(Name[Id]("closure"), None)
val sem = new ClosureSem[Id](expr)
sem.program[State[CompilerState[Id], *]]
}
"it" should "throw an error on 'nil'" in {
val expr = AssignmentExpr(Name[Id]("emptyArr"), VarToken[Id](Name[Id]("nil")))
val sem = new AssignmentSem[Id](expr)
val state = getState(sem.program[State[CompilerState[Id], *]])
inside(state.errors) { errors =>
atLeast(1, errors.toList) shouldBe a[RulesViolated[Span.S]]
}
}
"it" should "throw an error on empty array" in {
val expr = AssignmentExpr(Name[Id]("emptyArr"), CollectionToken[Id](ArrayMode, Nil))
val sem = new AssignmentSem[Id](expr)
val state = getState(sem.program[State[CompilerState[Id], *]])
inside(state.errors) { errors =>
atLeast(1, errors.toList) shouldBe a[RulesViolated[Span.S]]
}
}
}

View File

@ -1,38 +1,24 @@
package aqua.semantics package aqua.semantics
import aqua.parser.expr.func.ClosureExpr import aqua.parser.expr.func.ClosureExpr
import aqua.parser.lexer.{Name, Token} import aqua.parser.lexer.Name
import aqua.raw.arrow.ArrowRaw
import aqua.raw.Raw import aqua.raw.Raw
import aqua.raw.ops.{EmptyTag, FuncOp, RawTag} import aqua.raw.arrow.ArrowRaw
import aqua.raw.ops.RawTag
import aqua.semantics.expr.func.ClosureSem import aqua.semantics.expr.func.ClosureSem
import aqua.semantics.rules.names.{NamesInterpreter, NamesState}
import aqua.types.{ArrowType, ProductType} import aqua.types.{ArrowType, ProductType}
import cats.Id
import cats.data.* import cats.data.*
import cats.data.State.* import cats.data.State.*
import cats.instances.all.*
import cats.syntax.all.*
import cats.syntax.applicative.*
import cats.syntax.apply.*
import cats.syntax.bifunctor.*
import cats.syntax.comonad.*
import cats.syntax.flatMap.*
import cats.syntax.functor.*
import cats.syntax.monad.*
import cats.syntax.semigroup.*
import cats.{catsInstancesForId, Id, Monad}
import monocle.Lens
import monocle.macros.GenLens
import monocle.syntax.all.*
import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers import org.scalatest.matchers.should.Matchers
class ClosureSemSpec extends AnyFlatSpec with Matchers { class ClosureSemSpec extends AnyFlatSpec with Matchers {
import Utils.{given, *} import Utils.{*, given}
val program: Prog[State[CompilerState[cats.Id], *], Raw] = { val program: Prog[State[CompilerState[cats.Id], *], Raw] = {
import CompilerState.*
val expr = ClosureExpr(Name[Id]("closure"), None) val expr = ClosureExpr(Name[Id]("closure"), None)
val sem = new ClosureSem[Id](expr) val sem = new ClosureSem[Id](expr)

View File

@ -5,14 +5,13 @@ import aqua.parser.lexer.{Ability, Name}
import aqua.raw.RawContext import aqua.raw.RawContext
import aqua.raw.arrow.{ArrowRaw, FuncRaw} import aqua.raw.arrow.{ArrowRaw, FuncRaw}
import aqua.raw.ops.RawTag import aqua.raw.ops.RawTag
import aqua.raw.value.VarRaw
import aqua.semantics.header.{HeaderHandler, HeaderSem} import aqua.semantics.header.{HeaderHandler, HeaderSem}
import aqua.types.{AbilityType, ArrowType, NilType, ProductType, ScalarType} import aqua.types.*
import cats.data.{Chain, NonEmptyList, NonEmptyMap, Validated} import cats.data.{Chain, NonEmptyList, NonEmptyMap, Validated}
import cats.free.Cofree import cats.free.Cofree
import cats.{Eval, Id, Monoid}
import cats.syntax.applicative.* import cats.syntax.applicative.*
import cats.{Eval, Id, Monoid}
import org.scalatest.Inside import org.scalatest.Inside
import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers import org.scalatest.matchers.should.Matchers

View File

@ -1,26 +1,19 @@
package aqua.semantics package aqua.semantics
import aqua.raw.RawContext import aqua.parser.{Ast, Parser}
import aqua.parser.Ast
import aqua.raw.ops.{Call, CallArrowRawTag, FuncOp, OnTag, ParTag, RawTag, SeqGroupTag, SeqTag}
import aqua.parser.Parser
import aqua.parser.lift.{LiftParser, Span} import aqua.parser.lift.{LiftParser, Span}
import aqua.raw.RawContext
import aqua.raw.ops.*
import aqua.raw.value.* import aqua.raw.value.*
import aqua.types.* import aqua.types.*
import aqua.raw.ops.*
import cats.Eval
import cats.data.{Chain, EitherNec, NonEmptyChain, Validated}
import cats.free.Cofree
import cats.syntax.foldable.*
import org.scalatest.Inside
import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers import org.scalatest.matchers.should.Matchers
import org.scalatest.Inside
import cats.~>
import cats.data.{Chain, EitherNec, NonEmptyChain}
import cats.syntax.show.*
import cats.syntax.traverse.*
import cats.syntax.foldable.*
import cats.data.Validated
import cats.free.Cofree
import cats.data.State
import cats.Eval
class SemanticsSpec extends AnyFlatSpec with Matchers with Inside { class SemanticsSpec extends AnyFlatSpec with Matchers with Inside {

View File

@ -1,23 +1,17 @@
package aqua.semantics package aqua.semantics
import aqua.parser.expr.func.ClosureExpr
import aqua.parser.lexer.{Name, Token}
import aqua.parser.lift.Span import aqua.parser.lift.Span
import aqua.raw.{Raw, RawContext} import aqua.raw.{Raw, RawContext}
import aqua.semantics.expr.func.ClosureSem import aqua.semantics.rules.abilities.{AbilitiesAlgebra, AbilitiesInterpreter}
import aqua.semantics.rules.abilities.{AbilitiesAlgebra, AbilitiesInterpreter, AbilitiesState}
import aqua.semantics.rules.locations.{DummyLocationsInterpreter, LocationsAlgebra} import aqua.semantics.rules.locations.{DummyLocationsInterpreter, LocationsAlgebra}
import aqua.semantics.rules.names.{NamesAlgebra, NamesInterpreter, NamesState}
import aqua.semantics.rules.types.{TypesAlgebra, TypesInterpreter, TypesState}
import aqua.semantics.rules.mangler.{ManglerAlgebra, ManglerInterpreter} import aqua.semantics.rules.mangler.{ManglerAlgebra, ManglerInterpreter}
import aqua.semantics.rules.names.{NamesAlgebra, NamesInterpreter}
import aqua.semantics.rules.report.{ReportAlgebra, ReportInterpreter} import aqua.semantics.rules.report.{ReportAlgebra, ReportInterpreter}
import aqua.semantics.rules.types.{TypesAlgebra, TypesInterpreter}
import aqua.types.* import aqua.types.*
import cats.data.State import cats.data.State
import cats.{~>, Id} import cats.{Id, ~>}
import monocle.Lens
import monocle.macros.GenLens
import monocle.syntax.all.*
object Utils { object Utils {
@ -50,6 +44,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] = {

View File

@ -12,6 +12,7 @@ import aqua.semantics.rules.names.{NamesAlgebra, NamesInterpreter, NamesState}
import aqua.semantics.rules.report.{ReportAlgebra, ReportInterpreter} import aqua.semantics.rules.report.{ReportAlgebra, ReportInterpreter}
import aqua.semantics.rules.types.{TypesAlgebra, TypesInterpreter} import aqua.semantics.rules.types.{TypesAlgebra, TypesInterpreter}
import aqua.types.* import aqua.types.*
import cats.Id import cats.Id
import cats.data.{NonEmptyList, NonEmptyMap, State} import cats.data.{NonEmptyList, NonEmptyMap, State}
import monocle.syntax.all.* import monocle.syntax.all.*