// Path: src/test/java/com/woinject/stubs/StubApplication.java
// public class StubApplication extends InjectableApplication {
//     private static class StubModule extends AbstractModule {
//         private boolean moduleWasLoaded = false;
// 
//         @Override
//         protected void configure() {
//             moduleWasLoaded = true;
// 
//             bind(String.class).annotatedWith(Names.named("field")).toInstance("fieldInjected");
//             bind(String.class).annotatedWith(Names.named("method")).toInstance("methodInjected");
//         }
//     }
// 
//     public static void setApplication(WOApplication application) {
//         try {
//             Method method = WOApplication.class.getDeclaredMethod("_setApplication", WOApplication.class);
// 
//             method.setAccessible(true);
// 
//             method.invoke(null, application);
//         } catch (Exception exception) {
//             throw new RuntimeException(exception);
//         }
//     }
// 
//     @Inject
//     @Named("field")
//     private String injectableField;
// 
//     private String injectableMethod;
// 
//     private boolean nullInjector = false;
// 
//     private StubModule stubModule;
// 
//     @Override
//     protected Class<StubSession> _sessionClass() {
//         return StubSession.class;
//     }
// 
//     public String getInjectableField() {
//         return injectableField;
//     }
// 
//     public String getInjectableMethod() {
//         return injectableMethod;
//     }
// 
//     @Inject
//     public void initInjectableMethod(@Named("method") String value) {
//         injectableMethod = value;
//     }
// 
//     @Override
//     public Injector injector() {
//         if (nullInjector) {
//             return null;
//         }
// 
//         return super.injector();
//     }
// 
//     @Override
//     protected Module[] modules() {
//         stubModule = new StubModule();
// 
//         return new Module[] { stubModule };
//     }
// 
//     public void setReturnNullInjector(boolean nullInjector) {
//         this.nullInjector = nullInjector;
//     }
// 
//     public boolean stubModuleWasLoaded() {
//         return stubModule.moduleWasLoaded;
//     }
// }


import er.extensions.appserver.ERXSession;
import er.extensions.appserver.ERXWOContext;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.webobjects.appserver.WOApplication;
import com.webobjects.appserver.WOContext;
import com.woinject.stubs.StubApplication;
        ERXSession.setSession(null);
        ERXWOContext.setCurrentContext(null);
    }

    @Test
    public void returnSessionFromERXSession() throws Exception {
        ERXSession.setSession(session);

        WOSessionProvider<ERXSession> provider = new WOSessionProvider<ERXSession>();

        assertThat(provider.get(), is(session));
    }

    @Test
    public void returnSessionFromWOContext() throws Exception {
        ERXWOContext.setCurrentContext(context);

        when(context._session()).thenReturn(session);

        WOSessionProvider<ERXSession> provider = new WOSessionProvider<ERXSession>();

        assertThat(provider.get(), is(session));
    }

    @Test
    public void returnSessionFromSessionID() throws Exception {
        ERXWOContext.setCurrentContext(context);

        when(context._requestSessionID()).thenReturn("session-123");

// Path: src/test/java/com/woinject/stubs/StubApplication.java
// public class StubApplication extends InjectableApplication {
//     private static class StubModule extends AbstractModule {
//         private boolean moduleWasLoaded = false;
// 
//         @Override
//         protected void configure() {
//             moduleWasLoaded = true;
// 
//             bind(String.class).annotatedWith(Names.named("field")).toInstance("fieldInjected");
//             bind(String.class).annotatedWith(Names.named("method")).toInstance("methodInjected");
//         }
//     }
// 
//     public static void setApplication(WOApplication application) {
//         try {
//             Method method = WOApplication.class.getDeclaredMethod("_setApplication", WOApplication.class);
// 
//             method.setAccessible(true);
// 
//             method.invoke(null, application);
//         } catch (Exception exception) {
//             throw new RuntimeException(exception);
//         }
//     }
// 
//     @Inject
//     @Named("field")
//     private String injectableField;
// 
//     private String injectableMethod;
// 
//     private boolean nullInjector = false;
// 
//     private StubModule stubModule;
// 
//     @Override
//     protected Class<StubSession> _sessionClass() {
//         return StubSession.class;
//     }
// 
//     public String getInjectableField() {
//         return injectableField;
//     }
// 
//     public String getInjectableMethod() {
//         return injectableMethod;
//     }
// 
//     @Inject
//     public void initInjectableMethod(@Named("method") String value) {
//         injectableMethod = value;
//     }
// 
//     @Override
//     public Injector injector() {
//         if (nullInjector) {
//             return null;
//         }
// 
//         return super.injector();
//     }
// 
//     @Override
//     protected Module[] modules() {
//         stubModule = new StubModule();
// 
//         return new Module[] { stubModule };
//     }
// 
//     public void setReturnNullInjector(boolean nullInjector) {
//         this.nullInjector = nullInjector;
//     }
// 
//     public boolean stubModuleWasLoaded() {
//         return stubModule.moduleWasLoaded;
//     }
// }


// Path: src/test/java/com/woinject/TestWOSessionProvider.java
import er.extensions.appserver.ERXSession;
import er.extensions.appserver.ERXWOContext;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.webobjects.appserver.WOApplication;
import com.webobjects.appserver.WOContext;
import com.woinject.stubs.StubApplication;

        ERXSession.setSession(null);
        ERXWOContext.setCurrentContext(null);
    }

    @Test
    public void returnSessionFromERXSession() throws Exception {
        ERXSession.setSession(session);

        WOSessionProvider<ERXSession> provider = new WOSessionProvider<ERXSession>();

        assertThat(provider.get(), is(session));
    }

    @Test
    public void returnSessionFromWOContext() throws Exception {
        ERXWOContext.setCurrentContext(context);

        when(context._session()).thenReturn(session);

        WOSessionProvider<ERXSession> provider = new WOSessionProvider<ERXSession>();

        assertThat(provider.get(), is(session));
    }

    @Test
    public void returnSessionFromSessionID() throws Exception {
        ERXWOContext.setCurrentContext(context);

        when(context._requestSessionID()).thenReturn("session-123");

        StubApplication.setApplication(application);