aboutsummaryrefslogtreecommitdiff
path: root/lab5/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'lab5/src/test')
-rw-r--r--lab5/src/test/resources/lab5/test5001_vardecl.ans11
-rw-r--r--lab5/src/test/resources/lab5/test5001_vardecl.jsy2
-rw-r--r--lab5/src/test/resources/lab5/test5002_assign.ans29
-rw-r--r--lab5/src/test/resources/lab5/test5002_assign.jsy3
-rw-r--r--lab5/src/test/resources/lab5/test5015_objalias.ans51
-rw-r--r--lab5/src/test/resources/lab5/test5015_objalias.jsy8
-rw-r--r--lab5/src/test/resources/lab5/test5040_constassign.ans2
-rw-r--r--lab5/src/test/resources/lab5/test5040_constassign.jsy3
-rw-r--r--lab5/src/test/resources/lab5/test5041_varassign.ans30
-rw-r--r--lab5/src/test/resources/lab5/test5041_varassign.jsy3
-rw-r--r--lab5/src/test/resources/lab5/test5042_refassign.ans46
-rw-r--r--lab5/src/test/resources/lab5/test5042_refassign.jsy5
-rw-r--r--lab5/src/test/resources/lab5xc/test5005_varparamassign.ans56
-rw-r--r--lab5/src/test/resources/lab5xc/test5005_varparamassign.jsy7
-rw-r--r--lab5/src/test/resources/lab5xc/test5008_refparamassign.ans59
-rw-r--r--lab5/src/test/resources/lab5xc/test5008_refparamassign.jsy7
-rw-r--r--lab5/src/test/scala/jsy/lab5/Lab5Spec.scala128
-rw-r--r--lab5/src/test/scala/jsy/tester/JavascriptyTester.scala23
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)
+ }
+ }
+}