#!/bin/zsh

program=${0:h}/../mrgingham-rotate-corners
datafile=${0:h}/data/data-for-rotate-corners.vnl

numfailed=0

function check {
    name=$1
    data_post_pipe=$2
    args=$3
    data_ref=$4

    [[ -z "$data_post_pipe" ]] && data_post_pipe="cat"

    data_received=$(< $datafile ${(z)data_post_pipe} | $program ${(z)args} 2>/dev/null)

    error_code_received=$?

    if [[ "$data_ref" = "ERROR" ]] {
           # expected error
           if (( error_code_received )) {
                  echo "Test OK: $name"
              } else {
                  echo "Test failed: $name: Expected failure, but program succeeded:"
                  echo "Command:   < $datafile $data_post_pipe | $program $args"
                  echo ""
                  numfailed=$((numfailed+1))
              }
       } else {

           # did NOT expect an error
           if (( error_code_received )) {
                  echo "Test failed: $name: Expected success, but program failed"
                  echo "Command:   < $datafile $data_post_pipe | $program $args"
                  echo ""
                  numfailed=$((numfailed+1))
              } else {

                  if [[ "$data_ref" = "$data_received" ]] {
                         echo "Test OK: $name"
                     } else {
                         echo "Test failed: $name:"
                         echo "Command:   < $datafile $data_post_pipe | $program $args"
                         echo ""
                         echo "======= expected ========"
                         echo $data_ref
                         echo "======= received ========"
                         echo $data_received
                         echo "========================="
                         echo ""
                         numfailed=$((numfailed+1))
                     }
              }
       }
}






check "passthrough" "" "--gridn 3" "$(cat <<EOF
# filename x y level
a0 - - -
a1 40 400 0
a1 41 400 0
a1 42 400 0
a1 40 401 0
a1 41 401 0
a1 42 401 0
a1 40 402 0
a1 41 402 0
a1 42 402 0
a2 - - -
b0 - - -
b1 20 200 0
b1 21 200 0
b1 22 200 0
b1 20 201 0
b1 21 201 0
b1 22 201 0
b1 20 202 0
b1 21 202 0
b1 22 202 0
b2 - - -
c1 30 300 0
c1 31 300 0
c1 32 300 0
c1 30 301 0
c1 31 301 0
c1 32 301 0
c1 30 302 0
c1 31 302 0
c1 32 302 0
d0 - - -
EOF
)"

check "rot180" "" "--gridn 3 --180 a" "$(cat <<EOF
# filename x y level
a0 - - -
a1 42 402 0
a1 41 402 0
a1 40 402 0
a1 42 401 0
a1 41 401 0
a1 40 401 0
a1 42 400 0
a1 41 400 0
a1 40 400 0
a2 - - -
b0 - - -
b1 20 200 0
b1 21 200 0
b1 22 200 0
b1 20 201 0
b1 21 201 0
b1 22 201 0
b1 20 202 0
b1 21 202 0
b1 22 202 0
b2 - - -
c1 30 300 0
c1 31 300 0
c1 32 300 0
c1 30 301 0
c1 31 301 0
c1 32 301 0
c1 30 302 0
c1 31 302 0
c1 32 302 0
d0 - - -
EOF
)"

check "rot180-multiple" "" "--gridn 3 --180 a --180 b" "$(cat <<EOF
# filename x y level
a0 - - -
a1 42 402 0
a1 41 402 0
a1 40 402 0
a1 42 401 0
a1 41 401 0
a1 40 401 0
a1 42 400 0
a1 41 400 0
a1 40 400 0
a2 - - -
b0 - - -
b1 22 202 0
b1 21 202 0
b1 20 202 0
b1 22 201 0
b1 21 201 0
b1 20 201 0
b1 22 200 0
b1 21 200 0
b1 20 200 0
b2 - - -
c1 30 300 0
c1 31 300 0
c1 32 300 0
c1 30 301 0
c1 31 301 0
c1 32 301 0
c1 30 302 0
c1 31 302 0
c1 32 302 0
d0 - - -
EOF
)"

check "rot90" "" "--gridn 3 --90 a --180 b" "$(cat <<EOF
# filename x y level
a0 - - -
a1 42 400 0
a1 42 401 0
a1 42 402 0
a1 41 400 0
a1 41 401 0
a1 41 402 0
a1 40 400 0
a1 40 401 0
a1 40 402 0
a2 - - -
b0 - - -
b1 22 202 0
b1 21 202 0
b1 20 202 0
b1 22 201 0
b1 21 201 0
b1 20 201 0
b1 22 200 0
b1 21 200 0
b1 20 200 0
b2 - - -
c1 30 300 0
c1 31 300 0
c1 32 300 0
c1 30 301 0
c1 31 301 0
c1 32 301 0
c1 30 302 0
c1 31 302 0
c1 32 302 0
d0 - - -
EOF
)"

check "rot270" "" "--gridn 3 --270 a" "$(cat <<EOF
# filename x y level
a0 - - -
a1 40 402 0
a1 40 401 0
a1 40 400 0
a1 41 402 0
a1 41 401 0
a1 41 400 0
a1 42 402 0
a1 42 401 0
a1 42 400 0
a2 - - -
b0 - - -
b1 20 200 0
b1 21 200 0
b1 22 200 0
b1 20 201 0
b1 21 201 0
b1 22 201 0
b1 20 202 0
b1 21 202 0
b1 22 202 0
b2 - - -
c1 30 300 0
c1 31 300 0
c1 32 300 0
c1 30 301 0
c1 31 301 0
c1 32 301 0
c1 30 302 0
c1 31 302 0
c1 32 302 0
d0 - - -
EOF
)"

check "failure-gridn-too-low--all-data"  ""  "--gridn 2" "ERROR"
check "failure-gridn-too-high--all-data" "" "--gridn 5" "ERROR"

check "failure-gridn-too-low--one-file"  "vnl-filter filename==\"a1\""  "--gridn 2" "ERROR"
check "failure-gridn-too-high--one-file" "vnl-filter filename==\"a1\""  "--gridn 5" "ERROR"

exit $numfailed
