#!/usr/bin/env bash

# SPDX-FileCopyrightText: 2021 Robin Vobruba <hoijui.quaero@gmail.com>
#
# SPDX-License-Identifier: Unlicense

# Exit immediately on each error and unset variable;
# see: https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
set -Eeuo pipefail
#set -Eeu

#script_dir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
#source "$script_dir/env"

# We run all tests, even if some are failing.

tests=0
failures=0

function _report_test_res() {
  res="$1"
  echo -n "TEST: "
  if [ "$res" -eq 0 ]
  then
    echo "succeeded."
  else
    echo "failed."
  fi
}

echo
echo
echo "TEST: 'cargo test' - Run unit-tests ..."
failed=0
cargo test --release || failed=1
failures=$((failures + failed))
tests=$((tests + 1))
_report_test_res "$failed"

echo
echo
echo "TEST: 'cargo fmt' - Check source code formatting ..."
failed=0
cargo fmt -- --check || failed=1
failures=$((failures + failed))
tests=$((tests + 1))
_report_test_res "$failed"

# `cargo sort` is not as readily available as other commands,
# thus we make this test optional
if cargo --list | grep "^\\s\+sort\(\\s\|\$\)" -q
then
echo
echo
echo "TEST: 'cargo sort' - Check Cargo.toml dependencies order ..."
failed=0
cargo sort --check || failed=1
failures=$((failures + failed))
tests=$((tests + 1))
_report_test_res "$failed"
fi

echo
echo
echo "TEST: 'cargo clippy' - Static code linting ..."
failed=0
cargo clippy --release -- \
  --deny clippy::pedantic \
  || failed=1
failures=$((failures + failed))
tests=$((tests + 1))
_report_test_res "$failed"

echo
echo
echo "TEST: 'cargo doc-code(-tests)' - Building documentaiton and running docu code ..."
# This flag will run your code examples as tests.
# For more, see the chapter on documentation tests:
# https://doc.rust-lang.org/rustdoc/documentation-tests.html
failed=0
cargo test --release --doc || failed=1
failures=$((failures + failed))
tests=$((tests + 1))
_report_test_res "$failed"

echo
echo
echo "TEST: 'REUSE' - Licensing meta-data check ..."
if which reuse > /dev/null
then
  failed=0
  reuse lint || failed=1
  failures=$((failures + failed))
  tests=$((tests + 1))
  _report_test_res "$failed"
else
  >&2 echo "WARNING: REUSE tool not found; skipping licensing meta-data check."
fi

echo
echo
echo "Successful tests: $((tests - failures))/$tests"
if [ $failures -eq 0 ]
then
  echo "All tests successfull!"
else
  >&2 echo "There were test failures!"
fi

exit $failures
