#
#
#

locale ja JP JP
new instance jcal
new gregorian gcal

# Use GMT+09:00 for max day of year test which depends on time zone
# offsets.

timezone GMT+09:00
new instance tokyocal

test Make sure that the maximum year value doesn't depent on era
    use jcal
	# Note: the max year value is as of Reiwa
	assign 292276976 $max
	clear all
	set date Reiwa 1 May 1
	get millis
	check max year $max
	assign $max $maxyear

	clear all
	set date Heisei 20 May 5
	get millis
	check max year $maxyear

	clear all
	set date Showa 35 May 5
	get millis
	check max year $maxyear

	clear all
	set date BeforeMeiji 1 Jun 1
	get millis
	check max year $max

test Max of ERA
    use jcal
	# Assumption: Reiwa is the current era
	check maximum era Reiwa
	check leastmax era Reiwa

test Actual max MONTH
    use jcal
	clear all
	set date BeforeMeiji 1867 Jan 31
	check actualmax month Dec
	# Make sure that the same value is returned after
	# normalization.
	get millis
	check actualmax month Dec

	clear all
	set date Meiji 45 Mar 31
	check actualmax month Jul
	get millis
	check actualmax month Jul

	clear all
	set date Taisho 15 June 1
	check actualmax month Dec
	get millis
	check actualmax month Dec

	clear all
	set date Showa 64 Jan 4
	check actualmax month Jan
	get millis
	check actualmax month Jan

	clear all
	set date Heisei 31 Jan 4
	check actualmax month Apr
	get millis
	check actualmax month Apr

	clear all
	set date Reiwa 2 Jan 1
	set year $maxyear
	check actualmax month Aug
	get millis
	check actualmax month Aug

	clear all
	set date 17 Mar 1
	check actualmax month Dec
	get millis
	check actualmax month Dec

test Actual max DAY_OF_YEAR
    use jcal
	clear all
	set date Meiji 1 Dec 31
	# Meiji Gan-nen is a leap year.
	check actualmax day_of_year 366
	check day_of_year 366

	clear all
	set date Meiji 45 Jan 1
	# Meiji 45 or Taishi Gan-nen is also a leap year.
	check actualmax day_of_year 211 # 31+29+31+30+31+30+29
	set date Meiji 45 Jul 29
	check day_of_year 211
	set date Taisho 1 Jul 31
	get millis
	check actualmax day_of_year 155 # 366 - 211
	set date Taisho 1 Dec 31
	check day_of_year 155

	clear all
	set date Taisho 15 Sep 23
	check actualmax day_of_year 358 # 365 - 7
	set date Taisho 15 Dec 24
	check day_of_year 358
	set date Showa 1 Dec 25
	check actualmax day_of_year 7
	set date Showa 1 Dec 31
	check day_of_year 7

	clear all
	set date Showa 64 Jan 3
	check actualmax day_of_year 7
	set date Showa 64 Jan 7
	check day_of_year 7
	set date Heisei 1 Aug 9
	check actualmax day_of_year 358 # 365 - 7
	set date Heisei 1 Dec 31
	check day_of_year 358

   # time zone dependent
   use tokyocal
	clear all
	set date Reiwa $maxyear Jan 1
	# the last date of Reiwa is R292276976.08.17T16:12:55.807+0900
	check actualmax day_of_year 229 # 31+28+31+30+31+30+31+17

test Actual max WEEK_OF_YEAR
    use jcal
	clear all
	set date Meiji 1 Jan 1
	# Meiji gan-nen is a leap year.
	check actualmax week_of_year 52

	clear all
	set date Meiji 45 Jan 1
	check actualmax week_of_year 30
	set date Taisho 1 July 31
	check actualmax week_of_year 22

	clear all
	set date Taisho 15 Sep 23
	check actualmax week_of_year 51
	set date Showa 1 Dec 25
	check actualmax week_of_year 1

	clear all
	set date Showa 64 Jan 3
	check actualmax week_of_year 1
	set date Heisei 1 Aug 9
	check actualmax week_of_year 51

	clear all
	set date Heisei 31 Apr 28
	check actualmax week_of_year 17
	set date Reiwa 1 Aug 9
	check actualmax week_of_year 35

    use tokyocal
	set date Reiwa $maxyear Jan 1
	# the last date of Reiwa is R292276976.08.17T16:12:55.807+0900 (Sunday)	
	# The year is equivalent to 2003 (Gregorian).
	check actualmax week_of_year 34

test Actual max WEEK_OF_MONTH
    use jcal
	clear all
	set date Meiji 45 Jul 1
	check actualmax week_of_month 5
	set date Taisho 1 Jul 31
	check actualmax week_of_month 5

	clear all
	set date Taisho 15 Dec 1
	check actualmax week_of_month 5
	set date Showa 1 Dec 25
	check actualmax week_of_month 5

	clear all
	set date Showa 64 Jan 1
	check actualmax week_of_month 5
	set date Heisei 1 Jan 8
	check actualmax week_of_month 5

	clear all
	set date Heisei 31 Apr 30
	check actualmax week_of_month 5
	set date Reiwa 1 May 1
	check actualmax week_of_month 5

    use tokyocal
	set date Reiwa $maxyear Jan 1
	# the last date of Reiwa is R292276976.08.17T16:12:55.807+0900 (Sunday)	
	# The year is equivalent to 2003 (Gregorian).
	check actualmax week_of_month 4
	
test Actual max DAY_OF_WEEK_IN_MONTH
    use jcal
	clear all
	set date Meiji 45 Jul 1
	check actualmax week_of_month 5
	set date Taisho 1 Jul 31
	check actualmax week_of_month 5

	clear all
	set date Taisho 15 Dec 1
	check actualmax week_of_month 5
	set date Showa 1 Dec 25
	check actualmax week_of_month 5

	clear all
	set date Showa 64 Jan 1
	check actualmax week_of_month 5
	set date Heisei 1 Jan 8
	check actualmax week_of_month 5

	clear all
	set date Heisei 31 Apr 30
	check actualmax week_of_month 5
	set date Reiwa 1 May 1
	check actualmax week_of_month 5

    use tokyocal
	clear all
	set date Reiwa $maxyear Jan 1
	# the last date of Reiwa is R292276976.08.17T16:12:55.807+0900 (Sunday)	
	# The year is equivalent to 2003 (Gregorian).
	check actualmax week_of_month 4

test Actual max YEAR
    use jcal
	clear all
	set date BeforeMeiji 1 Jan 1
	check actualmax year 1867

	set date Meiji 1 Jan 1
	check actualmax year 45

	set date Meiji 1 Jul 30
	check actualmax year 44

	set date Taisho 1 Jul 30
	check actualmax year 15

	set date Taisho 1 Dec 25
	check actualmax year 14

	set date Showa 2 Jan 1
	check actualmax year 64

	set date Showa 1 Dec 25
	check actualmax year 63

	set date Heisei 1 Jan 7
	check actualmax year 64 

	set date Heisei 1 Aug 18
	check actualmax year 30

	set date Reiwa 1 Apr 30
	check actualmax year 31

	# Date/time beyond the last date in the max year.
	set date Reiwa 1 Aug 18
	check actualmax year 292276975
	
test Least max YEAR
	set date Heisei 17 Mar 1
	# Taisho is the shortest era, 14 years.
	# (See above actual max YEAR case.)
	check leastmax year 14

test Acutual min YEAR
	# Get minimum values for comparison
	clear all
	set era BeforeMeiji
	get min year
	assign $result $minyear
	set date $minyear Dec 31
	eval $minyear + 1
	assign $result $minyear_plus_one

	# BeforeMeiji 1 Dec 31 should exist in the minimum year which
	# should be the same value as the getMinimum() value.
	set date BeforeMeiji 1 Dec 31
	check actualmin year $minyear

	# Jan 1 shouldn't exist in the same year. So the actual minimum is
	# $minyear + 1.
	set date 1 Jan 1
	check actualmin year $minyear_plus_one

	# 1 should be returned if it's on a date of the last
	# year which also exists in the first year of each era.
	clear all
	set date Meiji 45 Jan 1
	check actualmin year 1

	clear all
	set date Taisho 14 Jul 30
	check actualmin year 1

	clear all
	set date Showa 60 Dec 25
	check actualmin year 1

	clear all
	set date Heisei 17 Jan 8
	check actualmin year 1

	# 2 should be returned if it's on a date of the last year which
	# doesn't exist in the first year of each era. (Meiji is an
	# exception.)
	clear all
	set date Taisho 14 Jul 29
	check actualmin year 2

	clear all
	set date Showa 60 Dec 23
	check actualmin year 2

	clear all
	set date Heisei 17 Jan 7
	check actualmin year 2