Skip to content

Commit 7e9152c

Browse files
authored
Merge pull request #1495 from dimagi/copy_of_commcare_2.58
Duplicate of Backmerge CommCare 2.58
2 parents 558a686 + 4ca12f9 commit 7e9152c

2 files changed

Lines changed: 81 additions & 14 deletions

File tree

src/main/java/org/javarosa/xform/util/CalendarUtils.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public static String ConvertToEthiopian(Date d, String format) {
6161
/*
6262
* Nepali calendar system has no discernible cyclic month pattern, so we must manually
6363
* enter them here as new calendars are known.
64+
* Calendar source: https://nepalipatro.com.np/calendar
6465
*
6566
* TODO: Enter month lengths for years beyond 2090
6667
*/
@@ -176,16 +177,16 @@ public static String ConvertToEthiopian(Date d, String format) {
176177
NEPALI_YEAR_MONTHS.put(2078, new int[]{0, 31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30});
177178
NEPALI_YEAR_MONTHS.put(2079, new int[]{0, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30});
178179
NEPALI_YEAR_MONTHS.put(2080, new int[]{0, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30});
179-
NEPALI_YEAR_MONTHS.put(2081, new int[]{0, 31, 31, 32, 32, 31, 30, 30, 30, 29, 30, 30, 30});
180-
NEPALI_YEAR_MONTHS.put(2082, new int[]{0, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30});
181-
NEPALI_YEAR_MONTHS.put(2083, new int[]{0, 31, 31, 32, 31, 31, 30, 30, 30, 29, 30, 30, 30});
182-
NEPALI_YEAR_MONTHS.put(2084, new int[]{0, 31, 31, 32, 31, 31, 30, 30, 30, 29, 30, 30, 30});
183-
NEPALI_YEAR_MONTHS.put(2085, new int[]{0, 31, 32, 31, 32, 30, 31, 30, 30, 29, 30, 30, 30});
184-
NEPALI_YEAR_MONTHS.put(2086, new int[]{0, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30});
185-
NEPALI_YEAR_MONTHS.put(2087, new int[]{0, 31, 31, 32, 31, 31, 31, 30, 30, 29, 30, 30, 30});
186-
NEPALI_YEAR_MONTHS.put(2088, new int[]{0, 30, 31, 32, 32, 30, 31, 30, 30, 29, 30, 30, 30});
187-
NEPALI_YEAR_MONTHS.put(2089, new int[]{0, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30});
188-
NEPALI_YEAR_MONTHS.put(2090, new int[]{0, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30});
180+
NEPALI_YEAR_MONTHS.put(2081, new int[]{0, 31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31});
181+
NEPALI_YEAR_MONTHS.put(2082, new int[]{0, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30});
182+
NEPALI_YEAR_MONTHS.put(2083, new int[]{0, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30});
183+
NEPALI_YEAR_MONTHS.put(2084, new int[]{0, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31});
184+
NEPALI_YEAR_MONTHS.put(2085, new int[]{0, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31});
185+
NEPALI_YEAR_MONTHS.put(2086, new int[]{0, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30});
186+
NEPALI_YEAR_MONTHS.put(2087, new int[]{0, 31, 31, 32, 32, 31, 31, 30, 29, 30, 29, 30, 30});
187+
NEPALI_YEAR_MONTHS.put(2088, new int[]{0, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31});
188+
NEPALI_YEAR_MONTHS.put(2089, new int[]{0, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31});
189+
NEPALI_YEAR_MONTHS.put(2090, new int[]{0, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30});
189190
}
190191

191192
private static final int MAX_YEAR = 2090;
@@ -354,7 +355,7 @@ public static UniversalDate fromMillis(Date date, String timezone) {
354355
cd.setTimeZone(DateUtils.timezone());
355356
}
356357
long dateInMillis = cd.getTime().getTime();
357-
DateTimeZone timezoneObject = DateTimeZone.forOffsetMillis(cd.getTimeZone().getRawOffset());
358+
DateTimeZone timezoneObject = DateTimeZone.forTimeZone(cd.getTimeZone());
358359
return fromMillis(dateInMillis, timezoneObject);
359360
}
360361

src/test/java/org/javarosa/xform/util/test/CalendarTests.java

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package org.javarosa.xform.util.test;
22

3+
import org.javarosa.core.model.utils.DateUtils;
4+
import org.javarosa.core.model.utils.TimezoneProvider;
5+
import org.javarosa.core.services.locale.Localization;
6+
import org.javarosa.core.services.locale.TableLocaleSource;
37
import org.javarosa.xform.util.CalendarUtils;
48
import org.javarosa.xform.util.UniversalDate;
59
import org.joda.time.DateTimeZone;
10+
import org.junit.Before;
611
import org.junit.Test;
712

813
import java.util.Calendar;
@@ -15,6 +20,19 @@
1520
* @author Phillip Mates (pmates@dimagi.com)
1621
*/
1722
public class CalendarTests {
23+
24+
@Before
25+
public void configureLocaleForCalendar() {
26+
Localization.getGlobalLocalizerAdvanced().addAvailableLocale("default");
27+
Localization.setLocale("default");
28+
TableLocaleSource localeData = new TableLocaleSource();
29+
localeData.setLocaleMapping("ethiopian_months",
30+
"Mäskäräm,T’ïk’ïmt,Hïdar,Tahsas,T’ïr,Yäkatit,Mägabit,Miyaziya,Gïnbot,Säne,Hämle,Nähäse,P’agume");
31+
localeData.setLocaleMapping("nepali_months",
32+
"Baishakh,Jestha,Ashadh,Shrawan,Bhadra,Ashwin,Kartik,Mangsir,Poush,Magh,Falgun,Chaitra");
33+
Localization.getGlobalLocalizerAdvanced().registerLocaleResource("default", localeData);
34+
}
35+
1836
@Test
1937
public void testTimesFallOnSameDate() {
2038
DateTimeZone nepaliTimeZone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT+05:45"));
@@ -25,8 +43,10 @@ public void testTimesFallOnSameDate() {
2543
Calendar nepaliBeginningOfDayDate = Calendar.getInstance(nepaliTimeZone.toTimeZone());
2644
nepaliBeginningOfDayDate.set(2007, Calendar.JULY, 7, 0, 0);
2745

28-
UniversalDate middleOfDay = CalendarUtils.fromMillis(nepaliMiddleOfDayDate.getTimeInMillis(), nepaliTimeZone);
29-
UniversalDate beginningOfDay = CalendarUtils.fromMillis(nepaliBeginningOfDayDate.getTimeInMillis(), nepaliTimeZone);
46+
UniversalDate middleOfDay = CalendarUtils.fromMillis(nepaliMiddleOfDayDate.getTimeInMillis(),
47+
nepaliTimeZone);
48+
UniversalDate beginningOfDay = CalendarUtils.fromMillis(nepaliBeginningOfDayDate.getTimeInMillis(),
49+
nepaliTimeZone);
3050
assertSameDate(middleOfDay, beginningOfDay);
3151

3252
Calendar nepaliEndOfDayDate = Calendar.getInstance(nepaliTimeZone.toTimeZone());
@@ -35,6 +55,33 @@ public void testTimesFallOnSameDate() {
3555
assertSameDate(endOfDay, beginningOfDay);
3656
}
3757

58+
// millis <=> date is different in every timezone
59+
@Test
60+
public void testConvertToNepaliString() {
61+
MockTimeZoneProvider mockTimeZoneProvider = new MockTimeZoneProvider(TimeZone.getTimeZone("Europe/Madrid"));
62+
DateUtils.setTimezoneProvider(mockTimeZoneProvider);
63+
DateTimeZone timeZone = DateTimeZone.forTimeZone(mockTimeZoneProvider.timeZone);
64+
// this is what Nepali widget uses to calculate the millis from date fields
65+
long millis = CalendarUtils.toMillisFromJavaEpoch(2081, 6, 16, timeZone);
66+
String nepaliDateStr = CalendarUtils.convertToNepaliString(new Date(millis), null);
67+
assertEquals( "16 Ashwin 2081", nepaliDateStr);
68+
69+
70+
mockTimeZoneProvider.setTimezone(TimeZone.getTimeZone("Asia/Kathmandu"));
71+
timeZone = DateTimeZone.forTimeZone(mockTimeZoneProvider.timeZone);
72+
millis = CalendarUtils.toMillisFromJavaEpoch(2081, 6, 16, timeZone);
73+
nepaliDateStr = CalendarUtils.convertToNepaliString(new Date(millis), null);
74+
assertEquals( "16 Ashwin 2081", nepaliDateStr);
75+
76+
77+
mockTimeZoneProvider.setTimezone(TimeZone.getTimeZone("America/Chicago"));
78+
timeZone = DateTimeZone.forTimeZone(mockTimeZoneProvider.timeZone);
79+
millis = CalendarUtils.toMillisFromJavaEpoch(2081, 6, 16, timeZone);
80+
nepaliDateStr = CalendarUtils.convertToNepaliString(new Date(millis), null);
81+
assertEquals( "16 Ashwin 2081", nepaliDateStr);
82+
DateUtils.resetTimezoneProvider();
83+
}
84+
3885
private static void assertSameDate(UniversalDate a, UniversalDate b) {
3986
assertEquals(a.day, b.day);
4087
assertEquals(a.month, b.month);
@@ -63,7 +110,8 @@ public void testUnpackingDateInDifferentTimezone() {
63110
mexicoCal.set(2007, Calendar.JULY, 7, 18, 46);
64111

65112
UniversalDate mexicanDate = CalendarUtils.fromMillis(mexicoCal.getTimeInMillis(), mexicanTimeZone);
66-
long time = CalendarUtils.toMillisFromJavaEpoch(mexicanDate.year, mexicanDate.month, mexicanDate.day, mexicanTimeZone);
113+
long time = CalendarUtils.toMillisFromJavaEpoch(mexicanDate.year, mexicanDate.month, mexicanDate.day,
114+
mexicanTimeZone);
67115
UniversalDate rebuiltDateInUsingDifferentTimezone = CalendarUtils.fromMillis(time, nepaliTimeZone);
68116
assertSameDate(rebuiltDateInUsingDifferentTimezone, mexicanDate);
69117
}
@@ -103,4 +151,22 @@ public void serializeUniversalDateViaMillisTest() {
103151
deserializedNepaliDate = CalendarUtils.fromMillis(date.getTime(), bostonTimeZone);
104152
assertSameDate(nepaliDate, deserializedNepaliDate);
105153
}
154+
155+
private class MockTimeZoneProvider extends TimezoneProvider {
156+
157+
private TimeZone timeZone;
158+
159+
public MockTimeZoneProvider(TimeZone timeZone) {
160+
this.timeZone = timeZone;
161+
}
162+
163+
public void setTimezone(TimeZone timeZone){
164+
this.timeZone = timeZone;
165+
}
166+
167+
@Override
168+
public TimeZone getTimezone() {
169+
return timeZone;
170+
}
171+
}
106172
}

0 commit comments

Comments
 (0)