]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
Pulling in a rudimentary testsuite - we have to find a better solution ...
authorWolfgang (Blub) Bumiller <blub@speed.at>
Sun, 28 Oct 2012 18:34:39 +0000 (19:34 +0100)
committerWolfgang (Blub) Bumiller <blub@speed.at>
Sun, 28 Oct 2012 18:34:39 +0000 (19:34 +0100)
30 files changed:
testsuite/Makefile [new file with mode: 0644]
testsuite/builtins/main.qc [new file with mode: 0644]
testsuite/calls/main.qc [new file with mode: 0644]
testsuite/equality/0.1.expected [new file with mode: 0644]
testsuite/equality/1.0.expected [new file with mode: 0644]
testsuite/equality/1.1.expected [new file with mode: 0644]
testsuite/equality/main.qc [new file with mode: 0644]
testsuite/fielddefs/deflist.expected [new file with mode: 0644]
testsuite/fielddefs/main.qc [new file with mode: 0644]
testsuite/fields1/expected [new file with mode: 0644]
testsuite/fields1/main.qc [new file with mode: 0644]
testsuite/globaldefs/deflist.expected [new file with mode: 0644]
testsuite/globaldefs/main.qc [new file with mode: 0644]
testsuite/if1/main.qc [new file with mode: 0644]
testsuite/invalid-types/assign.qc [new file with mode: 0644]
testsuite/invalid-types/call1.qc [new file with mode: 0644]
testsuite/invalid-types/call2.qc [new file with mode: 0644]
testsuite/invalid-types/call3.qc [new file with mode: 0644]
testsuite/invalid-types/op.qc [new file with mode: 0644]
testsuite/loops1/0.expected [new file with mode: 0644]
testsuite/loops1/1.expected [new file with mode: 0644]
testsuite/loops1/10.expected [new file with mode: 0644]
testsuite/loops1/4.expected [new file with mode: 0644]
testsuite/loops1/main.qc [new file with mode: 0644]
testsuite/maths1/0.0.expected [new file with mode: 0644]
testsuite/maths1/0.3.expected [new file with mode: 0644]
testsuite/maths1/3.6.expected [new file with mode: 0644]
testsuite/maths1/main.qc [new file with mode: 0644]
testsuite/maths2/main.qc [new file with mode: 0644]
testsuite/variadic/main.qc [new file with mode: 0644]

diff --git a/testsuite/Makefile b/testsuite/Makefile
new file mode 100644 (file)
index 0000000..910e598
--- /dev/null
@@ -0,0 +1,154 @@
+QCC = ../gmqcc
+VM = ../qcvm
+
+TESTLIST = \
+       globaldefs \
+       fielddefs  \
+       builtins   \
+       variadic   \
+       calls      \
+       if1        \
+       loops1     \
+       maths1     \
+       maths2     \
+       equality   \
+       fields1    \
+       invalid-types
+
+.PHONY: clean test
+
+clean:
+       rm -f gmqcc qcvm
+       rm -f */deflist */*.gm.dat */*.qcc.dat */output
+       rm -rf obj
+
+test: $(TESTLIST)
+
+obj/%.gm.dat: %/main.qc obj
+       @echo "Testing:" $(subst obj/,,$(subst .gm.dat,,$@))
+       @$(QCC) -std=gmqcc -o $@ $< > $@.out 2> $@.err
+
+obj/%.qcc.dat: %/main.qc obj
+       @echo "Testing:" $(subst obj/,,$(subst .qcc.dat,,$@))
+       @$(QCC) -std=qcc -o $@ $< > $@.out 2> $@.err
+
+#######################################################################
+
+# Macro which causes something to be compiled either with -std=qcc or without...
+# this may at some point be extended to also store information about the progs.dat
+# somewhere but for now we only need to build the object.
+define maketest
+$(eval $dat = obj/${1}.${2}.dat)
+$1: obj/$1.$2.dat
+endef
+
+#######################################################################
+
+globaldefs: obj/globaldefs.gm.dat
+       @$(VM) -printdefs $< > $@/deflist
+       @diff $@/deflist $@/deflist.expected
+
+$(eval $(call maketest,fielddefs,gm))
+fielddefs:
+       @$(VM) -printfields $< > $@/deflist
+       @diff $@/deflist $@/deflist.expected
+
+$(eval $(call maketest,builtins,qcc))
+builtins:
+       @$(VM) -string "Hello 1" $< > $@/output
+       @test "`wc -l $@/output | awk '{ print $$1 }'`" = "1"
+       @grep -qE '^Hello 1$$' $@/output
+       @$(VM) -string "A test message Yeah" $< > $@/output
+       @test "`wc -l $@/output | awk '{ print $$1 }'`" = "1"
+       @grep -qE '^A test message Yeah$$' $@/output
+
+$(eval $(call maketest,variadic,qcc))
+variadic:
+       @$(VM) -string "Hello 1" $< > $@/output
+       @test "`wc -l $@/output | awk '{ print $$1 }'`" = "1"
+       @grep -qE '^Hello 1$$' $@/output
+       @$(VM) -string "A test message Yeah" $< > $@/output
+       @test "`wc -l $@/output | awk '{ print $$1 }'`" = "1"
+       @grep -qE '^A test message Yeah$$' $@/output
+
+$(eval $(call maketest,calls,qcc))
+calls:
+       @$(VM) -float 1 -float 100 -float 10000 $< > $@/output
+       @grep -qE '^70907$$' $@/output
+       @$(VM) -float 3 -float 201 -float 90127 $< > $@/output
+       @grep -qE '^632719$$' $@/output
+
+$(eval $(call maketest,if1,qcc))
+if1:
+       @$(VM) -float 1 -float 100 -float 10000 $< > $@/output
+       @grep -qE '^One$$' $@/output
+       @$(VM) -float 2 -float 100 -float 10000 $< > $@/output
+       @grep -qE '^Two$$' $@/output
+       @$(VM) -float 3 -float 100 -float 10000 $< > $@/output
+       @grep -qE '^Three$$' $@/output
+       @$(VM) -float 4 -float 100 -float 10000 $< > $@/output
+       @grep -qE '^Else$$' $@/output
+
+$(eval $(call maketest,loops1,qcc))
+loops1:
+       @$(VM) -float 0 $< > $@/output
+       @diff $@/output $@/0.expected
+       @$(VM) -float 1 $< > $@/output
+       @diff $@/output $@/1.expected
+       @$(VM) -float 4 $< > $@/output
+       @diff $@/output $@/4.expected
+       @$(VM) -float 10 $< > $@/output
+       @diff $@/output $@/10.expected
+
+$(eval $(call maketest,maths1,qcc))
+maths1:
+       @$(VM) -float 0 -float 3 $< > $@/output
+       @diff $@/output $@/0.3.expected
+       @$(VM) -float 3 -float 6 $< > $@/output
+       @diff $@/output $@/3.6.expected
+       @$(VM) -float 0 -float 0 $< > $@/output
+       @diff $@/output $@/0.0.expected
+
+$(eval $(call maketest,maths2,qcc))
+maths2:
+       @$(VM) -vector '1 2 3' -vector '4 5 6' $< > $@/output
+       @grep -qE '^dot = 32$$' $@/output
+       @$(VM) -vector '-5 12 5.5' -vector '4 -5 1' $< > $@/output
+       @grep -qE '^dot = -74.5$$' $@/output
+       @$(VM) -vector '-5 12 5.5' -vector '0 0 0' $< > $@/output
+       @grep -qE '^dot = 0$$' $@/output
+
+$(eval $(call maketest,equality,qcc))
+equality:
+       @$(VM) -float 1 -float 1 $< > $@/output
+       @diff $@/output $@/1.1.expected
+       @$(VM) -float 1 -float 0 $< > $@/output
+       @diff $@/output $@/1.0.expected
+       @$(VM) -float 0 -float 1 $< > $@/output
+       @diff $@/output $@/0.1.expected
+
+$(eval $(call maketest,fields1,qcc))
+fields1:
+       @$(VM) -vector '150 2000 150' -vector '220 1300 -200' $< > $@/output
+       @diff $@/output $@/expected
+
+invalid-types-ok: obj invalid-types/assign.qc invalid-types/op.qc invalid-types/call1.qc invalid-types/call2.qc invalid-types/call3.qc
+       @if $(QCC) -std=qcc -o obj/invalid.dat invalid-types/op.qc     > obj/invalid.out 2>&1 ; then echo "Successfully compiled a file which was supposed to fail: op.qc"     ; false ; else true ; fi
+       @if $(QCC) -std=qcc -o obj/invalid.dat invalid-types/call1.qc  > obj/invalid.out 2>&1 ; then echo "Successfully compiled a file which was supposed to fail: call1.qc"  ; false ; else true ; fi
+       @if $(QCC) -std=qcc -o obj/invalid.dat invalid-types/call2.qc  > obj/invalid.out 2>&1 ; then echo "Successfully compiled a file which was supposed to fail: call2.qc"  ; false ; else true ; fi
+       @if $(QCC) -std=qcc -o obj/invalid.dat invalid-types/call3.qc  > obj/invalid.out 2>&1 ; then echo "Successfully compiled a file which was supposed to fail: call3.qc"  ; false ; else true ; fi
+       @if $(QCC) -std=qcc -o obj/invalid.dat invalid-types/assign.qc > obj/invalid.out 2>&1 ; then echo "Successfully compiled a file which was supposed to fail: assign.qc" ; false ; else true ; fi
+       @touch obj/invalid-types-ok
+
+invalid-types: invalid-types-ok
+
+#######################################################################
+obj:
+       mkdir obj
+
+../gmqcc:
+       $(MAKE) -C ..
+
+../qcvm:
+       $(MAKE) -C .. qcvm
+
diff --git a/testsuite/builtins/main.qc b/testsuite/builtins/main.qc
new file mode 100644 (file)
index 0000000..dd2013e
--- /dev/null
@@ -0,0 +1,6 @@
+void(string) print = #1;
+
+void(string what) main = {
+    print(what);
+    print("\n");
+};
diff --git a/testsuite/calls/main.qc b/testsuite/calls/main.qc
new file mode 100644 (file)
index 0000000..c6061e0
--- /dev/null
@@ -0,0 +1,14 @@
+void(string, ...) print = #1;
+string(float)     ftos  = #2;
+
+float(float x, float y, float z) sum = {
+    return x + y + z;
+};
+
+void(float a, float b, float c) main = {
+    local float f;
+    f = sum(sum(a, sum(a, b, c), c),
+            sum(sum(sum(a, b, c), b, sum(a, b, c)), b, sum(a, b, sum(a, b, c))),
+            sum(sum(a, b, c), b, c));
+    print(ftos(f), "\n");
+};
diff --git a/testsuite/equality/0.1.expected b/testsuite/equality/0.1.expected
new file mode 100644 (file)
index 0000000..1356fb7
--- /dev/null
@@ -0,0 +1,3 @@
+ne
+lt
+le
diff --git a/testsuite/equality/1.0.expected b/testsuite/equality/1.0.expected
new file mode 100644 (file)
index 0000000..6a3416e
--- /dev/null
@@ -0,0 +1,3 @@
+ne
+gt
+ge
diff --git a/testsuite/equality/1.1.expected b/testsuite/equality/1.1.expected
new file mode 100644 (file)
index 0000000..e332b2c
--- /dev/null
@@ -0,0 +1,3 @@
+eq
+ge
+le
diff --git a/testsuite/equality/main.qc b/testsuite/equality/main.qc
new file mode 100644 (file)
index 0000000..b21f8ff
--- /dev/null
@@ -0,0 +1,11 @@
+void(string, ...) print = #1;
+string(float)     ftos  = #2;
+
+void(float a, float b) main = {
+    if (a == b) print("eq\n");
+    if (a != b) print("ne\n");
+    if (a >  b) print("gt\n");
+    if (a <  b) print("lt\n");
+    if (a >= b) print("ge\n");
+    if (a <= b) print("le\n");
+};
diff --git a/testsuite/fielddefs/deflist.expected b/testsuite/fielddefs/deflist.expected
new file mode 100644 (file)
index 0000000..54ca670
--- /dev/null
@@ -0,0 +1,5 @@
+Field:     void                  at 0
+Field:    float globf            at 0
+Field:   vector globv            at 1
+Field:   string globs            at 4
+Field: function globfunc         at 5
diff --git a/testsuite/fielddefs/main.qc b/testsuite/fielddefs/main.qc
new file mode 100644 (file)
index 0000000..e2d2380
--- /dev/null
@@ -0,0 +1,4 @@
+.float  globf;
+.vector globv;
+.string globs;
+.void() globfunc;
diff --git a/testsuite/fields1/expected b/testsuite/fields1/expected
new file mode 100644 (file)
index 0000000..585213f
--- /dev/null
@@ -0,0 +1,3 @@
+spot1 = '150 2000 175'
+spot2 = '220 1300 -175'
+vis: 0
diff --git a/testsuite/fields1/main.qc b/testsuite/fields1/main.qc
new file mode 100644 (file)
index 0000000..fc64743
--- /dev/null
@@ -0,0 +1,43 @@
+void(string, ...) print = #1;
+string(float)     ftos  = #2;
+entity()          spawn = #3;
+string(vector)    vtos  = #5;
+void(string, ...) error = #6;
+
+entity self;
+
+.vector origin;
+.vector view;
+
+entity() make = {
+    local entity e;
+    e = spawn();
+    e.view = '0 0 25';
+    return e;
+};
+
+float(entity targ) visible = {
+    local vector spot1, spot2;
+    spot1 = self.origin + self.view;
+    spot2 = targ.origin + targ.view;
+
+    print("spot1 = ", vtos(spot1), "\n");
+    print("spot2 = ", vtos(spot2), "\n");
+    // This was part of some QC code which had a bug
+    // we don't actually return anything important here.
+    return 0;
+};
+
+void(vector a, vector b) main = {
+    local entity targ;
+
+    self = make();
+    targ = make();
+    if (self == targ)
+        error("ERROR, self == targ\n");
+
+    self.origin = a;
+    targ.origin = b;
+
+    print("vis: ", ftos(visible(targ)), "\n");
+};
diff --git a/testsuite/globaldefs/deflist.expected b/testsuite/globaldefs/deflist.expected
new file mode 100644 (file)
index 0000000..edee426
--- /dev/null
@@ -0,0 +1,5 @@
+Global:     void                  at 0
+Global:    float globf            at 28
+Global:   vector globv            at 29
+Global:   string globs            at 32
+Global: function globfunc         at 33
diff --git a/testsuite/globaldefs/main.qc b/testsuite/globaldefs/main.qc
new file mode 100644 (file)
index 0000000..3cc2dc1
--- /dev/null
@@ -0,0 +1,4 @@
+float  globf;
+vector globv;
+string globs;
+void() globfunc;
diff --git a/testsuite/if1/main.qc b/testsuite/if1/main.qc
new file mode 100644 (file)
index 0000000..d3089ce
--- /dev/null
@@ -0,0 +1,12 @@
+void(string, ...) print = #1;
+
+void(float c) main = {
+    if (c == 1)
+        print("One\n");
+    else if (c == 2)
+        print("Two\n");
+    else if (c == 3)
+        print("Three\n");
+    else
+        print("Else\n");
+};
diff --git a/testsuite/invalid-types/assign.qc b/testsuite/invalid-types/assign.qc
new file mode 100644 (file)
index 0000000..d884201
--- /dev/null
@@ -0,0 +1,5 @@
+void() main = {
+       local float x;
+       local entity e;
+       x = e;
+};
diff --git a/testsuite/invalid-types/call1.qc b/testsuite/invalid-types/call1.qc
new file mode 100644 (file)
index 0000000..07d6217
--- /dev/null
@@ -0,0 +1,6 @@
+void(float, string, entity) fun = #1;
+
+void() main = {
+       local float x;
+       fun(x, x, x);
+};
diff --git a/testsuite/invalid-types/call2.qc b/testsuite/invalid-types/call2.qc
new file mode 100644 (file)
index 0000000..cb84fcd
--- /dev/null
@@ -0,0 +1,6 @@
+void(float, string, entity) fun = #1;
+
+void() main = {
+       local string x;
+       fun(x, x, x);
+};
diff --git a/testsuite/invalid-types/call3.qc b/testsuite/invalid-types/call3.qc
new file mode 100644 (file)
index 0000000..4ad110b
--- /dev/null
@@ -0,0 +1,6 @@
+void(float, string, entity) fun = #1;
+
+void() main = {
+       local entity x;
+       fun(x, x, x);
+};
diff --git a/testsuite/invalid-types/op.qc b/testsuite/invalid-types/op.qc
new file mode 100644 (file)
index 0000000..bee4452
--- /dev/null
@@ -0,0 +1,5 @@
+void() main = {
+       local float x, y;
+       local entity e;
+       x = y + e;
+};
diff --git a/testsuite/loops1/0.expected b/testsuite/loops1/0.expected
new file mode 100644 (file)
index 0000000..bc0c271
--- /dev/null
@@ -0,0 +1 @@
+do 0
diff --git a/testsuite/loops1/1.expected b/testsuite/loops1/1.expected
new file mode 100644 (file)
index 0000000..8220dfd
--- /dev/null
@@ -0,0 +1,3 @@
+for 0
+while 0
+do 0
diff --git a/testsuite/loops1/10.expected b/testsuite/loops1/10.expected
new file mode 100644 (file)
index 0000000..3bfa4d2
--- /dev/null
@@ -0,0 +1,30 @@
+for 0
+for 1
+for 2
+for 3
+for 4
+for 5
+for 6
+for 7
+for 8
+for 9
+while 0
+while 1
+while 2
+while 3
+while 4
+while 5
+while 6
+while 7
+while 8
+while 9
+do 0
+do 1
+do 2
+do 3
+do 4
+do 5
+do 6
+do 7
+do 8
+do 9
diff --git a/testsuite/loops1/4.expected b/testsuite/loops1/4.expected
new file mode 100644 (file)
index 0000000..18efd30
--- /dev/null
@@ -0,0 +1,12 @@
+for 0
+for 1
+for 2
+for 3
+while 0
+while 1
+while 2
+while 3
+do 0
+do 1
+do 2
+do 3
diff --git a/testsuite/loops1/main.qc b/testsuite/loops1/main.qc
new file mode 100644 (file)
index 0000000..4b4dcea
--- /dev/null
@@ -0,0 +1,22 @@
+void(string, ...) print = #1;
+string(float)     ftos  = #2;
+
+void(float n) main = {
+    local float i;
+
+    for (i = 0; i < n; i += 1) {
+        print("for ", ftos(i), "\n");
+    }
+
+    i = 0;
+    while (i < n) {
+        print("while ", ftos(i), "\n");
+        i += 1;
+    }
+
+    i = 0;
+    do {
+        print("do ", ftos(i), "\n");
+        i += 1;
+    } while (i < n);
+};
diff --git a/testsuite/maths1/0.0.expected b/testsuite/maths1/0.0.expected
new file mode 100644 (file)
index 0000000..2423970
--- /dev/null
@@ -0,0 +1,8 @@
+input: 0 and 0
++  0
+*  0
+/  0
+&  0
+|  0
+&& 0
+|| 0
diff --git a/testsuite/maths1/0.3.expected b/testsuite/maths1/0.3.expected
new file mode 100644 (file)
index 0000000..dca5e6f
--- /dev/null
@@ -0,0 +1,8 @@
+input: 0 and 3
++  3
+*  0
+/  0
+&  0
+|  3
+&& 0
+|| 1
diff --git a/testsuite/maths1/3.6.expected b/testsuite/maths1/3.6.expected
new file mode 100644 (file)
index 0000000..370a09a
--- /dev/null
@@ -0,0 +1,8 @@
+input: 3 and 6
++  9
+*  18
+/  0.5
+&  2
+|  7
+&& 1
+|| 1
diff --git a/testsuite/maths1/main.qc b/testsuite/maths1/main.qc
new file mode 100644 (file)
index 0000000..58abf54
--- /dev/null
@@ -0,0 +1,14 @@
+void(string, ...) print = #1;
+string(float)     ftos  = #2;
+string(vector)    vtos  = #5;
+
+void(float a, float b) main = {
+    print("input: ", ftos(a), " and ", ftos(b), "\n");
+    print("+  ", ftos(a+b),  "\n");
+    print("*  ", ftos(a*b),  "\n");
+    print("/  ", ftos(a/b),  "\n");
+    print("&  ", ftos(a&b),  "\n");
+    print("|  ", ftos(a|b),  "\n");
+    print("&& ", ftos(a&&b), "\n");
+    print("|| ", ftos(a||b), "\n");
+};
diff --git a/testsuite/maths2/main.qc b/testsuite/maths2/main.qc
new file mode 100644 (file)
index 0000000..4d8358f
--- /dev/null
@@ -0,0 +1,6 @@
+void(string, ...) print = #1;
+string(float)     ftos  = #2;
+
+void(vector a, vector b) main = {
+    print("dot = ", ftos(a*b), "\n");
+};
diff --git a/testsuite/variadic/main.qc b/testsuite/variadic/main.qc
new file mode 100644 (file)
index 0000000..6c53eb2
--- /dev/null
@@ -0,0 +1,5 @@
+void(string, ...) print = #1;
+
+void(string what) main = {
+    print(what, "\n");
+};