tests: cleanup
authorgrischka <grischka>
Tue, 5 Feb 2013 13:27:38 +0000 (5 14:27 +0100)
committergrischka <grischka>
Tue, 5 Feb 2013 13:27:38 +0000 (5 14:27 +0100)
tests:
- add "hello" to test first basic compilation to file/memory
- add "more" test (tests2 suite)
- remove some tests

tests2:
- move into tests dir
- Convert some files from DOS to unix LF
- remove 2>&1 redirection

win32:
- tccrun.c: modify exception filter to exit correctly (needed for btest)
- tcctest.c: exclude weak_test() (feature does not exist on win32)

14 files changed:
Makefile
configure
tccrun.c
tests/Makefile
tests/tcctest.c
tests/tests2/16_nesting.expect
tests/tests2/17_enum.expect
tests/tests2/18_include.expect
tests/tests2/18_include.h
tests/tests2/44_scoped_declarations.c
tests/tests2/45_empty_for.c
tests/tests2/50_logical_second_arg.c
tests/tests2/54_goto.c
tests/tests2/Makefile

index 676c098..1179dbd 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -350,12 +350,10 @@ tcc-doc.info: tcc-doc.texi
 export LIBTCC1
 
 %est:
-       $(MAKE) -C tests2 $@
        $(MAKE) -C tests $@
 
 clean:
        rm -vf $(PROGS) tcc_p$(EXESUF) tcc.pod *~ *.o *.a *.so* *.out *.exe libtcc_test$(EXESUF)
-       $(MAKE) -C tests2 $@
        $(MAKE) -C tests $@
 ifneq ($(LIBTCC1),)
        $(MAKE) -C lib $@
index fa2c97d..709f593 100755 (executable)
--- a/configure
+++ b/configure
@@ -500,7 +500,7 @@ echo "SRC_PATH=$source_path" >>config.mak
 
 # build tree in object directory if source path is different from current one
 if test "$source_path_used" = "yes" ; then
-    FILES="Makefile lib/Makefile tests/Makefile tests2/Makefile"
+    FILES="Makefile lib/Makefile tests/Makefile tests/tests2/Makefile"
     for f in $FILES ; do
         dir=`fn_dirname "$f"`
         test -d "$dir" || mkdir -p "$dir"
index e28529b..b647962 100644 (file)
--- a/tccrun.c
+++ b/tccrun.c
@@ -615,8 +615,7 @@ static long __stdcall cpu_exception_handler(EXCEPTION_POINTERS *ex_info)
         rt_error(uc, "exception caught");
         break;
     }
-    exit(-1);
-    return EXCEPTION_CONTINUE_SEARCH;
+    return EXCEPTION_EXECUTE_HANDLER;
 }
 
 /* Generate a stack backtrace when a CPU exception occurs. */
index 7ea9d92..7685459 100644 (file)
@@ -7,73 +7,61 @@ include $(TOP)/Makefile
 VPATH = $(top_srcdir)/tests
 
 # what tests to run
-TESTS = libtest \
-               test1 \
-               test2 \
-               test3 \
-               speedtest \
-               btest \
-               test1b\
-               test2b\
-               test3b\
-               weaktest
-
-               # test4 # this test does not seem to work on any platform
-               # asmtest # this test does not seem to work on any platform
+TESTS = \
+ hello \
+ libtest \
+ test3 \
+ moretests
+
+# test4 -- problem with -static
+# asmtest -- minor differences with gcc
+# btest -- works on i386 (including win32)
+# test3 -- win32 does not know how to printf long doubles
 
 # bounds-checking is supported only on i386
 ifneq ($(ARCH),i386)
-    TESTS := $(filter-out btest,$(TESTS))
-    TESTS := $(filter-out test1b,$(TESTS))
-    TESTS := $(filter-out test2b,$(TESTS))
-    TESTS := $(filter-out test3b,$(TESTS))
+ TESTS := $(filter-out btest,$(TESTS))
 endif
-
-# these should work too
-# TESTS += test1 test2 speedtest btest weaktest
-
-# some tests do not pass on all platforms, remove them for now
-ifeq ($(TARGETOS),Linux)
-    TESTS := $(filter-out weaktest,$(TESTS))
+ifdef CONFIG_WIN32
+ TESTS := $(filter-out test3,$(TESTS))
 endif
 ifeq ($(TARGETOS),Darwin)
-    TESTS := $(filter-out test1,$(TESTS))
-    TESTS := $(filter-out test2,$(TESTS))
-    TESTS := $(filter-out test3,$(TESTS))
-    TESTS := $(filter-out btest,$(TESTS))
-    TESTS := $(filter-out weaktest,$(TESTS))
+ TESTS := $(filter-out test3 btest,$(TESTS))
 endif
 
 ifdef DISABLE_STATIC
-export LD_LIBRARY_PATH:=$(CURDIR)/..
+ export LD_LIBRARY_PATH:=$(CURDIR)/..
 endif
 
 ifeq ($(TARGETOS),Darwin)
-CFLAGS+=-Wl,-flat_namespace,-undefined,warning
-export MACOSX_DEPLOYMENT_TARGET:=10.2
-NATIVE_DEFINES+=-D_ANSI_SOURCE
+ CFLAGS+=-Wl,-flat_namespace,-undefined,warning
+ export MACOSX_DEPLOYMENT_TARGET:=10.2
+ NATIVE_DEFINES+=-D_ANSI_SOURCE
 endif
 
 # run local version of tcc with local libraries and includes
-TCC = ../tcc -B.. $(NATIVE_DEFINES)
+TCCFLAGS = -B$(TOP)
 ifdef CONFIG_WIN32
      TCC := $(TCC) -I $(top_srcdir)/win32/include -L$(top_build)
TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir)/include -L$(TOP)
 endif
-RUN_TCC = $(NATIVE_DEFINES) -run -DONE_SOURCE ../tcc.c -B..
-DISAS=objdump -d
 
-all test : $(TESTS)
+TCC = $(TOP)/tcc $(TCCFLAGS)
+RUN_TCC = $(NATIVE_DEFINES) -DONE_SOURCE -run $(TOP)/tcc.c $(TCCFLAGS)
 
-# make sure that tcc exists
-test1 test2 test3 test4 btest speedtest asmtest weaktest : ../tcc
-../%:
-       $(MAKE) -C .. $*
+DISAS = objdump -d
 
 # libtcc test
 ifdef LIBTCC1
-LIBTCC1:=$(TOP)/$(LIBTCC1)
+ LIBTCC1:=$(TOP)/$(LIBTCC1)
 endif
 
+all test : $(TESTS)
+
+hello: ../examples/ex1.c
+       @echo ------------ $@ ------------
+       $(TCC) $< -o $@$(EXESUF) && ./$@$(EXESUF)
+       $(TCC) -run $<
+
 libtest: libtcc_test$(EXESUF) $(LIBTCC1)
        @echo ------------ $@ ------------
        ./libtcc_test$(EXESUF) lib_path=..
@@ -81,6 +69,10 @@ libtest: libtcc_test$(EXESUF) $(LIBTCC1)
 libtcc_test$(EXESUF): libtcc_test.c $(top_builddir)/$(LIBTCC)
        $(CC) -o $@ $^ $(CPPFLAGS) $(CFLAGS) $(NATIVE_DEFINES) $(LIBS) $(LINK_LIBTCC) $(LDFLAGS)
 
+moretests:
+       @echo ------------ $@ ------------
+       $(MAKE) -C tests2
+
 # test.ref - generate using gcc
 # copy only tcclib.h so GCC's stddef and stdarg will be used
 test.ref: tcctest.c
@@ -94,59 +86,44 @@ test1: test.ref
        $(TCC) -run tcctest.c > test.out1
        @if diff -u test.ref test.out1 ; then echo "Auto Test OK"; fi
 
-test1b: test.ref
-       @echo ------------ $@ ------------
-       $(TCC) -b -run tcctest.c > test.out1b
-       @if diff -u test.ref test.out1b ; then echo "Auto Test OK"; fi
-
 # iterated test2 (compile tcc then compile tcctest.c !)
 test2: test.ref
        @echo ------------ $@ ------------
        $(TCC) $(RUN_TCC) $(RUN_TCC) -run tcctest.c > test.out2
        @if diff -u test.ref test.out2 ; then echo "Auto Test2 OK"; fi
 
-test2b: test.ref ../bcheck.o
-       @echo ------------ $@ ------------
-       $(TCC) -b $(RUN_TCC) $(RUN_TCC) -run tcctest.c > test.out2b
-       @if diff -u test.ref test.out2b ; then echo "Auto Test2b OK"; fi
-
 # iterated test3 (compile tcc then compile tcc then compile tcctest.c !)
 test3: test.ref
        @echo ------------ $@ ------------
        $(TCC) $(RUN_TCC) $(RUN_TCC) $(RUN_TCC) -run tcctest.c > test.out3
        @if diff -u test.ref test.out3 ; then echo "Auto Test3 OK"; fi
 
-test3b: test.ref
-       @echo ------------ $@ ------------
-       $(TCC) -b $(RUN_TCC) $(RUN_TCC) $(RUN_TCC) -run tcctest.c > test.out3b
-       @if diff -u test.ref test.out3b ; then echo "Auto Test3 OK"; fi
-
 # binary output test
 test4: test.ref
        @echo ------------ $@ ------------
-# dynamic output
-       $(TCC) -o tcctest1 tcctest.c
-       ./tcctest1 > test1.out
-       @if diff -u test.ref test1.out ; then echo "Dynamic Auto Test OK"; fi
 # object + link output
        $(TCC) -c -o tcctest3.o tcctest.c
        $(TCC) -o tcctest3 tcctest3.o
        ./tcctest3 > test3.out
        @if diff -u test.ref test3.out ; then echo "Object Auto Test OK"; fi
-# static output
-       $(TCC) -static -o tcctest2 tcctest.c
-       ./tcctest2 > test2.out
-       @if diff -u test.ref test2.out ; then echo "Static Auto Test OK"; fi
+# dynamic output
+       $(TCC) -o tcctest1 tcctest.c
+       ./tcctest1 > test1.out
+       @if diff -u test.ref test1.out ; then echo "Dynamic Auto Test OK"; fi
 # dynamic output + bound check
        $(TCC) -b -o tcctest4 tcctest.c
        ./tcctest4 > test4.out
        @if diff -u test.ref test4.out ; then echo "BCheck Auto Test OK"; fi
+# static output
+       $(TCC) -static -o tcctest2 tcctest.c
+       ./tcctest2 > test2.out
+       @if diff -u test.ref test2.out ; then echo "Static Auto Test OK"; fi
 
 # memory and bound check auto test
 BOUNDS_OK  = 1 4 8 10 14
 BOUNDS_FAIL= 2 5 7 9 11 12 13 15
 
-btest: boundtest.c ../bcheck.o
+btest: boundtest.c
        @echo ------------ $@ ------------
        @for i in $(BOUNDS_OK); do \
           echo ; echo --- boundtest $$i ---; \
@@ -212,5 +189,6 @@ cache: tcc_g
 
 # clean
 clean:
-       rm -vf *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.gcc \
-          tcctest[1234] ex? libtcc_test$(EXESUF) tcc_g tcclib.h
+       $(MAKE) -C tests2 $@
+       rm -vf *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.gcc *.exe \
+          hello libtcc_test tcctest[1234] ex? tcc_g tcclib.h
index 925418a..8e295fd 100644 (file)
@@ -594,7 +594,9 @@ int main(int argc, char **argv)
     local_label_test();
     asm_test();
     builtin_test();
+#ifndef _WIN32
     weak_test();
+#endif
     global_data_test();
     cmp_comparison_test();
     math_cmp_test();
@@ -2464,7 +2466,7 @@ void builtin_test(void)
     printf("res = %d\n", __builtin_constant_p(constant_p_var));
 }
 
-
+#ifndef _WIN32
 extern int __attribute__((weak)) weak_f1(void);
 extern int __attribute__((weak)) weak_f2(void);
 extern int                       weak_f3(void);
@@ -2520,6 +2522,7 @@ int __attribute__((weak)) weak_f2() { return 222; }
 int __attribute__((weak)) weak_f3() { return 333; }
 int __attribute__((weak)) weak_v2 = 222;
 int __attribute__((weak)) weak_v3 = 333;
+#endif
 
 void const_func(const int a)
 {
index 625ee13..5a3431e 100644 (file)
@@ -1,18 +1,18 @@
-0 0 0\r
-0 0 1\r
-0 0 2\r
-0 1 0\r
-0 1 1\r
-0 1 2\r
-0 2 0\r
-0 2 1\r
-0 2 2\r
-1 0 0\r
-1 0 1\r
-1 0 2\r
-1 1 0\r
-1 1 1\r
-1 1 2\r
-1 2 0\r
-1 2 1\r
-1 2 2\r
+0 0 0
+0 0 1
+0 0 2
+0 1 0
+0 1 1
+0 1 2
+0 2 0
+0 2 1
+0 2 2
+1 0 0
+1 0 1
+1 0 2
+1 1 0
+1 1 1
+1 1 2
+1 2 0
+1 2 1
+1 2 2
index bef4be6..0c4e153 100644 (file)
@@ -1,3 +1,3 @@
-0 1 2 3 54 73 74 75\r
-12\r
-54\r
+0 1 2 3 54 73 74 75
+12
+54
index 87729df..58c6d29 100644 (file)
@@ -1,3 +1,3 @@
-including\r
-included\r
-done\r
+including
+included
+done
index 01f894d..dc86080 100644 (file)
@@ -1 +1 @@
-printf("included\n");\r
+printf("included\n");
index 2febf98..f38664f 100644 (file)
@@ -1,17 +1,17 @@
-#include <stdio.h>\r
-\r
-int main()\r
-{\r
-   int a;\r
-\r
-   for (a = 0; a < 2; a++)\r
-   {\r
-      int b = a;\r
-   }\r
-\r
-   printf("it's all good\n");\r
-\r
-   return 0;\r
-}\r
-\r
-/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\r
+#include <stdio.h>
+
+int main()
+{
+   int a;
+
+   for (a = 0; a < 2; a++)
+   {
+      int b = a;
+   }
+
+   printf("it's all good\n");
+
+   return 0;
+}
+
+/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
index b14e9d4..7cef513 100644 (file)
@@ -1,18 +1,18 @@
-#include <stdio.h>\r
-\r
-int main()\r
-{\r
-   int Count = 0;\r
-\r
-   for (;;)\r
-   {\r
-      Count++;\r
-      printf("%d\n", Count);\r
-      if (Count >= 10)\r
-         break;\r
-   }\r
-\r
-   return 0;\r
-}\r
-\r
-/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\r
+#include <stdio.h>
+
+int main()
+{
+   int Count = 0;
+
+   for (;;)
+   {
+      Count++;
+      printf("%d\n", Count);
+      if (Count >= 10)
+         break;
+   }
+
+   return 0;
+}
+
+/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
index 5fa0bb9..ddec08c 100644 (file)
@@ -1,29 +1,29 @@
-#include <stdio.h>\r
-\r
-int fred()\r
-{\r
-   printf("fred\n");\r
-   return 0;\r
-}\r
-\r
-int joe()\r
-{\r
-   printf("joe\n");\r
-   return 1;\r
-}\r
-\r
-int main()\r
-{\r
-   printf("%d\n", fred() && joe());\r
-   printf("%d\n", fred() || joe());\r
-   printf("%d\n", joe() && fred());\r
-   printf("%d\n", joe() || fred());\r
-   printf("%d\n", fred() && (1 + joe()));\r
-   printf("%d\n", fred() || (0 + joe()));\r
-   printf("%d\n", joe() && (0 + fred()));\r
-   printf("%d\n", joe() || (1 + fred()));\r
-\r
-   return 0;\r
-}\r
-\r
-/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\r
+#include <stdio.h>
+
+int fred()
+{
+   printf("fred\n");
+   return 0;
+}
+
+int joe()
+{
+   printf("joe\n");
+   return 1;
+}
+
+int main()
+{
+   printf("%d\n", fred() && joe());
+   printf("%d\n", fred() || joe());
+   printf("%d\n", joe() && fred());
+   printf("%d\n", joe() || fred());
+   printf("%d\n", fred() && (1 + joe()));
+   printf("%d\n", fred() || (0 + joe()));
+   printf("%d\n", joe() && (0 + fred()));
+   printf("%d\n", joe() || (1 + fred()));
+
+   return 0;
+}
+
+/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
index 9509e83..2e151bb 100644 (file)
@@ -1,56 +1,56 @@
-#include <stdio.h>\r
-\r
-void fred()\r
-{\r
-   printf("In fred()\n");\r
-   goto done;\r
-   printf("In middle\n");\r
-done:\r
-   printf("At end\n");\r
-}\r
-\r
-void joe()\r
-{\r
-   int b = 5678;\r
-\r
-   printf("In joe()\n");\r
-\r
-   {\r
-      int c = 1234;\r
-      printf("c = %d\n", c);\r
-      goto outer;\r
-      printf("uh-oh\n");\r
-   }\r
-\r
-outer:    \r
-\r
-   printf("done\n");\r
-}\r
-\r
-void henry()\r
-{\r
-   int a;\r
-\r
-   printf("In henry()\n");\r
-   goto inner;\r
-\r
-   {\r
-      int b;\r
-inner:    \r
-      b = 1234;\r
-      printf("b = %d\n", b);\r
-   }\r
-\r
-   printf("done\n");\r
-}\r
-\r
-int main()\r
-{\r
-   fred();\r
-   joe();\r
-   henry();\r
-\r
-   return 0;\r
-}\r
-\r
-/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\r
+#include <stdio.h>
+
+void fred()
+{
+   printf("In fred()\n");
+   goto done;
+   printf("In middle\n");
+done:
+   printf("At end\n");
+}
+
+void joe()
+{
+   int b = 5678;
+
+   printf("In joe()\n");
+
+   {
+      int c = 1234;
+      printf("c = %d\n", c);
+      goto outer;
+      printf("uh-oh\n");
+   }
+
+outer:    
+
+   printf("done\n");
+}
+
+void henry()
+{
+   int a;
+
+   printf("In henry()\n");
+   goto inner;
+
+   {
+      int b;
+inner:    
+      b = 1234;
+      printf("b = %d\n", b);
+   }
+
+   printf("done\n");
+}
+
+int main()
+{
+   fred();
+   joe();
+   henry();
+
+   return 0;
+}
+
+/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
dissimilarity index 85%
index d328ce7..bf7511f 100644 (file)
-TOP = ..
-include $(TOP)/Makefile
-VPATH = $(top_srcdir)/tests2
-
-ifeq ($(TARGETOS),Darwin)
-    CFLAGS+=-Wl,-flat_namespace,-undefined,warning
-    TCCFLAGS=-D_ANSI_SOURCE
-    export MACOSX_DEPLOYMENT_TARGET:=10.2
-endif
-
-ifdef CONFIG_WIN32
-    TCCFLAGS=-I $(TOP)/win32/include -L$(TOP)
-endif
-
-TESTS= 00_assignment.test \
-               01_comment.test \
-               02_printf.test \
-               03_struct.test \
-               04_for.test \
-               05_array.test \
-               06_case.test \
-               07_function.test \
-               08_while.test \
-               09_do_while.test \
-               10_pointer.test \
-               11_precedence.test \
-               12_hashdefine.test \
-               13_integer_literals.test \
-               14_if.test \
-               15_recursion.test \
-               16_nesting.test \
-               17_enum.test \
-               18_include.test \
-               19_pointer_arithmetic.test \
-               20_pointer_comparison.test \
-               21_char_array.test \
-               22_floating_point.test \
-               23_type_coercion.test \
-               24_math_library.test \
-               25_quicksort.test \
-               26_character_constants.test \
-        27_sizeof.test \
-               28_strings.test \
-               29_array_address.test \
-               31_args.test \
-               32_led.test \
-               33_ternary_op.test \
-               35_sizeof.test \
-               36_array_initialisers.test \
-               37_sprintf.test \
-               38_multiple_array_index.test \
-               39_typedef.test \
-               40_stdio.test \
-               41_hashif.test \
-        42_function_pointer.test \
-               43_void_param.test \
-               44_scoped_declarations.test \
-               45_empty_for.test \
-               47_switch_return.test \
-               48_nested_break.test \
-               49_bracket_evaluation.test \
-               50_logical_second_arg.test \
-               51_static.test \
-               52_unnamed_enum.test \
-               54_goto.test \
-               55_lshift_type.test
-
-               # 30_hanoi.test \ # seg fault in the code, gcc as well
-               # 34_array_assignment.test \ # array assignment is not in C standard
-        # 46_grep.test \ # does not compile even with gcc
-
-# some tests do not pass on all platforms, remove them for now
-ifeq ($(TARGETOS),Darwin)
-    TESTS := $(filter-out 40_stdio.test,$(TESTS))
-endif
-ifdef CONFIG_WIN32
-    TESTS := $(filter-out 24_math_library.test,$(TESTS))
-    TESTS := $(filter-out 28_strings.test,$(TESTS))
-endif
-
-%.test: %.c %.expect
-       @echo Test: $*...
-       @if [ "x`echo $* | grep args`" != "x" ]; \
-       then \
-               ../tcc -B.. $(TCCFLAGS) -run $< - arg1 arg2 arg3 arg4 2>&1 >$*.output; \
-       else \
-               ../tcc -B.. $(TCCFLAGS) -run $< 2>&1 >$*.output; \
-       fi
-       @if diff -bu $(<:.c=.expect) $*.output ; \
-       then \
-        rm -f $*.output \
-       else \
-               echo "ERROR: test $*"; \
-       fi
-
-all: test
-
-test: $(TESTS)
-
-#  vim: set expandtab ts=4 sw=4 sts=4 tw=80 :
-
-clean:
-       rm -vf fred.txt
+TOP = ../..
+include $(TOP)/Makefile
+VPATH = $(top_srcdir)/tests/tests2
+
+TCCFLAGS = -B$(TOP)
+ifdef CONFIG_WIN32
+ TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir)/include -L$(TOP)
+endif
+
+ifeq ($(TARGETOS),Darwin)
+ CFLAGS += -Wl,-flat_namespace,-undefined,warning
+ TCCFLAGS += -D_ANSI_SOURCE
+ export MACOSX_DEPLOYMENT_TARGET:=10.2
+endif
+
+TCC_RUN = $(TOP)/tcc $(TCCFLAGS) -run
+
+TESTS =        \
+ 00_assignment.test \
+ 01_comment.test \
+ 02_printf.test \
+ 03_struct.test \
+ 04_for.test \
+ 05_array.test \
+ 06_case.test \
+ 07_function.test \
+ 08_while.test \
+ 09_do_while.test \
+ 10_pointer.test \
+ 11_precedence.test \
+ 12_hashdefine.test \
+ 13_integer_literals.test \
+ 14_if.test \
+ 15_recursion.test \
+ 16_nesting.test \
+ 17_enum.test \
+ 18_include.test \
+ 19_pointer_arithmetic.test \
+ 20_pointer_comparison.test \
+ 21_char_array.test \
+ 22_floating_point.test \
+ 23_type_coercion.test \
+ 24_math_library.test \
+ 25_quicksort.test \
+ 26_character_constants.test \
+ 27_sizeof.test \
+ 28_strings.test \
+ 29_array_address.test \
+ 31_args.test \
+ 32_led.test \
+ 33_ternary_op.test \
+ 35_sizeof.test \
+ 36_array_initialisers.test \
+ 37_sprintf.test \
+ 38_multiple_array_index.test \
+ 39_typedef.test \
+ 40_stdio.test \
+ 41_hashif.test \
+ 42_function_pointer.test \
+ 43_void_param.test \
+ 44_scoped_declarations.test \
+ 45_empty_for.test \
+ 47_switch_return.test \
+ 48_nested_break.test \
+ 49_bracket_evaluation.test \
+ 50_logical_second_arg.test \
+ 51_static.test \
+ 52_unnamed_enum.test \
+ 54_goto.test \
+ 55_lshift_type.test
+
+# 30_hanoi.test -- seg fault in the code, gcc as well
+# 34_array_assignment.test -- array assignment is not in C standard
+# 46_grep.test -- does not compile even with gcc
+
+# some tests do not pass on all platforms, remove them for now
+ifeq ($(TARGETOS),Darwin)
+  TESTS := $(filter-out 40_stdio.test,$(TESTS))
+endif
+ifdef CONFIG_WIN32
+  TESTS := $(filter-out 24_math_library.test 28_strings.test,$(TESTS))
+endif
+
+%.test: %.c %.expect
+       @echo Test: $*...
+       @if [ "x`echo $* | grep args`" != "x" ]; \
+       then $(TCC_RUN) $< - arg1 arg2 arg3 arg4 >$*.output; \
+       else $(TCC_RUN) $< >$*.output; \
+       fi
+       @if diff -bu $(<:.c=.expect) $*.output ; \
+       then rm -f $*.output; \
+       else exit 1; \
+       fi
+
+all test: $(TESTS)
+
+clean:
+       rm -vf fred.txt *.output