<?xml version="1.0" encoding="UTF-8"?>
<ccxml xmlns="http://www.w3.org/2002/09/ccxml" xmlns:conf="http://www.w3.org/2005/ccxml-conformance" version="1.0">
<!--
Serguei's infrastructure performs a loop on the 'assertions' Ecma array, based on "name_prepare_new" event for doing the "loop".

Mainly we have to different levels of assertions: 

- Main assertions, stored in 'assertions' array
- Children assertions, stored into 'assert_trace'

An assertion is a child assertion if it does not need to perform any action, but it is sufficient to test its father assertion result to determine if it passes or fails.

The test finishes when all the main assertions have been tested. Children assertions are tested after the father itself.

If an unexpected event is caught by the <transition event"*"/> a comment is printed and the loop continues with the next iteration.

An hang up event causes the interruption of test: session exits.

All the send.successful events are caught and ignored (they are generated by the loop mechanism).
-->

	<conf:docsetup/>

	<var name="newConnectionID"/>
	<var name="myConnectionID"/>

 	

	<script><![CDATA[
		var i=0;
		
		assertions[i++] = init_assertion('1154');		
		assertions[i++] = init_assertion('214');				
		assertions[i++] = init_assertion('1123');		
		
			
		var assert_last = i - 1;
		var assert_index = -1;
	
		// out of the loop assertions (children)

		// Children of 1154
		add_2_assert_trace('1157');

		// Children of 214
		add_2_assert_trace('218');
		add_2_assert_trace('1120');

		// Children of 1123
		add_2_assert_trace('1131');

		
		s_ASSERTIONS_LEFT = show_remained_assertions();
		var b_in_test = false;
	]]></script>
	
	
	<eventprocessor statevariable="current_state">
		<conf:setup type="connected"/>

		<transition event="connection.connected" state="init">
			<conf:comment expr="'Event: ' + event$.name"/>
	    <assign name="myConnectionID" expr="event$.connectionid"/>			
	    <send targettype="'ccxml'" target="session.id" name="'user.timeout'" delay="TEST_VERY_LONG_TIMEOUT"/>			
			<send targettype="'ccxml'" target="session.id" name="name_prepare_new"/>
		</transition>

		
		<transition event="user.PREPARE_NEW">
			<conf:comment expr="'Event: ' + event$.name"/>
			<if cond="assert_index &gt;= 0">
				<assign name="ASSERTION_NUM" expr="assertions[assert_index].number"/>
				<assign name="t_ASSERT_RESULT" expr="assertions[assert_index].P_F"/>
				<script>assertions[assert_index].reason = t_ASSERT_REASON;</script>
				<if cond="t_ASSERT_RESULT == s_PASS">
					<conf:pass reason="t_ASSERT_REASON"/>
					<elseif cond="t_ASSERT_RESULT == s_FAIL"/>
					<conf:fail reason="t_ASSERT_REASON"/>
					<else/>
					<conf:not_exec reason="t_ASSERT_REASON"/>
				</if>
			</if>
			<assign name="assert_index" expr="assert_index + 1"/>
			<if cond="assert_index &gt; assert_last">
				<log label="s_TA" expr="s_ASSERTIONS_LEFT"/>
				<conf:uncond_exit expr="'DONE'"/>
				<else/>
				<log label="s_TA" expr="s_ASSERTIONS_LEFT"/>
				<assign name="ASSERTION_NUM" expr=" assertions[assert_index].number"/>
				<assign name="t_ASSERT_REASON" expr="''"/>
				<script>assertions[assert_index].P_F = s_FAIL;</script>
				<assign name="current_state" expr="state_prefix + ASSERTION_NUM"/>
				<send targettype="'ccxml'" target="session.id" name="start_name_prefix + ASSERTION_NUM"/>
			</if>
		</transition>

    	      			
<!--
1154.
connection.redirect.failed
The connection.redirect.failed event MUST be emitted when an error occurs when there is an error redirecting a connection using the <redirect> element.

1157.
The connection.redirect.failed event must contain a reason field which contains a description of the reason the redirect failed.
-->


		<transition event="user.START_ASSERTION_1154" state="ASSERTION_NMBR_1154">		
			<conf:comment expr=" 'Current state : ' + current_state + ' , Event: ' + event$.name"/>					
      <redirect connectionid="myConnectionID" dest="'sip:1.1.1.345'"/>
		</transition>
		

		<transition event="connection.redirect.failed" state="ASSERTION_NMBR_1154">		
			<conf:comment expr=" 'Current state : ' + current_state + ' , Event: ' + event$.name"/>		
		 	<script>assertions[assert_index].P_F = s_PASS;</script>					
		 	
  		<!-- Begin Related Tests -->
			<assign name="ASSERTION_NUM" expr="'1157'"/>		
			<if cond="event$.reason != undefined">
				<conf:pass/>
			<else/>
				<conf:fail/>
			</if>
							
  		<!-- End Related Tests -->
  				 	
			<send targettype="'ccxml'" target="session.id" name="name_prepare_new"/>				 	    		 	
    </transition>
    
		<transition event="send.successful" state="ASSERTION_NMBR_1154">
		</transition>
		    
		<transition event="*" state="ASSERTION_NMBR_1154">		
			<conf:comment expr=" 'Current state : ' + current_state + ' , Event: ' + event$.name"/>
		 	<script>assertions[assert_index].P_F = s_FAIL;</script>					
			<assign name="t_ASSERT_REASON" expr="'connection.redirect.failed expected, '+ event$.name + ' received.'"/>			 	
			<send targettype="'ccxml'" target="session.id" name="name_prepare_new"/>				 	    		 	
    </transition>


<!--
214.
The connection.failed event MUST be emitted when an incoming or outgoing call fails to complete its connection 

218.
The connection.failed event may contain a reason attribute which contains an error code if one is available

1120.
The connection.failed event is a transition to state FAILED.

-->

		<transition event="user.START_ASSERTION_214" state="ASSERTION_NMBR_214">		
			<conf:comment expr=" 'Current state : ' + current_state + ' , Event: ' + event$.name"/>					
			<createcall dest="'xxx'" connectionid="newConnectionID"/>
		</transition>
		
		<transition event="connection.progressing" state="ASSERTION_NMBR_214" cond="event$.connectionid == newConnectionID">		
			<conf:comment expr=" 'Current state : ' + current_state + ' , Event: ' + event$.name"/>		
		</transition>


		<transition event="connection.failed" state="ASSERTION_NMBR_214" cond="event$.connectionid == newConnectionID">		
			<conf:comment expr=" 'Current state : ' + current_state + ' , Event: ' + event$.name"/>		
		 	<script>assertions[assert_index].P_F = s_PASS;</script>					
		 	
  		<!-- Begin Related Tests -->
			<assign name="ASSERTION_NUM" expr="'218'"/>		
				
			<if cond="event$.reason != undefined">
				<conf:pass/>
			<else/>
				<conf:pass/>
			</if>
							
			<assign name="ASSERTION_NUM" expr="'1120'"/>		
			<if cond="event$.connection.state == Connection.FAILED">
				<conf:pass/>
			<else/>
				<conf:fail/>
			</if>
							
  		<!-- End Related Tests -->
		 	
			<send targettype="'ccxml'" target="session.id" name="name_prepare_new"/>				 	    		 	
    </transition>
    
		<transition event="send.successful" state="ASSERTION_NMBR_214">
		</transition>
		    
		<transition event="*" state="ASSERTION_NMBR_214">		
			<conf:comment expr=" 'Current state : ' + current_state + ' , Event: ' + event$.name"/>
  					
		 	<script>assertions[assert_index].P_F = s_FAIL;</script>					
			<assign name="t_ASSERT_REASON" expr="'connection.failed expected, '+ event$.name + ' received.'"/>			 	
			<send targettype="'ccxml'" target="session.id" name="name_prepare_new"/>				 	    		 	
    </transition>
    

<!--
1123.
The error.connection.wrongstate event MUST be emitted when an application attempts a telephony operation that is not legal for the current state of the Connection Object. 

1131.
The error.connection.wrongstate event MUST contain a tagname property which must be set to the ECMAScript string value of the name of the element that produced the error (ie accept, reject, etc).


-->

		<transition event="user.START_ASSERTION_1123" state="ASSERTION_NMBR_1123">		
			<conf:comment expr=" 'Current state : ' + current_state + ' , Event: ' + event$.name"/>					
      <accept connectionid="myConnectionID"/>
		</transition>
		

		<transition event="error.connection.wrongstate" state="ASSERTION_NMBR_1123">		
			<conf:comment expr=" 'Current state : ' + current_state + ' , Event: ' + event$.name"/>		
		 	<script>assertions[assert_index].P_F = s_PASS;</script>					
		 	
  		<!-- Begin Related Tests -->
			<assign name="ASSERTION_NUM" expr="'1131'"/>		
			<if cond="event$.tagname != undefined">
				<conf:pass/>
			<else/>
				<conf:fail/>
			</if>
							
  		<!-- End Related Tests -->
		 	
			<send targettype="'ccxml'" target="session.id" name="name_prepare_new"/>				 	    		 	
    </transition>
    
		<transition event="send.successful" state="ASSERTION_NMBR_1123">
		</transition>
		    
		<transition event="*" state="ASSERTION_NMBR_1123">		
			<conf:comment expr=" 'Current state : ' + current_state + ' , Event: ' + event$.name"/>
		 	<script>assertions[assert_index].P_F = s_FAIL;</script>					
			<assign name="t_ASSERT_REASON" expr="'error.connection.wrongstate expected, '+ event$.name + ' received.'"/>			 	
			<send targettype="'ccxml'" target="session.id" name="name_prepare_new"/>				 	    		 	
    </transition>
    

    
	<!--  ***************** COMMON ******************************** -->
		<transition event="send.successful">
		</transition>


    <transition event="user.timeout">
			<assign name="current_state" expr="'GEN'"/>
			<conf:uncond_exit expr="'TEST-TIMEOUT.' + show_remained_assertions()"/>
		</transition>
		
		<transition event="connection.disconnected">
			<conf:uncond_exit expr="'CONNECTION-DISCONNECTED'"/>
		</transition>
	
		<transition event="*">
			<assign name="t_ASSERT_REASON" expr="'UNEXPECTED EVENT ' + event$.name + ' IN STATE ' + current_state"/>
				<conf:comment expr="t_ASSERT_REASON"/>
				<if cond="current_state == 'init'">
					<conf:uncond_exit expr="'Did not come out from init state.'"/>
				<else/>
					<send targettype="'ccxml'" target="session.id" name="name_prepare_new"/>
				</if>   
			</transition>
	
		</eventprocessor>
</ccxml>
