blob: 643aa3aeb855568deea25c427099bf4d7fdacecd [file] [log] [blame]
package ioc.specs
import org.apache.tapestry5.ioc.util.IdAllocator
import spock.lang.Specification
class IdAllocatorSpec extends Specification {
def "id is not allocated until it is allocated"() {
when:
IdAllocator a = new IdAllocator()
then:
!a.isAllocated("name")
when:
def actual = a.allocateId("name")
then:
actual == "name"
a.isAllocated("name")
}
def "repeatedly allocated ids are uniqued with a suffix"() {
IdAllocator a = new IdAllocator()
a.allocateId("name")
expect:
10.times {
def expected = "name_$it"
assert !a.isAllocated(expected)
assert a.allocateId("name") == expected
}
}
def "access to allocated ids"() {
IdAllocator a = new IdAllocator()
when:
a.allocateId("name")
then:
a.allocatedIds == ["name"]
when:
a.allocateId("name")
then:
a.allocatedIds == ["name", "name_0"]
}
def "allocation using a namespace"() {
IdAllocator a = new IdAllocator("_NS")
expect:
a.allocateId("name") == "name_NS"
a.allocateId("name") == "name_NS_0"
// This is current behavior, but is probably something
// that could be improved.
a.allocateId("name_NS") == "name_NS_NS"
a.allocateId("name_NS") == "name_NS_NS_0"
}
def "degenerate id allocation"() {
IdAllocator a = new IdAllocator()
expect:
a.allocateId("d_1") == "d_1"
a.allocateId("d") == "d"
a.allocateId("d") == "d_0"
a.allocateId("d") == "d_2"
a.allocateId("d") == "d_3"
// It's a collision, so a unique number is appended.
a.allocateId("d_1") == "d_1_0"
}
def "degenerate id allocation (with a namespace)"() {
IdAllocator a = new IdAllocator("_NS")
expect:
a.allocateId("d_1") == "d_1_NS"
a.allocateId("d") == "d_NS"
a.allocateId("d") == "d_NS_0"
a.allocateId("d") == "d_NS_1"
a.allocateId("d") == "d_NS_2"
a.allocateId("d") == "d_NS_3"
a.allocateId("d_1") == "d_1_NS_0"
// This is very degenerate, and maybe something that needs fixing.
a.allocateId("d_1_NS") == "d_1_NS_NS"
}
def "clearing an allocator forgets prior ids"() {
when:
IdAllocator a = new IdAllocator()
then:
a.allocateId("foo") == "foo"
a.allocateId("foo") == "foo_0"
when:
a.clear()
then:
a.allocateId("foo") == "foo"
a.allocateId("foo") == "foo_0"
}
def "cloning an id allocator does not share data with the new allocator"() {
when:
IdAllocator a = new IdAllocator();
then:
a.allocateId("foo") == "foo"
a.allocateId("foo") == "foo_0"
when:
IdAllocator b = a.clone()
then:
["bar", "baz", "foo", "foo"].each {
assert a.allocateId(it) == b.allocateId(it)
}
}
}