From: Wolfgang (Blub) Bumiller Date: Sun, 28 Oct 2012 18:34:39 +0000 (+0100) Subject: Pulling in a rudimentary testsuite - we have to find a better solution ... X-Git-Tag: 0.1-rc1~13 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=18272f9f34fbe43166f4af050b2e6cb7f9985971;p=xonotic%2Fgmqcc.git Pulling in a rudimentary testsuite - we have to find a better solution ... --- diff --git a/testsuite/Makefile b/testsuite/Makefile new file mode 100644 index 0000000..910e598 --- /dev/null +++ b/testsuite/Makefile @@ -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 index 0000000..dd2013e --- /dev/null +++ b/testsuite/builtins/main.qc @@ -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 index 0000000..c6061e0 --- /dev/null +++ b/testsuite/calls/main.qc @@ -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 index 0000000..1356fb7 --- /dev/null +++ b/testsuite/equality/0.1.expected @@ -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 index 0000000..6a3416e --- /dev/null +++ b/testsuite/equality/1.0.expected @@ -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 index 0000000..e332b2c --- /dev/null +++ b/testsuite/equality/1.1.expected @@ -0,0 +1,3 @@ +eq +ge +le diff --git a/testsuite/equality/main.qc b/testsuite/equality/main.qc new file mode 100644 index 0000000..b21f8ff --- /dev/null +++ b/testsuite/equality/main.qc @@ -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 index 0000000..54ca670 --- /dev/null +++ b/testsuite/fielddefs/deflist.expected @@ -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 index 0000000..e2d2380 --- /dev/null +++ b/testsuite/fielddefs/main.qc @@ -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 index 0000000..585213f --- /dev/null +++ b/testsuite/fields1/expected @@ -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 index 0000000..fc64743 --- /dev/null +++ b/testsuite/fields1/main.qc @@ -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 index 0000000..edee426 --- /dev/null +++ b/testsuite/globaldefs/deflist.expected @@ -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 index 0000000..3cc2dc1 --- /dev/null +++ b/testsuite/globaldefs/main.qc @@ -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 index 0000000..d3089ce --- /dev/null +++ b/testsuite/if1/main.qc @@ -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 index 0000000..d884201 --- /dev/null +++ b/testsuite/invalid-types/assign.qc @@ -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 index 0000000..07d6217 --- /dev/null +++ b/testsuite/invalid-types/call1.qc @@ -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 index 0000000..cb84fcd --- /dev/null +++ b/testsuite/invalid-types/call2.qc @@ -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 index 0000000..4ad110b --- /dev/null +++ b/testsuite/invalid-types/call3.qc @@ -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 index 0000000..bee4452 --- /dev/null +++ b/testsuite/invalid-types/op.qc @@ -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 index 0000000..bc0c271 --- /dev/null +++ b/testsuite/loops1/0.expected @@ -0,0 +1 @@ +do 0 diff --git a/testsuite/loops1/1.expected b/testsuite/loops1/1.expected new file mode 100644 index 0000000..8220dfd --- /dev/null +++ b/testsuite/loops1/1.expected @@ -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 index 0000000..3bfa4d2 --- /dev/null +++ b/testsuite/loops1/10.expected @@ -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 index 0000000..18efd30 --- /dev/null +++ b/testsuite/loops1/4.expected @@ -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 index 0000000..4b4dcea --- /dev/null +++ b/testsuite/loops1/main.qc @@ -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 index 0000000..2423970 --- /dev/null +++ b/testsuite/maths1/0.0.expected @@ -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 index 0000000..dca5e6f --- /dev/null +++ b/testsuite/maths1/0.3.expected @@ -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 index 0000000..370a09a --- /dev/null +++ b/testsuite/maths1/3.6.expected @@ -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 index 0000000..58abf54 --- /dev/null +++ b/testsuite/maths1/main.qc @@ -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 index 0000000..4d8358f --- /dev/null +++ b/testsuite/maths2/main.qc @@ -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 index 0000000..6c53eb2 --- /dev/null +++ b/testsuite/variadic/main.qc @@ -0,0 +1,5 @@ +void(string, ...) print = #1; + +void(string what) main = { + print(what, "\n"); +};