test: enable all tests, use expect count, add tinycc tests.
* build-aux/check-mescc.sh (tests): Add tinycc tests. * build-aux/diff.scm: Naive diff for tinycc tests. * build-aux/test.sh: Run diff when .expect found.
This commit is contained in:
parent
a937d18c38
commit
98417537a2
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -14,7 +14,8 @@
|
||||||
*.hex2
|
*.hex2
|
||||||
*.hex2-o
|
*.hex2-o
|
||||||
*.log
|
*.log
|
||||||
*.log
|
*.stderr
|
||||||
|
*.stdout
|
||||||
*.mini-M1
|
*.mini-M1
|
||||||
*.mini-guile
|
*.mini-guile
|
||||||
*.mini-hex2
|
*.mini-hex2
|
||||||
|
|
|
@ -40,6 +40,7 @@ CPPFLAGS=${CPPFLAGS-"
|
||||||
|
|
||||||
MESCCLAGS=${MESCCFLAGS-"
|
MESCCLAGS=${MESCCFLAGS-"
|
||||||
"}
|
"}
|
||||||
|
LIBC=${LIBC-lib/libc}
|
||||||
|
|
||||||
c=$1
|
c=$1
|
||||||
|
|
||||||
|
@ -72,7 +73,7 @@ if [ -z "$NOLINK" ]; then
|
||||||
$BLOOD_ELF\
|
$BLOOD_ELF\
|
||||||
-f stage0/x86.M1\
|
-f stage0/x86.M1\
|
||||||
-f "$c".M1\
|
-f "$c".M1\
|
||||||
-f lib/libc-mes.M1\
|
-f $LIBC-mes.M1\
|
||||||
-o "$c".blood-elf-M1
|
-o "$c".blood-elf-M1
|
||||||
$M1 --LittleEndian --Architecture=1\
|
$M1 --LittleEndian --Architecture=1\
|
||||||
-f "$c".blood-elf-M1\
|
-f "$c".blood-elf-M1\
|
||||||
|
@ -80,7 +81,7 @@ if [ -z "$NOLINK" ]; then
|
||||||
$HEX2 --LittleEndian --Architecture=1 --BaseAddress=0x1000000\
|
$HEX2 --LittleEndian --Architecture=1 --BaseAddress=0x1000000\
|
||||||
-f stage0/elf32-header.hex2\
|
-f stage0/elf32-header.hex2\
|
||||||
-f lib/crt1.hex2\
|
-f lib/crt1.hex2\
|
||||||
-f lib/libc-mes.hex2\
|
-f $LIBC-mes.hex2\
|
||||||
-f "$c".hex2\
|
-f "$c".hex2\
|
||||||
-f "$c".blood-elf-hex2\
|
-f "$c".blood-elf-hex2\
|
||||||
--exec_enable\
|
--exec_enable\
|
||||||
|
|
|
@ -107,19 +107,29 @@ t
|
||||||
82-define
|
82-define
|
||||||
"
|
"
|
||||||
|
|
||||||
if [ ! -x ./i686-unknown-linux-gnu-tcc ]; then
|
broken="$broken
|
||||||
tests=$(echo "$tests" | grep -Ev "02-return-1|05-call-1|80-setjmp|81-qsort")
|
"
|
||||||
fi
|
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
|
expect=$(echo $broken | wc -w)
|
||||||
|
pass=0
|
||||||
fail=0
|
fail=0
|
||||||
total=0
|
total=0
|
||||||
|
export LIBC=libc/libc
|
||||||
for t in $tests; do
|
for t in $tests; do
|
||||||
|
if [ -z "${t/[012][0-9]-*/}" ]; then
|
||||||
|
LIBC=lib/mini-libc;
|
||||||
|
elif [ -z "${t/8[0-9]-*/}" ]; then
|
||||||
|
LIBC=lib/libc+tcc;
|
||||||
|
else
|
||||||
|
LIBC=lib/libc;
|
||||||
|
fi
|
||||||
sh build-aux/test.sh "scaffold/tests/$t" &> scaffold/tests/"$t".log
|
sh build-aux/test.sh "scaffold/tests/$t" &> scaffold/tests/"$t".log
|
||||||
r=$?
|
r=$?
|
||||||
total=$((total+1))
|
total=$((total+1))
|
||||||
if [ $r = 0 ]; then
|
if [ $r = 0 ]; then
|
||||||
echo $t: [OK]
|
echo $t: [OK]
|
||||||
|
pass=$((pass+1))
|
||||||
else
|
else
|
||||||
echo $t: [FAIL]
|
echo $t: [FAIL]
|
||||||
fail=$((fail+1))
|
fail=$((fail+1))
|
||||||
|
@ -141,7 +151,7 @@ tests="
|
||||||
10_pointer
|
10_pointer
|
||||||
11_precedence
|
11_precedence
|
||||||
12_hashdefine
|
12_hashdefine
|
||||||
|
13_integer_literals
|
||||||
14_if
|
14_if
|
||||||
15_recursion
|
15_recursion
|
||||||
16_nesting
|
16_nesting
|
||||||
|
@ -151,44 +161,71 @@ tests="
|
||||||
|
|
||||||
20_pointer_comparison
|
20_pointer_comparison
|
||||||
21_char_array
|
21_char_array
|
||||||
|
22_floating_point
|
||||||
|
23_type_coercion
|
||||||
|
24_math_library
|
||||||
25_quicksort
|
25_quicksort
|
||||||
|
26_character_constants
|
||||||
|
27_sizeof
|
||||||
|
28_strings
|
||||||
29_array_address
|
29_array_address
|
||||||
|
|
||||||
|
30_hanoi
|
||||||
31_args
|
31_args
|
||||||
|
32_led
|
||||||
|
|
||||||
33_ternary_op
|
33_ternary_op
|
||||||
|
34_array_assignment
|
||||||
35_sizeof
|
35_sizeof
|
||||||
|
36_array_initialisers
|
||||||
|
37_sprintf
|
||||||
|
38_multiple_array_index
|
||||||
|
39_typedef
|
||||||
|
|
||||||
|
40_stdio
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
41_hashif
|
41_hashif
|
||||||
|
42_function_pointer
|
||||||
43_void_param
|
43_void_param
|
||||||
44_scoped_declarations
|
44_scoped_declarations
|
||||||
45_empty_for
|
45_empty_for
|
||||||
|
46_grep
|
||||||
47_switch_return
|
47_switch_return
|
||||||
48_nested_break
|
48_nested_break
|
||||||
|
49_bracket_evaluation
|
||||||
|
|
||||||
50_logical_second_arg
|
50_logical_second_arg
|
||||||
|
51_static
|
||||||
|
52_unnamed_enum
|
||||||
|
55_lshift_type
|
||||||
54_goto
|
54_goto
|
||||||
|
|
||||||
"
|
"
|
||||||
|
|
||||||
#13_integer_literals ; fail
|
broken="$broken
|
||||||
|
18_include
|
||||||
|
|
||||||
|
22_floating_point
|
||||||
|
23_type_coercion
|
||||||
|
24_math_library
|
||||||
|
26_character_constants
|
||||||
|
27_sizeof
|
||||||
|
28_strings
|
||||||
|
|
||||||
|
30_hanoi
|
||||||
|
32_led
|
||||||
|
34_array_assignment
|
||||||
|
37_sprintf
|
||||||
|
38_multiple_array_index
|
||||||
|
39_typedef
|
||||||
|
|
||||||
|
40_stdio
|
||||||
|
42_function_pointer
|
||||||
|
46_grep
|
||||||
|
49_bracket_evaluation
|
||||||
|
|
||||||
|
51_static
|
||||||
|
52_unnamed_enum
|
||||||
|
55_lshift_type
|
||||||
|
"
|
||||||
|
|
||||||
#22_floating_point ; float
|
#22_floating_point ; float
|
||||||
#23_type_coercion ; float
|
#23_type_coercion ; float
|
||||||
#24_math_library ; float
|
#24_math_library ; float
|
||||||
|
@ -211,27 +248,33 @@ tests="
|
||||||
#55_lshift_type ; unsigned
|
#55_lshift_type ; unsigned
|
||||||
|
|
||||||
|
|
||||||
# FIXME: have no diff
|
expect=$(echo $broken | wc -w)
|
||||||
tests=
|
|
||||||
for t in $tests; do
|
for t in $tests; do
|
||||||
if [ ! -f scaffold/tinycc/"$t.c" ]; then
|
if [ ! -f scaffold/tinycc/"$t.c" ]; then
|
||||||
echo ' [SKIP]'
|
echo ' [SKIP]'
|
||||||
continue;
|
continue;
|
||||||
fi
|
fi
|
||||||
sh build-aux/test.sh "scaffold/tinycc/$t" &> scaffold/tinycc/"$t".log
|
sh build-aux/test.sh "scaffold/tinycc/$t" arg1 arg2 arg3 arg4 arg5 &> scaffold/tinycc/"$t".log
|
||||||
r=$?
|
r=$?
|
||||||
total=$((total+1))
|
total=$((total+1))
|
||||||
if [ $r = 0 ]; then
|
if [ $r = 0 ]; then
|
||||||
echo $t: [OK]
|
echo $t: [OK]
|
||||||
|
pass=$((pass+1))
|
||||||
else
|
else
|
||||||
echo $t: [FAIL]
|
echo $t: [FAIL]
|
||||||
fail=$((fail+1))
|
fail=$((fail+1))
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
[ $expect != 0 ] && echo "expect: $expect"
|
||||||
if [ $fail != 0 ]; then
|
[ $fail != 0 ] && echo "failed: $fail"
|
||||||
|
[ $fail -lt $expect ] && echo "solved: $(($expect - $fail))"
|
||||||
|
echo "passed: $pass"
|
||||||
|
echo "total: $total"
|
||||||
|
if [ $fail != 0 -a $fail -gt $expect ]; then
|
||||||
echo FAILED: $fail/$total
|
echo FAILED: $fail/$total
|
||||||
exit 1
|
exit 1
|
||||||
|
elif [ $fail != 0 ]; then
|
||||||
|
echo PASS: $pass/$total
|
||||||
else
|
else
|
||||||
echo PASS: $total
|
echo PASS: $total
|
||||||
fi
|
fi
|
||||||
|
|
116
build-aux/diff.scm
Executable file
116
build-aux/diff.scm
Executable file
|
@ -0,0 +1,116 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# -*-scheme-*-
|
||||||
|
exec ${GUILE-guile} -L $(dirname 0) -e '(diff)' -s "$0" "$@"
|
||||||
|
!#
|
||||||
|
|
||||||
|
;;; Mes --- Maxwell Equations of Software
|
||||||
|
;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
;;;
|
||||||
|
;;; mes-snarf.scm: This file is part of Mes.
|
||||||
|
;;;
|
||||||
|
;;; Mes is free software; you can redistribute it and/or modify it
|
||||||
|
;;; under the terms of the GNU General Public License as published by
|
||||||
|
;;; the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
;;; your option) any later version.
|
||||||
|
;;;
|
||||||
|
;;; Mes is distributed in the hope that it will be useful, but
|
||||||
|
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
;;; GNU General Public License for more details.
|
||||||
|
;;;
|
||||||
|
;;; You should have received a copy of the GNU General Public License
|
||||||
|
;;; along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
(define-module (diff)
|
||||||
|
#:use-module (srfi srfi-1)
|
||||||
|
#:use-module (srfi srfi-9)
|
||||||
|
#:use-module (ice-9 rdelim)
|
||||||
|
#:export (main))
|
||||||
|
|
||||||
|
(cond-expand
|
||||||
|
(mes
|
||||||
|
(define %scheme "mes"))
|
||||||
|
(guile-2
|
||||||
|
(define %scheme "guile")
|
||||||
|
(define-macro (mes-use-module . rest) #t))
|
||||||
|
(guile
|
||||||
|
(use-modules (ice-9 syncase))
|
||||||
|
(define %scheme "guile")
|
||||||
|
(define-macro (mes-use-module . rest) #t)))
|
||||||
|
|
||||||
|
(mes-use-module (mes guile))
|
||||||
|
|
||||||
|
(format (current-error-port) "diff[~a]...\n" %scheme)
|
||||||
|
|
||||||
|
(define (plus a)
|
||||||
|
(string-append "+" a))
|
||||||
|
(define (minus a)
|
||||||
|
(string-append "-" a))
|
||||||
|
(define (keep a)
|
||||||
|
(string-append " " a))
|
||||||
|
|
||||||
|
(define-record-type <hunk> (make-hunk context after removed added)
|
||||||
|
hunk?
|
||||||
|
(context hunk.context)
|
||||||
|
(after hunk.after)
|
||||||
|
(removed hunk.removed)
|
||||||
|
(added hunk.added))
|
||||||
|
|
||||||
|
(define (hunk->lines o)
|
||||||
|
(append `(,(format #f "@@ -~a,~a +~a,~a" (length (hunk.removed o)) (+ 3 (car (hunk.context o))) (length (hunk.added o)) (+ 3 (cadr (hunk.context o))))
|
||||||
|
,@(map keep (filter identity (cddr (hunk.context o)))))
|
||||||
|
(map minus (hunk.removed o))
|
||||||
|
(map plus (hunk.added o))
|
||||||
|
(map keep (hunk.after o))))
|
||||||
|
|
||||||
|
(define (safe-list-head lst n)
|
||||||
|
(list-head lst (min n (length lst))))
|
||||||
|
|
||||||
|
;; naive diff
|
||||||
|
(define (diff a b)
|
||||||
|
(let ((a-lines (string-split (with-input-from-file a read-string) #\newline))
|
||||||
|
(b-lines (string-split (with-input-from-file b read-string) #\newline)))
|
||||||
|
(let loop ((context '(1 1 #f #f #f)) (a-lines a-lines) (b-lines b-lines))
|
||||||
|
;;(format (current-error-port) "loop context=~s\n" context)
|
||||||
|
(cond ((and (null? a-lines) (null? b-lines)) '())
|
||||||
|
((null? a-lines)
|
||||||
|
(list (make-hunk context (safe-list-head a-lines 3) '() b-lines)))
|
||||||
|
((null? b-lines)
|
||||||
|
(list (make-hunk context (safe-list-head a-lines 3) a-lines '())))
|
||||||
|
((equal? (car a-lines) (car b-lines))
|
||||||
|
(loop `(,(1+ (car context))
|
||||||
|
,(1+ (cadr context))
|
||||||
|
,@(cdddr context)
|
||||||
|
,(car a-lines))
|
||||||
|
(cdr a-lines) (cdr b-lines)))
|
||||||
|
(else
|
||||||
|
(cond ((and (pair? (cdr b-lines)) (equal? (car a-lines) (cadr b-lines)))
|
||||||
|
(cons (make-hunk context (safe-list-head a-lines 3) '() (list (car b-lines)))
|
||||||
|
(loop `(,(+ 1 (car context))
|
||||||
|
,(+ 2 (cadr context))
|
||||||
|
,@(cdddr context)
|
||||||
|
,(car a-lines))
|
||||||
|
(cdr a-lines) (cddr b-lines))))
|
||||||
|
((and (pair? (cdr a-lines)) (equal? (cadr a-lines) (car b-lines)))
|
||||||
|
(cons (make-hunk context (safe-list-head a-lines 3) (list (car a-lines)) '())
|
||||||
|
(loop `(,(+ 2 (car context))
|
||||||
|
,(+ 1 (cadr context))
|
||||||
|
,@(cddddr context)
|
||||||
|
,(car a-lines)
|
||||||
|
,(cadr a-lines))
|
||||||
|
(cddr a-lines) (cdr b-lines))))
|
||||||
|
(else (cons (make-hunk context (safe-list-head a-lines 3) (list (car a-lines)) (list (car b-lines)))
|
||||||
|
(loop `(,(1+ (car context))
|
||||||
|
,(1+ (cadr context))
|
||||||
|
,@(cdddr context)
|
||||||
|
,(car a-lines))
|
||||||
|
(cdr a-lines) (cdr b-lines))))))))))
|
||||||
|
|
||||||
|
(define (main args)
|
||||||
|
(let* ((files (cdr args))
|
||||||
|
(files (if (equal? (car files) "-u") (cdr files) files))
|
||||||
|
(hunks (apply diff (list-head files 2))))
|
||||||
|
(when (pair? hunks)
|
||||||
|
(display (string-join (append-map hunk->lines hunks) "\n"))
|
||||||
|
(newline)
|
||||||
|
(exit 1))))
|
|
@ -20,6 +20,10 @@
|
||||||
|
|
||||||
set -ex
|
set -ex
|
||||||
|
|
||||||
|
GUILE=${GUILE-$MES}
|
||||||
|
DIFF=${DIFF-$(command -v diff)}
|
||||||
|
DIFF=${DIFF-sh build-aux/diff.scm}
|
||||||
|
|
||||||
t=${1-scaffold/tests/t}
|
t=${1-scaffold/tests/t}
|
||||||
#rm -f "$t".i686-unknown-linux-gnu-out
|
#rm -f "$t".i686-unknown-linux-gnu-out
|
||||||
rm -f "$t".mes-out
|
rm -f "$t".mes-out
|
||||||
|
@ -27,11 +31,14 @@ rm -f "$t".mes-out
|
||||||
sh build-aux/cc-mes.sh "$t"
|
sh build-aux/cc-mes.sh "$t"
|
||||||
|
|
||||||
r=0
|
r=0
|
||||||
|
[ -f "$t".exit ] && r=$(cat "$t".exit)
|
||||||
set +e
|
set +e
|
||||||
"$t".mes-out | tee "$t".stdout
|
"$t".mes-out "$@" > "$t".stdout
|
||||||
m=$?
|
m=$?
|
||||||
|
cat "$t".stdout
|
||||||
|
set -e
|
||||||
|
|
||||||
[ $m = $r ]
|
[ $m = $r ]
|
||||||
if [ -f "$t".expect ]; then
|
if [ -f "$t".expect ]; then
|
||||||
diff -u "$t".expect "$t".stdout;
|
$DIFF -u "$t".expect "$t".stdout;
|
||||||
fi
|
fi
|
||||||
|
|
1
scaffold/tests/02-return-1.exit
Normal file
1
scaffold/tests/02-return-1.exit
Normal file
|
@ -0,0 +1 @@
|
||||||
|
1
|
1
scaffold/tests/05-call-1.exit
Normal file
1
scaffold/tests/05-call-1.exit
Normal file
|
@ -0,0 +1 @@
|
||||||
|
1
|
Loading…
Reference in a new issue