/**
 * Copyright (C) 2010 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.inject.servlet;

import static com.google.inject.servlet.UriPatternType.REGEX;
import static com.google.inject.servlet.UriPatternType.SERVLET;

import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;

import com.google.inject.Binding;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.internal.util.ImmutableList;
import com.google.inject.internal.util.ImmutableMap;
import com.google.inject.name.Names;
import com.google.inject.servlet.ServletSpiVisitor.Params;
import com.google.inject.spi.Element;
import com.google.inject.spi.Elements;

/**
 * A very basic test that servletmodule works with bindings.
 * 
 * @author sameb@google.com (Sam Berlin)
 */
public class ExtensionSpiTest extends TestCase {
  
  private DummyFilterImpl dummyFilter1 = new DummyFilterImpl();
  private DummyFilterImpl dummyFilter2 = new DummyFilterImpl();
  private DummyFilterImpl dummyFilter3 = new DummyFilterImpl();
  private DummyFilterImpl dummyFilter4 = new DummyFilterImpl();
  
  private DummyServlet dummyServlet1 = new DummyServlet();
  private DummyServlet dummyServlet2 = new DummyServlet();
  private DummyServlet dummyServlet3 = new DummyServlet();
  private DummyServlet dummyServlet4 = new DummyServlet();
  
  public final void testSpiOnElements() {    
    ServletSpiVisitor visitor = new ServletSpiVisitor(false);
    int count = 0;
    for(Element element : Elements.getElements(new Module())) {
      if(element instanceof Binding) {
        assertEquals(count++, ((Binding)element).acceptTargetVisitor(visitor));
      }
    }
    validateVisitor(visitor);
  }
  
  public final void testSpiOnInjector() {
    ServletSpiVisitor visitor = new ServletSpiVisitor(true);
    int count = 0;
    Injector injector = Guice.createInjector(new Module());
    for(Binding binding : injector.getBindings().values()) {
      assertEquals(count++, binding.acceptTargetVisitor(visitor));
    }
    validateVisitor(visitor);
  }
  
  private void validateVisitor(ServletSpiVisitor visitor) {
    assertEquals(48, visitor.currentCount - visitor.otherCount);
    
    // This is the expected param list, in order..
    List<Params> expected = ImmutableList.of(
        new Params("/class", Key.get(DummyFilterImpl.class), ImmutableMap.of(), SERVLET),
        new Params("/class/2", Key.get(DummyFilterImpl.class), ImmutableMap.of(), SERVLET),
        new Params("/key", Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of(), SERVLET),
        new Params("/key/2", Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of(), SERVLET),
        new Params("/instance", dummyFilter1, ImmutableMap.of(), SERVLET),
        new Params("/instance/2", dummyFilter1, ImmutableMap.of(), SERVLET),
        new Params("/class/keyvalues", Key.get(DummyFilterImpl.class), ImmutableMap.of("key", "value"), SERVLET),
        new Params("/class/keyvalues/2", Key.get(DummyFilterImpl.class), ImmutableMap.of("key", "value"), SERVLET),
        new Params("/key/keyvalues", Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of("key", "value"), SERVLET),
        new Params("/key/keyvalues/2", Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of("key", "value"), SERVLET),
        new Params("/instance/keyvalues", dummyFilter2, ImmutableMap.of("key", "value"), SERVLET),
        new Params("/instance/keyvalues/2", dummyFilter2, ImmutableMap.of("key", "value"), SERVLET),
        
        new Params("/class[0-9]", Key.get(DummyFilterImpl.class), ImmutableMap.of(), REGEX),
        new Params("/class[0-9]/2", Key.get(DummyFilterImpl.class), ImmutableMap.of(), REGEX),
        new Params("/key[0-9]", Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of(), REGEX),
        new Params("/key[0-9]/2", Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of(), REGEX),
        new Params("/instance[0-9]", dummyFilter3, ImmutableMap.of(), REGEX),
        new Params("/instance[0-9]/2", dummyFilter3, ImmutableMap.of(), REGEX),
        new Params("/class[0-9]/keyvalues", Key.get(DummyFilterImpl.class), ImmutableMap.of("key", "value"), REGEX),
        new Params("/class[0-9]/keyvalues/2", Key.get(DummyFilterImpl.class), ImmutableMap.of("key", "value"), REGEX),
        new Params("/key[0-9]/keyvalues", Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of("key", "value"), REGEX),
        new Params("/key[0-9]/keyvalues/2", Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of("key", "value"), REGEX),
        new Params("/instance[0-9]/keyvalues", dummyFilter4, ImmutableMap.of("key", "value"), REGEX),
        new Params("/instance[0-9]/keyvalues/2", dummyFilter4, ImmutableMap.of("key", "value"), REGEX),
        
        new Params("/class", Key.get(DummyServlet.class), ImmutableMap.of(), SERVLET),
        new Params("/class/2", Key.get(DummyServlet.class), ImmutableMap.of(), SERVLET),
        new Params("/key", Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of(), SERVLET),
        new Params("/key/2", Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of(), SERVLET),
        new Params("/instance", dummyServlet1, ImmutableMap.of(), SERVLET),
        new Params("/instance/2", dummyServlet1, ImmutableMap.of(), SERVLET),
        new Params("/class/keyvalues", Key.get(DummyServlet.class), ImmutableMap.of("key", "value"), SERVLET),
        new Params("/class/keyvalues/2", Key.get(DummyServlet.class), ImmutableMap.of("key", "value"), SERVLET),
        new Params("/key/keyvalues", Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of("key", "value"), SERVLET),
        new Params("/key/keyvalues/2", Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of("key", "value"), SERVLET),
        new Params("/instance/keyvalues", dummyServlet2, ImmutableMap.of("key", "value"), SERVLET),
        new Params("/instance/keyvalues/2", dummyServlet2, ImmutableMap.of("key", "value"), SERVLET),
        
        new Params("/class[0-9]", Key.get(DummyServlet.class), ImmutableMap.of(), REGEX),
        new Params("/class[0-9]/2", Key.get(DummyServlet.class), ImmutableMap.of(), REGEX),
        new Params("/key[0-9]", Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of(), REGEX),
        new Params("/key[0-9]/2", Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of(), REGEX),
        new Params("/instance[0-9]", dummyServlet3, ImmutableMap.of(), REGEX),
        new Params("/instance[0-9]/2", dummyServlet3, ImmutableMap.of(), REGEX),
        new Params("/class[0-9]/keyvalues", Key.get(DummyServlet.class), ImmutableMap.of("key", "value"), REGEX),
        new Params("/class[0-9]/keyvalues/2", Key.get(DummyServlet.class), ImmutableMap.of("key", "value"), REGEX),
        new Params("/key[0-9]/keyvalues", Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of("key", "value"), REGEX),
        new Params("/key[0-9]/keyvalues/2", Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of("key", "value"), REGEX),
        new Params("/instance[0-9]/keyvalues", dummyServlet4, ImmutableMap.of("key", "value"), REGEX),
        new Params("/instance[0-9]/keyvalues/2", dummyServlet4, ImmutableMap.of("key", "value"), REGEX)
    );
    
    assertEquals(expected.size(), visitor.actual.size());
    Iterator<Params> actualIterator = visitor.actual.iterator();
    int i = 0;
    for(Params param : expected) {
      assertEquals("wrong " + i++ + "th param", param, actualIterator.next());
    }
  }

  private class Module extends ServletModule {
    @Override
    protected void configureServlets() {
      filter("/class", "/class/2").through(DummyFilterImpl.class);
      filter("/key", "/key/2").through(
          Key.get(DummyFilterImpl.class, Names.named("foo")));
      filter("/instance", "/instance/2").through(dummyFilter1);
      filter("/class/keyvalues", "/class/keyvalues/2").through(
          DummyFilterImpl.class, ImmutableMap.of("key", "value"));
      filter("/key/keyvalues", "/key/keyvalues/2").through(
          Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of("key", "value"));
      filter("/instance/keyvalues", "/instance/keyvalues/2").through(
          dummyFilter2, ImmutableMap.of("key", "value"));

      filterRegex("/class[0-9]", "/class[0-9]/2").through(DummyFilterImpl.class);
      filterRegex("/key[0-9]", "/key[0-9]/2").through(
          Key.get(DummyFilterImpl.class, Names.named("foo")));
      filterRegex("/instance[0-9]", "/instance[0-9]/2").through(dummyFilter3);
      filterRegex("/class[0-9]/keyvalues", "/class[0-9]/keyvalues/2").through(
          DummyFilterImpl.class, ImmutableMap.of("key", "value"));
      filterRegex("/key[0-9]/keyvalues", "/key[0-9]/keyvalues/2").through(
          Key.get(DummyFilterImpl.class, Names.named("foo")), ImmutableMap.of("key", "value"));
      filterRegex("/instance[0-9]/keyvalues", "/instance[0-9]/keyvalues/2").through(
          dummyFilter4, ImmutableMap.of("key", "value"));

      serve("/class", "/class/2").with(DummyServlet.class);
      serve("/key", "/key/2").with(
          Key.get(DummyServlet.class, Names.named("foo")));
      serve("/instance", "/instance/2").with(dummyServlet1);
      serve("/class/keyvalues", "/class/keyvalues/2").with(
          DummyServlet.class, ImmutableMap.of("key", "value"));
      serve("/key/keyvalues", "/key/keyvalues/2").with(
          Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of("key", "value"));
      serve("/instance/keyvalues", "/instance/keyvalues/2").with(
          dummyServlet2, ImmutableMap.of("key", "value"));

      serveRegex("/class[0-9]", "/class[0-9]/2").with(DummyServlet.class);
      serveRegex("/key[0-9]", "/key[0-9]/2").with(
          Key.get(DummyServlet.class, Names.named("foo")));
      serveRegex("/instance[0-9]", "/instance[0-9]/2").with(dummyServlet3);
      serveRegex("/class[0-9]/keyvalues", "/class[0-9]/keyvalues/2").with(
          DummyServlet.class, ImmutableMap.of("key", "value"));
      serveRegex("/key[0-9]/keyvalues", "/key[0-9]/keyvalues/2").with(
          Key.get(DummyServlet.class, Names.named("foo")), ImmutableMap.of("key", "value"));
      serveRegex("/instance[0-9]/keyvalues", "/instance[0-9]/keyvalues/2").with(
          dummyServlet4, ImmutableMap.of("key", "value"));
    }
  };
  
}
