package tests.jfun.yan;
import tests.jfun.yan.tck.BaseContainerTestCase;
import jfun.yan.*;
import jfun.yan.containers.DefaultContainer;
import jfun.yan.containers.ProxyContainer;
import junit.framework.TestSuite;
import java.util.Map;
import java.util.HashMap;
import java.io.IOException;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
/**
* @author Paul Hammant
* @version $Revision: 1.2 $
*/
public class BaseProxyContainerTestCase
extends BaseContainerTestCase {
public static void main(String[] args){
Utils.runTest(suite());
}
private static TestSuite suite(){
return new TestSuite(BaseProxyContainerTestCase.class);
}
public void testInstanceIsNotAutomaticallyHidden() {
Container pc = createImplementationHidingPicoContainer();
pc.registerValue(Map.class, new HashMap());
final String s1 = "unused component just for coverage";
pc.registerValue(s1);
final String s2 = "hello";
pc.registerComponent("mark",
Components.value(s2).singleton().guard().subsume(String.class)
.subsume(CharSequence.class));
Map map = (Map) pc.getInstance(Map.class);
pc.verify();
assertNotNull(map);
assertTrue(map instanceof HashMap);
assertSame(s1, pc.getInstance(String.class));
assertSame(s2, pc.getInstance("mark"));
assertSame(s1, pc.getInstance(String.class));
assertSame(s2, pc.getInstance("mark"));
}
protected Container createImplementationHidingPicoContainer(){
return new ProxyContainer();
}
public void testImplementaionIsAutomaticallyHidden() {
Container pc = createImplementationHidingPicoContainer();
pc.registerConstructor(Map.class, HashMap.class, null);
Map map = (Map) pc.getInstance(Map.class);
assertNotNull(map);
assertFalse(map instanceof HashMap);
}
public void testNonInterfaceImplementaionIsAutomaticallyHidden() {
Container pc = createImplementationHidingPicoContainer();
pc.registerConstructor(HashMap.class, HashMap.class, null);
Map map = (Map) pc.getInstance(HashMap.class);
assertNotNull(map);
assertTrue(map instanceof HashMap);
}
public void testNonInterfaceImplementaionWithParametersIsAutomaticallyHidden() {
Container pc = createImplementationHidingPicoContainer();
pc.registerConstructor(HashMap.class, HashMap.class,
null);
Map map = (Map) pc.getInstance(HashMap.class);
assertNotNull(map);
assertTrue(map instanceof HashMap);
}
public void testImplementaionWithParametersIsAutomaticallyHidden() {
Container pc = createImplementationHidingPicoContainer();
pc.registerConstructor(Map.class, HashMap.class,
null);
Map map = (Map) pc.getInstance(Map.class);
assertNotNull(map);
assertFalse(map instanceof HashMap);
}
/*
public void testSerializedContainerCanRetrieveImplementation() throws PicoException, PicoInitializationException,
IOException, ClassNotFoundException {
try {
super.testSerializedContainerCanRetrieveImplementation();
fail("The ImplementationHidingPicoContainer should not be able to retrieve the component impl");
} catch (ClassCastException cce) {
// expected.
}
}
*/
public void testExceptionThrowingFromHiddenComponent() {
Container pc = createImplementationHidingPicoContainer();
pc.registerConstructor(ActionListener.class, Burp.class);
try {
ActionListener ac = (ActionListener) pc.getInstance(ActionListener.class);
ac.actionPerformed(null);
fail("Oh no.");
} catch (RuntimeException e) {
assertEquals("woohoo", e.getMessage());
}
}
public void testProxyAsObject(){
final Container yan = createYanContainer();
yan.registerConstructor(String.class, (Class[])null);
final Component c = yan.getComponentOfType(CharSequence.class);
assertEquals(c, c);
final Object s1 = yan.getInstanceOfType(CharSequence.class);
final Object s2 = yan.getInstanceOfType(CharSequence.class);
assertEquals(s1, s2);
final HashMap map = new HashMap();
map.put(s1, s2);
assertEquals(s2, map.get(s1));
}
public static class Burp implements ActionListener {
public void actionPerformed(ActionEvent e) {
throw new RuntimeException("woohoo");
}
}
protected Container getContainerImpl(){
return new ProxyContainer();
}
public interface Man {
int getEndurance();
}
public interface Woman {
Man getMan();
}
public static class Husband implements Man {
public final Woman woman;
public Husband(Woman woman) {
this.woman = woman;
}
public int getEndurance() {
return 10;
}
}
public static class Wife implements Woman {
public final Man man;
public Wife(Man man) {
this.man = man;
}
public Man getMan() {
return man;
}
}
public class Superman implements Man {
public int getEndurance() {
return 1000;
}
}
public void testCircularDependency(){
final Container yan = createYanContainer();
yan.registerConstructor(Woman.class, Wife.class);
yan.registerConstructor(Man.class, Husband.class);
Woman woman = (Woman) yan.getInstance(Woman.class);
assertEquals(10, woman.getMan().getEndurance());
Man superman = new Superman();
//((Swappable)woman.getMan()).hotswap(superman);
assertTrue(Proxies.setProxyImplementation(woman.getMan(), superman));
assertEquals(1000, woman.getMan().getEndurance());
try{
Proxies.setProxyImplementation(woman, "abc");
fail("should have failed");
}
catch(IllegalArgumentException e){
assertEquals("object of type java.lang.String is not an instance of tests.jfun.yan.BaseProxyContainerTestCase$Woman",
e.getMessage());
}
assertFalse(Proxies.setProxyImplementation(superman, superman));
}
}