#!/bin/sh
set -e
set -u
set -x


SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
PROG_DIR="$SCRIPT_DIR/../programs"

ZSTD="$PROG_DIR/zstd"
ZSTD_COMPRESS="$PROG_DIR/zstd-compress"
ZSTD_DECOMPRESS="$PROG_DIR/zstd-decompress"
ZSTD_NOLEGACY="$PROG_DIR/zstd-nolegacy"
ZSTD_DICTBUILDER="$PROG_DIR/zstd-dictBuilder"
ZSTD_FRUGAL="$PROG_DIR/zstd-frugal"
ZSTD_NOMT="$PROG_DIR/zstd-nomt"

println() {
    printf '%b\n' "${*}"
}

die() {
    println "$@" 1>&2
    exit 1
}

symbol_present() {
	(nm $1 || echo "symbol_present $@ failed") | grep $2
}

symbol_not_present() {
	symbol_present $@ && die "Binary '$1' mistakenly contains symbol '$2'" ||:
}

compress_not_present() {
	symbol_not_present "$1" ZSTD_compress
}

decompress_not_present() {
	symbol_not_present "$1" ZSTD_decompress
}

dict_not_present() {
	symbol_not_present "$1" ZDICT_
	symbol_not_present "$1" COVER_
}

cliextra_not_present() {
	symbol_not_present "$1" TRACE_
	symbol_not_present "$1" BMK_
}

legacy_not_present() {
	symbol_not_present "$1" ZSTDv0
}

test_help() {
	"$1" --help | grep -- "$2"
}

test_no_help() {
	test_help $@ && die "'$1' supports '$2' when it shouldn't" ||:
}

extras_not_present() {
	dict_not_present $@
	legacy_not_present $@
	cliextra_not_present $@
	test_no_help $@ "--train"
	test_no_help $@ "-b#"
}

test_compress() {
	echo "hello" | "$1" | "$ZSTD" -t
}

test_decompress() {
	echo "hello" | "$ZSTD" | "$1" -t
}

test_zstd() {
	test_compress $@
	test_decompress $@
}

extras_not_present "$ZSTD_FRUGAL"
extras_not_present "$ZSTD_COMPRESS"
extras_not_present "$ZSTD_DECOMPRESS"

compress_not_present "$ZSTD_DECOMPRESS"

decompress_not_present "$ZSTD_COMPRESS"
decompress_not_present "$ZSTD_DICTBUILDER"

cliextra_not_present "$ZSTD_DICTBUILDER"

legacy_not_present "$ZSTD_DICTBUILDER"
legacy_not_present "$ZSTD_NOLEGACY"

symbol_not_present "$ZSTD" ZSTDv01
symbol_not_present "$ZSTD" ZSTDv02
symbol_not_present "$ZSTD" ZSTDv03
symbol_not_present "$ZSTD" ZSTDv04

test_compress "$ZSTD_COMPRESS"
test_decompress "$ZSTD_DECOMPRESS"

test_zstd "$ZSTD_FRUGAL"
test_zstd "$ZSTD_NOLEGACY"

test_help "$ZSTD" '-b#'
test_help "$ZSTD" --train
test_help "$ZSTD_DICTBUILDER" --train

println "Success!"