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:
Jan Nieuwenhuizen 2018-05-01 16:50:29 +02:00
parent a937d18c38
commit 98417537a2
No known key found for this signature in database
GPG Key ID: F3C1A0D9C1D65273
7 changed files with 204 additions and 34 deletions

3
.gitignore vendored
View File

@ -14,7 +14,8 @@
*.hex2
*.hex2-o
*.log
*.log
*.stderr
*.stdout
*.mini-M1
*.mini-guile
*.mini-hex2

View File

@ -40,6 +40,7 @@ CPPFLAGS=${CPPFLAGS-"
MESCCLAGS=${MESCCFLAGS-"
"}
LIBC=${LIBC-lib/libc}
c=$1
@ -72,7 +73,7 @@ if [ -z "$NOLINK" ]; then
$BLOOD_ELF\
-f stage0/x86.M1\
-f "$c".M1\
-f lib/libc-mes.M1\
-f $LIBC-mes.M1\
-o "$c".blood-elf-M1
$M1 --LittleEndian --Architecture=1\
-f "$c".blood-elf-M1\
@ -80,7 +81,7 @@ if [ -z "$NOLINK" ]; then
$HEX2 --LittleEndian --Architecture=1 --BaseAddress=0x1000000\
-f stage0/elf32-header.hex2\
-f lib/crt1.hex2\
-f lib/libc-mes.hex2\
-f $LIBC-mes.hex2\
-f "$c".hex2\
-f "$c".blood-elf-hex2\
--exec_enable\

View File

@ -107,19 +107,29 @@ t
82-define
"
if [ ! -x ./i686-unknown-linux-gnu-tcc ]; then
tests=$(echo "$tests" | grep -Ev "02-return-1|05-call-1|80-setjmp|81-qsort")
fi
broken="$broken
"
set +e
expect=$(echo $broken | wc -w)
pass=0
fail=0
total=0
export LIBC=libc/libc
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
r=$?
total=$((total+1))
if [ $r = 0 ]; then
echo $t: [OK]
pass=$((pass+1))
else
echo $t: [FAIL]
fail=$((fail+1))
@ -141,7 +151,7 @@ tests="
10_pointer
11_precedence
12_hashdefine
13_integer_literals
14_if
15_recursion
16_nesting
@ -151,44 +161,71 @@ tests="
20_pointer_comparison
21_char_array
22_floating_point
23_type_coercion
24_math_library
25_quicksort
26_character_constants
27_sizeof
28_strings
29_array_address
30_hanoi
31_args
32_led
33_ternary_op
34_array_assignment
35_sizeof
36_array_initialisers
37_sprintf
38_multiple_array_index
39_typedef
40_stdio
41_hashif
42_function_pointer
43_void_param
44_scoped_declarations
45_empty_for
46_grep
47_switch_return
48_nested_break
49_bracket_evaluation
50_logical_second_arg
51_static
52_unnamed_enum
55_lshift_type
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
#23_type_coercion ; float
#24_math_library ; float
@ -211,27 +248,33 @@ tests="
#55_lshift_type ; unsigned
# FIXME: have no diff
tests=
expect=$(echo $broken | wc -w)
for t in $tests; do
if [ ! -f scaffold/tinycc/"$t.c" ]; then
echo ' [SKIP]'
continue;
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=$?
total=$((total+1))
if [ $r = 0 ]; then
echo $t: [OK]
pass=$((pass+1))
else
echo $t: [FAIL]
fail=$((fail+1))
fi
done
if [ $fail != 0 ]; then
[ $expect != 0 ] && echo "expect: $expect"
[ $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
exit 1
elif [ $fail != 0 ]; then
echo PASS: $pass/$total
else
echo PASS: $total
fi

116
build-aux/diff.scm Executable file
View 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))))

View File

@ -20,6 +20,10 @@
set -ex
GUILE=${GUILE-$MES}
DIFF=${DIFF-$(command -v diff)}
DIFF=${DIFF-sh build-aux/diff.scm}
t=${1-scaffold/tests/t}
#rm -f "$t".i686-unknown-linux-gnu-out
rm -f "$t".mes-out
@ -27,11 +31,14 @@ rm -f "$t".mes-out
sh build-aux/cc-mes.sh "$t"
r=0
[ -f "$t".exit ] && r=$(cat "$t".exit)
set +e
"$t".mes-out | tee "$t".stdout
"$t".mes-out "$@" > "$t".stdout
m=$?
cat "$t".stdout
set -e
[ $m = $r ]
if [ -f "$t".expect ]; then
diff -u "$t".expect "$t".stdout;
$DIFF -u "$t".expect "$t".stdout;
fi

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1 @@
1