#! /usr/bin/env bash
#
# Generate a dune file for our test files using glob patterns.
# See https://discuss.ocaml.org/t/creating-generic-rules-in-dune/7757/5
#
set -eu

generate_in_folder() {
  # available variables: $folder, $atddiff_options

  echo "Generating 'dune' file in $(pwd)"
  echo "  atddiff options: $atddiff_options"

  shopt -s failglob
  test_names=$(for x in *_old.atd; do echo $(basename "$x" _old.atd); done)

  cat > dune <<EOF
; Generated by $0
; For adding tests, read the instructions in the Makefile.
EOF
  for name in $test_names; do
    if ! [[ -e "$name"_new.atd ]]; then
      echo "Missing test file '${name}_new.atd'" >&2
      exit 1
    fi
    cat >> dune <<EOF
(rule
 (targets $name.txt)
 (deps ${name}_old.atd ${name}_new.atd)
 (action (run %{bin:atddiff} %{deps} -o %{targets} $atddiff_options)))

(rule
 (alias runtest)
 (deps $name.txt)
 (action (diff $name.expected.txt $name.txt)))

EOF

    # Create empty output files if they don't exist already so as to save
    # some manual labor
    if ! [[ -e "$name".expected.txt ]]; then
      touch "$name".expected.txt
    fi
  done
}

folders="
  default
  filter
  filter_backward
  filter_forward
  json_defaults
  json_defaults_old
  json_defaults_new
  json_output
  no_locations_text
  no_locations_json
"

for folder in $folders; do
  atddiff_options="--exit-success "
  case "$folder" in
    default)
      ;;
    filter)
      atddiff_options+="--backward --forward --types a,b"
      ;;
    filter_backward)
      atddiff_options+="--backward"
      ;;
    filter_forward)
      atddiff_options+="--forward"
      ;;
    json_defaults)
      atddiff_options+="--json-defaults"
      ;;
    json_defaults_old)
      atddiff_options+="--json-defaults-old"
      ;;
    json_defaults_new)
      atddiff_options+="--json-defaults-new"
      ;;
    json_output)
      atddiff_options+="--output-format json"
      ;;
    no_locations_text)
      atddiff_options+="--no-locations -f text"
      ;;
    no_locations_json)
      atddiff_options+="--no-locations -f json"
      ;;
    *)
      echo "Error: Unknown atddiff command for test folder $folder" >&2
      exit 1
      ;;
  esac
  (
    cd "$folder"
    generate_in_folder
  )
done
