#!/bin/sh
# SPDX-License-Identifier: MIT

PTEST_DIR=$(cd "$(dirname "$0")" && pwd)
CFLAGS="-O2 -Wall -I$PTEST_DIR/include -L$PTEST_DIR/lib"

# bhaible tests validate by comparing paired output lines
for t in test-call test-callback; do
    src="$PTEST_DIR/testsuite/libffi.bhaible/$t.c"
    if gcc $CFLAGS -o "$PTEST_DIR/$t" "$src" -lffi 2>&1; then
        "$PTEST_DIR/$t" > "$PTEST_DIR/$t.out" 2>&1
        if ! LC_ALL=C uniq -u < "$PTEST_DIR/$t.out" | grep -q .; then
            echo "PASS: libffi.bhaible/$t"
        else
            echo "FAIL: libffi.bhaible/$t"
            cat "$PTEST_DIR/$t.out"
        fi
    else
        echo "SKIP: libffi.bhaible/$t"
    fi
    rm -f "$PTEST_DIR/$t" "$PTEST_DIR/$t.out"
done

# Individual test programs from upstream dejagnu suites
for suite in libffi.call libffi.closures libffi.complex libffi.go libffi.threads; do
    dir="$PTEST_DIR/testsuite/$suite"
    [ -d "$dir" ] || continue

    extra=""
    [ "$suite" = "libffi.threads" ] && extra="-lpthread"

    for src in "$dir"/*.c "$dir"/*.cc; do
        [ -f "$src" ] || continue
        grep -q "dg-do run" "$src" || continue

        name=$(basename "${src%.*}")
        case "$src" in
            *.cc) cc="g++";;
            *)    cc="gcc";;
        esac

        if $cc $CFLAGS -o "$PTEST_DIR/$name" "$src" -lffi $extra 2>&1; then
            if "$PTEST_DIR/$name" 2>&1; then
                echo "PASS: $suite/$name"
            else
                echo "FAIL: $suite/$name"
            fi
        else
            echo "SKIP: $suite/$name"
        fi
        rm -f "$PTEST_DIR/$name"
    done
done
