aboutsummaryrefslogtreecommitdiffstats
path: root/lib/stdlib/test/calendar_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/stdlib/test/calendar_SUITE.erl')
-rw-r--r--lib/stdlib/test/calendar_SUITE.erl251
1 files changed, 251 insertions, 0 deletions
diff --git a/lib/stdlib/test/calendar_SUITE.erl b/lib/stdlib/test/calendar_SUITE.erl
new file mode 100644
index 0000000000..ea81bb99a9
--- /dev/null
+++ b/lib/stdlib/test/calendar_SUITE.erl
@@ -0,0 +1,251 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(calendar_SUITE).
+
+-include("test_server.hrl").
+
+-export([all/1,
+ gregorian_days/1,
+ gregorian_seconds/1,
+ day_of_the_week/1,
+ day_of_the_week_calibrate/1,
+ leap_years/1,
+ last_day_of_the_month/1,
+ local_time_to_universal_time_dst/1]).
+
+-define(START_YEAR, 1947).
+-define(END_YEAR, 2012).
+
+all(suite) -> [gregorian_days,
+ gregorian_seconds,
+ day_of_the_week,
+ day_of_the_week_calibrate,
+ leap_years,
+ last_day_of_the_month,
+ local_time_to_universal_time_dst];
+
+all(doc) -> "This is the test suite for calendar.erl".
+
+gregorian_days(doc) ->
+ "Tests that date_to_gregorian_days and gregorian_days_to_date "
+ "are each others inverses from ?START_YEAR-01-01 up to ?END_YEAR-01-01. "
+ "At the same time valid_date is tested.";
+gregorian_days(suite) ->
+ [];
+gregorian_days(Config) when list(Config) ->
+ ?line Days = calendar:date_to_gregorian_days({?START_YEAR, 1, 1}),
+ ?line MaxDays = calendar:date_to_gregorian_days({?END_YEAR, 1, 1}),
+ ?line check_gregorian_days(Days, MaxDays).
+
+gregorian_seconds(doc) ->
+ "Tests that datetime_to_gregorian_seconds and "
+ "gregorian_seconds_to_date are each others inverses for a sampled "
+ "number of seconds from ?START_YEAR-01-01 up to ?END_YEAR-01-01: We check "
+ "every 2 days + 1 second.";
+gregorian_seconds(suite) ->
+ [];
+gregorian_seconds(Config) when list(Config) ->
+ ?line Secs = calendar:datetime_to_gregorian_seconds({{?START_YEAR, 1, 1},
+ {0, 0, 0}}),
+ ?line MaxSecs = calendar:datetime_to_gregorian_seconds({{?END_YEAR, 1, 1},
+ {0, 0, 0}}),
+ ?line check_gregorian_seconds(Secs, MaxSecs).
+
+day_of_the_week(doc) ->
+ "Tests that day_of_the_week reports correctly the day of the week from "
+ "year ?START_YEAR up to ?END_YEAR.";
+day_of_the_week(suite) ->
+ [];
+day_of_the_week(Config) when list(Config) ->
+ ?line Days = calendar:date_to_gregorian_days({?START_YEAR, 1, 1}),
+ ?line MaxDays = calendar:date_to_gregorian_days({?END_YEAR, 1, 1}),
+ ?line DayNumber = calendar:day_of_the_week({?START_YEAR, 1, 1}),
+ ?line check_day_of_the_week(Days, MaxDays, DayNumber).
+
+day_of_the_week_calibrate(doc) ->
+ "Tests that day_of_the_week for 1997-11-11 is Tuesday (2)";
+day_of_the_week_calibrate(suite) ->
+ [];
+day_of_the_week_calibrate(Config) when list(Config) ->
+ ?line 2 = calendar:day_of_the_week({1997, 11, 11}).
+
+leap_years(doc) ->
+ "Tests that is_leap_year reports correctly the leap years from "
+ "year ?START_YEAR up to ?END_YEAR.";
+leap_years(suite) ->
+ [];
+leap_years(Config) when list(Config) ->
+ ?line check_leap_years(?START_YEAR, ?END_YEAR).
+
+last_day_of_the_month(doc) ->
+ "Tests that last_day_of_the_month reports correctly from "
+ "year ?START_YEAR up to ?END_YEAR.";
+last_day_of_the_month(suite) ->
+ [];
+last_day_of_the_month(Config) when list(Config) ->
+ ?line check_last_day_of_the_month({?START_YEAR, 1}, {?END_YEAR, 1}).
+
+local_time_to_universal_time_dst(doc) ->
+ "Tests local_time_to_universal_time_dst for MET";
+local_time_to_universal_time_dst(suite) ->
+ [];
+local_time_to_universal_time_dst(Config) when list(Config) ->
+ case os:type() of
+ {unix,_} ->
+ case os:cmd("date '+%Z'") of
+ "SAST"++_ ->
+ {comment, "Spoky time zone with zero-set DST, skipped"};
+ _ ->
+ local_time_to_universal_time_dst_x(Config)
+ end;
+ _ ->
+ local_time_to_universal_time_dst_x(Config)
+ end.
+local_time_to_universal_time_dst_x(Config) when list(Config) ->
+ %% Assumes MET (UTC+1 / UTC+2(dst)
+ ?line LtW = {{2003,01,15},{14,00,00}}, % Winter
+ ?line UtW = {{2003,01,15},{13,00,00}}, %
+ ?line UtWd = {{2003,01,15},{12,00,00}}, % dst
+ ?line LtS = {{2003,07,15},{14,00,00}}, % Summer
+ ?line UtS = {{2003,07,15},{13,00,00}}, %
+ ?line UtSd = {{2003,07,15},{12,00,00}}, % dst
+ ?line LtWS = {{2003,03,30},{02,30,00}}, % Winter->Summer
+ ?line UtWS = {{2003,03,30},{01,30,00}}, %
+ ?line UtWSd = {{2003,03,30},{00,30,00}}, % dst
+ ?line LtSW = {{2003,10,26},{02,30,00}}, % Summer->Winter
+ ?line UtSW = {{2003,10,26},{01,30,00}}, %
+ ?line UtSWd = {{2003,10,26},{00,30,00}}, % dst
+ %%
+ ?line UtW = calendar:local_time_to_universal_time(LtW, false),
+ ?line UtWd = calendar:local_time_to_universal_time(LtW, true),
+ ?line UtW = calendar:local_time_to_universal_time(LtW, undefined),
+ %%
+ ?line UtS = calendar:local_time_to_universal_time(LtS, false),
+ ?line UtSd = calendar:local_time_to_universal_time(LtS, true),
+ ?line UtSd = calendar:local_time_to_universal_time(LtS, undefined),
+ %%
+ case calendar:local_time_to_universal_time(LtWS, false) of
+ UtWS ->
+ ?line UtWSd = calendar:local_time_to_universal_time(LtWS, true),
+ ?line [] = calendar:local_time_to_universal_time_dst(LtWS),
+ %%
+ ?line UtSW = calendar:local_time_to_universal_time(LtSW, false),
+ ?line UtSWd = calendar:local_time_to_universal_time(LtSW, true),
+ ?line [UtSWd, UtSW] = calendar:local_time_to_universal_time_dst(LtSW),
+ ok;
+ {{1969,12,31},{23,59,59}} ->
+ %% It seems that Apple has no intention of fixing this bug in
+ %% Mac OS 10.3.9, and we have no intention of implementing a
+ %% workaround.
+ {comment,"Bug in mktime() in this OS"}
+ end.
+
+
+%%
+%% LOCAL FUNCTIONS
+%%
+
+%% check_gregorian_days
+%%
+check_gregorian_days(Days, MaxDays) when Days < MaxDays ->
+ ?line Date = calendar:gregorian_days_to_date(Days),
+ ?line true = calendar:valid_date(Date),
+ ?line Days = calendar:date_to_gregorian_days(Date),
+ ?line check_gregorian_days(Days + 1, MaxDays);
+check_gregorian_days(_Days, _MaxDays) ->
+ ok.
+
+%% check_gregorian_seconds
+%%
+%% We increment with something prime (172801 = 2 days + 1 second).
+%%
+check_gregorian_seconds(Secs, MaxSecs) when Secs < MaxSecs ->
+ ?line DateTime = calendar:gregorian_seconds_to_datetime(Secs),
+ ?line Secs = calendar:datetime_to_gregorian_seconds(DateTime),
+ ?line check_gregorian_seconds(Secs + 172801, MaxSecs);
+check_gregorian_seconds(_Secs, _MaxSecs) ->
+ ok.
+
+
+%% check_day_of_the_week
+%%
+check_day_of_the_week(Days, MaxDays, DayNumber) when Days < MaxDays ->
+ ?line Date = calendar:gregorian_days_to_date(Days),
+ ?line DayNumber = calendar:day_of_the_week(Date),
+ ?line check_day_of_the_week(Days + 1, MaxDays,
+ ((DayNumber rem 7) + 1));
+check_day_of_the_week(_Days, _MaxDays, _DayNumber) ->
+ ok.
+
+%% check_leap_years
+%%
+%% SYr must be larger than 1800, and EYr must be less than ?END_YEAR.
+%%
+check_leap_years(SYr, EYr) when SYr < EYr ->
+ ?line Rem = SYr rem 4,
+ case Rem of
+ 0 ->
+ case SYr of
+ 1900 ->
+ ?line false = calendar:is_leap_year(SYr);
+ 2000 ->
+ ?line true = calendar:is_leap_year(SYr);
+ _ ->
+ ?line true = calendar:is_leap_year(SYr)
+ end;
+ _ ->
+ ?line false = calendar:is_leap_year(SYr)
+ end,
+ check_leap_years(SYr + 1, EYr);
+check_leap_years(_SYr, _EYr) ->
+ ok.
+
+check_last_day_of_the_month({SYr, SMon}, {EYr, EMon}) when SYr < EYr ->
+ ?line LastDay = calendar:last_day_of_the_month(SYr, SMon),
+ ?line LastDay = case SMon of
+ 1 -> 31;
+ 2 ->
+ case calendar:is_leap_year(SYr) of
+ true -> 29;
+ false -> 28
+ end;
+ 3 -> 31;
+ 4 -> 30;
+ 5 -> 31;
+ 6 -> 30;
+ 7 -> 31;
+ 8 -> 31;
+ 9 -> 30;
+ 10 -> 31;
+ 11 -> 30;
+ 12 -> 31
+ end,
+ ?line NYr = case SMon of
+ 12 -> SYr + 1;
+ _ -> SYr
+ end,
+ ?line check_last_day_of_the_month({NYr, (SMon rem 12) + 1},
+ {EYr, EMon});
+check_last_day_of_the_month(_, _) ->
+ ok.
+
+
+
+
+