package ioc.specs

import org.apache.tapestry5.ioc.*

class ServiceProxySpec extends AbstractRegistrySpecification {

  def "shutdown deactivaties proxies"() {
    buildRegistry FredModule, BarneyModule

    def fred = getService "Fred", Runnable

    fred.run()

    shutdown()

    when:

    fred.run()

    then:

    RuntimeException ex = thrown()

    ex.message.contains "Proxy for service Fred is no longer active because the IOC Registry has been shut down."

    fred.toString() == "<Proxy for Fred(java.lang.Runnable)>"

    cleanup:

    registry = null
  }

  def "show that services defined without a implementation are instantiated immediately"() {
    buildRegistry NonProxiedServiceModule

    when:

    def holder = getService StringHolder

    then:

    holder instanceof StringHolderImpl // and not some proxy
  }

  def "service builder methods with a class (not interface) return type are not proxied, but are cached"() {

    buildRegistry ConcreteServiceBuilderModule

    when:

    def h1 = getService StringHolder

    then: "not proxied"

    h1 instanceof StringHolderImpl

    when:

    def h2 = getService StringHolder

    then: "cached"

    h2.is h1
  }

  def "verify that a proxy for an autobuilt object lazily instantiates the implementation"() {

    buildRegistry()

    expect:
    IntegrationTestFixture.countingGreeterInstantiationCount == 0

    when: "obtaining the proxy"

    def g = proxy Greeter, CountingGreeterImpl

    then: "the implementation is not yet instantiated"

    IntegrationTestFixture.countingGreeterInstantiationCount == 0

    when: "invoking toString() on the proxy"

    assert g.toString() == "<Autoreload proxy org.apache.tapestry5.ioc.CountingGreeterImpl(org.apache.tapestry5.ioc.Greeter)>"

    then: "the implementation is not yet instantiated"

    IntegrationTestFixture.countingGreeterInstantiationCount == 0

    when: "invoking other methods on the proxy"

    assert g.greeting == "Hello"

    then: "the implementation is now instantiated"

    IntegrationTestFixture.countingGreeterInstantiationCount == 1
  }

}
