Skip to content

Commit

Permalink
Fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
InversionSpaces committed Aug 1, 2023
1 parent 6f2b17c commit 20abe03
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 85 deletions.
60 changes: 47 additions & 13 deletions parser/src/test/scala/aqua/AquaSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,11 @@ package aqua

import aqua.AquaSpec.spanToId
import aqua.parser.expr.*
import aqua.parser.expr.func.{
AbilityIdExpr,
ArrowExpr,
AssignmentExpr,
CallArrowExpr,
ClosureExpr,
ElseOtherwiseExpr,
ForExpr,
IfExpr,
OnExpr,
PushToStreamExpr,
ReturnExpr
}
import aqua.parser.expr.func.*
import aqua.parser.lexer.InfixToken.Op as InfixOp
import aqua.parser.lexer.PrefixToken.Op as PrefixOp
import aqua.parser.lexer.InfixToken.Op.*
import aqua.parser.lexer.PrefixToken.Op.*
import aqua.parser.head.FromExpr.NameOrAbAs
import aqua.parser.head.{FromExpr, UseFromExpr}
import aqua.parser.lexer.*
Expand Down Expand Up @@ -170,6 +162,48 @@ trait AquaSpec extends EitherValues {
def closureExpr(str: String): ClosureExpr[Id] = ClosureExpr.p.parseAll(str).value.mapK(spanToId)
def arrowExpr(str: String): ArrowExpr[Id] = ArrowExpr.p.parseAll(str).value.mapK(spanToId)

def prefixToken(value: ValueToken[Id], op: PrefixOp) =
PrefixToken[Id](value, op)

def infixToken(left: ValueToken[Id], right: ValueToken[Id], op: InfixOp) =
InfixToken[Id](left, right, op)

def mul(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Mul)

def sub(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Sub)

def div(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Div)

def rem(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Rem)

def add(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Add)

def pow(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Pow)

def gt(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Gt)

def gte(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Gte)

def lt(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Lt)

def lte(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Lte)

def equ(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Equ)

def neq(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Neq)

val nat = new (Span.S ~> Id) {

override def apply[A](span: Span.S[A]): A = {
Expand Down
5 changes: 2 additions & 3 deletions parser/src/test/scala/aqua/parser/FuncExprSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import aqua.parser.lexer.{
ArrowTypeToken,
BasicTypeToken,
CallArrowToken,
EqOp,
LiteralToken,
Token,
VarToken
Expand Down Expand Up @@ -106,7 +105,7 @@ class FuncExprSpec extends AnyFlatSpec with Matchers with Inside with Inspectors
val ifBody =
checkHeadGetTail(
arrowExpr.head,
IfExpr(toVarLambda("peer", List("id")), EqOp[Id](true), toVar("other")),
IfExpr(equ(toVarLambda("peer", List("id")), toVar("other"))),
3
).toList

Expand Down Expand Up @@ -304,7 +303,7 @@ class FuncExprSpec extends AnyFlatSpec with Matchers with Inside with Inspectors
.cata[Int]((expr, results) =>
// Count `if`s inside the tree
Eval.later(results.sumAll + (expr match {
case IfExpr(_, _, _) => 1
case IfExpr(_) => 1
case _ => 0
}))
)
Expand Down
56 changes: 30 additions & 26 deletions parser/src/test/scala/aqua/parser/IfExprSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,82 +3,86 @@ package aqua.parser
import aqua.AquaSpec
import aqua.parser.expr.func.IfExpr
import aqua.parser.lexer.InfixToken.Op.{Add, Sub}
import aqua.parser.lexer.{CallArrowToken, CollectionToken, EqOp, InfixToken}
import aqua.parser.lexer.{CallArrowToken, CollectionToken, InfixToken}
import aqua.parser.lexer.CollectionToken.Mode.OptionMode
import cats.Id
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class IfExprSpec extends AnyFlatSpec with Matchers with AquaSpec {

import AquaSpec._
import AquaSpec.*

"if" should "be parsed" in {
parseIf("if a") should be(
IfExpr[Id](toVarLambda("a", Nil), EqOp[Id](true), toBool(true))
IfExpr[Id](toVarLambda("a", Nil))
)

parseIf("if a == b") should be(
IfExpr[Id](toVarLambda("a", Nil), EqOp[Id](true), toVar("b"))
IfExpr[Id](equ(toVarLambda("a", Nil), toVar("b")))
)

parseIf("if 1 != false") should be(
IfExpr[Id](toNumber(1), EqOp[Id](false), toBool(false))
IfExpr[Id](neq(toNumber(1), toBool(false)))
)

parseIf("if a[1] != \"ds\"") should be(
IfExpr[Id](toVarIndex("a", 1), EqOp[Id](false), toStr("ds"))
IfExpr[Id](neq(toVarIndex("a", 1), toStr("ds")))
)

parseIf("if a[1] == 43") should be(
IfExpr[Id](toVarIndex("a", 1), EqOp[Id](true), toNumber(43))
IfExpr[Id](equ(toVarIndex("a", 1), toNumber(43)))
)

parseIf("if a!5 == b[3]") should be(
IfExpr[Id](toVarIndex("a", 5), EqOp[Id](true), toVarIndex("b", 3))
IfExpr[Id](equ(toVarIndex("a", 5), toVarIndex("b", 3)))
)

parseIf("if Op.identity(\"str\") == \"a\"") should be(
IfExpr[Id](
CallArrowToken[Id](Some(toNamedType("Op")), toName("identity"), toStr("str") :: Nil),
EqOp[Id](true),
toStr("a")
equ(
CallArrowToken[Id](Some(toNamedType("Op")), toName("identity"), toStr("str") :: Nil),
toStr("a")
)
)
)

parseIf("if Op.identity(\"str\") != Op.identity(\"str\")") should be(
IfExpr[Id](
CallArrowToken[Id](Some(toNamedType("Op")), toName("identity"), toStr("str") :: Nil),
EqOp[Id](false),
CallArrowToken[Id](Some(toNamedType("Op")), toName("identity"), toStr("str") :: Nil)
neq(
CallArrowToken[Id](Some(toNamedType("Op")), toName("identity"), toStr("str") :: Nil),
CallArrowToken[Id](Some(toNamedType("Op")), toName("identity"), toStr("str") :: Nil)
)
)
)

parseIf("if 2 - 3 != Op.identity(4) + 5") should be(
IfExpr[Id](
InfixToken[Id](toNumber(2), toNumber(3), Sub),
EqOp[Id](false),
InfixToken[Id](
CallArrowToken[Id](Some(toNamedType("Op")), toName("identity"), toNumber(4) :: Nil),
toNumber(5),
Add
neq(
sub(toNumber(2), toNumber(3)),
add(
CallArrowToken[Id](Some(toNamedType("Op")), toName("identity"), toNumber(4) :: Nil),
toNumber(5)
)
)
)
)

parseIf("if funcCall(3) == funcCall2(4)") should be(
IfExpr[Id](
CallArrowToken[Id](None, toName("funcCall"), toNumber(3) :: Nil),
EqOp[Id](true),
CallArrowToken[Id](None, toName("funcCall2"), toNumber(4) :: Nil)
equ(
CallArrowToken[Id](None, toName("funcCall"), toNumber(3) :: Nil),
CallArrowToken[Id](None, toName("funcCall2"), toNumber(4) :: Nil)
)
)
)

parseIf("if ?[\"a\"] == ?[\"a\"]") should be(
IfExpr[Id](
CollectionToken[Id](OptionMode, toStr("a") :: Nil),
EqOp[Id](true),
CollectionToken[Id](OptionMode, toStr("a") :: Nil)
equ(
CollectionToken[Id](OptionMode, toStr("a") :: Nil),
CollectionToken[Id](OptionMode, toStr("a") :: Nil)
)
)
)
}
Expand Down
38 changes: 1 addition & 37 deletions parser/src/test/scala/aqua/parser/ValueTokenComplexSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class ValueTokenComplexSpec extends AnyFlatSpec with Matchers with Inside with A
}
}

import AquaSpec._
import AquaSpec.*

private def variable(name: String): ValueToken[Id] =
VarToken(Name(name), Nil)
Expand All @@ -38,42 +38,6 @@ class ValueTokenComplexSpec extends AnyFlatSpec with Matchers with Inside with A

private def literalBool(b: Boolean): ValueToken[Id] = toBool(b)

private def prefixToken(value: ValueToken[Id], op: PrefixOp) =
PrefixToken[Id](value, op)

private def infixToken(left: ValueToken[Id], right: ValueToken[Id], op: InfixOp) =
InfixToken[Id](left, right, op)

private def mul(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Mul)

private def sub(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Sub)

private def div(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Div)

private def rem(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Rem)

private def add(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Add)

private def pow(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Pow)

private def gt(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Gt)

private def gte(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Gte)

private def lt(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Lt)

private def lte(left: ValueToken[Id], right: ValueToken[Id]): ValueToken[Id] =
infixToken(left, right, Lte)

"primitive math expression" should "be parsed" in {

val vt = ValueToken.`value`.parseAll("3").right.get.mapK(spanToId)
Expand Down
18 changes: 12 additions & 6 deletions semantics/src/test/scala/aqua/semantics/SemanticsSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ 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.raw.value.{LiteralRaw, ValueRaw}
import aqua.raw.value.{ApplyBinaryOpRaw, LiteralRaw, ValueRaw}
import aqua.types.*
import aqua.raw.ops.*

Expand Down Expand Up @@ -66,6 +66,12 @@ class SemanticsSpec extends AnyFlatSpec with Matchers with Inside {
)
.leaf

def equ(left: ValueRaw, right: ValueRaw): ApplyBinaryOpRaw =
ApplyBinaryOpRaw(ApplyBinaryOpRaw.Op.Eq, left, right)

def neq(left: ValueRaw, right: ValueRaw): ApplyBinaryOpRaw =
ApplyBinaryOpRaw(ApplyBinaryOpRaw.Op.Neq, left, right)

// use it to fix https://github.com/fluencelabs/aqua/issues/90
"semantics" should "create right model" in {
val script =
Expand Down Expand Up @@ -109,7 +115,7 @@ class SemanticsSpec extends AnyFlatSpec with Matchers with Inside {

insideBody(script) { body =>
val expected =
IfTag(LiteralRaw.number(1), LiteralRaw.number(2), true).wrap(
IfTag(equ(LiteralRaw.number(1), LiteralRaw.number(2))).wrap(
testServiceCallStr("if"),
testServiceCallStr("else")
)
Expand Down Expand Up @@ -203,7 +209,7 @@ class SemanticsSpec extends AnyFlatSpec with Matchers with Inside {

insideBody(script) { body =>
val expected =
IfTag(LiteralRaw.number(1), LiteralRaw.number(2), false).wrap(
IfTag(neq(LiteralRaw.number(1), LiteralRaw.number(2))).wrap(
testServiceCallStr("if")
)

Expand Down Expand Up @@ -283,7 +289,7 @@ class SemanticsSpec extends AnyFlatSpec with Matchers with Inside {

insideBody(script) { body =>
val expected = TryTag.wrap(
IfTag(LiteralRaw.quote("a"), LiteralRaw.quote("b"), false).wrap(
IfTag(neq(LiteralRaw.quote("a"), LiteralRaw.quote("b"))).wrap(
testServiceCallStr("if")
),
testServiceCallStr("otherwise")
Expand All @@ -300,7 +306,7 @@ class SemanticsSpec extends AnyFlatSpec with Matchers with Inside {
| if "a" != "b":
| Test.testCallStr("if")
|""".stripMargin ->
IfTag(LiteralRaw.quote("a"), LiteralRaw.quote("b"), false).wrap(
IfTag(neq(LiteralRaw.quote("a"), LiteralRaw.quote("b"))).wrap(
testServiceCallStr("if")
),
"""
Expand Down Expand Up @@ -430,7 +436,7 @@ class SemanticsSpec extends AnyFlatSpec with Matchers with Inside {
TryTag.wrap(
ParTag.wrap(
TryTag.wrap(
IfTag(LiteralRaw.quote("a"), LiteralRaw.quote("b"), false).wrap(
IfTag(neq(LiteralRaw.quote("a"), LiteralRaw.quote("b"))).wrap(
testServiceCallStr("if")
),
testServiceCallStr("otherwise1")
Expand Down

0 comments on commit 20abe03

Please sign in to comment.