| 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] |