/* $Id$
 *
 * Copyright 2007-2008 Cisco Systems Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy
 * of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

module org.apache.etch.tests

/** The first big test */
@Direction(Both)
@Timeout(4000)
service Test1
{
	/** blah */
	const boolean BOOL1 = false
	
	/** blah */
	const boolean BOOL2 = true
	
	/** blah */
	const byte BYTE1 = -128
	
	/** blah */
	const byte BYTE2 = -1
	
	/** blah */
	const byte BYTE3 = 0
	
	/** blah */
	const byte BYTE4 = 1
	
	/** blah */
	const byte BYTE5 = 127
	
	/** blah */
	const short SHORT1 = -32768
	
	/** blah */
	const short SHORT2 = -1
	
	/** blah */
	const short SHORT3 = 0
	
	/** blah */
	const short SHORT4 = 1
	
	/** blah */
	const short SHORT5 = 32767
	
	/** blah */
	const int INT1 = -2147483648
	
	/** blah */
	const int INT2 = -1
	
	/** blah */
	const int INT3 = 0
	
	/** blah */
	const int INT4 = 1
	
	/** blah */
	const int INT5 = 2147483647
	
	/** blah */
	const long LONG1 = -9223372036854775808
	
	/** blah */
	const long LONG2 = -1
	
	/** blah */
	const long LONG3 = 0
	/** blah */
	const long LONG4 = 1
	/** blah */
	const long LONG5 = 9223372036854775807
	
	/** blah */
	const float FLOAT1 = 1.4e-45
	/** blah */
	const float FLOAT2 = -1
	/** blah */
	const float FLOAT3 = 0
	/** blah */
	const float FLOAT4 = 1
	/** blah */
	const float FLOAT5 = 3.4028235e38
	
	/** blah */
	const double DOUBLE1 = 4.9e-324
	/** blah */
	const double DOUBLE2 = -1
	/** blah */
	const double DOUBLE3 = 0
	/** blah */
	const double DOUBLE4 = 1
	/** blah */
	const double DOUBLE5 = 1.7976931348623157e308
	
	/** blah */
	const string STRING1 = ""
	/** blah */
	const string STRING2 = "a"
	/** blah */
	const string STRING3 = "abc"
	/** blah */
	const string STRING4 = "a\tb\tc\r\n"
	/** blah */
	const string STRING5 = "x\u0020x" // space
	/** blah */
	const string STRING6 = "x\u00bfx" // inverted question mark
	/** blah */
	const string STRING7 = "x\u03a9x" // greek omega
	/** blah */
	const string STRING8 = "x\\x" // backslash
	/** blah */
	const string STRING9 = "x'x" // apostrophe
	/** blah */
	const string STRING10 = "x\"x" // double quote
	
	/** blah */
	enum E1( /** value */ A, /** value */ B, /** value */ C )
	
	/** blah */
	struct S1( /** value */ int x, /** value */ int y, /** value */ int z )
	
	/** blah */
	struct S2( /** value */ S1 a, /** value */ S1 b, /** value */ E1 c )
	
	/** struct with object as param */
	struct S3 ( /** value */ string tipe, /** value */ object x )
	
	/** struct with array of object as param */
	struct S4 ( /** value */ string tipe, /** value */ object[] x )
	
	/** blah */
	@Extern(java, "StrIntHashMap", "org.apache.etch.bindings.java.util.StrIntHashMap",
		"StrIntHashMapSerializer", "org.apache.etch.bindings.java.util.StrIntHashMapSerializer")
	@Extern(csharp, "StrIntHashMap", "Org.Apache.Etch.Bindings.Csharp.Util",
		"StrIntHashMapSerializer", "Org.Apache.Etch.Bindings.Csharp.Util")
	extern Blob
	
	/** blah */
	exception Excp1( /** value */ string msg, /** value */ int code )
	
	/** blah */
	@Unchecked
	exception Excp2()
	
	/** blah */
	@Unchecked(true)
	exception Excp3()
	
	/** blah */
	@Unchecked(false)
	exception Excp4()
	
	/** Exception with object as param */
	exception Excp5( /** value */ string msg, /** value */ int code, /** value */ object x )
	
	/** Exception with array of object as param */
	exception Excp6( /** value */ string msg, /** value */ int code, /** value */ object[] x )	
	
	/** do absolutely nothing */
	@AsyncReceiver(Free)
	void nothing()
	
	/**
	 * Increments a value by one.
	 * @param x a value
	 * @return a value one larger.
	 */
	@AsyncReceiver(Queued)
	int incr( int x )

	/**
	 * @param x a value
	 * @param y a value
	 * @return a value
	 */
	int add(int x, int y )
	
	/**
	 * @param x a value
	 * @param y a value
	 * @return a value
	 */
	int sub( int x, int y )
	
	/**
	 * @param x a value
	 * @return a value
	 */
	int sum( int[] x )
	
	/**
	 * @param e a value
	 * @param x a value
	 * @return a value
	 */
	int trans( E1 e, int x )
	
	/**
	 * @param a a value
	 * @param b a value
	 * @return a value
	 */
	double dist( S1 a, S1 b )
	
	/**
	 * @param n a value
	 * @param x a value
	 * @return a value
	 */
	int[] fill( int n, int x )
	
	/**
	 * @param n a value
	 * @param o a value
	 * @return a value
	 */
	object[] fillObject( int n, object o)
	
	/**
	 * @param msg a value
	 * @param code a value
	 * @throws Excp1
	 */
	void blow( string msg, int code ) throws Excp1
	
	/**
	 * @param e a value
	 * @return a value
	 * @throws Excp3
	 * @throws Excp4
	 */
	int beets( E1 e ) throws Excp3, Excp4
	
	/**
	 * @param msg
	 * @param code
	 * @param value
	 * @throws Excp5
	 */
	void throwExcp5 ( string msg, int code, object value ) throws Excp5
	
	/**
	 * @param msg
	 * @param code
	 * @param value
	 * @throws Excp6
	 */
	void throwExcp6 ( string msg, int code, object[] value ) throws Excp6
			
	// try one of every type of parameter and result...
	
	/**
	 * @param a
	 * @return a
	 */
	boolean p_boolean( boolean a )
	
	/** 
	 * @param a
	 * @return a
	 */
	boolean[] p_boolean_array( boolean[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	byte p_byte( byte a )
	
	/** 
	 * @param a
	 * @return a
	 */
	byte[] p_byte_array( byte[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	short p_short( short a )
	
	/** 
	 * @param a
	 * @return a
	 */
	short[] p_short_array( short[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	int p_int( int a )
	
	/** 
	 * @param a
	 * @return a
	 */
	int[] p_int_array( int[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	long p_long( long a )
	
	/** 
	 * @param a
	 * @return a
	 */
	long[] p_long_array( long[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	float p_float( float a )
	
	/** 
	 * @param a
	 * @return a
	 */
	float[] p_float_array( float[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	double p_double( double a )
	
	/** 
	 * @param a
	 * @return a
	 */
	double[] p_double_array( double[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	string p_string( string a )
	
	/** 
	 * @param a
	 * @return a
	 */
	string[] p_string_array( string[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	E1 p_E1( E1 a )
	
	/** 
	 * @param a
	 * @return a
	 */
	E1[] p_E1_array( E1[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	S1 p_S1( S1 a )
	
	/** 
	 * @param a
	 * @return a
	 */
	S1[] p_S1_array( S1[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	S2 p_S2( S2 a )
	
	/** 
	 * @param a
	 * @return a
	 */
	S2[] p_S2_array( S2[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	Blob p_Blob( Blob a )
	
	/** 
	 * @param a
	 * @return a
	 */
	Blob[] p_Blob_array( Blob[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	object p_object( object a )
		
	/** 
	 * @param a
	 * @return a
	 */
	object[] p_object_array( object[] a )
	
	/** 
	 * @param a
	 * @return a
	 */
	S3 p_object_struct( S3 a )
	
	/** 
	 * @param a
	 * @return a
	 */
	S4 p_object_struct_array( S4 a )
	
	/**
	 * @return a value
	 */
	@Authorize( isTrue )
	int alwaysWorks()
	
	/**
	 * @return a value
	 */
	boolean isTrue()
	
	/** blah */
	@Authorize( isFalse )
	void alwaysFails()
	
	/**
	 * @return a value
	 */
	boolean isFalse()
	
	// null
	
	/** blah */
	@Authorize( can_m1 )
	void m1()
	
	/**
	 * @return a value
	 */
	boolean can_m1()
	
	// literal constants
	
	/** blah */
	@Authorize( can_m2, null )
	void m2()
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m2( boolean x )
	
	/** blah */
	@Authorize( can_m3, false )
	void m3()
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m3( boolean x )
	
	/** blah */
	@Authorize( can_m4, true )
	void m4()
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m4( boolean x )
	
	/** blah */
	@Authorize( can_m5, 23 )
	void m5()
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m5( byte x )
	
	/** blah */
	@Authorize( can_m6, 2323 )
	void m6()
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m6( short x )
	
	/** blah */
	@Authorize( can_m7, 23232323 )
	void m7()
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m7( int x )
	
	/** blah */
	@Authorize( can_m8, 2323232323232323 )
	void m8()
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m8( long x )
	
	/** blah */
	@Authorize( can_m9, 3.1415926535897932384626433832795 )
	void m9()
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m9( float x )
	
	/** blah */
	@Authorize( can_m10, 3.1415926535897932384626433832795 )
	void m10()
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m10( double x )
	
	/** blah */
	@Authorize( can_m11, "abc" )
	void m11()
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m11( string x )
	
	/** blah */
	@Authorize( can_m12, INT1 )
	void m12()
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m12( int x )
	
	/**
	 * @param k a value
	 */
	@Authorize( can_m13, k )
	void m13( int k )
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m13( int x )
	
	/**
	 * @param k a value
	 */
	@Authorize( can_m14, k.x )
	void m14( S1 k )
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m14( int x )
	
	/** blah */
	@Authorize( can_m15, E1.A )
	void m15()
	
	/**
	 * @param x a value
	 * @return a value
	 */
	boolean can_m15( E1 x )
}
