/*******************************************************************************
 * Copyright (c) 2004, 2011 Andrew Eisenberg 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:
 *     Andrew Eisenberg - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.context.tests;

import java.lang.reflect.Method;
import java.util.List;

import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
import org.eclipse.mylyn.context.sdk.util.AbstractContextTest;
import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;

/**
 * This tests that structure bridge shadowing occurs appropriately.
 * 
 * @author Andrew Eisenberg
 */
public class ShadowsBridgeTest extends AbstractContextTest {

	static final String BASE_CONTENT_TYPE = "BASE_CONTENT_TYPE";

	static final String SHADOWS_CONTENT_TYPE = "SHADOWS_CONTENT_TYPE";

	static final String BASE_IDENTIFIER = "BASE_IDENTIFIER";

	static final String SHADOWS_IDENTIFIER = "SHADOWS_IDENTIFIER";

	static final String BASE_LABEL = "BASE_LABEL";

	static final String SHADOWS_LABEL = "SHADOWS_LABEL";

	static final Object BASE_OBJECT = new Object();

	static final Object SHADOWS_OBJECT = new Object();

	class BaseContentStructureBridge extends AbstractContextStructureBridge {

		@Override
		public boolean acceptsObject(Object object) {
			return object == BASE_OBJECT || object == SHADOWS_OBJECT;
		}

		@Override
		public boolean canBeLandmark(String handle) {
			return false;
		}

		@Override
		public boolean canFilter(Object element) {
			return false;
		}

		@Override
		public List<String> getChildHandles(String handle) {
			return null;
		}

		@Override
		public String getContentType() {
			return BASE_CONTENT_TYPE;
		}

		@Override
		public String getContentType(String elementHandle) {
			if (elementHandle == BASE_IDENTIFIER) {
				return BASE_CONTENT_TYPE;
			} else if (elementHandle == SHADOWS_IDENTIFIER) {
				return SHADOWS_IDENTIFIER;
			} else {
				return null;
			}
		}

		@Override
		public String getHandleForOffsetInObject(Object resource, int offset) {
			if (resource == BASE_OBJECT) {
				return BASE_IDENTIFIER;
			} else if (resource == SHADOWS_OBJECT) {
				return SHADOWS_IDENTIFIER;
			} else {
				return null;
			}
		}

		@Override
		public String getHandleIdentifier(Object object) {
			if (object == BASE_OBJECT) {
				return BASE_IDENTIFIER;
			} else if (object == SHADOWS_OBJECT) {
				return SHADOWS_IDENTIFIER;
			} else {
				return null;
			}
		}

		@Override
		public String getLabel(Object object) {
			if (object == BASE_OBJECT) {
				return BASE_LABEL;
			} else if (object == SHADOWS_OBJECT) {
				return SHADOWS_LABEL;
			} else {
				return null;
			}
		}

		@Override
		public Object getObjectForHandle(String handle) {
			if (handle == BASE_IDENTIFIER) {
				return BASE_OBJECT;
			} else if (handle == SHADOWS_IDENTIFIER) {
				return SHADOWS_OBJECT;
			} else {
				return null;
			}
		}

		@Override
		public String getParentHandle(String handle) {
			return null;
		}

		@Override
		public boolean isDocument(String handle) {
			return false;
		}

	}

	class ShadowsContentStructureBridge extends AbstractContextStructureBridge {

		@Override
		public boolean acceptsObject(Object object) {
			return object == SHADOWS_OBJECT;
		}

		@Override
		public boolean canBeLandmark(String handle) {
			return false;
		}

		@Override
		public boolean canFilter(Object element) {
			return false;
		}

		@Override
		public List<String> getChildHandles(String handle) {
			return null;
		}

		@Override
		public String getContentType() {
			return SHADOWS_CONTENT_TYPE;
		}

		@Override
		public String getContentType(String elementHandle) {
			if (elementHandle == SHADOWS_IDENTIFIER) {
				return SHADOWS_IDENTIFIER;
			} else {
				return null;
			}
		}

		@Override
		public String getHandleForOffsetInObject(Object resource, int offset) {
			if (resource == SHADOWS_OBJECT) {
				return SHADOWS_IDENTIFIER;
			} else {
				return null;
			}
		}

		@Override
		public String getHandleIdentifier(Object object) {
			if (object == SHADOWS_OBJECT) {
				return SHADOWS_IDENTIFIER;
			} else {
				return null;
			}
		}

		@Override
		public String getLabel(Object object) {
			if (object == SHADOWS_OBJECT) {
				return SHADOWS_LABEL;
			} else {
				return null;
			}
		}

		@Override
		public Object getObjectForHandle(String handle) {
			if (handle == SHADOWS_IDENTIFIER) {
				return SHADOWS_OBJECT;
			} else {
				return null;
			}
		}

		@Override
		public String getParentHandle(String handle) {
			return null;
		}

		@Override
		public boolean isDocument(String handle) {
			return false;
		}

	}

	/**
	 * @throws Exception
	 */
	public void testShadowsStructureBridge() throws Exception {
		// 1) Create mock bridge 
		BaseContentStructureBridge baseBridge = new BaseContentStructureBridge();

		// 2) Add it to ContextCorePlugin
		ContextCorePlugin context = ContextCorePlugin.getDefault();
		context.addStructureBridge(baseBridge);

		// 3) Check that the bridge is found properly
		AbstractContextStructureBridge otherBridge;

		otherBridge = context.getStructureBridge(BASE_CONTENT_TYPE);
		assertEquals("Should be the same bridges: " + baseBridge + " " + otherBridge, baseBridge, otherBridge);

		otherBridge = context.getStructureBridge(BASE_OBJECT);
		assertEquals("Should be the same bridges: " + baseBridge + " " + otherBridge, baseBridge, otherBridge);

//		otherBridge = context.getStructureBridge(SHADOWS_CONTENT_TYPE);
//		assertEquals("Should be the same bridges: " + baseBridge + " " + otherBridge, baseBridge, otherBridge);

		otherBridge = context.getStructureBridge(SHADOWS_OBJECT);
		assertEquals("Should be the same bridges: " + baseBridge + " " + otherBridge, baseBridge, otherBridge);

		// 4) Create second mock bridge 
		ShadowsContentStructureBridge shadowsBridge = new ShadowsContentStructureBridge();

		// 5) Add it to ContextCorePlugin
		context.addStructureBridge(shadowsBridge);

		// 6) Add shadows relationship (must use reflection because it is not exposed)
		Method addShadowsContentMethod = ContextCorePlugin.class.getDeclaredMethod("addShadowsContent", String.class,
				String.class);
		addShadowsContentMethod.setAccessible(true);
		addShadowsContentMethod.invoke(context, BASE_CONTENT_TYPE, SHADOWS_CONTENT_TYPE);

		// 7) Ensure that the proper kinds of objects are accepted by the shadows bridge instead
		// now the base content is shadowed and should return the shadows bridge
		otherBridge = context.getStructureBridge(BASE_CONTENT_TYPE);
		assertEquals("Should be the same bridges: " + shadowsBridge + " " + otherBridge, shadowsBridge, otherBridge);

		otherBridge = context.getStructureBridge(SHADOWS_CONTENT_TYPE);
		assertEquals("Should be the same bridges: " + shadowsBridge + " " + otherBridge, shadowsBridge, otherBridge);

		otherBridge = context.getStructureBridge(SHADOWS_OBJECT);
		assertEquals("Should be the same bridges: " + shadowsBridge + " " + otherBridge, shadowsBridge, otherBridge);

		// since shadows bridge does not accept BASE_OBJECT, we should still be getting base bridge here.
		otherBridge = context.getStructureBridge(BASE_OBJECT);
		assertEquals("Should be the same bridges: " + baseBridge + " " + otherBridge, baseBridge, otherBridge);
	}
}
