blob: 0250c6e45d6f2caa3ba26635a4ed604b0cdbbe0a [file] [log] [blame]
/*******************************************************************************
* 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);
}
}