package ioc.specs

import org.apache.tapestry5.ioc.MappedConfiguration
import org.apache.tapestry5.ioc.ObjectLocator
import org.apache.tapestry5.ioc.def.ContributionDef
import org.apache.tapestry5.ioc.internal.ContributionDefImpl
import org.apache.tapestry5.ioc.internal.TypeCoercerProxy
import org.apache.tapestry5.ioc.internal.ValidatingMappedConfigurationWrapper
import org.apache.tapestry5.ioc.services.PlasticProxyFactory

import java.sql.SQLException

class ValidatingMappedConfigurationWrapperSpec extends AbstractSharedRegistrySpecification {

  static String SERVICE_ID = "Baz"

  ObjectLocator locator = Mock()
  TypeCoercerProxy tc = Mock()
  Map keyToContribution = [:]
  Map map = [:]

  def "contribute a property key and value"() {
    ContributionDef cd = Mock()
    def keyToContribution = [:]
    ObjectLocator locator = Mock()
    def map = [:]
    TypeCoercerProxy tc = Mock()
    Runnable value = Mock()

    MappedConfiguration config = new ValidatingMappedConfigurationWrapper(Runnable, locator, tc, map, null, SERVICE_ID, cd, Class, keyToContribution)

    when:

    config.add(Integer, value)

    then:

    tc.coerce(value, Runnable) >> value

    map[Integer].is(value)
    keyToContribution[Integer].is(cd)
  }

  def "an added value may be coerced to the correct type"() {

    ContributionDef cd = Mock()
    def value = "coerce-me"
    Runnable coerced = Mock()

    MappedConfiguration config = new ValidatingMappedConfigurationWrapper(Runnable, locator, tc, map, null, SERVICE_ID, cd, Class, keyToContribution)

    when:

    config.add(Integer, value)

    then:

    tc.coerce(value, Runnable) >> coerced

    map[Integer].is(coerced)
    keyToContribution[Integer].is(cd)
  }

  def ContributionDef newContributionDef(methodName) {

    def proxyFactory = getService PlasticProxyFactory

    return new ContributionDefImpl(SERVICE_ID, findMethod(methodName), false, proxyFactory, null, null);
  }

  def findMethod(name) {
    return this.class.methods.find() { it.name == name }
  }


  public void contributionPlaceholder1() {

  }

  public void contributionPlaceholder2() {

  }

  def "may not contribute a duplicate key"() {
    ContributionDef def1 = newContributionDef "contributionPlaceholder1"
    ContributionDef def2 = newContributionDef "contributionPlaceholder2"

    keyToContribution[Integer] = def1

    MappedConfiguration config = new ValidatingMappedConfigurationWrapper(Runnable, locator, tc, map, null, SERVICE_ID, def2, Class, keyToContribution)

    when:

    config.add(Integer, "does-not-matter")

    then:

    IllegalArgumentException e = thrown()

    e.message.contains "Service contribution (to service 'Baz') conflicts with existing contribution"

    keyToContribution[Integer].is(def1)
    map.isEmpty()
  }

  def "the contributed key may not be null"() {
    ContributionDef cd = newContributionDef "contributionPlaceholder1"

    MappedConfiguration config = new ValidatingMappedConfigurationWrapper(Runnable, locator, tc, map, null, SERVICE_ID, cd, Class, keyToContribution)

    when:

    config.add(null, "does-not-matter")

    then:

    NullPointerException e = thrown()

    e.message == "Key for service contribution (to service '$SERVICE_ID') was null."
  }

  def "adding a key of the wrong type is an exception"() {
    ContributionDef cd = newContributionDef "contributionPlaceholder1"

    MappedConfiguration config = new ValidatingMappedConfigurationWrapper(Runnable, locator, tc, map, null, SERVICE_ID, cd, Class, keyToContribution)

    when:

    config.add("java.util.List", "does-not-matter")

    then:

    IllegalArgumentException e = thrown()

    e.message == "Key for service contribution (to service 'Baz') was an instance of java.lang.String, but the expected key type was java.lang.Class."
  }

  def "contributing a null value is an exception"() {
    ContributionDef cd = newContributionDef "contributionPlaceholder1"

    MappedConfiguration config = new ValidatingMappedConfigurationWrapper(Runnable, locator, tc, map, null, SERVICE_ID, cd, Class, keyToContribution)

    when:

    config.add(SQLException, null)

    then:

    NullPointerException e = thrown()

    e.message == "Service contribution (to service 'Baz') was null."
    map.isEmpty()
  }
}