/*******************************************************************************
 * Copyright (c) 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
 *     Helen Hawkins   - iniital version
 *******************************************************************************/
package org.eclipse.contribution.xref.core.tests;

import java.util.Iterator;
import java.util.List;

import org.eclipse.contribution.xref.core.IXReferenceProvider;
import org.eclipse.contribution.xref.core.XReferenceProviderDefinition;
import org.eclipse.contribution.xref.core.XReferenceProviderManager;

import junit.framework.TestCase;

/**
 * @author hawkinsh
 *  
 */
public class XReferenceProviderManagerTest extends TestCase {

	/*
	 * @see TestCase#setUp()
	 */
	protected void setUp() throws Exception {
		super.setUp();
	}

	/*
	 * @see TestCase#tearDown()
	 */
	protected void tearDown() throws Exception {
		super.tearDown();
	}

	public void testGetManager() {
		XReferenceProviderManager manager =
			XReferenceProviderManager.getManager();
		assertNotNull(manager);
		XReferenceProviderManager manager2 =
			XReferenceProviderManager.getManager();
		assertSame(manager, manager2);
	}

	public void testGetProvidersFor() {
		XReferenceProviderManager manager =
			XReferenceProviderManager.getManager();
		List<IXReferenceProvider> providers = manager.getProvidersFor(new AdaptableObject());
		assertEquals(0, providers.size());
		providers = manager.getProvidersFor(new AdaptableString());
		assertEquals(1, providers.size());
		assertTrue(providers.get(0) instanceof TestProvider);
	}

	public void testGetRegisteredProviders() {
		XReferenceProviderManager manager =
			XReferenceProviderManager.getManager();
		List providers = manager.getRegisteredProviders();
		// know should have 3 providers registered:
		// TestProvider (in core.test), TestXRefProvider (in ui.test)
		// and TestXRefProviderWithEntities (in ui.test),
		// check that all three are actually registered 
		// (note haven't hard coded in that expect exactly 3 providers
		// to cope with the case where there are others)
		assertTrue(containsProvider(providers, "My Label")); //$NON-NLS-1$
		assertTrue(
			containsProvider(providers, "Test XReference Provider Label")); //$NON-NLS-1$
		assertTrue(
			containsProvider(
				providers,
				"Test XReference Provider With Entities Label")); //$NON-NLS-1$
		// TODO: HELEN: put this back in!
		//assertTrue(ProviderExceptionLoggingTest.exceptionLoggedOnRegistration);
	}

	private boolean containsProvider(List providers, String label) {
		boolean contains = false;
		Iterator itor = providers.iterator();
		while (itor.hasNext()) {
			XReferenceProviderDefinition xrdef =
				(XReferenceProviderDefinition) itor.next();
			if (xrdef.getLabel().compareTo(label) == 0) {
				contains = true;
			}
		}
		return contains;
	}
	
	public void testSettingOfIsInplace() {
		XReferenceProviderManager manager =
			XReferenceProviderManager.getManager();
		boolean currentValue = manager.getIsInplace();
		if (currentValue == true) {
			manager.setIsInplace(false);
			assertFalse("isInplace has not been set correctly", manager.getIsInplace()); //$NON-NLS-1$
		} else {
			manager.setIsInplace(true);
			assertTrue("isInplace has not been set correctly", manager.getIsInplace()); //$NON-NLS-1$
		}
		// Reset the value
		manager.setIsInplace(currentValue);
	}
}
