<?xml version="1.0" encoding="UTF-8"?>
<Mission xmlns="Tethys"
       xmlns:Control="Tethys/Control"
       xmlns:Guidance="Tethys/Guidance" 
       xmlns:Units="Tethys/Units"
       xmlns:Universal="Tethys/Universal"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="Tethys http://okeanids.mbari.org/tethys/Xml/Tethys.xsd
                           Tethys/Control http://okeanids.mbari.org/tethys/Xml/Control.xsd
                           Tethys/Guidance http://okeanids.mbari.org/tethys/Xml/Guidance.xsd
                           Tethys/Units http://okeanids.mbari.org/tethys/Xml/Units.xsd
                           Tethys/Universal http://okeanids.mbari.org/tethys/Xml/Universal.xsd"
       Id="TestMission">

<!--
TEST_WITH_VALGRIND
TEST_CODE_START

# If the script makes it to the end without a Critical error, it passed
passed = True

TEST_CODE_END
-->

    <DefineArg Name="Threshold"><Units:second/><Value>0.5</Value></DefineArg>

    <DefineArg Name="TwoSec"><Units:second/><Value>2</Value></DefineArg>

    <DefineArg Name="FiveSec"><Units:second/><Value>5</Value></DefineArg>

    <DefineArg Name="SevenSec"><Units:second/><Value>7</Value></DefineArg>

    <Insert Id="Timeout" Filename="RegressionTests/InsertTimedProgression.xml"/>

    <Syslog>Elapsed1 is <Arg Name="Timeout:Elapsed"/><Units:second/>, expected <Arg Name="Timeout:Timeout"/><Units:second/></Syslog>

    <Aggregate Id="Test2">

        <Description>
            Run long and short timeouts in progression
        </Description>

        <DefineOutput Name="Elapsed"><Units:second/><Value>0</Value></DefineOutput>

        <Sequence/>

        <Call PriorityHere="true" Id="TimeoutA" RefId="Timeout"/>

        <Insert Id="TimeoutB" Filename="RegressionTests/InsertTimedProgression.xml">
            <RedefineArg Name="Timeout"><Arg Name="FiveSec"/></RedefineArg>
        </Insert>

        <Assign><Parallel/><Arg Name="Elapsed"/><Elapsed/></Assign>

    </Aggregate>

    <Syslog>Elapsed2A is <Arg Name="Test2:TimeoutA:Elapsed"/><Units:second/>, expected <Arg Name="Timeout:Timeout"/><Units:second/></Syslog>

    <Syslog>Elapsed2B is <Arg Name="Test2:TimeoutB:Elapsed"/><Units:second/>, expected <Arg Name="FiveSec"/><Units:second/></Syslog>

    <Syslog>Elapsed2 is <Arg Name="Test2:Elapsed"/><Units:second/>, expected <Arg Name="Timeout:Timeout"/><Units:second/></Syslog>

    <Aggregate Id="Test3">

        <Description>
            Run short and long timeouts in progression
        </Description>

        <DefineOutput Name="Elapsed"><Units:second/><Value>0</Value></DefineOutput>

        <Sequence/>

        <Insert Id="TimeoutA" Filename="RegressionTests/InsertTimedProgression.xml">
            <RedefineArg Name="Timeout"><Arg Name="FiveSec"/></RedefineArg>
        </Insert>

        <Call PriorityHere="true" Id="TimeoutB" RefId="Timeout"/>

        <Assign><Parallel/><Arg Name="Elapsed"/><Elapsed/></Assign>

    </Aggregate>

    <Syslog>Elapsed3A is <Arg Name="Test3:TimeoutA:Elapsed"/><Units:second/>, expected <Arg Name="FiveSec"/><Units:second/></Syslog>

    <Syslog>Elapsed3B is <Arg Name="Test3:TimeoutB:Elapsed"/><Units:second/>, expected <Arg Name="Timeout:Timeout"/><Units:second/></Syslog>

    <Syslog>Elapsed3 is <Arg Name="Test3:Elapsed"/><Units:second/>, expected <Arg Name="Timeout:Timeout"/><Units:second/></Syslog>

    <Aggregate Id="Test4">

        <Description>
            Assign different value to timeout in progression, with no Redefine
        </Description>

        <Sequence/>

        <Call PriorityHere="true" Id="Timeout" RefId="Timeout"/>

        <Aggregate Id="ReAssign">

            <Progression/>

            <Assign><Sequence/><Arg Name="Timeout:Timeout"/><Arg Name="FiveSec"/></Assign>

        </Aggregate>

    </Aggregate>

    <Syslog>Elapsed4 is <Arg Name="Test4:Timeout:Elapsed"/><Units:second/>, expected <Arg Name="FiveSec"/><Units:second/></Syslog>

    <Aggregate Id="Test5">

        <Description>
            Assign different value to timeout in progression, override Redefine
        </Description>

        <Sequence/>

        <Insert Id="Timeout" Filename="RegressionTests/InsertTimedProgression.xml">
            <RedefineArg Name="Timeout"><Arg Name="SevenSec"/></RedefineArg>
        </Insert>

        <Aggregate Id="ReAssign">

            <Progression/>

            <Syslog Id="SmallPause"></Syslog>

            <Assign><Sequence/><Arg Name="Timeout:Timeout"/><Arg Name="FiveSec"/></Assign>

        </Aggregate>

    </Aggregate>

    <Syslog>Elapsed5 is <Arg Name="Test5:Timeout:Elapsed"/><Units:second/>, expected <Arg Name="FiveSec"/><Units:second/></Syslog>

    <Aggregate Id="Test6">

        <Description>
            Assign different value to timeout in progression, by changing Arg
            used in Redefine
        </Description>

        <Sequence/>

        <Insert Id="Timeout" Filename="RegressionTests/InsertTimedProgression.xml">
            <RedefineArg Name="Timeout"><Arg Name="SevenSec"/></RedefineArg>
        </Insert>

        <Aggregate Id="ReAssign">

            <Progression/>

            <Syslog Id="SmallPause"></Syslog>

            <Assign><Sequence/><Arg Name="SevenSec"/><Arg Name="FiveSec"/></Assign>

        </Aggregate>

    </Aggregate>

    <Syslog>Elapsed6 is <Arg Name="Test6:Timeout:Elapsed"/><Units:second/>, expected <Arg Name="FiveSec"/><Units:second/></Syslog>

    <Assign><Sequence/><Arg Name="SevenSec"/><Units:second/><Value>7</Value></Assign>

    <Aggregate Id="Test7">

        <Description>
            Assign different value to timeout in progression, override Redefine,
            then changing Arg used in Redefine
        </Description>

        <Sequence/>

        <Insert Id="Timeout" Filename="RegressionTests/InsertTimedProgression.xml">
            <RedefineArg Name="Timeout"><Arg Name="SevenSec"/></RedefineArg>
        </Insert>

        <Aggregate Id="ReAssign">

            <Progression/>

            <Syslog Id="SmallPause"></Syslog>

            <Assign><Sequence/><Arg Name="Timeout:Timeout"/><Arg Name="TwoSec"/></Assign>

            <Syslog Id="SmallPause"></Syslog>

            <Assign><Sequence/><Arg Name="SevenSec"/><Arg Name="FiveSec"/></Assign>

        </Aggregate>

    </Aggregate>

    <Syslog>Elapsed7 is <Arg Name="Test7:Timeout:Elapsed"/><Units:second/>, expected <Arg Name="FiveSec"/><Units:second/></Syslog>

    <Assign><Sequence/><Arg Name="SevenSec"/><Units:second/><Value>7</Value></Assign>

    <Aggregate Id="Test8">

        <Description>
            Assign different value to timeout in progression, by changing Arg
            used in Redefine, then override Redefine
        </Description>

        <Sequence/>

        <Insert Id="Timeout" Filename="RegressionTests/InsertTimedProgression.xml">
            <RedefineArg Name="Timeout"><Arg Name="SevenSec"/></RedefineArg>
        </Insert>

        <Aggregate Id="ReAssign">

            <Progression/>

            <Syslog Id="SmallPause"></Syslog>

            <Assign><Sequence/><Arg Name="SevenSec"/><Arg Name="TwoSec"/></Assign>

            <Syslog Id="SmallPause"></Syslog>

            <Assign><Sequence/><Arg Name="Timeout:Timeout"/><Arg Name="FiveSec"/></Assign>

        </Aggregate>

    </Aggregate>

    <Syslog>Elapsed8 is <Arg Name="Test8:Timeout:Elapsed"/><Units:second/>, expected <Arg Name="FiveSec"/><Units:second/></Syslog>

    <Aggregate Id="Evaluate">

        <Sequence/>

        <Break>
            <Abs><Arg Name="Timeout:Elapsed"/><Sub><Arg Name="Timeout:Timeout"/></Sub></Abs>
            <Lt><Arg Name="Threshold"/></Lt>
            <And><Abs><Arg Name="Test2:TimeoutA:Elapsed"/><Sub><Arg Name="Timeout:Timeout"/></Sub></Abs><Lt><Arg Name="Threshold"/></Lt></And>
            <And><Abs><Arg Name="Test2:TimeoutB:Elapsed"/><Sub><Arg Name="FiveSec"/></Sub></Abs><Lt><Arg Name="Threshold"/></Lt></And>
            <And><Abs><Arg Name="Test2:Elapsed"/><Sub><Arg Name="Timeout:Timeout"/></Sub></Abs><Lt><Arg Name="Threshold"/></Lt></And>
            <And><Abs><Arg Name="Test3:TimeoutA:Elapsed"/><Sub><Arg Name="FiveSec"/></Sub></Abs><Lt><Arg Name="Threshold"/></Lt></And>
            <And><Abs><Arg Name="Test3:TimeoutB:Elapsed"/><Sub><Arg Name="Timeout:Timeout"/></Sub></Abs><Lt><Arg Name="Threshold"/></Lt></And>
            <And><Abs><Arg Name="Test3:Elapsed"/><Sub><Arg Name="Timeout:Timeout"/></Sub></Abs><Lt><Arg Name="Threshold"/></Lt></And>
            <And><Abs><Arg Name="Test4:Timeout:Elapsed"/><Sub><Arg Name="FiveSec"/></Sub></Abs><Lt><Arg Name="Threshold"/></Lt></And>
            <And><Abs><Arg Name="Test5:Timeout:Elapsed"/><Sub><Arg Name="FiveSec"/></Sub></Abs><Lt><Arg Name="Threshold"/></Lt></And>
            <And><Abs><Arg Name="Test6:Timeout:Elapsed"/><Sub><Arg Name="FiveSec"/></Sub></Abs><Lt><Arg Name="Threshold"/></Lt></And>
            <And><Abs><Arg Name="Test7:Timeout:Elapsed"/><Sub><Arg Name="FiveSec"/></Sub></Abs><Lt><Arg Name="Threshold"/></Lt></And>
            <And><Abs><Arg Name="Test8:Timeout:Elapsed"/><Sub><Arg Name="FiveSec"/></Sub></Abs><Lt><Arg Name="Threshold"/></Lt></And>
        </Break>

        <Syslog Severity="Critical">Differences exceeded threshold of <Arg Name="Threshold"/><Units:second/></Syslog>

    </Aggregate>

</Mission>
