1b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov/**
211a89b445f3bde56bf07e6a0d04f0b0256dcb215Andrey Somov * Copyright (c) 2008, http://www.snakeyaml.org
3b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov *
4b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov * Licensed under the Apache License, Version 2.0 (the "License");
5b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov * you may not use this file except in compliance with the License.
6b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov * You may obtain a copy of the License at
7b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov *
8b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov *     http://www.apache.org/licenses/LICENSE-2.0
9b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov *
10b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov * Unless required by applicable law or agreed to in writing, software
11b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov * distributed under the License is distributed on an "AS IS" BASIS,
12b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov * See the License for the specific language governing permissions and
14b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov * limitations under the License.
15b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov */
16b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somovpackage org.yaml.snakeyaml.issues.issue49;
17b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov
18b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somovimport java.util.Calendar;
19b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somovimport java.util.Date;
20b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somovimport java.util.GregorianCalendar;
21b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somovimport java.util.TimeZone;
22b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov
23b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somovimport junit.framework.TestCase;
24b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov
25def9635e03df5f547cda12693af495d24d1b0a5bAndrey Somovimport org.yaml.snakeyaml.Yaml;
26b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov
27b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somovpublic class CalendarTest extends TestCase {
28e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    /**
29e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov     * Daylight Saving Time is not taken into account
30e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov     */
31e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    public void testDumpDstIgnored() {
32b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        CalendarBean bean = new CalendarBean();
33b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        bean.setName("lunch");
34b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        Calendar cal = Calendar.getInstance();
35b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        cal.setTime(new Date(1000000000000L));
36b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        cal.setTimeZone(TimeZone.getTimeZone("GMT-8:00"));
37b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        bean.setCalendar(cal);
388dffba7d9ff950b6094fc1b907f296c3992ec434Andrey Somov        Yaml yaml = new Yaml();
39778ea368d9f908d28df478964de32f23313756cbAndrey Somov        String output = yaml.dumpAsMap(bean);
40e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov        // System.out.println(output);
41e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov        assertEquals("calendar: 2001-09-08T17:46:40-8:00\nname: lunch\n", output);
42d1aa3d62d60edf26d15381eb96df5fb2f0daf00aAndrey Somov        //
43eec4c376290f8022508acc74fde2c01cabee1767Andrey Somov        Yaml loader = new Yaml();
44eec4c376290f8022508acc74fde2c01cabee1767Andrey Somov        CalendarBean parsed = loader.loadAs(output, CalendarBean.class);
45d1aa3d62d60edf26d15381eb96df5fb2f0daf00aAndrey Somov        assertEquals(bean.getCalendar(), parsed.getCalendar());
46d1aa3d62d60edf26d15381eb96df5fb2f0daf00aAndrey Somov    }
47d1aa3d62d60edf26d15381eb96df5fb2f0daf00aAndrey Somov
48e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    /**
49e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov     * Daylight Saving Time is in effect on this date/time in
50e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov     * America/Los_Angeles Daylight<br/>
51e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov     * Saving Time is not in effect on this date/time in GMT
52e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov     */
53e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    public void testDumpDstIsNotTheSame() {
54e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov        check(1000000000000L, "America/Los_Angeles", "Must be 7 hours difference.",
55e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov                "2001-09-08T18:46:40-7:00");
56e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    }
57e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov
58e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    /**
59e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov     * Daylight Saving Time is not in effect on this date/time in
60e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov     * America/Los_Angeles Daylight<br/>
61e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov     * Saving Time is not in effect on this date/time in GMT
62e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov     */
63e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    public void testDumpDstIsTheSame() {
64e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov        check(1266833741374L, "America/Los_Angeles", "Must be 8 hours difference.",
65e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov                "2010-02-22T02:15:41.374-8:00");
66e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    }
67e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov
68e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    /**
69e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov     * Test odd time zone
70e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov     */
71e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    public void testNepal() {
72e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov        check(1266833741374L, "Asia/Katmandu", "Must be 5:45 hours difference.",
73e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov                "2010-02-22T16:00:41.374+5:45");
74e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    }
75e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov
76e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    public void testMoreThen10hours() {
77e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov        check(1266833741374L, "Asia/Kamchatka", "Must be 12 hours difference.",
78e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov                "2010-02-22T22:15:41.374+12:00");
79e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    }
80e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov
81e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov    private void check(long time, String timeZone, String warning, String etalon) {
82d1aa3d62d60edf26d15381eb96df5fb2f0daf00aAndrey Somov        CalendarBean bean = new CalendarBean();
83d1aa3d62d60edf26d15381eb96df5fb2f0daf00aAndrey Somov        bean.setName("lunch");
84d1aa3d62d60edf26d15381eb96df5fb2f0daf00aAndrey Somov        Calendar cal = Calendar.getInstance();
85e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov        cal.setTime(new Date(time));
86e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov        cal.setTimeZone(TimeZone.getTimeZone(timeZone));
87d1aa3d62d60edf26d15381eb96df5fb2f0daf00aAndrey Somov        bean.setCalendar(cal);
888dffba7d9ff950b6094fc1b907f296c3992ec434Andrey Somov        Yaml yaml = new Yaml();
89778ea368d9f908d28df478964de32f23313756cbAndrey Somov        String output = yaml.dumpAsMap(bean);
90e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov        // System.out.println(output);
91e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov        assertEquals(warning, "calendar: " + etalon + "\nname: lunch\n", output);
92d1aa3d62d60edf26d15381eb96df5fb2f0daf00aAndrey Somov        //
93eec4c376290f8022508acc74fde2c01cabee1767Andrey Somov        Yaml loader = new Yaml();
94eec4c376290f8022508acc74fde2c01cabee1767Andrey Somov        CalendarBean parsed = loader.loadAs(output, CalendarBean.class);
95e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov        assertFalse("TimeZone must deviate.", bean.getCalendar().equals(parsed.getCalendar()));
96e1050b8bf53eac31bc6228aa1d675f9a74136651Andrey Somov        assertEquals(bean.getCalendar().getTimeInMillis(), parsed.getCalendar().getTimeInMillis());
97b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov    }
98b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov
99b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov    public void testLoadBean() {
100eec4c376290f8022508acc74fde2c01cabee1767Andrey Somov        Yaml beanLoader = new Yaml();
101eec4c376290f8022508acc74fde2c01cabee1767Andrey Somov        CalendarBean bean = beanLoader.loadAs(
102eec4c376290f8022508acc74fde2c01cabee1767Andrey Somov                "calendar:  2001-12-14t21:59:43.10-05:00\nname: dinner", CalendarBean.class);
103b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        assertEquals("dinner", bean.getName());
104b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        Calendar calendar = bean.getCalendar();
105b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        assertEquals(TimeZone.getTimeZone("GMT-5:00").getOffset(calendar.getTime().getTime()),
106b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov                calendar.getTimeZone().getOffset(calendar.getTime().getTime()));
107b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        //
108def9635e03df5f547cda12693af495d24d1b0a5bAndrey Somov        Yaml yaml = new Yaml();
109b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        Date date = (Date) yaml.load("2001-12-14t21:59:43.10-05:00");
110b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        assertEquals(date, calendar.getTime());
111b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov    }
112b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov
113b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov    public void testLoadWithTag() {
114def9635e03df5f547cda12693af495d24d1b0a5bAndrey Somov        Yaml yaml = new Yaml();
115b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        GregorianCalendar calendar = (GregorianCalendar) yaml
116b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov                .load("!!java.util.GregorianCalendar 2001-12-14t21:59:43.10-05:00");
117b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        assertEquals(TimeZone.getTimeZone("GMT-5:00").getOffset(calendar.getTime().getTime()),
118b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov                calendar.getTimeZone().getOffset(calendar.getTime().getTime()));
119b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        //
120b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        Date date = (Date) yaml.load("2001-12-14t21:59:43.10-05:00");
121b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov        assertEquals(date, calendar.getTime());
122b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov    }
123b4779f9a8e0eaf921e4838fc9c68b8e9c0be963cAndrey Somov}
124