/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 * 
 *************************************************************/


#ifndef __com_sun_star_test_XTest_idl__
#define __com_sun_star_test_XTest_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif

#ifndef __com_sun_star_test_XTestListener_idl__
#include <com/sun/star/test/XTestListener.idl>
#endif


//=============================================================================

module com { module sun { module star { module test { 

//=============================================================================
/** 
	A simple interface to test a service or interface implementation.
*/
published interface XTest: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
	/** 
		Test the object TestObject against the test specified with TestName. This test
		does not change the semantic state of the object, so it can be called on a existing
		component that will used further on. Note: This can be a strong test limitation. 
		There are some components, that cannot perform their full test scenario. 
		@param TestName		
			the name of the test. Must be an interface, service, or implementation name.
			Note: The name is only used by the test component to distinguish between test 
			scenarios.
		@param TestObject	
				The instance to be tested.
		@throws IllegalArgumentException  
			if the test does not support TestName or TestObject is null.
	*/
	void testInvariant( [in] string TestName,
			 [in] com::sun::star::uno::XInterface TestObject )
			raises( com::sun::star::lang::IllegalArgumentException );

	//-------------------------------------------------------------------------
	/** 
		Test the object TestObject against the test specified with TestName. 
		This test changes the state of the object. The object may be useless 
		afterwards (e.g., a closed XOutputStream). The method in general may 
		be called multiple times with a new test object instance. Note: Each test 
		scenario should be independent of each other, so even if a scenario 
		didn't pass the test, the other test can still be performed. 
		The error messages are cumulative.
		
		@param TestName 
			The name of the test. Must be an interface, service, or 
			implementation name. Note: The name is only used by the test component 
			to distinguish between test scenarios.
		@param TestObject 
				The instance to be tested.
		@param hTestHandle 
				Internal test handle. Handle for first test is always 0.
			Handle of next test is  returned by the method.
		@return Handle of the next test. -1 if this was the last test.
		
		@throws IllegalArgumentException 
			if the test does not support TestName or TestObject is null.
	*/
	long test( [in] string TestName,
			 [in] com::sun::star::uno::XInterface TestObject,
			 [in] long hTestHandle )
			raises( com::sun::star::lang::IllegalArgumentException );

	//-------------------------------------------------------------------------
	/** 
		Test the object TestObject against the test specified with TestName	using 
		several threads. That does NOT mean that testMultiThread should	implement 
		a test using several threads but that this test method should be designed 
		to be called by several threads. So for example, it has to take into consideration 
		that a test object state that is changed by the method	can be 
		changed again by another thread. So it's not necessarily a mistake if an
		expected state can't be confirmed after setting it. Besides that, everything 
		is the same as described for the test method.

		If this way of testing with multiple threads is not appropriate for the
		component to be tested this method should not be implemented (it should 
		only return -1) and a special multithread test adapted to the special 
		needs of testing this component should be integrated in the test method.

		@param TestName 
			The name of the test. Must be an interface, service or 
			implementation name. Note: The name is only used by the test component 
			to distinguish between test scenarios.
		@param TestObject 
			The instance to be tested.
		@param hTestHandle 
			Internal test handle. Handle for first test is always 0.
			Handle of next test is  returned by the method.
		@return Handle of the next test. -1 if this was the last test.
		
		@throws IllegalArgumentException 
			if the test does not support TestName or TestObject is null.
	*/
	long testMultiThread( [in] string TestName,
			 [in] com::sun::star::uno::XInterface TestObject,
			 [in] long hTestHandle )
			raises( com::sun::star::lang::IllegalArgumentException );

	//-------------------------------------------------------------------------
	/**	registers an event listener, which will be called for reporting 
		errors/exceptions and warnings and for protocol purpuses.
	*/
	void addTestListener( [in] XTestListener xListener );

	//-------------------------------------------------------------------------
	/**	unregisters an event listener which was registered with
		<member>XTest::addTestListener()</member>.

	*/
	void removeTestListener( [in] XTestListener xListener );

};

//=============================================================================

}; }; }; }; 

#endif
