Files
Compoiler/test.sh

67 lines
1.7 KiB
Bash
Executable File

#!/bin/bash
# run all tests: ./test.sh 2>&1 | grep -E "Testing|Results"
# inspect a diff: diff <(javap -c /tmp/compoiler-ref/FieldsTest.class) <(javap -c /tmp/compoiler-out/FieldsTest.class)
JAVA_DIR="src/Testsuite/javaFiles"
REF_DIR="/tmp/compoiler-ref"
OUT_DIR="/tmp/compoiler-out"
PASS=0
FAIL=0
ERROR=0
mkdir -p "$REF_DIR" "$OUT_DIR"
for javafile in "$JAVA_DIR"/*.java; do
classname=$(basename "$javafile" .java)
echo -n "Testing $classname ... "
# Run our compiler
compiler_out=$(src/Main "$javafile" 2>&1)
if [ $? -ne 0 ]; then
echo "ERROR (compiler crashed)"
echo " $compiler_out"
((ERROR++))
continue
fi
# Move generated .class to OUT_DIR
mv "out/${classname}.class" "$OUT_DIR/" 2>/dev/null
if [ ! -f "$OUT_DIR/${classname}.class" ]; then
echo "ERROR (no .class generated)"
((ERROR++))
continue
fi
# Compile reference with javac
javac "$javafile" -d "$REF_DIR" 2>/dev/null
if [ ! -f "$REF_DIR/${classname}.class" ]; then
echo "ERROR (javac failed)"
((ERROR++))
continue
fi
# Compare structure and bytecode only (strip CP indices from instructions,
# skip debug info like LineNumberTable and SourceFile)
normalize() {
javap -c "$1" 2>&1 \
| grep -v "^Classfile\|Last modified\|SHA-256\|Compiled from\|LineNumberTable\|line [0-9]\|SourceFile" \
| sed 's/#[0-9]*/\#N/g' \
| sed 's/[[:space:]]*\/\/.*$//'
}
ref=$(normalize "$REF_DIR/${classname}.class")
mine=$(normalize "$OUT_DIR/${classname}.class")
if diff <(echo "$ref") <(echo "$mine") > /dev/null 2>&1; then
echo "PASS"
((PASS++))
else
echo "FAIL"
diff <(echo "$ref") <(echo "$mine")
((FAIL++))
fi
done
echo ""
echo "Results: $PASS passed, $FAIL failed, $ERROR errors"