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

import junit.framework.TestCase;

import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPerspectiveRegistry;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.tests.harness.util.ArrayUtil;

public class IPerspectiveRegistryTest extends TestCase {

    private IPerspectiveRegistry fReg;

    public IPerspectiveRegistryTest(String testName) {
        super(testName);
    }

    public void setUp() {
        fReg = PlatformUI.getWorkbench().getPerspectiveRegistry();
    }

    public void testFindPerspectiveWithId() {
        IPerspectiveDescriptor pers = (IPerspectiveDescriptor) ArrayUtil
                .pickRandom(fReg.getPerspectives());

        IPerspectiveDescriptor suspect = fReg.findPerspectiveWithId(pers
                .getId());
        assertNotNull(suspect);
        assertEquals(pers, suspect);

        suspect = fReg.findPerspectiveWithId(IConstants.FakeID);
        assertNull(suspect);
    }

    /*	
     public void testFindPerspectiveWithLabel()
     {
     IPerspectiveDescriptor pers = ( IPerspectiveDescriptor )ArrayUtil.pickRandom( fReg.getPerspectives() );
     
     IPerspectiveDescriptor suspect = fReg.findPerspectiveWithLabel( pers.getLabel() );
     assertNotNull( suspect );
     assertEquals( pers, suspect );
     
     suspect = fReg.findPerspectiveWithLabel( IConstants.FakeLabel );
     assertNull( suspect );
     }
     */
    public void testGetDefaultPerspective() {
        String id = fReg.getDefaultPerspective();
        assertNotNull(id);

        IPerspectiveDescriptor suspect = fReg.findPerspectiveWithId(id);
        assertNotNull(suspect);
    }

    public void testSetDefaultPerspective() {
        IPerspectiveDescriptor pers = (IPerspectiveDescriptor) ArrayUtil
                .pickRandom(fReg.getPerspectives());
        fReg.setDefaultPerspective(pers.getId());

        assertEquals(pers.getId(), fReg.getDefaultPerspective());
    }

    public void testGetPerspectives() throws Throwable {
        IPerspectiveDescriptor[] pers = fReg.getPerspectives();
        assertNotNull(pers);

        for (int i = 0; i < pers.length; i++)
            assertNotNull(pers[i]);
    }
}
