/**
 * 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 com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Binding;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
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;

import junit.framework.TestCase;

import java.util.Iterator;
import java.util.List;

/**
 * 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() {
      binder().requireExplicitBindings();

      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"));
    }
  }
}
