/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.tests.junit;

import junit.framework.*;
import junit.textui.*;

/**
 * Automated Test Suite for class org.eclipse.swt.ole.win32.OleControlSite
 *
 * @see org.eclipse.swt.ole.win32.OleControlSite
 */
public class Test_org_eclipse_swt_ole_win32_OleControlSite extends Test_org_eclipse_swt_ole_win32_OleClientSite {

public Test_org_eclipse_swt_ole_win32_OleControlSite(String name) {
	super(name);
}

public static void main(String[] args) {
	TestRunner.run(suite());
}

protected void setUp() {
	super.setUp();
}

protected void tearDown() {
	super.tearDown();
}

public void test_ConstructorLorg_eclipse_swt_widgets_CompositeILjava_lang_String() {
	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_CompositeILjava_lang_String not written");
}

public void test_addEventListenerILorg_eclipse_swt_ole_win32_OleListener() {
	warnUnimpl("Test test_addEventListenerILorg_eclipse_swt_ole_win32_OleListener not written");
}

public void test_addEventListenerLorg_eclipse_swt_ole_win32_OleAutomationILorg_eclipse_swt_ole_win32_OleListener() {
	warnUnimpl("Test test_addEventListenerLorg_eclipse_swt_ole_win32_OleAutomationILorg_eclipse_swt_ole_win32_OleListener not written");
}

public void test_addPropertyListenerILorg_eclipse_swt_ole_win32_OleListener() {
	warnUnimpl("Test test_addPropertyListenerILorg_eclipse_swt_ole_win32_OleListener not written");
}

public void test_getBackground() {
	warnUnimpl("Test test_getBackground not written");
}

public void test_getFont() {
	warnUnimpl("Test test_getFont not written");
}

public void test_getForeground() {
	warnUnimpl("Test test_getForeground not written");
}

public void test_getSitePropertyI() {
	warnUnimpl("Test test_getSitePropertyI not written");
}

public void test_removeEventListenerILorg_eclipse_swt_ole_win32_OleListener() {
	warnUnimpl("Test test_removeEventListenerILorg_eclipse_swt_ole_win32_OleListener not written");
}

public void test_removeEventListenerLorg_eclipse_swt_ole_win32_OleAutomationILorg_eclipse_swt_ole_win32_OleListener() {
	warnUnimpl("Test test_removeEventListenerLorg_eclipse_swt_ole_win32_OleAutomationILorg_eclipse_swt_ole_win32_OleListener not written");
}

public void test_removeEventListenerLorg_eclipse_swt_ole_win32_OleAutomationLorg_eclipse_swt_internal_ole_win32_GUIDILorg_eclipse_swt_ole_win32_OleListener() {
	warnUnimpl("Test test_removeEventListenerLorg_eclipse_swt_ole_win32_OleAutomationLorg_eclipse_swt_internal_ole_win32_GUIDILorg_eclipse_swt_ole_win32_OleListener not written");
}

public void test_removePropertyListenerILorg_eclipse_swt_ole_win32_OleListener() {
	warnUnimpl("Test test_removePropertyListenerILorg_eclipse_swt_ole_win32_OleListener not written");
}

public void test_setBackgroundLorg_eclipse_swt_graphics_Color() {
	warnUnimpl("Test test_setBackgroundLorg_eclipse_swt_graphics_Color not written");
}

public void test_setFontLorg_eclipse_swt_graphics_Font() {
	warnUnimpl("Test test_setFontLorg_eclipse_swt_graphics_Font not written");
}

public void test_setForegroundLorg_eclipse_swt_graphics_Color() {
	warnUnimpl("Test test_setForegroundLorg_eclipse_swt_graphics_Color not written");
}

public void test_setSitePropertyILorg_eclipse_swt_ole_win32_Variant() {
	warnUnimpl("Test test_setSitePropertyILorg_eclipse_swt_ole_win32_Variant not written");
}


public static Test suite() {
	TestSuite suite = new TestSuite();
	java.util.Vector methodNames = methodNames();
	java.util.Enumeration e = methodNames.elements();
	while (e.hasMoreElements()) {
		suite.addTest(new Test_org_eclipse_swt_ole_win32_OleControlSite((String)e.nextElement()));
	}
	return suite;
}

public static java.util.Vector methodNames() {
	java.util.Vector methodNames = new java.util.Vector();
	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeILjava_lang_String");
	methodNames.addElement("test_addEventListenerILorg_eclipse_swt_ole_win32_OleListener");
	methodNames.addElement("test_addEventListenerLorg_eclipse_swt_ole_win32_OleAutomationILorg_eclipse_swt_ole_win32_OleListener");
	methodNames.addElement("test_addPropertyListenerILorg_eclipse_swt_ole_win32_OleListener");
	methodNames.addElement("test_getBackground");
	methodNames.addElement("test_getFont");
	methodNames.addElement("test_getForeground");
	methodNames.addElement("test_getSitePropertyI");
	methodNames.addElement("test_removeEventListenerILorg_eclipse_swt_ole_win32_OleListener");
	methodNames.addElement("test_removeEventListenerLorg_eclipse_swt_ole_win32_OleAutomationILorg_eclipse_swt_ole_win32_OleListener");
	methodNames.addElement("test_removeEventListenerLorg_eclipse_swt_ole_win32_OleAutomationLorg_eclipse_swt_internal_ole_win32_GUIDILorg_eclipse_swt_ole_win32_OleListener");
	methodNames.addElement("test_removePropertyListenerILorg_eclipse_swt_ole_win32_OleListener");
	methodNames.addElement("test_setBackgroundLorg_eclipse_swt_graphics_Color");
	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
	methodNames.addElement("test_setForegroundLorg_eclipse_swt_graphics_Color");
	methodNames.addElement("test_setSitePropertyILorg_eclipse_swt_ole_win32_Variant");
	methodNames.addAll(Test_org_eclipse_swt_ole_win32_OleClientSite.methodNames()); // add superclass method names
	return methodNames;
}

protected void runTest() throws Throwable {
	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeILjava_lang_String")) test_ConstructorLorg_eclipse_swt_widgets_CompositeILjava_lang_String();
	else if (getName().equals("test_addEventListenerILorg_eclipse_swt_ole_win32_OleListener")) test_addEventListenerILorg_eclipse_swt_ole_win32_OleListener();
	else if (getName().equals("test_addEventListenerLorg_eclipse_swt_ole_win32_OleAutomationILorg_eclipse_swt_ole_win32_OleListener")) test_addEventListenerLorg_eclipse_swt_ole_win32_OleAutomationILorg_eclipse_swt_ole_win32_OleListener();
	else if (getName().equals("test_addPropertyListenerILorg_eclipse_swt_ole_win32_OleListener")) test_addPropertyListenerILorg_eclipse_swt_ole_win32_OleListener();
	else if (getName().equals("test_getBackground")) test_getBackground();
	else if (getName().equals("test_getFont")) test_getFont();
	else if (getName().equals("test_getForeground")) test_getForeground();
	else if (getName().equals("test_getSitePropertyI")) test_getSitePropertyI();
	else if (getName().equals("test_removeEventListenerILorg_eclipse_swt_ole_win32_OleListener")) test_removeEventListenerILorg_eclipse_swt_ole_win32_OleListener();
	else if (getName().equals("test_removeEventListenerLorg_eclipse_swt_ole_win32_OleAutomationILorg_eclipse_swt_ole_win32_OleListener")) test_removeEventListenerLorg_eclipse_swt_ole_win32_OleAutomationILorg_eclipse_swt_ole_win32_OleListener();
	else if (getName().equals("test_removeEventListenerLorg_eclipse_swt_ole_win32_OleAutomationLorg_eclipse_swt_internal_ole_win32_GUIDILorg_eclipse_swt_ole_win32_OleListener")) test_removeEventListenerLorg_eclipse_swt_ole_win32_OleAutomationLorg_eclipse_swt_internal_ole_win32_GUIDILorg_eclipse_swt_ole_win32_OleListener();
	else if (getName().equals("test_removePropertyListenerILorg_eclipse_swt_ole_win32_OleListener")) test_removePropertyListenerILorg_eclipse_swt_ole_win32_OleListener();
	else if (getName().equals("test_setBackgroundLorg_eclipse_swt_graphics_Color")) test_setBackgroundLorg_eclipse_swt_graphics_Color();
	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
	else if (getName().equals("test_setForegroundLorg_eclipse_swt_graphics_Color")) test_setForegroundLorg_eclipse_swt_graphics_Color();
	else if (getName().equals("test_setSitePropertyILorg_eclipse_swt_ole_win32_Variant")) test_setSitePropertyILorg_eclipse_swt_ole_win32_Variant();
	else super.runTest();
}
}
