/*******************************************************************************
 * 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 org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.widgets.*;
import junit.framework.*;
import junit.textui.*;

/**
 * Automated Test Suite for class org.eclipse.swt.widgets.TableColumn
 *
 * @see org.eclipse.swt.widgets.TableColumn
 */
public class Test_org_eclipse_swt_widgets_TableColumn extends Test_org_eclipse_swt_widgets_Item {

protected TableColumn tableColumn;
protected Table table;

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

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

protected void setUp() {
	super.setUp();
	table = new Table(shell, SWT.SINGLE);		
	tableColumn = new TableColumn(table, SWT.NULL);	
	setWidget(tableColumn);
}

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

public void test_ConstructorLorg_eclipse_swt_widgets_TableI(){
	if (fCheckSwtNullExceptions) {
		try {
			new TableColumn(null, SWT.NULL);
			fail("No exception thrown for parent == null");
		}
		catch (IllegalArgumentException e) {
		}
	}
}

public void test_ConstructorLorg_eclipse_swt_widgets_TableII(){
	if (fCheckSwtNullExceptions) {
		try {
			new TableColumn(null, SWT.NULL, 0);
			fail("No exception thrown for parent == null");
		}
		catch (IllegalArgumentException e) {
		}

		try {
			new TableColumn(table, SWT.NULL, -1);
			fail("No exception thrown for index == -1");
		}
		catch (IllegalArgumentException e) {
		}

		try {
			new TableColumn(table, SWT.NULL, 2);
			fail("No exception thrown for illegal index argument");
		}
		catch (IllegalArgumentException e) {
		}
	}
}

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

public void test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener(){
	try {
		tableColumn.addSelectionListener(null);		
		fail("No exception thrown for selectionListener == null");
	}
	catch (IllegalArgumentException e) {
	}
}

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

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

public void test_getDisplay() {
	assertTrue(":a:", tableColumn.getDisplay() == table.getDisplay());
}

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

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

public void test_getWidth(){
	final int DEFAULT_WIDTH = 10;
	int testWidth = 42;
	
	assertTrue(":a: width=" + tableColumn.getWidth() + " should be=" + DEFAULT_WIDTH, tableColumn.getWidth() == DEFAULT_WIDTH);

//	try {
//		tableColumn.setWidth(-1);
//		assertTrue("No exception thrown", false);
//	}
//	catch (IllegalArgumentException e) {
//		assertTrue("Wrong error thrown: " + e, e.getMessage().equals("Argument not valid"));
//	}
//	catch (SWTException e) {
//		assertTrue("Wrong error thrown: " + e, e.getMessage().equals("Argument not valid"));
//	}

	tableColumn.setWidth(0);
	assertTrue(":c: width=" + tableColumn.getWidth() + " should be=" + 0, tableColumn.getWidth() == 0);

	tableColumn.setWidth(testWidth);
	assertTrue(":d: width=" + tableColumn.getWidth() + " should be=" + testWidth, tableColumn.getWidth() == testWidth);

	tableColumn.setWidth(testWidth);
	assertTrue(":e: width=" + tableColumn.getWidth() + " should be=" + testWidth, tableColumn.getWidth() == testWidth);
}

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

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

public void test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener(){
	SelectionListener listener = new SelectionAdapter() {
		public void widgetSelected(SelectionEvent e) {}};

	tableColumn.removeSelectionListener(listener);	
	tableColumn.addSelectionListener(listener);		
	tableColumn.removeSelectionListener(listener);	
	try {
		tableColumn.removeSelectionListener(null);		
		fail("No exception thrown for selectionListener == null");
	}
	catch (IllegalArgumentException e) {
	}
}

public void test_setAlignmentI(){
	TableColumn column2;
	
	assertTrue(":a:", tableColumn.getAlignment() == SWT.LEFT);

	tableColumn.setAlignment(-1);
	assertTrue(":b:", tableColumn.getAlignment() == SWT.LEFT);

	tableColumn.setAlignment(SWT.RIGHT);
	assertTrue(
		":c: Should not be allowed to set alignment of the first column", 
		tableColumn.getAlignment() == SWT.LEFT);

	column2 = new TableColumn(table, SWT.NULL);
	column2.setAlignment(SWT.RIGHT);
	assertTrue(":d:", column2.getAlignment() == SWT.RIGHT);
	
	column2.setAlignment(SWT.CENTER);
	assertTrue(":e:", column2.getAlignment() == SWT.CENTER);	

	column2.setAlignment(SWT.LEFT);
	assertTrue(":f:", column2.getAlignment() == SWT.LEFT);	
}

public void test_setResizableZ(){
	assertTrue(":a:", tableColumn.getResizable() == true);

	tableColumn.setResizable(false);
	assertTrue(":b:", tableColumn.getResizable() == false);

	tableColumn.setResizable(false);
	assertTrue(":c:", tableColumn.getResizable() == false);

	tableColumn.setResizable(true);
	assertTrue(":d:", tableColumn.getResizable() == true);
}

public void test_setTextLjava_lang_String(){
	assertTrue(":a:", tableColumn.getText() == "");

	tableColumn.setText("text");
	assertTrue(":b:", tableColumn.getText() == "text");

	try {
		tableColumn.setText(null);
		fail("No exception thrown for column header == null");
	}
	catch (IllegalArgumentException e) {
	}
}

public void test_setWidthI() {
	warnUnimpl("Test test_setWidthI 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_widgets_TableColumn((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_TableI");
	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_TableII");
	methodNames.addElement("test_addControlListenerLorg_eclipse_swt_events_ControlListener");
	methodNames.addElement("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener");
	methodNames.addElement("test_checkSubclass");
	methodNames.addElement("test_getAlignment");
	methodNames.addElement("test_getDisplay");
	methodNames.addElement("test_getParent");
	methodNames.addElement("test_getResizable");
	methodNames.addElement("test_getWidth");
	methodNames.addElement("test_pack");
	methodNames.addElement("test_removeControlListenerLorg_eclipse_swt_events_ControlListener");
	methodNames.addElement("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener");
	methodNames.addElement("test_setAlignmentI");
	methodNames.addElement("test_setResizableZ");
	methodNames.addElement("test_setTextLjava_lang_String");
	methodNames.addElement("test_setWidthI");
	methodNames.addAll(Test_org_eclipse_swt_widgets_Item.methodNames()); // add superclass method names
	return methodNames;
}
protected void runTest() throws Throwable {
	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_TableI")) test_ConstructorLorg_eclipse_swt_widgets_TableI();
	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_TableII")) test_ConstructorLorg_eclipse_swt_widgets_TableII();
	else if (getName().equals("test_addControlListenerLorg_eclipse_swt_events_ControlListener")) test_addControlListenerLorg_eclipse_swt_events_ControlListener();
	else if (getName().equals("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener();
	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
	else if (getName().equals("test_getAlignment")) test_getAlignment();
	else if (getName().equals("test_getDisplay")) test_getDisplay();
	else if (getName().equals("test_getParent")) test_getParent();
	else if (getName().equals("test_getResizable")) test_getResizable();
	else if (getName().equals("test_getWidth")) test_getWidth();
	else if (getName().equals("test_pack")) test_pack();
	else if (getName().equals("test_removeControlListenerLorg_eclipse_swt_events_ControlListener")) test_removeControlListenerLorg_eclipse_swt_events_ControlListener();
	else if (getName().equals("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener();
	else if (getName().equals("test_setAlignmentI")) test_setAlignmentI();
	else if (getName().equals("test_setResizableZ")) test_setResizableZ();
	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
	else if (getName().equals("test_setWidthI")) test_setWidthI();
	else super.runTest();
}
}
