/******************************************************************************
 * Copyright (c) ETSI 2017.
 *
 * This file is subject to copyrights owned by ETSI. Non-exclusive permission
 * is hereby granted, free of charge, to copy, reproduce and amend this file
 * under the following conditions: It is provided "as is", without warranty of any
 * kind, expressed or implied.
 * 
 * ETSI shall never be liable for any claim, damages, or other liability arising
 * from its use or inability of use.This permission does not apply to any documentation
 * associated with this file for which ETSI keeps all rights reserved. The present
 * copyright notice shall be included in all copies of whole or part of this
 * file and shall not imply any sub-license right.
 *
 * Modified by: Adrien Kirjak
 *
 ** @version  0.0.1
 ** @purpose  1:19.8, Ensure that the IUT correctly handles goto statements.
 ** @verdict  pass reject
 *****************************************************************/

module NegSem_1908_goto_statement_001 {

	type record MessageType {
  	 	integer  		field1, 
  	 	charstring  	field2
	}

    type port loopbackPort message {
	  	inout MessageType
	} with {extension "internal"}

	type component GeneralComp {	    	    
		port loopbackPort messagePort
	}	

	function f_test ( integer p_integer := 0 ) runs on GeneralComp return integer {
	 	label L1;
	 	return p_integer+1;
	}

	
	altstep AltSet1() runs on GeneralComp { 
	  	var integer v_LocalVar := f_test();   // local variable 
	  
		[] messagePort.receive {
		  	label L_A;
		  	label L_B;
		}
		 
	}

	testcase TC_NegSem_1908_goto_statement_001 () runs on GeneralComp {
	 	var MessageType v_testMessage;
	 	timer t_timer;
	 
	 	v_testMessage:=  {  
	  		field1 := 1,
	  		field2 := "test string"
	 	} 
		
		connect(self:messagePort,self:messagePort);

	 	messagePort.send(v_testMessage);
	 	t_timer.start( 1.0 );
	 	label L1;
	 	goto L2;	//cannot jump into alt statements
	 
	 	alt {
	  		[] AltSet1();		
	  		[] messagePort.receive {
		  		label L2;
		  		setverdict(pass);
		 	}
	  		[] t_timer.timeout {
		 	 	label L2;
		 	}
	 	}

	 	label L3;
		setverdict(pass);
	 
	}			

	control{
		execute(TC_NegSem_1908_goto_statement_001());
	}

}
