30fad2ce7d
Reviewed-by: naoto
567 lines
19 KiB
Plaintext
567 lines
19 KiB
Plaintext
Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
|
|
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
|
|
This code is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License version 2 only, as
|
|
published by the Free Software Foundation.
|
|
|
|
This code is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
version 2 for more details (a copy is included in the LICENSE file that
|
|
accompanied this code).
|
|
|
|
You should have received a copy of the GNU General Public License version
|
|
2 along with this work; if not, write to the Free Software Foundation,
|
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
or visit www.oracle.com if you need additional information or have any
|
|
questions.
|
|
|
|
CALENDAR TEST SCRIPT
|
|
|
|
Masayoshi Okutsu
|
|
2005-03-18
|
|
|
|
Introduction
|
|
------------
|
|
|
|
Calendar Test Script is a simple scripting language to describe test cases
|
|
for java.util.Calendar and its subclasses. It should be much more
|
|
productive to use this script language than writing test programs in Java.
|
|
|
|
A script looks like below.
|
|
|
|
1 locale ja JP JP
|
|
2 timezone Asia/Tokyo
|
|
3 new instance jcal
|
|
4 test day of week on Heisei 1 Jan 8
|
|
5 use jcal
|
|
6 clear all
|
|
7 set date Heisei 1 Jan 8
|
|
8 check day_of_week Sun
|
|
|
|
The first line defines a Locale to be used for creating Calendar
|
|
instances. Line 2 defines the current TimeZone to be Asia/Tokyo that is
|
|
used creating Calendar instances. Line 3 creates a Calendar instance with
|
|
the Locale and TimeZone instances. Its reference name is `jcal'. Line 4
|
|
indicates a start point for a test case with a short test case
|
|
description. Line 5 designates `jcal' as the current Calendar
|
|
instance. All calendar operation commands are applied to the current
|
|
Calendar instance. Line 6 clears all of the calendar fields (e.g., ERA,
|
|
YEAR, MONTH, etc.). Line 7 sets the ERA, YEAR, MONTH and DAY_OF_MONTH
|
|
fields to Heisei, 1, JANUARY and 8, respectively. Line 8 checks if the
|
|
DAY_OF_WEEK value is SUNDAY. If it's not, then a RuntimeException is
|
|
thrown.
|
|
|
|
Script Grammar
|
|
--------------
|
|
|
|
A line is a comment, blank or command line. Any text after '#' is always
|
|
treated as a comment and ignored, like a shell script.
|
|
|
|
# This is a comment line.
|
|
|
|
A command line consists of a command and its parameters, optionally
|
|
followed by a comment. For example,
|
|
|
|
set date Heisei 1 Jan 8 # The first day of Heisei
|
|
|
|
`set' is a command to set `date' to Heisei year 1 January 8th. `Heisei' is
|
|
a constant for the Japanese Heisei era value which is consistent with the
|
|
Japanese imperial calendar implementation. `Jan' is a constant for
|
|
Calendar.SUNDAY. The text after '#' is ignored.
|
|
|
|
Keywords are case-insensitive.
|
|
|
|
set DAY_OF_WEEK MON
|
|
SET day_of_week Mon
|
|
|
|
are the same thing.
|
|
|
|
Lexical analysis is very simple. A command must be complete in a single
|
|
line. Keywords and symbols must be separated by white space. For example,
|
|
"$result+1" is parsed as one token. It must be written as "$result + 1".
|
|
|
|
Variables
|
|
---------
|
|
|
|
Variables can be used in any context to store an integer value and are
|
|
referenced in any contexts where an integer value is required. A variable
|
|
name must start with a '$', such as `$maxyear'. The integer value is
|
|
handled as a long.
|
|
|
|
`$result' is reserved for storing a result of a get commend operation. For
|
|
example, executing the following command:
|
|
|
|
get day_of_month
|
|
|
|
sets $result to the get(Calendar.DAY_OF_MONTH) value of the current
|
|
Calendar instance. (See NEW and USE commands for the current Calendar
|
|
instance.)
|
|
|
|
Commands
|
|
--------
|
|
|
|
The following defines each command and its syntax. Keywords are described
|
|
in upper case below.
|
|
|
|
LOCALE language [country [variant]]
|
|
|
|
Creates a Locale instance by calling new Locale(language, country,
|
|
variant). country and variant are optional. Defining LOCALE overrides
|
|
the previously defined Locale value if any. The initial Locale value
|
|
is Locale.getDefault().
|
|
|
|
TIMEZONE tzid
|
|
|
|
Creates a TimeZone instance by calling
|
|
TimeZone.getTimeZone(tzid). Defining TIMEZONE overrides the previously
|
|
defined Locale value if any. The initial TimeZone value is
|
|
TimeZone.getDefault().
|
|
|
|
NEW INSTANCE calendarname
|
|
|
|
Creates a Calendar instance by calling Calendar.getInstance(TimeZone,
|
|
Locale). TimeZone and Locale are those defined by TIMEZONE and LOCALE
|
|
commands (or their initial values), respectively. The instance is
|
|
associated with `calendarname' and becomes the current Calendar
|
|
instance to be used for testing.
|
|
|
|
NEW GREGORIAN calendarname
|
|
|
|
Creates a Calendar instance by calling new GregorianCalendar(TimeZone,
|
|
Locale). TimeZone and Locale are those defined by TIMEZONE and LOCALE
|
|
commands (or their initial values), respectively. The instance is
|
|
associated with `calendarname' and becomes the current Calendar
|
|
instance to be used for testing.
|
|
|
|
TEST [comments...]
|
|
|
|
Declares the beginning of a test case. `comments...' gives a short
|
|
description of a test case. (Multiple lines are not supported.) The
|
|
test system displays `comments...' to System.out. For example, the
|
|
following command:
|
|
|
|
test A test case for non-lenient mode
|
|
|
|
will output:
|
|
|
|
Test #n: A test case for non-lenient mode
|
|
|
|
where `n' is a sequence number of TEST command lines appeared in a
|
|
test script file.
|
|
|
|
USE calendarname
|
|
|
|
Specifies the current Calendar instance to use for testing by
|
|
`calendarname'. If you need to use more than one Calendar instances,
|
|
then you have to switch those Calendar instances by the USE command.
|
|
|
|
ASSIGN value variable
|
|
|
|
Assigns `value' to `variable'. `value' can be an integer literal, a
|
|
variable name or a constant. Examples are:
|
|
|
|
assign 2005 $year
|
|
assign $result $temp
|
|
assign Sun $Microsystems
|
|
|
|
ASSIGN value variable IF condition
|
|
|
|
Assigns `value' to `variable' if `condition' is true. `condition' is a
|
|
relational expression as:
|
|
|
|
value1 relOp value2
|
|
|
|
`relOp' must be one of >, >=, ==, !=, <=, <.
|
|
|
|
EVAL expression
|
|
|
|
Evaluates the given *simple* expression and assigns the expression
|
|
value to $result if `op' is one of the arithmetic operators (+, -, *,
|
|
/, %). If `op' is one of the relational operators (>, >=, ==, !=, <=,
|
|
<), then EVAL throws an exception if the expression value is false, or
|
|
does nothing if the value is true. Note that an operator and values
|
|
must be separated by white space.
|
|
|
|
The following is an example of the ASSIGN and EVAL commands usage to
|
|
get the next day of week value. Then, it's used to check the
|
|
roll(DAY_OF_WEEK) result.
|
|
|
|
get day_of_week
|
|
eval $result + 1
|
|
assign $result $nextDayOfWeek
|
|
assign Sun $nextDayOfWeek if $nextDayOfWeek > Sat
|
|
roll day_of_week 1
|
|
check day_of_week $nextDayOfWeek
|
|
|
|
CLEAR ALL
|
|
|
|
Clears all the calendar fields of the current Calendar instance by
|
|
calling Calendar.clear().
|
|
|
|
CLEAR field
|
|
|
|
Clears the specified calendar `field' of the current Calendar instance
|
|
by calling Calendar.clear(field).`field' must be one of the Calendar
|
|
field indices, ERA, YEAR, MONTH, DAY_OF_MONTH, WEEK_OF_YEAR, etc.
|
|
|
|
GET MILLIS
|
|
|
|
Gets the millisecond value of the current Calendar instance by calling
|
|
Calendar.getTimeInMillis(). The value is assigned to $result.
|
|
|
|
GET field
|
|
|
|
Gets the `field' value specified of the current Calendar instance by
|
|
calling Calendar.get(field). The value is assigned to $result.
|
|
|
|
GET MIN field
|
|
|
|
Gets the minimum value of the specified `field' of the current
|
|
Calendar instance by calling Calendar.getMinimum(field). The value is
|
|
assigned to $result.
|
|
|
|
GET GREATESTMIN field
|
|
|
|
Gets the greatest minimum value of the specified `field' of the
|
|
current Calendar instance by calling
|
|
Calendar.getGreatestMinimum(field). The value is assigned to $result.
|
|
|
|
GET ACTUALMIN field
|
|
|
|
Gets the actual minimum value of the specified `field' of the current
|
|
Calendar instance by calling Calendar.getActualMinimum(field). The
|
|
value is assigned to $result.
|
|
|
|
GET MAX field
|
|
|
|
Gets the maximum value of the specified `field' of the current
|
|
Calendar instance by calling Calendar.getMaximum(field). The value is
|
|
assigned to $result.
|
|
|
|
GET LEASTMAX field
|
|
|
|
Gets the least maximum value of the specified `field' of the current
|
|
Calendar instance by calling Calendar.getLeastMaximum(field). The
|
|
value is assigned to $result.
|
|
|
|
GET ACTUALMAX field
|
|
|
|
Gets the actual maximum value of the specified `field' of the current
|
|
Calendar instance by calling Calendar.getActualMaximum(field). The
|
|
value is assigned to $result.
|
|
|
|
GET FIRSTDAYOFWEEK
|
|
|
|
Gets the first day of week value of the current Calendar instance by
|
|
calling Calendar.getFirstDayOfWeek(). The value is assigned to
|
|
$result.
|
|
|
|
GET MINIMALDAYSINFIRSTWEEK
|
|
|
|
Gets the minimal days in first week value of the current Calendar
|
|
instance by calling Calendar.getMinimalDaysInFirstWeek(). The value is
|
|
assigned to $result.
|
|
|
|
ADD field amount
|
|
|
|
Adds `amount' to the specified `field' of the current Calendar
|
|
instance by calling Calendar.add(field, amount).
|
|
|
|
ROLL field amount
|
|
|
|
Rolls `amount' of the specified `field' of the current Calendar
|
|
instance by calling Calendar.roll(field, amount).
|
|
|
|
SET MILLIS value
|
|
|
|
Sets the millisecond value of the current Calendar instance to `value'
|
|
by calling Calendar.setTimeInMillis(value).
|
|
|
|
SET field value
|
|
|
|
Sets the `field' value of the current Calendar instance to `value' by
|
|
calling Calendar.set(field, value).
|
|
|
|
SET DATE era year month dayOfMonth
|
|
|
|
Sets the date of the current Calendar instance to the date specified
|
|
by `era', `year', `month' and `dayOfMonth' by calling
|
|
Calendar.set(ERA, era) and Calendar.set(year, month,
|
|
dayOfMonth). Please note that `month' follows the Calendar convention
|
|
and is 0-based. (e.g., JANUARY is 0)
|
|
|
|
SET DATE year month dayOfMonth
|
|
|
|
Sets the date of the current Calendar instance to the date specified
|
|
by `year', `month' and `dayOfMonth' by calling
|
|
Calendar.set(year, month, dayOfMont). Please note that `month'
|
|
follows the Calendar convention and is 0-based. (e.g., JANUARY is 0)
|
|
|
|
SET DATETIME year month dayOfMonth hourOfDay minute second
|
|
|
|
Sets the date and time of the current Calendar instance to the date
|
|
and time specified by `year', `month', `dayOfMonth', `hourOfDay',
|
|
`minute', and `second' by calling Calendar.set(year, month,
|
|
dayOfMonth, hourOfDay, minute, second). Please note that `hourOfDay'
|
|
is the 24-hour clock.
|
|
|
|
SET TIMEOFDAY hourOfDay minute second millisecond
|
|
|
|
Sets the date and time of the current Calendar instance to the date
|
|
and time specified by `year', `month', `dayOfMonth', `hourOfDay',
|
|
`minute', and `second' by calling Calendar.set(HOUR_OF_DAY,
|
|
hourOfDay), Calendar.set(MINUTE, minute), and Calendar.set(SECOND,
|
|
second).
|
|
|
|
SET FIRSTDAYOFWEEK value
|
|
|
|
Sets the first day of week value of the current Calendar instance to
|
|
`value' by calling Calendar.setFirstDayOfWeek(value).
|
|
|
|
SET MINIMALDAYSINFIRSTWEEK value
|
|
|
|
Sets the minimal days in the first week value of the current Calendar
|
|
instance to `value' by calling Calendar.setMinimalDaysInFirstWeek(value).
|
|
|
|
SET LENIENT
|
|
|
|
Sets the lenient mode in the current Calendar instance by calling
|
|
Calendar.setLenient(true).
|
|
|
|
SET NON-LENIENT
|
|
|
|
Sets the non-lenient mode in the current Calendar instance by calling
|
|
Calendar.setLenient(false).
|
|
|
|
CHECK MILLIS value
|
|
|
|
Checks if the specified `value' is the same as the millisecond value
|
|
of the current Calendar instance given by calling
|
|
Calendar.getTimeInMillis(). If the values are different, an exception
|
|
is thrown.
|
|
|
|
CHECK DATE era year month dayOfMonth
|
|
|
|
Checks if the date specified by `era', `year', `month' and
|
|
`dayOfMonth' is the same date of the current Calendar instance. The
|
|
calendar date is given by calling Calendar.get(ERA),
|
|
Calendar.get(YEAR), Calendar.get(MONTH), and
|
|
Calendar.get(DAY_OF_MONTH). If the dates are different, an exception
|
|
is thrown.
|
|
|
|
CHECK DATE year month dayOfMonth
|
|
|
|
Checks if the date specified by `year', `month' and `dayOfMonth' is
|
|
the same date of the current Calendar instance. The calendar date is
|
|
given by calling Calendar.get(YEAR), Calendar.get(MONTH), and
|
|
Calendar.get(DAY_OF_MONTH). If the dates are different, an exception
|
|
is thrown.
|
|
|
|
CHECK DATETIME year month dayOfMonth hourOfDay minute second
|
|
|
|
Checks if the date and time specified by `year', `month',
|
|
`dayOfMonth', `hourOfDay', `minute', and `second' are the same ones of
|
|
the current Calendar instance. The calendar date and time are given by
|
|
calling Calendar.get(YEAR), Calendar.get(MONTH),
|
|
Calendar.get(DAY_OF_MONTH), Calendar.get(HOUR_OF_DAY),
|
|
Calendar.get(MINUTE) and Calendar.get(SECOND). If the dates or times
|
|
are different, an exception is thrown.
|
|
|
|
CHECK DATETIME year month dayOfMonth hourOfDay minute second millisecond
|
|
|
|
Checks if the date and time specified by `year', `month',
|
|
`dayOfMonth', `hourOfDay', `minute', `second' and `millisecond' are
|
|
the same ones of the current Calendar instance. The calendar date and
|
|
time are given by calling Calendar.get(YEAR), Calendar.get(MONTH),
|
|
Calendar.get(DAY_OF_MONTH), Calendar.get(HOUR_OF_DAY),
|
|
Calendar.get(MINUTE), Calendar.get(SECOND) and
|
|
Calendar.get(MILLISECOND). If the dates or times are different, an
|
|
exception is thrown.
|
|
|
|
CHECK TIMEOFDAY hourOfDay minute second millisecond
|
|
|
|
Checks if the time of day specified by `hourOfDay', `minute', `second'
|
|
and `millisecond' are the same ones of the current Calendar
|
|
instance. The calendar date and time are given by calling
|
|
Calendar.get(HOUR_OF_DAY), Calendar.get(MINUTE), Calendar.get(SECOND)
|
|
and Calendar.get(MILLISECOND). If the times are different, an
|
|
exception is thrown.
|
|
|
|
CHECK field value
|
|
|
|
Checks if the value of the given `field' of the current Calendar
|
|
instance is equal to the given `value'. If it doesn't, an exception is
|
|
thrown.
|
|
|
|
CHECK MIN field value
|
|
|
|
Checks if the minimum value of the specified `field' of the current
|
|
Calendar instance is equal to the specified `value'. If not, an
|
|
exception is thrown.
|
|
|
|
CHECK GREATESTMIN field value
|
|
|
|
Checks if the greatest minimum value of the specified `field' of the
|
|
current Calendar instance is equal to the specified `value'. If not,
|
|
an exception is thrown.
|
|
|
|
CHECK ACTUALMIN field value
|
|
|
|
Checks if the actual minimum value of the specified `field' of the
|
|
current Calendar instance is equal to the specified `value'. If not,
|
|
an exception is thrown.
|
|
|
|
CHECK MAX field value
|
|
|
|
Checks if the maximum value of the specified `field' of the current
|
|
Calendar instance is equal to the specified `value'. If not, an
|
|
exception is thrown.
|
|
|
|
CHECK LEASTMAX field value
|
|
|
|
Checks if the least maximum value of the specified `field' of the
|
|
current Calendar instance is equal to the specified `value'. If not,
|
|
an exception is thrown.
|
|
|
|
CHECK ACTUALMAX field value
|
|
|
|
Checks if the actual maximum value of the specified `field' of the
|
|
current Calendar instance is equal to the specified `value'. If not,
|
|
an exception is thrown.
|
|
|
|
EXCEPTION exceptionname
|
|
|
|
Checks if the previous command threw the specified exception by
|
|
`exceptionname'. For example, the following tests invalid date
|
|
detection in non-lenient.
|
|
|
|
set non-lenient
|
|
set date 2005 Feb 29 # 2005 isn't a leap year.
|
|
get millis
|
|
exception IllegalArgumentException
|
|
|
|
PRINT variable
|
|
|
|
Prints the value of `variable'.
|
|
|
|
PRINT INSTANCE [calendarname]
|
|
|
|
Prints the Calendar.toString() value of the current Calendar instance
|
|
or the instance given by `calendarname'.
|
|
|
|
PRINT field
|
|
|
|
Prints the value of the specified `field' of the current Calendar
|
|
instance. The value is obtained by calling Calendar.get(field).
|
|
|
|
PRINT MILLIS
|
|
|
|
Prints the millisecond value of the current Calendar instance. The
|
|
value is obtained by calling Calendar.getTimeInMillis().
|
|
|
|
PRINT MIN field
|
|
|
|
Prints the minimum value of the specified field by `field' of the
|
|
current Calendar instance. The value is obtained by calling
|
|
Calendar.getMinimum(field).
|
|
|
|
PRINT GREATESTMIN field
|
|
|
|
Prints the greatest minimum value of the specified field by `field' of
|
|
the current Calendar instance. The value is obtained by calling
|
|
Calendar.getGreatestMinimum(field).
|
|
|
|
PRINT ACTUALMIN field
|
|
|
|
Prints the actual minimum value of the specified field by `field' of
|
|
the current Calendar instance by calling
|
|
Calendar.getActualMinimum(field).
|
|
|
|
PRINT MAX field
|
|
|
|
Prints the maximum value of the specified field by `field' of the
|
|
current Calendar instance. The value is obtained by calling
|
|
Calendar.getMaximum(field).
|
|
|
|
PRINT LEASTMAX field
|
|
|
|
Prints the least maximum value of the specified field by `field' of
|
|
the current Calendar instance. The value is obtained by calling
|
|
Calendar.getLeastMaximum(field).
|
|
|
|
PRINT ACTUALMAX field
|
|
|
|
Prints the actual maximum value of the specified field by `field' of
|
|
the current Calendar instance. The value is obtained by calling
|
|
Calendar.getActualMaximum(field).
|
|
|
|
PRINT DATE
|
|
|
|
Prints the date of the current Calendar instance in format
|
|
"[ERA] yyyy-MM-dd". The date is obtained by calling Calendar.get(ERA),
|
|
Calendar.get(YEAR), Calendar.get(MONTH), and
|
|
Calendar.get(DAY_OF_MONTH).
|
|
|
|
PRINT DATETIME
|
|
|
|
Prints the date and time of the current Calendar instance in an ISO
|
|
8601-style format "[ERA] yyyy-MM-ddTHH:mm:ss.SSS{Z|{+|-}hhmm}". The
|
|
date and time are obtained by calling Calendar.get(ERA),
|
|
Calendar.get(YEAR), Calendar.get(MONTH), Calendar.get(DAY_OF_MONTH),
|
|
Calendar.get(HOUR_OF_DAY), Calendar.get(MINUTE), Calendar.get(SECOND),
|
|
Calendar.get(MILLISECOND), Calendar.get(ZONE_OFFSET), and
|
|
Calendar.get(DST_OFFSET).
|
|
|
|
PRINT TIMEZONE
|
|
|
|
Prints the toString() value of the current TimeZone.
|
|
|
|
PRINT LOCALE
|
|
|
|
Prints the toString() value of the current Locale.
|
|
|
|
Usage
|
|
-----
|
|
|
|
The usage of the test script system at this directory is:
|
|
|
|
$ javac -d classes --add-exports java.base/sun.util=ALL-UNNAMED --add-exports java.base/sun.util.calendar=ALL-UNNAMED *.java
|
|
$ java -cp classes CalendarTestEngine scriptfiles...
|
|
|
|
A script file has suffix ".cts" by convention. If multiple script files
|
|
are specified. Those files are sequentially executed as if those are a
|
|
single test script. For example, if we have the following script files:
|
|
|
|
file1.cts:
|
|
locale ja JP JP
|
|
timezone Asia/Tokyo
|
|
file2.cts:
|
|
new instance jcal
|
|
new gregorian gcal
|
|
test example
|
|
use jcal
|
|
print datetime
|
|
get millis
|
|
print $result
|
|
use gcal
|
|
set millis $result
|
|
print datetime
|
|
|
|
running CalendarTestEngine with those files will produce:
|
|
|
|
$ java -cp classes CalendarTestEngine file1.cts file2.cts
|
|
Starting file1.cts...
|
|
Completed file1.cts
|
|
Starting file2.cts...
|
|
Test #1: example
|
|
file2.cts:5: Heisei 0017-03-18T20:00:25.402+0900
|
|
file2.cts:7: $result=1111143625402
|
|
file2.cts:10: 2005-03-18T20:00:25.402+0900
|
|
Completed file2.cts
|
|
|
|
[end of README]
|