blob: 91fdd6457b0a356eef157d1243e0bd5cb32da257 [file] [log] [blame]
package ioc.specs
import org.apache.tapestry5.ioc.internal.services.cron.CronExpression
import spock.lang.Ignore
import spock.lang.Issue
import spock.lang.PendingFeature
import spock.lang.Specification
import spock.lang.Unroll
import java.text.ParseException
@Unroll
class CronExpressionSpec extends Specification {
// This allows the any of the constants defined on Calendar to be used
// without qualification.
def propertyMissing(String name) { Calendar[name] }
def "isSatisfiedBy(#year, #month, #day, #hour, #minute, #second ) should be #satisfied for expression '#expr'"() {
def cal = Calendar.getInstance();
def exp = new CronExpression(expr)
cal.set year, month, day, hour, minute, second
expect:
exp.isSatisfiedBy(cal.time) == satisfied
where:
expr | year | month | day | hour | minute | second | satisfied
"0 15 10 * * ? 2005" | 2005 | JUNE | 1 | 10 | 15 | 0 | true
"0 15 10 * * ? 2005" | 2006 | JUNE | 1 | 10 | 15 | 0 | false
"0 15 10 * * ? 2005" | 2005 | JUNE | 1 | 10 | 16 | 0 | false
"0 15 10 * * ? 2005" | 2005 | JUNE | 1 | 10 | 14 | 0 | false
"0 15 10 L-2 * ? 2010" | 2010 | OCTOBER | 29 | 10 | 15 | 0 | true
"0 15 10 L-2 * ? 2010" | 2010 | OCTOBER | 28 | 10 | 15 | 0 | false
"0 15 10 L-5W * ? 2010" | 2010 | OCTOBER | 26 | 10 | 15 | 0 | true
"0 15 10 L-1 * ? 2010" | 2010 | OCTOBER | 30 | 10 | 15 | 0 | true
"0 15 10 L-1W * ? 2010" | 2010 | OCTOBER | 29 | 10 | 15 | 0 | true
}
def cloneViaSerialize(obj) {
ByteArrayOutputStream baos = new ByteArrayOutputStream()
baos.withObjectOutputStream { it.writeObject(obj) }
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray())
ObjectInputStream ois = new ObjectInputStream(bais)
ois.readObject()
}
// This test is in the original TestNG test but failed there (making me think that the test case was probably
// not being run). It's clear that CronExpressions do not deserialize correctly by looking at the source!
@Ignore
def "check that CronExpressions serialize and deserialize"() {
CronExpression original = new CronExpression("19 15 10 4 Apr ? ")
when:
CronExpression cloned = cloneViaSerialize original
then:
cloned.cronExpression == original.cronExpression
cloned.getNextValidTimeAfter(new Date()) != null
}
def "Parse failure: parse of '#expr' should fail with '#err'"() {
when:
new CronExpression(expr)
then:
def e = thrown(ParseException)
assert e.message.startsWith(err)
where:
expr | err
"* * * * Foo ? " | "Invalid Month value:"
"* * * * Jan-Foo ? " | "Invalid Month value:"
"0 0 * * * *" | "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented."
"0 0 * 4 * *" | "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented."
"0 0 * * * 4" | "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented."
"0 43 9 1,5,29,L * ?" | "Support for specifying 'L' and 'LW' with other days of the month is not implemented"
"0 43 9 ? * SAT,SUN,L" | "Support for specifying 'L' with other days of the week is not implemented"
"0 43 9 ? * 6,7,L" | "Support for specifying 'L' with other days of the week is not implemented"
"0/5 * * 32W 1 ?" | "The 'W' option does not make sense with values larger than"
}
def "Expression '#expr' is valid"() {
when:
new CronExpression(expr)
then:
noExceptionThrown()
where:
expr << ["0 43 9 ? * 5L"]
}
@Issue("https://issues.apache.org/jira/projects/TAP5/issues/TAP5-2723")
def "getNextValidTimeAfter(#after) should be #expected for #expr"()
{
given:
def e = new CronExpression(expr)
e.setTimeZone(TimeZone.getTimeZone("UTC"))
expect:
e.getNextValidTimeAfter(new Date(after)) == new Date(expected)
where:
expr | after || expected
"0/5 * * ? * * *" | 0 || 5000
"0/5 * * ? * * *" | 5000 || 10000
"0 55 8 L-9 * ? *" | 1653939024971 || 1655801700000
}
}