package ioc.specs

import org.apache.tapestry5.ioc.internal.util.OneShotLockSubject
import spock.lang.Specification

class OneShotLockSpec extends Specification {

  def subject = new OneShotLockSubject()

  def "may only invoke locked method once"() {
    subject.go()
    subject.done()


    when:

    subject.go()

    then:

    IllegalStateException e = thrown()

    e.message.contains "${subject.class.name}.go("
    e.message.contains "may no longer be invoked"
  }

  def "the method that locks is itself checked"() {

    subject.go()
    subject.done()

    when:

    subject.done()

    then:

    IllegalStateException e = thrown()

    e.message.contains "${subject.class.name}.done("
  }
}
