/*******************************************************************************
 * 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.ui.tests.api;

import junit.framework.TestCase;

import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IFileEditorMapping;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.tests.util.ArrayUtil;

public class IFileEditorMappingTest extends TestCase {
	private IFileEditorMapping[] fMappings;
	
	public IFileEditorMappingTest( String testName )
	{
		super( testName );
	}

	public void setUp()
	{
		fMappings = PlatformUI.getWorkbench().getEditorRegistry().getFileEditorMappings();
	}
	
	public void testGetName() throws Throwable
	{
		for( int i = 0; i < fMappings.length; i ++ )
			assertNotNull( fMappings[ i ].getName() );
	}

	public void testGetLabel() throws Throwable
	{
		String label;
		for( int i = 0; i < fMappings.length; i ++ ){
			label = fMappings[ i ].getLabel();
			assertNotNull( label );
			assertTrue( label.equals( fMappings[ i ].getName() + "." + fMappings[ i ].getExtension() ) );			
		}
	}

	public void testGetExtension() throws Throwable
	{
		for( int i = 0; i < fMappings.length; i ++ )
			assertNotNull( fMappings[ i ].getExtension() );
	}

	public void testGetEditors() throws Throwable
	{
		IEditorDescriptor[] editors;
		
		for( int i = 0; i < fMappings.length; i ++ ){
			editors = fMappings[ i ].getEditors();
			assertTrue( ArrayUtil.checkNotNull( editors ) == true );
		}
	}

	public void testGetImageDescriptor() throws Throwable
	{
		for( int i = 0; i < fMappings.length; i ++ )
			assertNotNull( fMappings[ i ].getImageDescriptor() );
	}

//how do i set the default editor?
	public void testGetDefaultEditor()  throws Throwable
	{		
/*		for( int i = 0; i < fMappings.length; i ++ )
			assertNotNull( fMappings[ i ].getDefaultEditor() );*/
	}
}