summaryrefslogtreecommitdiff
path: root/ecomp-c/test.sh
blob: daf108424fbf8c2daa6bcedbf10c86374ff2629d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/bin/sh

TESTS="
empty_module
unknown_variable
variable_name_as_type
variable_initialization
unknown_type
const_assignment_error
const_assignment_from_another_constant
const_assignment_from_another_constant_illegal_type
const_assignment_from_unknown_constant
variable_assign_from_constant
variable_assign_from_type
variable_assign_from_variable
variable_assign_from_expression
boolean_variable
character_variable
string_variable
if_statement
bool_conditions
type_check_assignment
type_check_comparision
while_statement
procedure_call
procedure_forward_declaration
procedure_local_variables
procedure_scoping
procedure_call_value_parameters
procedure_call_too_many_parameters
procedure_call_too_few_parameters
procedure_call_value_parameters_wrong_types
example_divisors
example_divisors_array_result
example_reverse_array
example_insertion_sort
"

run_test( )
{
	TEST=$1
	echo -n "$TEST"
	if test ! -f "$TEST.e"; then
		echo " SKIP (not found)"
		return
	fi
	../ec < $TEST.e > $TEST.asm 2> _tmp
	COMPILATION_RES=$?
	grep -v '^Total ' _tmp | grep -v '^Arena' | grep -v 'bytes.*=' | grep -v 'max mmap' > $TEST.comp_err
	rm -f _tmp
	diff $TEST.asm $TEST.easm >/dev/null 2>&1
	OUT=$?
	diff $TEST.comp_err $TEST.ecomp_err >/dev/null 2>&1
	ERR=$?
	if test $OUT = 0 -a $ERR = 0; then
		if test $COMPILATION_RES = 0; then
			fasm $TEST.asm $TEST.ebin >/dev/null 2>&1
			../asm-i386 < $TEST.asm > $TEST.bin 2> _tmp
			grep -v '^Total ' _tmp | grep -v '^Arena' | grep -v 'bytes.*=' | grep -v 'max mmap' | grep -v 'Assembled in' > $TEST.asm_err
			rm -f _tmp
			cmp $TEST.bin $TEST.ebin >/dev/null 2>&1
			OUT=$?
			diff $TEST.asm_err $TEST.easm_err >/dev/null 2>&1
			ERR=$?
			if test $OUT = 0 -a $ERR = 0; then
				../emul $TEST.bin > $TEST.run
				diff $TEST.run $TEST.erun >/dev/null 2>&1
				if test $? = 0; then
					echo " PASS"
				else
					echo " FAIL"
					diff $TEST.run $TEST.erun
					echo "---"
				fi
			else
				echo " FAIL"
				cmp -b $TEST.asm $TEST.easm
				diff $TEST.asm_err $TEST.easm_err
				echo "---"
			fi
		else
			echo " PASS (XFAIL)"
		fi
	else
		echo " FAIL"
		diff $TEST.asm $TEST.easm
		diff $TEST.comp_err $TEST.ecomp_err
		echo "---"
	fi
}

list_tests( )
{
	echo $TESTS | tr ' ' '\n'
}

cd "$(dirname "$0")"/tests

rm -f *.asm *.comp_err *.bin *.ebin *.run

if test "x$1" != "x"; then
	if test "$1" = "list"; then
		list_tests
	else
		run_test "$1"
	fi
else
	for test in $TESTS; do
		run_test $test
	done
fi