// Path: src/main/java/org/bigtesting/fixd/request/HttpRequest.java
// public interface HttpRequest {
// 
//     String getPath();
//     
//     String getUndecodedPath();
//     
//     Set<String> getRequestParameterNames();
//     
//     String getRequestParameter(String name);
//     
//     String getPathParameter(String name);
//     
//     List<String> getHeaderNames();
//     
//     String getHeaderValue(String name);
//     
//     String getBody();
//     
//     InputStream getBodyAsStream() throws IOException;
//     
//     <T> T getBody(Class<T> type);
//     
//     long getContentLength();
//     
//     String getContentType();
//     
//     String getMethod();
//     
//     long getTime();
//     
//     String getQuery();
//     
//     int getMajor();
//     
//     int getMinor();
//     
//     String getTarget();
//     
//     /**
//      * @return a session, if it exists, or null if it does not
//      */
//     Session getSession();
//     
//     Route getRoute();
// }
// 
// Path: src/main/java/org/bigtesting/fixd/session/RequestParamSessionHandler.java
// public class RequestParamSessionHandler implements SessionHandler {
// 
//     public void onCreate(HttpRequest request) {
// 
//         Set<String> params = request.getRequestParameterNames();
//         
//         for (String param : params) {
//             request.getSession().set(param, request.getRequestParameter(param));
//         }
//     }
// }
// 
// Path: src/main/java/org/bigtesting/fixd/session/Session.java
// public class Session {
// 
//     private final String sessionId;
//     
//     private final Map<String, Object> values = new HashMap<String, Object>();
//     
//     private boolean valid = true;
//     
//     public Session() {
//         
//         this.sessionId = UUID.randomUUID().toString();
//     }
//     
//     public String getSessionId() {
//         
//         return sessionId;
//     }
//     
//     public Object get(String key) {
//         
//         return values.get(key);
//     }
//     
//     public void set(String key, Object value) {
//         
//         values.put(key, value);
//     }
//     
//     public Set<String> getAttributeNames() {
//         
//         return values.keySet();
//     }
//     
//     public boolean isValid() {
//         
//         return valid;
//     }
//     
//     public void invalidate() {
//         
//         this.valid = false;
//     }
// }
// 
// Path: src/main/java/org/bigtesting/fixd/session/SessionHandler.java
// public interface SessionHandler {
// 
//     void onCreate(HttpRequest request);
// }


import org.junit.Test;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.bigtesting.fixd.request.HttpRequest;
import org.bigtesting.fixd.session.RequestParamSessionHandler;
import org.bigtesting.fixd.session.Session;
import org.bigtesting.fixd.session.SessionHandler;
import org.bigtesting.routd.Route;
        
        newSessionHandler().onCreate(request);
        
        List<String> attributeNames = new ArrayList<String>(session.getAttributeNames());
        Collections.sort(attributeNames);
        
        assertEquals("[firstName, lastName]", attributeNames.toString());
        
        assertEquals("John", session.get("firstName"));
        assertEquals("Doe", session.get("lastName"));
    }
    
    @Test
    public void onCreateIsHandledWithNoParams() {
        
        HttpRequest request = mock(HttpRequest.class);
        when(request.getRequestParameterNames()).thenReturn(new HashSet<String>());
        when(request.getRequestParameter(anyString())).thenReturn(null);
        
        Session session = new Session();
        when(request.getSession()).thenReturn(session);
        
        Route route = new Route("/");
        when(request.getRoute()).thenReturn(route);
        
        newSessionHandler().onCreate(request);
        
        assertEquals("[]", session.getAttributeNames().toString());
    }
    
// Path: src/main/java/org/bigtesting/fixd/request/HttpRequest.java
// public interface HttpRequest {
// 
//     String getPath();
//     
//     String getUndecodedPath();
//     
//     Set<String> getRequestParameterNames();
//     
//     String getRequestParameter(String name);
//     
//     String getPathParameter(String name);
//     
//     List<String> getHeaderNames();
//     
//     String getHeaderValue(String name);
//     
//     String getBody();
//     
//     InputStream getBodyAsStream() throws IOException;
//     
//     <T> T getBody(Class<T> type);
//     
//     long getContentLength();
//     
//     String getContentType();
//     
//     String getMethod();
//     
//     long getTime();
//     
//     String getQuery();
//     
//     int getMajor();
//     
//     int getMinor();
//     
//     String getTarget();
//     
//     /**
//      * @return a session, if it exists, or null if it does not
//      */
//     Session getSession();
//     
//     Route getRoute();
// }
// 
// Path: src/main/java/org/bigtesting/fixd/session/RequestParamSessionHandler.java
// public class RequestParamSessionHandler implements SessionHandler {
// 
//     public void onCreate(HttpRequest request) {
// 
//         Set<String> params = request.getRequestParameterNames();
//         
//         for (String param : params) {
//             request.getSession().set(param, request.getRequestParameter(param));
//         }
//     }
// }
// 
// Path: src/main/java/org/bigtesting/fixd/session/Session.java
// public class Session {
// 
//     private final String sessionId;
//     
//     private final Map<String, Object> values = new HashMap<String, Object>();
//     
//     private boolean valid = true;
//     
//     public Session() {
//         
//         this.sessionId = UUID.randomUUID().toString();
//     }
//     
//     public String getSessionId() {
//         
//         return sessionId;
//     }
//     
//     public Object get(String key) {
//         
//         return values.get(key);
//     }
//     
//     public void set(String key, Object value) {
//         
//         values.put(key, value);
//     }
//     
//     public Set<String> getAttributeNames() {
//         
//         return values.keySet();
//     }
//     
//     public boolean isValid() {
//         
//         return valid;
//     }
//     
//     public void invalidate() {
//         
//         this.valid = false;
//     }
// }
// 
// Path: src/main/java/org/bigtesting/fixd/session/SessionHandler.java
// public interface SessionHandler {
// 
//     void onCreate(HttpRequest request);
// }


// Path: src/test/java/org/bigtesting/fixd/tests/TestRequestParamSessionHandler.java
import org.junit.Test;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.bigtesting.fixd.request.HttpRequest;
import org.bigtesting.fixd.session.RequestParamSessionHandler;
import org.bigtesting.fixd.session.Session;
import org.bigtesting.fixd.session.SessionHandler;
import org.bigtesting.routd.Route;

        
        newSessionHandler().onCreate(request);
        
        List<String> attributeNames = new ArrayList<String>(session.getAttributeNames());
        Collections.sort(attributeNames);
        
        assertEquals("[firstName, lastName]", attributeNames.toString());
        
        assertEquals("John", session.get("firstName"));
        assertEquals("Doe", session.get("lastName"));
    }
    
    @Test
    public void onCreateIsHandledWithNoParams() {
        
        HttpRequest request = mock(HttpRequest.class);
        when(request.getRequestParameterNames()).thenReturn(new HashSet<String>());
        when(request.getRequestParameter(anyString())).thenReturn(null);
        
        Session session = new Session();
        when(request.getSession()).thenReturn(session);
        
        Route route = new Route("/");
        when(request.getRoute()).thenReturn(route);
        
        newSessionHandler().onCreate(request);
        
        assertEquals("[]", session.getAttributeNames().toString());
    }
    
    private SessionHandler newSessionHandler() {