#!/usr/bin/env bash

test_description='graph state/path execution.'

. lib/test-lib.sh

################################################################

test_expect_code 1 'non-existant state' 'testguard TEST0 BAD'
test_expect_code 1 'non-existant request state' 'testguard TEST0 A BAD'

test_begin_subtest "state A"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} > OUTPUT &
testguard --ca-prefix TEST TEST0 A
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:TEST-A..0.UDF.INVALID
T1:TEST-B..0.UDF.INVALID
T1:TEST-C..0.UDF.INVALID
T1:TEST-D..0.UDF.INVALID
T1:TEST-A..0.UDF.INVALID
T1:TEST-A..1..
T1:TEST-A..2..
T1:TEST-A..3..
T1:TEST-A..4..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "state B"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} > OUTPUT &
testguard --ca-prefix TEST TEST0 B
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:TEST-A..0.UDF.INVALID
T1:TEST-B..0.UDF.INVALID
T1:TEST-C..0.UDF.INVALID
T1:TEST-D..0.UDF.INVALID
T1:TEST-B..1..
T1:TEST-B..2..
T1:TEST-B..3..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "path A -> B (non-requestable)"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} >OUTPUT &
testguard --ca-prefix TEST TEST0 A B
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:TEST-A..0.UDF.INVALID
T1:TEST-B..0.UDF.INVALID
T1:TEST-C..0.UDF.INVALID
T1:TEST-D..0.UDF.INVALID
T1:TEST-A..0.UDF.INVALID
T1:TEST-A..1..
T1:TEST-A..2..
T1:TEST-A..3..
T1:TEST-A..4..
T1:TEST-B..1..
T1:TEST-B..2..
T1:TEST-B..3..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "path A -> C"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} >OUTPUT &
testguard --ca-prefix TEST TEST0 A C
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:TEST-A..0.UDF.INVALID
T1:TEST-B..0.UDF.INVALID
T1:TEST-C..0.UDF.INVALID
T1:TEST-D..0.UDF.INVALID
T1:TEST-A..0.UDF.INVALID
T1:TEST-A..1..
T1:TEST-A..2..
T1:TEST-A..3..
T1:TEST-A..4..
T1:TEST-B..1..
T1:TEST-B..2..
T1:TEST-B..3..
T1:TEST-C..0.UDF.INVALID
T1:TEST-C..1..
T1:TEST-C..2..
T1:TEST-C..3..
T1:TEST-C..4..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "invalid path A -> D"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} >OUTPUT &
testguard --ca-prefix TEST --name TEST TEST0 A D
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:TEST-A..0.UDF.INVALID
T1:TEST-B..0.UDF.INVALID
T1:TEST-C..0.UDF.INVALID
T1:TEST-D..0.UDF.INVALID
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "inherited path A -> D"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} >OUTPUT &
testguard --ca-prefix TEST --name TEST TEST1 A D
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:TEST-A..0.UDF.INVALID
T1:TEST-B..0.UDF.INVALID
T1:TEST-C..0.UDF.INVALID
T1:TEST-D..0.UDF.INVALID
T1:TEST-A..0.UDF.INVALID
T1:TEST-A..1..
T1:TEST-A..2..
T1:TEST-A..3..
T1:TEST-A..4..
T1:TEST-B..1..
T1:TEST-B..2..
T1:TEST-B..3..
T1:TEST-C..0.UDF.INVALID
T1:TEST-C..1..
T1:TEST-C..2..
T1:TEST-C..3..
T1:TEST-C..4..
T1:TEST-D..-1..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "state with main jump"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} >OUTPUT &
sleep .1
caput ${IFO}:TEST-C 10
testguard --ca-prefix TEST --name TEST TEST0 C
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:TEST-A..0.UDF.INVALID
T1:TEST-B..0.UDF.INVALID
T1:TEST-C..0.UDF.INVALID
T1:TEST-D..0.UDF.INVALID
T1:TEST-C..10..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "state with run jump"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} >OUTPUT &
sleep .1
caput ${IFO}:TEST-C 9
caput ${IFO}:TEST-J 1
testguard --ca-prefix TEST --name TEST TEST0 C
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:TEST-A..0.UDF.INVALID
T1:TEST-B..0.UDF.INVALID
T1:TEST-C..0.UDF.INVALID
T1:TEST-D..0.UDF.INVALID
T1:TEST-C..9..
T1:TEST-C..0..
EOF
test_expect_equal_file OUTPUT EXPECTED

################################################################

test_done
