diff options
Diffstat (limited to 'lab5/src/test')
18 files changed, 473 insertions, 0 deletions
diff --git a/lab5/src/test/resources/lab5/test5001_vardecl.ans b/lab5/src/test/resources/lab5/test5001_vardecl.ans new file mode 100644 index 0000000..ebd107d --- /dev/null +++ b/lab5/src/test/resources/lab5/test5001_vardecl.ans @@ -0,0 +1,11 @@ +## type Decl(MVar,x,N(1.0),Var(x)) : number +## step 0: +## Map() +## Decl(MVar,x,N(1.0),Var(x)) +## step 1: +## Map(A(1) -> N(1.0)) +## Unary(Deref,A(1)) +## result: +## Map(A(1) -> N(1.0)) +## N(1.0) +1.0 diff --git a/lab5/src/test/resources/lab5/test5001_vardecl.jsy b/lab5/src/test/resources/lab5/test5001_vardecl.jsy new file mode 100644 index 0000000..79c3a73 --- /dev/null +++ b/lab5/src/test/resources/lab5/test5001_vardecl.jsy @@ -0,0 +1,2 @@ +var x = 1
+x
\ No newline at end of file diff --git a/lab5/src/test/resources/lab5/test5002_assign.ans b/lab5/src/test/resources/lab5/test5002_assign.ans new file mode 100644 index 0000000..824cbca --- /dev/null +++ b/lab5/src/test/resources/lab5/test5002_assign.ans @@ -0,0 +1,29 @@ +## type Decl(MVar,x,N(2.0),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(2.0))),Decl(MConst,y,Binary(Plus,Var(x),N(2.0)),Undefined))) : Undefined +## step 0: +## Map() +## Decl(MVar,x,N(2.0),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(2.0))),Decl(MConst,y,Binary(Plus,Var(x),N(2.0)),Undefined))) +## step 1: +## Map(A(1) -> N(2.0)) +## Binary(Seq,Assign(Unary(Deref,A(1)),Binary(Plus,Unary(Deref,A(1)),N(2.0))),Decl(MConst,y,Binary(Plus,Unary(Deref,A(1)),N(2.0)),Undefined)) +## step 2: +## Map(A(1) -> N(2.0)) +## Binary(Seq,Assign(Unary(Deref,A(1)),Binary(Plus,N(2.0),N(2.0))),Decl(MConst,y,Binary(Plus,Unary(Deref,A(1)),N(2.0)),Undefined)) +## step 3: +## Map(A(1) -> N(2.0)) +## Binary(Seq,Assign(Unary(Deref,A(1)),N(4.0)),Decl(MConst,y,Binary(Plus,Unary(Deref,A(1)),N(2.0)),Undefined)) +## step 4: +## Map(A(1) -> N(4.0)) +## Binary(Seq,N(4.0),Decl(MConst,y,Binary(Plus,Unary(Deref,A(1)),N(2.0)),Undefined)) +## step 5: +## Map(A(1) -> N(4.0)) +## Decl(MConst,y,Binary(Plus,Unary(Deref,A(1)),N(2.0)),Undefined) +## step 6: +## Map(A(1) -> N(4.0)) +## Decl(MConst,y,Binary(Plus,N(4.0),N(2.0)),Undefined) +## step 7: +## Map(A(1) -> N(4.0)) +## Decl(MConst,y,N(6.0),Undefined) +## result: +## Map(A(1) -> N(4.0)) +## Undefined +undefined diff --git a/lab5/src/test/resources/lab5/test5002_assign.jsy b/lab5/src/test/resources/lab5/test5002_assign.jsy new file mode 100644 index 0000000..bd617e7 --- /dev/null +++ b/lab5/src/test/resources/lab5/test5002_assign.jsy @@ -0,0 +1,3 @@ +var x = 2
+x = x + 2
+const y = x + 2
\ No newline at end of file diff --git a/lab5/src/test/resources/lab5/test5015_objalias.ans b/lab5/src/test/resources/lab5/test5015_objalias.ans new file mode 100644 index 0000000..7efc35d --- /dev/null +++ b/lab5/src/test/resources/lab5/test5015_objalias.ans @@ -0,0 +1,51 @@ +## type Decl(MConst,obj,Obj(TreeMap(value -> N(15.0))),Binary(Seq,Print(Var(obj)),Decl(MConst,obj2,Var(obj),Binary(Seq,Print(Var(obj2)),Binary(Seq,Assign(GetField(Var(obj2),value),N(295.0)),Binary(Seq,Print(Var(obj)),Binary(Seq,Print(Var(obj2)),GetField(Var(obj),value)))))))) : number +## step 0: +## Map() +## Decl(MConst,obj,Obj(TreeMap(value -> N(15.0))),Binary(Seq,Print(Var(obj)),Decl(MConst,obj2,Var(obj),Binary(Seq,Print(Var(obj2)),Binary(Seq,Assign(GetField(Var(obj2),value),N(295.0)),Binary(Seq,Print(Var(obj)),Binary(Seq,Print(Var(obj2)),GetField(Var(obj),value)))))))) +## step 1: +## Map(A(1) -> Obj(TreeMap(value -> N(15.0)))) +## Decl(MConst,obj,A(1),Binary(Seq,Print(Var(obj)),Decl(MConst,obj2,Var(obj),Binary(Seq,Print(Var(obj2)),Binary(Seq,Assign(GetField(Var(obj2),value),N(295.0)),Binary(Seq,Print(Var(obj)),Binary(Seq,Print(Var(obj2)),GetField(Var(obj),value)))))))) +## step 2: +## Map(A(1) -> Obj(TreeMap(value -> N(15.0)))) +## Binary(Seq,Print(A(1)),Decl(MConst,obj2,A(1),Binary(Seq,Print(Var(obj2)),Binary(Seq,Assign(GetField(Var(obj2),value),N(295.0)),Binary(Seq,Print(A(1)),Binary(Seq,Print(Var(obj2)),GetField(A(1),value))))))) +{ value: 15.0 } +## step 3: +## Map(A(1) -> Obj(TreeMap(value -> N(15.0)))) +## Binary(Seq,Undefined,Decl(MConst,obj2,A(1),Binary(Seq,Print(Var(obj2)),Binary(Seq,Assign(GetField(Var(obj2),value),N(295.0)),Binary(Seq,Print(A(1)),Binary(Seq,Print(Var(obj2)),GetField(A(1),value))))))) +## step 4: +## Map(A(1) -> Obj(TreeMap(value -> N(15.0)))) +## Decl(MConst,obj2,A(1),Binary(Seq,Print(Var(obj2)),Binary(Seq,Assign(GetField(Var(obj2),value),N(295.0)),Binary(Seq,Print(A(1)),Binary(Seq,Print(Var(obj2)),GetField(A(1),value)))))) +## step 5: +## Map(A(1) -> Obj(TreeMap(value -> N(15.0)))) +## Binary(Seq,Print(A(1)),Binary(Seq,Assign(GetField(A(1),value),N(295.0)),Binary(Seq,Print(A(1)),Binary(Seq,Print(A(1)),GetField(A(1),value))))) +{ value: 15.0 } +## step 6: +## Map(A(1) -> Obj(TreeMap(value -> N(15.0)))) +## Binary(Seq,Undefined,Binary(Seq,Assign(GetField(A(1),value),N(295.0)),Binary(Seq,Print(A(1)),Binary(Seq,Print(A(1)),GetField(A(1),value))))) +## step 7: +## Map(A(1) -> Obj(TreeMap(value -> N(15.0)))) +## Binary(Seq,Assign(GetField(A(1),value),N(295.0)),Binary(Seq,Print(A(1)),Binary(Seq,Print(A(1)),GetField(A(1),value)))) +## step 8: +## Map(A(1) -> Obj(TreeMap(value -> N(295.0)))) +## Binary(Seq,N(295.0),Binary(Seq,Print(A(1)),Binary(Seq,Print(A(1)),GetField(A(1),value)))) +## step 9: +## Map(A(1) -> Obj(TreeMap(value -> N(295.0)))) +## Binary(Seq,Print(A(1)),Binary(Seq,Print(A(1)),GetField(A(1),value))) +{ value: 295.0 } +## step 10: +## Map(A(1) -> Obj(TreeMap(value -> N(295.0)))) +## Binary(Seq,Undefined,Binary(Seq,Print(A(1)),GetField(A(1),value))) +## step 11: +## Map(A(1) -> Obj(TreeMap(value -> N(295.0)))) +## Binary(Seq,Print(A(1)),GetField(A(1),value)) +{ value: 295.0 } +## step 12: +## Map(A(1) -> Obj(TreeMap(value -> N(295.0)))) +## Binary(Seq,Undefined,GetField(A(1),value)) +## step 13: +## Map(A(1) -> Obj(TreeMap(value -> N(295.0)))) +## GetField(A(1),value) +## result: +## Map(A(1) -> Obj(TreeMap(value -> N(295.0)))) +## N(295.0) +295.0 diff --git a/lab5/src/test/resources/lab5/test5015_objalias.jsy b/lab5/src/test/resources/lab5/test5015_objalias.jsy new file mode 100644 index 0000000..8802136 --- /dev/null +++ b/lab5/src/test/resources/lab5/test5015_objalias.jsy @@ -0,0 +1,8 @@ +const obj = { value: 15 }
+console.log(obj)
+const obj2 = obj
+console.log(obj2)
+obj2.value = 295
+console.log(obj)
+console.log(obj2)
+obj.value
\ No newline at end of file diff --git a/lab5/src/test/resources/lab5/test5040_constassign.ans b/lab5/src/test/resources/lab5/test5040_constassign.ans new file mode 100644 index 0000000..e47fba5 --- /dev/null +++ b/lab5/src/test/resources/lab5/test5040_constassign.ans @@ -0,0 +1,2 @@ +StaticTypeError +<source>:2:1: invalid type Undefined for sub-expression Var(x) in Assign(Var(x),Binary(Plus,Var(x),N(23.0))) diff --git a/lab5/src/test/resources/lab5/test5040_constassign.jsy b/lab5/src/test/resources/lab5/test5040_constassign.jsy new file mode 100644 index 0000000..e32a675 --- /dev/null +++ b/lab5/src/test/resources/lab5/test5040_constassign.jsy @@ -0,0 +1,3 @@ +const x = 0
+x = x + 23
+console.log(x + 45)
\ No newline at end of file diff --git a/lab5/src/test/resources/lab5/test5041_varassign.ans b/lab5/src/test/resources/lab5/test5041_varassign.ans new file mode 100644 index 0000000..a3f3e4f --- /dev/null +++ b/lab5/src/test/resources/lab5/test5041_varassign.ans @@ -0,0 +1,30 @@ +## type Decl(MVar,x,N(0.0),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(23.0))),Print(Binary(Plus,Var(x),N(45.0))))) : Undefined +## step 0: +## Map() +## Decl(MVar,x,N(0.0),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(23.0))),Print(Binary(Plus,Var(x),N(45.0))))) +## step 1: +## Map(A(1) -> N(0.0)) +## Binary(Seq,Assign(Unary(Deref,A(1)),Binary(Plus,Unary(Deref,A(1)),N(23.0))),Print(Binary(Plus,Unary(Deref,A(1)),N(45.0)))) +## step 2: +## Map(A(1) -> N(0.0)) +## Binary(Seq,Assign(Unary(Deref,A(1)),Binary(Plus,N(0.0),N(23.0))),Print(Binary(Plus,Unary(Deref,A(1)),N(45.0)))) +## step 3: +## Map(A(1) -> N(0.0)) +## Binary(Seq,Assign(Unary(Deref,A(1)),N(23.0)),Print(Binary(Plus,Unary(Deref,A(1)),N(45.0)))) +## step 4: +## Map(A(1) -> N(23.0)) +## Binary(Seq,N(23.0),Print(Binary(Plus,Unary(Deref,A(1)),N(45.0)))) +## step 5: +## Map(A(1) -> N(23.0)) +## Print(Binary(Plus,Unary(Deref,A(1)),N(45.0))) +## step 6: +## Map(A(1) -> N(23.0)) +## Print(Binary(Plus,N(23.0),N(45.0))) +## step 7: +## Map(A(1) -> N(23.0)) +## Print(N(68.0)) +68.0 +## result: +## Map(A(1) -> N(23.0)) +## Undefined +undefined diff --git a/lab5/src/test/resources/lab5/test5041_varassign.jsy b/lab5/src/test/resources/lab5/test5041_varassign.jsy new file mode 100644 index 0000000..6926019 --- /dev/null +++ b/lab5/src/test/resources/lab5/test5041_varassign.jsy @@ -0,0 +1,3 @@ +var x = 0
+x = x + 23
+console.log(x + 45)
\ No newline at end of file diff --git a/lab5/src/test/resources/lab5/test5042_refassign.ans b/lab5/src/test/resources/lab5/test5042_refassign.ans new file mode 100644 index 0000000..9ba214d --- /dev/null +++ b/lab5/src/test/resources/lab5/test5042_refassign.ans @@ -0,0 +1,46 @@ +## type Decl(MVar,y,N(0.0),Decl(MRef,x,Var(y),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(23.0))),Binary(Seq,Print(Binary(Plus,Var(x),N(45.0))),Print(Binary(Plus,Var(y),N(67.0))))))) : Undefined +## step 0: +## Map() +## Decl(MVar,y,N(0.0),Decl(MRef,x,Var(y),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(23.0))),Binary(Seq,Print(Binary(Plus,Var(x),N(45.0))),Print(Binary(Plus,Var(y),N(67.0))))))) +## step 1: +## Map(A(1) -> N(0.0)) +## Decl(MRef,x,Unary(Deref,A(1)),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(23.0))),Binary(Seq,Print(Binary(Plus,Var(x),N(45.0))),Print(Binary(Plus,Unary(Deref,A(1)),N(67.0)))))) +## step 2: +## Map(A(1) -> N(0.0)) +## Binary(Seq,Assign(Unary(Deref,A(1)),Binary(Plus,Unary(Deref,A(1)),N(23.0))),Binary(Seq,Print(Binary(Plus,Unary(Deref,A(1)),N(45.0))),Print(Binary(Plus,Unary(Deref,A(1)),N(67.0))))) +## step 3: +## Map(A(1) -> N(0.0)) +## Binary(Seq,Assign(Unary(Deref,A(1)),Binary(Plus,N(0.0),N(23.0))),Binary(Seq,Print(Binary(Plus,Unary(Deref,A(1)),N(45.0))),Print(Binary(Plus,Unary(Deref,A(1)),N(67.0))))) +## step 4: +## Map(A(1) -> N(0.0)) +## Binary(Seq,Assign(Unary(Deref,A(1)),N(23.0)),Binary(Seq,Print(Binary(Plus,Unary(Deref,A(1)),N(45.0))),Print(Binary(Plus,Unary(Deref,A(1)),N(67.0))))) +## step 5: +## Map(A(1) -> N(23.0)) +## Binary(Seq,N(23.0),Binary(Seq,Print(Binary(Plus,Unary(Deref,A(1)),N(45.0))),Print(Binary(Plus,Unary(Deref,A(1)),N(67.0))))) +## step 6: +## Map(A(1) -> N(23.0)) +## Binary(Seq,Print(Binary(Plus,Unary(Deref,A(1)),N(45.0))),Print(Binary(Plus,Unary(Deref,A(1)),N(67.0)))) +## step 7: +## Map(A(1) -> N(23.0)) +## Binary(Seq,Print(Binary(Plus,N(23.0),N(45.0))),Print(Binary(Plus,Unary(Deref,A(1)),N(67.0)))) +## step 8: +## Map(A(1) -> N(23.0)) +## Binary(Seq,Print(N(68.0)),Print(Binary(Plus,Unary(Deref,A(1)),N(67.0)))) +68.0 +## step 9: +## Map(A(1) -> N(23.0)) +## Binary(Seq,Undefined,Print(Binary(Plus,Unary(Deref,A(1)),N(67.0)))) +## step 10: +## Map(A(1) -> N(23.0)) +## Print(Binary(Plus,Unary(Deref,A(1)),N(67.0))) +## step 11: +## Map(A(1) -> N(23.0)) +## Print(Binary(Plus,N(23.0),N(67.0))) +## step 12: +## Map(A(1) -> N(23.0)) +## Print(N(90.0)) +90.0 +## result: +## Map(A(1) -> N(23.0)) +## Undefined +undefined diff --git a/lab5/src/test/resources/lab5/test5042_refassign.jsy b/lab5/src/test/resources/lab5/test5042_refassign.jsy new file mode 100644 index 0000000..bc22619 --- /dev/null +++ b/lab5/src/test/resources/lab5/test5042_refassign.jsy @@ -0,0 +1,5 @@ +var y = 0
+ref x = y
+x = x + 23
+console.log(x + 45)
+console.log(y + 67)
\ No newline at end of file diff --git a/lab5/src/test/resources/lab5xc/test5005_varparamassign.ans b/lab5/src/test/resources/lab5xc/test5005_varparamassign.ans new file mode 100644 index 0000000..d6c1fd2 --- /dev/null +++ b/lab5/src/test/resources/lab5xc/test5005_varparamassign.ans @@ -0,0 +1,56 @@ +## type Decl(MConst,f,Fun(None,List((x,MTyp(MVar,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Binary(Plus,Var(x),N(1.0)))),Decl(MConst,y,N(5.0),Binary(Seq,Print(Var(y)),Decl(MConst,z,Call(Var(f),List(Var(y))),Binary(Seq,Print(Var(y)),Print(Var(z))))))) : Undefined +## step 0: +## Map() +## Decl(MConst,f,Fun(None,List((x,MTyp(MVar,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Binary(Plus,Var(x),N(1.0)))),Decl(MConst,y,N(5.0),Binary(Seq,Print(Var(y)),Decl(MConst,z,Call(Var(f),List(Var(y))),Binary(Seq,Print(Var(y)),Print(Var(z))))))) +## step 1: +## Map() +## Decl(MConst,y,N(5.0),Binary(Seq,Print(Var(y)),Decl(MConst,z,Call(Fun(None,List((x,MTyp(MVar,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Binary(Plus,Var(x),N(1.0)))),List(Var(y))),Binary(Seq,Print(Var(y)),Print(Var(z)))))) +## step 2: +## Map() +## Binary(Seq,Print(N(5.0)),Decl(MConst,z,Call(Fun(None,List((x,MTyp(MVar,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Binary(Plus,Var(x),N(1.0)))),List(N(5.0))),Binary(Seq,Print(N(5.0)),Print(Var(z))))) +5.0 +## step 3: +## Map() +## Binary(Seq,Undefined,Decl(MConst,z,Call(Fun(None,List((x,MTyp(MVar,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Binary(Plus,Var(x),N(1.0)))),List(N(5.0))),Binary(Seq,Print(N(5.0)),Print(Var(z))))) +## step 4: +## Map() +## Decl(MConst,z,Call(Fun(None,List((x,MTyp(MVar,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Binary(Plus,Var(x),N(1.0)))),List(N(5.0))),Binary(Seq,Print(N(5.0)),Print(Var(z)))) +## step 5: +## Map() +## Decl(MConst,z,Decl(MVar,x,N(5.0),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Binary(Plus,Var(x),N(1.0)))),Binary(Seq,Print(N(5.0)),Print(Var(z)))) +## step 6: +## Map(A(1) -> N(5.0)) +## Decl(MConst,z,Binary(Seq,Assign(Unary(Deref,A(1)),Binary(Plus,Unary(Deref,A(1)),N(1.0))),Binary(Plus,Unary(Deref,A(1)),N(1.0))),Binary(Seq,Print(N(5.0)),Print(Var(z)))) +## step 7: +## Map(A(1) -> N(5.0)) +## Decl(MConst,z,Binary(Seq,Assign(Unary(Deref,A(1)),Binary(Plus,N(5.0),N(1.0))),Binary(Plus,Unary(Deref,A(1)),N(1.0))),Binary(Seq,Print(N(5.0)),Print(Var(z)))) +## step 8: +## Map(A(1) -> N(5.0)) +## Decl(MConst,z,Binary(Seq,Assign(Unary(Deref,A(1)),N(6.0)),Binary(Plus,Unary(Deref,A(1)),N(1.0))),Binary(Seq,Print(N(5.0)),Print(Var(z)))) +## step 9: +## Map(A(1) -> N(6.0)) +## Decl(MConst,z,Binary(Seq,N(6.0),Binary(Plus,Unary(Deref,A(1)),N(1.0))),Binary(Seq,Print(N(5.0)),Print(Var(z)))) +## step 10: +## Map(A(1) -> N(6.0)) +## Decl(MConst,z,Binary(Plus,Unary(Deref,A(1)),N(1.0)),Binary(Seq,Print(N(5.0)),Print(Var(z)))) +## step 11: +## Map(A(1) -> N(6.0)) +## Decl(MConst,z,Binary(Plus,N(6.0),N(1.0)),Binary(Seq,Print(N(5.0)),Print(Var(z)))) +## step 12: +## Map(A(1) -> N(6.0)) +## Decl(MConst,z,N(7.0),Binary(Seq,Print(N(5.0)),Print(Var(z)))) +## step 13: +## Map(A(1) -> N(6.0)) +## Binary(Seq,Print(N(5.0)),Print(N(7.0))) +5.0 +## step 14: +## Map(A(1) -> N(6.0)) +## Binary(Seq,Undefined,Print(N(7.0))) +## step 15: +## Map(A(1) -> N(6.0)) +## Print(N(7.0)) +7.0 +## result: +## Map(A(1) -> N(6.0)) +## Undefined +undefined diff --git a/lab5/src/test/resources/lab5xc/test5005_varparamassign.jsy b/lab5/src/test/resources/lab5xc/test5005_varparamassign.jsy new file mode 100644 index 0000000..497e58d --- /dev/null +++ b/lab5/src/test/resources/lab5xc/test5005_varparamassign.jsy @@ -0,0 +1,7 @@ +const f = function(x: var number): number { x = x + 1; return x + 1 }
+
+const y = 5
+console.log(y)
+const z = f(y)
+console.log(y)
+console.log(z)
diff --git a/lab5/src/test/resources/lab5xc/test5008_refparamassign.ans b/lab5/src/test/resources/lab5xc/test5008_refparamassign.ans new file mode 100644 index 0000000..3f9aefe --- /dev/null +++ b/lab5/src/test/resources/lab5xc/test5008_refparamassign.ans @@ -0,0 +1,59 @@ +## type Decl(MConst,f,Fun(None,List((x,MTyp(MRef,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Var(x))),Decl(MVar,y,N(5.0),Binary(Seq,Print(Var(y)),Decl(MConst,z,Call(Var(f),List(Var(y))),Binary(Seq,Print(Var(y)),Print(Var(z))))))) : Undefined +## step 0: +## Map() +## Decl(MConst,f,Fun(None,List((x,MTyp(MRef,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Var(x))),Decl(MVar,y,N(5.0),Binary(Seq,Print(Var(y)),Decl(MConst,z,Call(Var(f),List(Var(y))),Binary(Seq,Print(Var(y)),Print(Var(z))))))) +## step 1: +## Map() +## Decl(MVar,y,N(5.0),Binary(Seq,Print(Var(y)),Decl(MConst,z,Call(Fun(None,List((x,MTyp(MRef,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Var(x))),List(Var(y))),Binary(Seq,Print(Var(y)),Print(Var(z)))))) +## step 2: +## Map(A(1) -> N(5.0)) +## Binary(Seq,Print(Unary(Deref,A(1))),Decl(MConst,z,Call(Fun(None,List((x,MTyp(MRef,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Var(x))),List(Unary(Deref,A(1)))),Binary(Seq,Print(Unary(Deref,A(1))),Print(Var(z))))) +## step 3: +## Map(A(1) -> N(5.0)) +## Binary(Seq,Print(N(5.0)),Decl(MConst,z,Call(Fun(None,List((x,MTyp(MRef,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Var(x))),List(Unary(Deref,A(1)))),Binary(Seq,Print(Unary(Deref,A(1))),Print(Var(z))))) +5.0 +## step 4: +## Map(A(1) -> N(5.0)) +## Binary(Seq,Undefined,Decl(MConst,z,Call(Fun(None,List((x,MTyp(MRef,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Var(x))),List(Unary(Deref,A(1)))),Binary(Seq,Print(Unary(Deref,A(1))),Print(Var(z))))) +## step 5: +## Map(A(1) -> N(5.0)) +## Decl(MConst,z,Call(Fun(None,List((x,MTyp(MRef,TNumber))),Some(TNumber),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Var(x))),List(Unary(Deref,A(1)))),Binary(Seq,Print(Unary(Deref,A(1))),Print(Var(z)))) +## step 6: +## Map(A(1) -> N(5.0)) +## Decl(MConst,z,Decl(MRef,x,Unary(Deref,A(1)),Binary(Seq,Assign(Var(x),Binary(Plus,Var(x),N(1.0))),Var(x))),Binary(Seq,Print(Unary(Deref,A(1))),Print(Var(z)))) +## step 7: +## Map(A(1) -> N(5.0)) +## Decl(MConst,z,Binary(Seq,Assign(Unary(Deref,A(1)),Binary(Plus,Unary(Deref,A(1)),N(1.0))),Unary(Deref,A(1))),Binary(Seq,Print(Unary(Deref,A(1))),Print(Var(z)))) +## step 8: +## Map(A(1) -> N(5.0)) +## Decl(MConst,z,Binary(Seq,Assign(Unary(Deref,A(1)),Binary(Plus,N(5.0),N(1.0))),Unary(Deref,A(1))),Binary(Seq,Print(Unary(Deref,A(1))),Print(Var(z)))) +## step 9: +## Map(A(1) -> N(5.0)) +## Decl(MConst,z,Binary(Seq,Assign(Unary(Deref,A(1)),N(6.0)),Unary(Deref,A(1))),Binary(Seq,Print(Unary(Deref,A(1))),Print(Var(z)))) +## step 10: +## Map(A(1) -> N(6.0)) +## Decl(MConst,z,Binary(Seq,N(6.0),Unary(Deref,A(1))),Binary(Seq,Print(Unary(Deref,A(1))),Print(Var(z)))) +## step 11: +## Map(A(1) -> N(6.0)) +## Decl(MConst,z,Unary(Deref,A(1)),Binary(Seq,Print(Unary(Deref,A(1))),Print(Var(z)))) +## step 12: +## Map(A(1) -> N(6.0)) +## Decl(MConst,z,N(6.0),Binary(Seq,Print(Unary(Deref,A(1))),Print(Var(z)))) +## step 13: +## Map(A(1) -> N(6.0)) +## Binary(Seq,Print(Unary(Deref,A(1))),Print(N(6.0))) +## step 14: +## Map(A(1) -> N(6.0)) +## Binary(Seq,Print(N(6.0)),Print(N(6.0))) +6.0 +## step 15: +## Map(A(1) -> N(6.0)) +## Binary(Seq,Undefined,Print(N(6.0))) +## step 16: +## Map(A(1) -> N(6.0)) +## Print(N(6.0)) +6.0 +## result: +## Map(A(1) -> N(6.0)) +## Undefined +undefined diff --git a/lab5/src/test/resources/lab5xc/test5008_refparamassign.jsy b/lab5/src/test/resources/lab5xc/test5008_refparamassign.jsy new file mode 100644 index 0000000..70c39cd --- /dev/null +++ b/lab5/src/test/resources/lab5xc/test5008_refparamassign.jsy @@ -0,0 +1,7 @@ +const f = function(x: ref number): number { x = x + 1; return x }
+
+var y = 5
+console.log(y)
+const z = f(y)
+console.log(y)
+console.log(z)
diff --git a/lab5/src/test/scala/jsy/lab5/Lab5Spec.scala b/lab5/src/test/scala/jsy/lab5/Lab5Spec.scala new file mode 100644 index 0000000..2b42cb7 --- /dev/null +++ b/lab5/src/test/scala/jsy/lab5/Lab5Spec.scala @@ -0,0 +1,128 @@ +package jsy.lab5 + +import scala.collection.immutable.SortedMap +import jsy.lab5.ast._ +import jsy.lab5.Parser.parse +import jsy.tester.JavascriptyTester +import jsy.util.DoWith +import jsy.util.DoWith._ +import org.scalatest._ +import flatspec._ +import Lab5._ +import java.{util => ju} + +class Lab5StudentSpec extends AnyFlatSpec { +} + +class Lab5Spec extends AnyFlatSpec { + + "DoNeg" should "return the negation of a number value" in { + val e1 = N(5) + val e2 = Unary(Neg, e1) + assertResult( N(-5) ) { + val (_, r) = step(e2)(memempty) + r + } + } + + "DoPlus" should "Perform addition of two numbers" in { + val e1 = N(1) + val e2 = N(2) + val e = Binary(Plus, e1, e2) + assertResult( N(3) ) { + val (_, r) = step(e)(memempty) + r + } + } + + "Decl" should "Evaluate Decl" in { + val e1 = Binary(Plus, N(1), N(3)) + val e2 = Var("x") + val e = Decl(MVar, "x", Binary(Plus, e1, N(1)), e2) + val ep = Decl(MVar, "x", Binary(Plus, N(4), N(1)), e2) + assertResult( ep ) { + val (_, r) = step(e)(memempty) + r + } + } + + "DoDeref" should "Deref a Reference" in { + val e = Unary(Deref, A(1)) + assertResult(N(1)) { + val (_, r) = step(e)(memempty + (A(1) -> N(1))) + r + } + } + + "TypeofNeg" should "Return type TNumber" in { + val e1 = Binary(Plus, N(1), N(2)) + val e = Unary(Neg, e1) + assertResult(TNumber) { + hastype(Map.empty, e) + } + } + + "TypeofAnd" should "Return type TBool" in { + val e1 = B(false) + val e2 = Unary(Not, e1) + val e = Binary(And, e1, e2) + assertResult(TBool) { + hastype(Map.empty, e) + } + } + + "TypeofAssign" should "Return type TNumber" in { + val mp = Map("x" -> new MTyp(MVar, TNumber)) + val e1 = Binary(Plus, N(1), N(2)) + val e = Assign(Var("x"), e1) + assertResult(TNumber) { + hastype(mp, e) + } + } + + // "mapFirstDoWith" should "map the first element where f returns Some" in { + // val l1 = List(1, 2, -3, 4, -5) + // val gold1 = List(1, 2, 3, 4, -5) + // def dowith[W]: DoWith[W,List[Int]] = mapFirstWith(l1) { (i: Int) => if (i < 0) Some(doreturn(-i)) else None } + // assertResult((true,gold1)) { dowith(true) } + // assertResult((42,gold1)) { dowith(42) } + // } + + // "mapWith(List)" should "map the elements of a list in a DoWith" in { + // val l = List(1, 2, 3, 4, 5) + // val r1 = l.map { i => i + 1 } + + // def dowith1[W]: DoWith[W,List[Int]] = mapWith(l) { i: Int => doreturn(i + 1) } + // assertResult((true,r1)) { dowith1(true) } + // assertResult((42,r1)) { dowith1(42) } + + // assertResult((2 * l.length + 1, r1)) { + // val dw: DoWith[Int,List[Int]] = mapWith(l) { i: Int => + // domodify[Int](s => s + 2) map { _ => i + 1 } + // } + // dw(1) + // } + // } + + // "rename" should "rename in a DoWith" in { + // val e1 = parse("const a = 1 + a; a") + // val e1p = parse("const aa = 1 + a; aa") + + // assertResult((1,e1p)) { + // rename(empty, e1){ x => domodify[Int](n => n + 1) map { _ => x + x } }(0) + // } + // } + + // "CastOkNull" should "perform CastOkNull" in { + // assertResult(true) { + // castOk(TNull, TObj(SortedMap.empty)) + // } + // } + +} + + +// The next bit of code runs a test for each .jsy file in src/test/resources/lab5. +// The test expects a corresponding .ans file with the expected result. +class Lab5JsyTests extends JavascriptyTester(None, "lab5", Lab5) +class Lab5XCJsyTests extends JavascriptyTester(None, "lab5xc", Lab5)
\ No newline at end of file diff --git a/lab5/src/test/scala/jsy/tester/JavascriptyTester.scala b/lab5/src/test/scala/jsy/tester/JavascriptyTester.scala new file mode 100644 index 0000000..48e789c --- /dev/null +++ b/lab5/src/test/scala/jsy/tester/JavascriptyTester.scala @@ -0,0 +1,23 @@ +package jsy.tester +import java.io.File +import jsy.util.JsyApplication +import org.scalatest._ +import flatspec._ + +/* + * A ScalaTest interface for running system tests. + */ +class JavascriptyTester(rootPrefix: Option[String], testDirectory: String, jsy: JsyApplication) extends AnyFlatSpec { + val testResources = s"src${File.separator}test${File.separator}resources" + val testPrefix = rootPrefix match { + case None => testResources + case Some(p) => s"${p}${File.separator}${testResources}" + } + val testPath = s"${testPrefix}${File.separator}${testDirectory}" + jsy.test(new File(testPath)) { case (in,ans,assertion) => + s"eval on ${in}" should s"match ${ans}" in { + val (b: Boolean, msg: String) = assertion + assert(b, msg) + } + } +} |