package fitnesse.slim;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import org.junit.AfterClass;
import org.junit.Before;
import fitnesse.slim.StatementExecutorTestBase.Delete;
import fitnesse.slim.StatementExecutorTestBase.Echo;
import fitnesse.slim.StatementExecutorTestBase.EchoSupport;
import fitnesse.slim.StatementExecutorTestBase.FileSupport;
import fitnesse.slim.StatementExecutorTestBase.FixtureWithNamedSystemUnderTestBase;
import fitnesse.slim.StatementExecutorTestBase.MyAnnotatedSystemUnderTestFixture;
import fitnesse.slim.StatementExecutorTestBase.MySystemUnderTestBase;
import fitnesse.slim.StatementExecutorTestBase.SimpleFixture;
import fitnesse.slim.StatementExecutorTestBase.Speak;
import fitnesse.slim.StatementExecutorTestBase.SystemUnderTestFixture;
public abstract class Jsr223StatementExecutorTestBase extends StatementExecutorTestBase {
protected static Jsr223SlimFactory slimFactory;
protected static Jsr223Bridge bridge;
public static class FileSupportJsr223 extends FileSupport {
private FixtureProxyJsr223 fixtureProxy;
public FileSupportJsr223(FixtureProxyJsr223 fixtureProxy) {
this.fixtureProxy = fixtureProxy;
}
public void delete(String fileName) {
fixtureProxy.delete(fileName);
}
public boolean deleteCalled() {
return fixtureProxy.deleteCalled();
}
}
public static class EchoSupportJsr223 extends EchoSupport {
private FixtureProxyJsr223 fixtureProxy;
public EchoSupportJsr223(FixtureProxyJsr223 fixtureProxy) {
this.fixtureProxy = fixtureProxy;
}
public void echo() {
fixtureProxy.echo();
}
public boolean echoCalled() {
return fixtureProxy.echoCalled();
}
public void speak() {
fixtureProxy.speak();
}
public boolean speakCalled() {
return fixtureProxy.speakCalled();
}
}
public static class SimpleFixtureJsr223 extends SimpleFixture {
private FixtureProxyJsr223 fixtureProxy;
public SimpleFixtureJsr223(FixtureProxyJsr223 fixtureProxy) {
this.fixtureProxy = fixtureProxy;
}
public void echo() {
fixtureProxy.echo();
}
public boolean echoCalled() {
return fixtureProxy.echoCalled();
}
}
public static class FixtureWithNamedSystemUnderTestJsr223 extends
FixtureWithNamedSystemUnderTestBase {
private FixtureProxyJsr223 fixtureProxy;
public FixtureWithNamedSystemUnderTestJsr223(FixtureProxyJsr223 fixtureProxy) {
this.fixtureProxy = fixtureProxy;
}
public void echo() {
fixtureProxy.echo();
}
public boolean echoCalled() {
return fixtureProxy.echoCalled();
}
public MySystemUnderTestBase getSystemUnderTest() {
return fixtureProxy.getSystemUnderTest();
}
}
public static class MySystemUnderTestJsr223 extends MySystemUnderTestBase {
private FixtureProxyJsr223 fixtureProxy;
public MySystemUnderTestJsr223(FixtureProxyJsr223 fixtureProxy) {
this.fixtureProxy = fixtureProxy;
}
public void echo() {
fixtureProxy.echo();
}
public boolean echoCalled() {
return fixtureProxy.echoCalled();
}
public void speak() {
fixtureProxy.speak();
}
public boolean speakCalled() {
return fixtureProxy.speakCalled();
}
}
public static class MyAnnotatedSystemUnderTestFixtureJsr223 extends
MyAnnotatedSystemUnderTestFixture {
private FixtureProxyJsr223 fixtureProxy;
public MyAnnotatedSystemUnderTestFixtureJsr223(
FixtureProxyJsr223 fixtureProxy) {
this.fixtureProxy = fixtureProxy;
}
public void echo() {
fixtureProxy.echo();
}
public boolean echoCalled() {
return fixtureProxy.echoCalled();
}
public MySystemUnderTestBase getSystemUnderTest() {
return fixtureProxy.getSystemUnderTest();
}
}
public static class FixtureProxyJsr223 implements Echo, Speak, Delete,
SystemUnderTestFixture {
private Object proxy;
public FixtureProxyJsr223(Object instance) {
proxy = instance;
}
public void echo() {
}
public boolean echoCalled() {
return (Boolean) callMethod("echoCalled");
}
public void speak() {
}
public boolean speakCalled() {
return (Boolean) callMethod("speakCalled");
}
public void delete(String fileName) {
}
public boolean deleteCalled() {
return (Boolean) callMethod("deleteCalled");
}
public MySystemUnderTestBase getSystemUnderTest() {
return new MySystemUnderTestJsr223(new FixtureProxyJsr223(
callMethod("getSystemUnderTest")));
}
private Object callMethod(String method, Object... args) {
try {
return bridge.invokeMethod(proxy, method, args);
} catch (Throwable e) {
return e.toString();
}
}
}
@AfterClass
public static void tearDownClass() {
slimFactory.stop();
}
@Override
@Before
public void init() throws Exception {
statementExecutor = slimFactory.getStatementExecutor();
statementExecutor.addPath(getTestModulePath());
}
protected abstract String getTestModulePath();
@Override
protected Echo getVerifiedInstance() {
FixtureProxyJsr223 myInstance = new FixtureProxyJsr223(statementExecutor
.getInstance(INSTANCE_NAME));
assertFalse(myInstance.echoCalled());
return myInstance;
}
protected void createFixtureInstance(String fixtureClass) {
Object created = statementExecutor.create(INSTANCE_NAME, fixtureClass,
new Object[] {});
assertEquals("OK", created);
}
@Override
protected MyAnnotatedSystemUnderTestFixture createAnnotatedFixture() {
createFixtureInstance(annotatedFixtureName());
return new MyAnnotatedSystemUnderTestFixtureJsr223(
(FixtureProxyJsr223) getVerifiedInstance());
}
@Override
protected FixtureWithNamedSystemUnderTestBase createNamedFixture() {
createFixtureInstance(namedFixtureName());
return new FixtureWithNamedSystemUnderTestJsr223(
(FixtureProxyJsr223) getVerifiedInstance());
}
@Override
protected SimpleFixture createSimpleFixture() {
createFixtureInstance(simpleFixtureName());
return new SimpleFixtureJsr223((FixtureProxyJsr223) getVerifiedInstance());
}
@Override
protected EchoSupport createEchoLibrary() {
String instanceName = "library" + library++;
Object created = statementExecutor.create(instanceName, echoLibraryName(),
new Object[] {});
assertEquals("OK", created);
return new EchoSupportJsr223(new FixtureProxyJsr223(statementExecutor
.getInstance(instanceName)));
}
@Override
protected FileSupport createFileSupportLibrary() {
String instanceName = "library" + library++;
Object created = statementExecutor.create(instanceName, fileSupportName(),
new Object[] {});
assertEquals("OK", created);
return new FileSupportJsr223(new FixtureProxyJsr223(statementExecutor
.getInstance(instanceName)));
}
@Override
protected String annotatedFixtureName() {
return "MyAnnotatedSystemUnderTestFixture";
}
@Override
protected String namedFixtureName() {
return "FixtureWithNamedSystemUnderTest";
}
@Override
protected String echoLibraryName() {
return "EchoSupport";
}
@Override
protected String fileSupportName() {
return "FileSupport";
}
@Override
protected String simpleFixtureName() {
return "SimpleFixture";
}
}