package ioc.specs

import org.apache.tapestry5.ioc.internal.ExtraPublicConstructorsModule
import org.apache.tapestry5.ioc.internal.PrivateConstructorModule
import org.apache.tapestry5.ioc.internal.UpcaseService
import org.apache.tapestry5.ioc.*

/**
 * A few tests that are easiest (or even just possible) by building a Registry and trying out a few
 * things.
 */
class RegistryConstructionAndRuntimeErrorsSpec extends AbstractRegistrySpecification {

  def "duplicate service names are a failure"() {
    when:

    buildRegistry FredModule, DuplicateFredModule

    then:

    RuntimeException ex = thrown()

    ex.message.startsWith "Service id 'Fred' has already been defined by"

    // Can't check entire message, can't guarantee what order modules will be processed in
  }

  def "service with unknown scope fails at service proxy creation"() {
    buildRegistry UnknownScopeModule

    when:

    getService "UnknownScope", Runnable

    then:

    Exception e = thrown()

    e.message.contains "Error building service proxy for service 'UnknownScope'"
    e.message.contains "Unknown service scope 'magic'"
  }

  def "ensure that recursive module construction is detected"() {

    buildRegistry RecursiveConstructorModule

    def runnable = getService "Runnable", Runnable

    when:

    // We can get the proxy, but invoking a method causes
    // the module to be instantiated ... but that also invokes a method on
    // the proxy.

    runnable.run()

    then:

    RuntimeException e = thrown()

    e.message.contains "has failed due to recursion"
  }

  def "a module class must have a public constructor"() {

    buildRegistry PrivateConstructorModule

    def trigger = getService "Trigger", Runnable

    when:

    trigger.run()

    then:

    RuntimeException e = thrown()

    e.message.contains "Module class org.apache.tapestry5.ioc.internal.PrivateConstructorModule does not contain any public constructors."
  }

  def "extra public constructors on a module class are ignored"() {

    buildRegistry ExtraPublicConstructorsModule

    when: "forcing the module to be instantiated"

    def upcase = getService UpcaseService

    then: "no exception when instantiating the module"

    upcase.upcase('Hello, ${fred}') == "HELLO, FLINTSTONE"
  }

  def "extra public methods on module classes are exceptions"() {
    when:
    buildRegistry ExtraMethodsModule

    then:

    RuntimeException e = thrown()

    e.message.contains "Module class org.apache.tapestry5.ioc.ExtraMethodsModule contains unrecognized public methods: "
    e.message.contains "thisMethodIsInvalid()"
    e.message.contains "soIsThisMethod()"
  }

  def "can not use withSimpleId() when binding a service interface to a ServiceBuilder callback"() {
    when:

    buildRegistry NoImplementationClassForSimpleIdModule

    then:

    RuntimeException e = thrown()

    e.message.contains "No defined implementation class to generate simple id from"
  }
}
