package org.eclipse.swt.tests.junit;

/*
 * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
 * This file is 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
 */

import org.eclipse.swt.custom.*;
import junit.framework.*;
import junit.textui.*;

/**
 * Automated Test Suite for class org.eclipse.swt.custom.TableEditor
 *
 * @see org.eclipse.swt.custom.TableEditor
 */
public class Test_org_eclipse_swt_custom_TableEditor extends Test_org_eclipse_swt_custom_ControlEditor {

public Test_org_eclipse_swt_custom_TableEditor(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_Table() {
	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Table not written");
}

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

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

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

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

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

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

public void test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TableItemI() {
	warnUnimpl("Test test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TableItemI 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_custom_TableEditor((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_Table");
	methodNames.addElement("test_dispose");
	methodNames.addElement("test_getColumn");
	methodNames.addElement("test_setColumnI");
	methodNames.addElement("test_getItem");
	methodNames.addElement("test_setItemLorg_eclipse_swt_widgets_TableItem");
	methodNames.addElement("test_setEditorLorg_eclipse_swt_widgets_Control");
	methodNames.addElement("test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TableItemI");
	methodNames.addAll(Test_org_eclipse_swt_custom_ControlEditor.methodNames()); // add superclass method names
	return methodNames;
}
protected void runTest() throws Throwable {
	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Table")) test_ConstructorLorg_eclipse_swt_widgets_Table();
	else if (getName().equals("test_dispose")) test_dispose();
	else if (getName().equals("test_getColumn")) test_getColumn();
	else if (getName().equals("test_setColumnI")) test_setColumnI();
	else if (getName().equals("test_getItem")) test_getItem();
	else if (getName().equals("test_setItemLorg_eclipse_swt_widgets_TableItem")) test_setItemLorg_eclipse_swt_widgets_TableItem();
	else if (getName().equals("test_setEditorLorg_eclipse_swt_widgets_Control")) test_setEditorLorg_eclipse_swt_widgets_Control();
	else if (getName().equals("test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TableItemI")) test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TableItemI();
	else super.runTest();
}
}
