blob: 0479626229a5950c909ad6ecb96ad3d5c20bc0ab [file] [log] [blame]
package ioc.specs
import org.apache.tapestry5.ioc.AdvisorDef2
import org.apache.tapestry5.ioc.BlueMarker
import org.apache.tapestry5.ioc.RedMarker
import org.apache.tapestry5.ioc.services.PlasticProxyFactory
import org.slf4j.Logger
import spock.lang.Specification
import org.apache.tapestry5.ioc.def.*
import org.apache.tapestry5.ioc.internal.*
class ModuleImplSpec extends Specification {
Logger logger = Mock()
InternalRegistry registry = Mock()
PlasticProxyFactory proxyFactory = Mock()
ServiceActivityTracker tracker = Mock()
def "findServiceIdsForInterface() test"() {
ModuleDef md = new DefaultModuleDefImpl(ModuleImplTestModule, logger, proxyFactory)
when:
Module module = new ModuleImpl(registry, tracker, md, proxyFactory, logger)
def serviceIds = module.findServiceIdsForInterface(FieService)
then:
serviceIds.size() == 2
serviceIds.containsAll(["Fie", "OtherFie"])
}
def "findMatchingDecoratorDefs() with exact DecoratorDef match"() {
ServiceDef sd = Mock()
DecoratorDef2 def1 = Mock()
DecoratorDef def2 = Mock()
ModuleDef md = Mock()
def decoratorDefs = [def1, def2] as Set
when:
Module module = new ModuleImpl(registry, tracker, md, proxyFactory, logger)
then:
1 * md.serviceIds >> Collections.EMPTY_SET
when:
def matches = module.findMatchingDecoratorDefs(sd)
then:
matches.size() == 1
matches.contains def2
1 * md.decoratorDefs >> decoratorDefs
1 * sd.serviceInterface >> Runnable
1 * def1.matches(sd) >> false
// Maybe not a complete match, so does it match by type & markers?
1 * def1.serviceInterface >> ToStringService
// An exact match
1 * def2.matches(sd) >> true
0 * _
}
def "findDecoratorDefs() with matching service but non-matching marker annotations"() {
ServiceDef sd = Mock()
DecoratorDef2 def1 = Mock()
DecoratorDef def2 = Mock()
ModuleDef md = Mock()
def decoratorDefs = [def1, def2] as Set
def def1markers = [BlueMarker] as Set
def sdmarkers = [RedMarker] as Set
def registrymarkers = [RedMarker, BlueMarker] as Set
when:
Module module = new ModuleImpl(registry, tracker, md, proxyFactory, logger)
then:
1 * md.serviceIds >> Collections.EMPTY_SET
when:
def matches = module.findMatchingDecoratorDefs(sd)
then:
matches.size() == 1
matches.contains def2
1 * md.decoratorDefs >> decoratorDefs
1 * def1.matches(sd) >> false
1 * def1.serviceInterface >> Object
_ * sd.serviceInterface >> Runnable
1 * def1.markers >> def1markers
1 * sd.markers >> sdmarkers
1 * def2.matches(sd) >> true
1 * registry.markerAnnotations >> registrymarkers
0 * _
}
def "findMatchingServiceAdvisors() where the advise is for a different interface than the service"() {
AdvisorDef2 def1 = Mock()
AdvisorDef2 def2 = Mock()
ModuleDef2 md = Mock()
ServiceDef sd = Mock()
def advisors = [def1, def2] as Set
when:
Module module = new ModuleImpl(registry, tracker, md, proxyFactory, logger)
then:
1 * md.serviceIds >> Collections.EMPTY_SET
when:
def matches = module.findMatchingServiceAdvisors(sd)
then:
matches.size() == 1
matches.contains def2
1 * md.advisorDefs >> advisors
1 * def1.matches(sd) >> false
1 * def1.serviceInterface >> ToStringService
1 * sd.serviceInterface >> Runnable
1 * def2.matches(sd) >> true
0 * _
}
def "findMatchingServiceAdvisors() where the advice is for a matching service type but non-matching marker annotations"() {
AdvisorDef2 def1 = Mock()
AdvisorDef2 def2 = Mock()
ModuleDef2 md = Mock()
ServiceDef sd = Mock()
def advisors = [def1, def2] as Set
def def1markers = [BlueMarker] as Set
def registrymarkers = [BlueMarker, RedMarker] as Set
def servicemarkers = [RedMarker] as Set
when:
Module module = new ModuleImpl(registry, tracker, md, proxyFactory, logger)
then:
1 * md.serviceIds >> Collections.EMPTY_SET
when:
def matches = module.findMatchingServiceAdvisors(sd)
then:
matches.size() == 1
matches.contains def2
1 * registry.markerAnnotations >> registrymarkers
1 * md.advisorDefs >> advisors
1 * def1.matches(sd) >> false
1 * def1.serviceInterface >> Object
1 * sd.serviceInterface >> Runnable
1 * sd.markers >> servicemarkers
1 * def1.markers >> def1markers
1 * def2.matches(sd) >> true
0 * _
}
def "findMatchingServiceAdvisors() match on type and marker annotations"() {
AdvisorDef2 ad = Mock()
ModuleDef2 md = Mock()
ServiceDef sd = Mock()
def advisors = [ad] as Set
def admarkers = [RedMarker] as Set
def registrymarkers = [BlueMarker, RedMarker] as Set
def servicemarkers = [RedMarker] as Set
when:
Module module = new ModuleImpl(registry, tracker, md, proxyFactory, logger)
then:
1 * md.serviceIds >> Collections.EMPTY_SET
when:
def matches = module.findMatchingServiceAdvisors(sd)
then:
matches.size() == 1
matches.contains ad
1 * registry.markerAnnotations >> registrymarkers
1 * md.advisorDefs >> advisors
1 * ad.matches(sd) >> false
1 * ad.serviceInterface >> Object
1 * sd.serviceInterface >> Runnable
1 * sd.markers >> servicemarkers
1 * ad.markers >> admarkers
0 * _
}
def "findMatchingServiceAdvisors() where there are no marker annotations at all"() {
AdvisorDef2 ad = Mock()
ModuleDef2 md = Mock()
ServiceDef sd = Mock()
def advisors = [ad] as Set
when:
Module module = new ModuleImpl(registry, tracker, md, proxyFactory, logger)
then:
1 * md.serviceIds >> Collections.EMPTY_SET
when:
def matches = module.findMatchingServiceAdvisors(sd)
then:
matches.size() == 0
1 * registry.markerAnnotations >> Collections.EMPTY_SET
1 * md.advisorDefs >> advisors
1 * ad.matches(sd) >> false
1 * ad.serviceInterface >> Object
1 * sd.serviceInterface >> Runnable
1 * ad.markers >> Collections.EMPTY_SET
0 * _
}
}