--- /dev/null
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ss.usermodel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.text.DateFormatSymbols;
+import java.text.FieldPosition;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.poi.util.LocaleUtil;
+import org.junit.Test;
+
+public class TestExcelStyleDateFormatter {
+ private static final String EXCEL_DATE_FORMAT = "MMMMM";
+
+ /**
+ * [Bug 60369] Month format 'MMMMM' issue with TEXT-formula and Java 8
+ */
+ @Test
+ public void test60369() throws ParseException {
+ // Setting up the locale to be tested together with a list of asserted unicode-formatted results and put them in a map.
+ Locale germanLocale = Locale.GERMAN;
+ List<String> germanResultList = Arrays.asList("\u004a", "\u0046", "\u004d", "\u0041", "\u004d",
+ "\u004a", "\u004a", "\u0041", "\u0053", "\u004f", "\u004e", "\u0044");
+
+ Locale russianLocale = new Locale("ru", "RU");
+ List<String> russianResultList = Arrays.asList("\u044f", "\u0444", "\u043c", "\u0430", "\u043c",
+ "\u0438", "\u0438", "\u0430", "\u0441", "\u043e", "\u043d", "\u0434");
+
+ Locale austrianLocale = new Locale("de", "AT");
+ List<String> austrianResultList = Arrays.asList("\u004a", "\u0046", "\u004d", "\u0041", "\u004d",
+ "\u004a", "\u004a", "\u0041", "\u0053", "\u004f", "\u004e", "\u0044");
+
+ Locale englishLocale = Locale.UK;
+ List<String> englishResultList = Arrays.asList("\u004a", "\u0046", "\u004d", "\u0041", "\u004d",
+ "\u004a", "\u004a", "\u0041", "\u0053", "\u004f", "\u004e", "\u0044");
+
+ Locale frenchLocale = Locale.FRENCH;
+ List<String> frenchResultList = Arrays.asList("\u006a", "\u0066", "\u006d", "\u0061", "\u006d",
+ "\u006a", "\u006a", "\u0061", "\u0073", "\u006f", "\u006e", "\u0064");
+
+ Locale chineseLocale = Locale.CHINESE;
+ List<String> chineseResultList = Arrays.asList("\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94",
+ "\u516d", "\u4e03", "\u516b", "\u4e5d", "\u5341", "\u5341", "\u5341");
+
+ Locale turkishLocale = new Locale("tr", "TR");
+ List<String> turkishResultList = Arrays.asList("\u004f", "\u015e", "\u004d", "\u004e", "\u004d",
+ "\u0048", "\u0054", "\u0041", "\u0045", "\u0045", "\u004b", "\u0041");
+
+ Locale hungarianLocale = new Locale("hu", "HU");
+ List<String> hungarianResultList = Arrays.asList("\u006a", "\u0066", "\u006d", "\u00e1", "\u006d",
+ "\u006a", "\u006a", "\u0061", "\u0073", "\u006f", "\u006e", "\u0064");
+
+ Locale indianLocale = new Locale("en", "IN");
+ List<String> indianResultList = Arrays.asList("\u004a", "\u0046", "\u004d", "\u0041", "\u004d",
+ "\u004a", "\u004a", "\u0041", "\u0053", "\u004f", "\u004e", "\u0044");
+
+ Locale indonesianLocale = new Locale("in", "ID");
+ List<String> indonesianResultList = Arrays.asList("\u004a", "\u0046", "\u004d", "\u0041", "\u004d",
+ "\u004a", "\u004a", "\u0041", "\u0053", "\u004f", "\u004e", "\u0044");
+
+
+ Map<Locale, List<String>> testMap = new HashMap<Locale, List<String>>();
+ testMap.put(germanLocale, germanResultList);
+ testMap.put(russianLocale, russianResultList);
+ testMap.put(austrianLocale, austrianResultList);
+ testMap.put(englishLocale, englishResultList);
+ testMap.put(frenchLocale, frenchResultList);
+ testMap.put(chineseLocale, chineseResultList);
+ testMap.put(turkishLocale, turkishResultList);
+ testMap.put(hungarianLocale, hungarianResultList);
+ testMap.put(indianLocale, indianResultList);
+ testMap.put(indonesianLocale, indonesianResultList);
+
+ // We have to set up dates as well.
+ SimpleDateFormat testDateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.ROOT);
+ List<Date> testDates = Arrays.asList(
+ testDateFormat.parse("12.01.1980"),
+ testDateFormat.parse("11.02.1995"),
+ testDateFormat.parse("10.03.2045"),
+ testDateFormat.parse("09.04.2016"),
+ testDateFormat.parse("08.05.2017"),
+ testDateFormat.parse("07.06.1945"),
+ testDateFormat.parse("06.07.1998"),
+ testDateFormat.parse("05.08.2099"),
+ testDateFormat.parse("04.09.1988"),
+ testDateFormat.parse("03.10.2023"),
+ testDateFormat.parse("02.11.1978"),
+ testDateFormat.parse("01.12.1890"));
+
+ // Let's iterate over the test setup.
+ for (Locale locale : testMap.keySet()) {
+ //System.err.println("Locale: " + locale);
+ ExcelStyleDateFormatter formatter = new ExcelStyleDateFormatter(EXCEL_DATE_FORMAT, new DateFormatSymbols(locale));
+ for (int i = 0; i < 12; i++) {
+ // Call the method to be tested!
+ String result =
+ formatter.format(testDates.get(i),
+ new StringBuffer(),
+ new FieldPosition(java.text.DateFormat.MONTH_FIELD)).toString();
+ //System.err.println(result + " - " + getUnicode(result.charAt(0)));
+ assertEquals(getUnicode(testMap.get(locale).get(i).charAt(0)), getUnicode(result.charAt(0)));
+ }
+ }
+ }
+
+ private String getUnicode(char c) {
+ return "\\u" + Integer.toHexString(c | 0x10000).substring(1);
+ }
+
+ @Test
+ public void testConstruct() {
+ assertNotNull(new ExcelStyleDateFormatter(EXCEL_DATE_FORMAT, LocaleUtil.getUserLocale()));
+ assertNotNull(new ExcelStyleDateFormatter(EXCEL_DATE_FORMAT));
+ }
+
+ @Test
+ public void testWithLocale() throws ParseException {
+ Locale before = LocaleUtil.getUserLocale();
+ try {
+ LocaleUtil.setUserLocale(Locale.GERMAN);
+ String dateStr = new ExcelStyleDateFormatter(EXCEL_DATE_FORMAT).format(
+ new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT).parse("2016-03-26"));
+ assertEquals("M", dateStr);
+ } finally {
+ LocaleUtil.setUserLocale(before);
+ }
+ }
+
+ @Test
+ public void testWithPattern() throws ParseException {
+ String dateStr = new ExcelStyleDateFormatter("yyyy|" + EXCEL_DATE_FORMAT + "|").format(
+ new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT).parse("2016-03-26"));
+ assertEquals("2016|M|", dateStr);
+ }
+}