67 lines
1.7 KiB
Bash
Executable File
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"
|