From 499c08881aa0cb06fd3e6c941d88f6ce0ecf2469 Mon Sep 17 00:00:00 2001 From: Christopher Dambakk Date: Mon, 19 Oct 2020 19:06:14 +0200 Subject: [PATCH 1/8] Add Norwegian locale and corresponding test (failing as pr issue #146) --- .../kotlin/com/soywiz/klock/locale/nb.kt | 46 +++++++++++++++++++ .../soywiz/klock/locale/KlockLocaleTest.kt | 18 ++++++++ 2 files changed, 64 insertions(+) create mode 100644 klock/src/commonMain/kotlin/com/soywiz/klock/locale/nb.kt diff --git a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/nb.kt b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/nb.kt new file mode 100644 index 0000000..2f3074d --- /dev/null +++ b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/nb.kt @@ -0,0 +1,46 @@ +package com.soywiz.klock.locale + +import com.soywiz.klock.DayOfWeek +import com.soywiz.klock.KlockLocale + +val KlockLocale.Companion.norwegian get() = NorwegianKlockLocale + +open class NorwegianKlockLocale : KlockLocale() { + + companion object : NorwegianKlockLocale() + + override val ISO639_1 = "nb" + + override val firstDayOfWeek = DayOfWeek.Monday + + override val daysOfWeek = listOf( + "Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag" + ) + + override val months = listOf( + "januar", + "februar", + "mars", + "april", + "mai", + "juni", + "juli", + "august", + "september", + "oktober", + "november", + "desember" + ) + + override val formatDateTimeMedium = format("dd.MM.y HH:mm:ss") + override val formatDateTimeShort = format("dd.MM.yy HH:mm") + + override val formatDateFull = format("EEEE, d. MMMM y") + override val formatDateLong = format("d. MMMM y") + override val formatDateMedium = format("dd.MM.y") + override val formatDateShort = format("dd.MM.yy") + + override val formatTimeMedium = format("HH:mm:ss") + override val formatTimeShort = format("HH:mm") + +} diff --git a/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt b/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt index 90effb3..b4a9a05 100644 --- a/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt +++ b/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt @@ -61,6 +61,24 @@ class KlockLocaleTest { ) } + @Test + fun testNorwegianLocale() { + assertEquals( + """ + Ons, 13 mar 2019 21:36:45 UTC + 13.03.2019 21:36:45 + 13.03.19 21:36 + Onsdag, 13. mars 2019 + 13. mars 2019 + 13.03.2019 + 13.03.19 + 21:36:45 + 21:36 + """.trimIndent(), + multiFormat(NorwegianKlockLocale, KlockLocale.norwegian) + ) + } + @Test fun testJapaneseLocale() { assertEquals( From 2d6f9794d960e594472e64c3cba133bc18f62ef1 Mon Sep 17 00:00:00 2001 From: Christopher Dambakk Date: Mon, 19 Oct 2020 21:02:56 +0200 Subject: [PATCH 2/8] Change format method to use localized names for days and months. Fix tests. See issue #146. --- .../kotlin/com/soywiz/klock/KlockLocale.kt | 6 +- .../com/soywiz/klock/PatternDateFormat.kt | 14 ++--- .../kotlin/com/soywiz/klock/locale/de.kt | 6 +- .../soywiz/klock/locale/KlockLocaleTest.kt | 58 +++++++++---------- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/klock/src/commonMain/kotlin/com/soywiz/klock/KlockLocale.kt b/klock/src/commonMain/kotlin/com/soywiz/klock/KlockLocale.kt index 6a9f479..6f03ccd 100644 --- a/klock/src/commonMain/kotlin/com/soywiz/klock/KlockLocale.kt +++ b/klock/src/commonMain/kotlin/com/soywiz/klock/KlockLocale.kt @@ -84,11 +84,11 @@ abstract class KlockLocale { override val firstDayOfWeek: DayOfWeek = DayOfWeek.Sunday override val daysOfWeek: List = listOf( - "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" + "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ) override val months: List = listOf( - "january", "february", "march", "april", "may", "june", - "july", "august", "september", "october", "november", "december" + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" ) override val formatTimeMedium = format("h:mm:ss a") diff --git a/klock/src/commonMain/kotlin/com/soywiz/klock/PatternDateFormat.kt b/klock/src/commonMain/kotlin/com/soywiz/klock/PatternDateFormat.kt index 07be9bc..736037c 100644 --- a/klock/src/commonMain/kotlin/com/soywiz/klock/PatternDateFormat.kt +++ b/klock/src/commonMain/kotlin/com/soywiz/klock/PatternDateFormat.kt @@ -132,14 +132,14 @@ data class PatternDateFormat @JvmOverloads constructor( for (name in chunks) { val nlen = name.length out += when (name) { - "E", "EE", "EEE" -> realLocale.daysOfWeekShort[utc.dayOfWeek.index0].capitalize() - "EEEE", "EEEEE", "EEEEEE" -> realLocale.daysOfWeek[utc.dayOfWeek.index0].capitalize() + "E", "EE", "EEE" -> DayOfWeek[utc.dayOfWeek.index0].localShortName(realLocale) + "EEEE", "EEEEE", "EEEEEE" -> DayOfWeek[utc.dayOfWeek.index0].localName(realLocale) "z", "zzz" -> dd.offset.timeZone "d", "dd" -> utc.dayOfMonth.padded(nlen) "M", "MM" -> utc.month1.padded(nlen) - "MMM" -> realLocale.months[utc.month0].substr(0, 3).capitalize() - "MMMM" -> realLocale.months[utc.month0].capitalize() - "MMMMM" -> realLocale.months[utc.month0].substr(0, 1).capitalize() + "MMM" -> Month[utc.month1].localName(realLocale).substr(0, 3) + "MMMM" -> Month[utc.month1].localName(realLocale) + "MMMMM" -> Month[utc.month1].localName(realLocale).substr(0, 1) "y" -> utc.yearInt "yy" -> (utc.yearInt % 100).padded(2) "yyy" -> (utc.yearInt % 1000).padded(3) @@ -212,7 +212,7 @@ data class PatternDateFormat @JvmOverloads constructor( } "d", "dd" -> day = value.toInt() "M", "MM" -> month = value.toInt() - "MMM" -> month = realLocale.monthsShort.indexOf(value.toLowerCase()) + 1 + "MMM" -> month = realLocale.monthsShort.indexOf(value) + 1 "y", "yyyy", "YYYY" -> fullYear = value.toInt() "yy" -> if (doThrow) throw RuntimeException("Not guessing years from two digits.") else return null "yyy" -> fullYear = value.toInt() + if (value.toInt() < 800) 2000 else 1000 // guessing year... @@ -257,7 +257,7 @@ data class PatternDateFormat @JvmOverloads constructor( } } } - "MMMM" -> month = realLocale.months.indexOf(value.toLowerCase()) + 1 + "MMMM" -> month = realLocale.months.indexOf(value) + 1 "MMMMM" -> if (doThrow) throw RuntimeException("Not possible to get the month from one letter.") else return null "a" -> isPm = value == "pm" else -> { diff --git a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/de.kt b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/de.kt index f17338a..c7476aa 100644 --- a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/de.kt +++ b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/de.kt @@ -15,11 +15,11 @@ open class GermanKlockLocale : KlockLocale() { override val firstDayOfWeek: DayOfWeek = DayOfWeek.Monday override val daysOfWeek = listOf( - "sonntag", "montag", "dienstag", "mittwoch", "donnerstag", "freitag", "samstag" + "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" ) override val months = listOf( - "januar", "februar", "märz", "april", "mai", "juni", - "juli", "august", "september", "oktober", "november", "dezember" + "Januar", "Februar", "März", "April", "Mai", "Juni", + "Juli", "August", "September", "Oktober", "November", "Dezember" ) override val formatDateTimeMedium = format("dd.MM.y HH:mm:ss") diff --git a/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt b/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt index b4a9a05..14ccc3c 100644 --- a/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt +++ b/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt @@ -11,11 +11,11 @@ class KlockLocaleTest { fun testSpanishLocale() { assertEquals( """ - Mié, 13 Mar 2019 21:36:45 UTC + mié, 13 mar 2019 21:36:45 UTC 13/03/2019 21:36:45 13/03/19 21:36 - Miércoles, 13 de Marzo de 2019 - 13 de Marzo de 2019 + miércoles, 13 de marzo de 2019 + 13 de marzo de 2019 13/03/2019 13/03/19 21:36:45 @@ -29,12 +29,12 @@ class KlockLocaleTest { fun testFrenchLocale() { assertEquals( """ - Mer, 13 Mar 2019 21:36:45 UTC - 13 Mar 2019 21:36:45 + mer, 13 mar 2019 21:36:45 UTC + 13 mar 2019 21:36:45 13/03/2019 21:36 - Mercredi 13 Mars 2019 - 13 Mars 2019 - 13 Mar 2019 + mercredi 13 mars 2019 + 13 mars 2019 + 13 mar 2019 13/03/2019 21:36:45 21:36 @@ -101,12 +101,12 @@ class KlockLocaleTest { fun testDutchLocale() { assertEquals( """ - Woe, 13 Maa 2019 21:36:45 UTC - 13 Maa 2019 21:36:45 + woe, 13 maa 2019 21:36:45 UTC + 13 maa 2019 21:36:45 13-03-19 21:36 - Woensdag 13 Maart 2019 - 13 Maart 2019 - 13 Maa 2019 + woensdag 13 maart 2019 + 13 maart 2019 + 13 maa 2019 13-03-2019 21:36:45 21:36 @@ -119,12 +119,12 @@ class KlockLocaleTest { fun testPortugueseLocale() { assertEquals( """ - Qua, 13 Mar 2019 21:36:45 UTC - 13 de Mar de 2019 21:36:45 + qua, 13 mar 2019 21:36:45 UTC + 13 de mar de 2019 21:36:45 13/03/2019 21:36 - Quarta-feira, 13 de Março de 2019 - 13 de Março de 2019 - 13 de Mar de 2019 + quarta-feira, 13 de março de 2019 + 13 de março de 2019 + 13 de mar de 2019 13/03/2019 21:36:45 21:36 @@ -137,12 +137,12 @@ class KlockLocaleTest { fun testRussianLocale() { assertEquals( """ - Ср, 13 Мар 2019 21:36:45 UTC - 13 Мар 2019 г. 21:36:45 + ср, 13 мар 2019 21:36:45 UTC + 13 мар 2019 г. 21:36:45 13.03.2019 21:36 - Среда, 13 Марта 2019 г. - 13 Марта 2019 г. - 13 Мар 2019 г. + среда, 13 марта 2019 г. + 13 марта 2019 г. + 13 мар 2019 г. 13.03.2019 21:36:45 21:36 @@ -191,12 +191,12 @@ class KlockLocaleTest { fun testUkrainianLocale() { assertEquals( """ - Ср, 13 Бер 2019 21:36:45 UTC - 13 Бер 2019 р. 21:36:45 + ср, 13 бер 2019 21:36:45 UTC + 13 бер 2019 р. 21:36:45 13.03.2019 21:36 - Середа, 13 Березня 2019 р. - 13 Березня 2019 р. - 13 Бер 2019 р. + середа, 13 березня 2019 р. + 13 березня 2019 р. + 13 бер 2019 р. 13.03.2019 21:36:45 21:36 @@ -244,7 +244,7 @@ class KlockLocaleTest { fun testTemporalSetDefault() { assertEquals("Wed, 13 Mar 2019 21:36:45 UTC", date.toString()) KlockLocale.setTemporarily(KlockLocale.spanish) { - assertEquals("Mié, 13 Mar 2019 21:36:45 UTC", date.toString()) + assertEquals("mié, 13 mar 2019 21:36:45 UTC", date.toString()) } assertEquals("Wed, 13 Mar 2019 21:36:45 UTC", date.toString()) } From addb287d4d762698de22a6f1593a857afcbe6ec8 Mon Sep 17 00:00:00 2001 From: Christopher Dambakk Date: Thu, 22 Oct 2020 19:03:04 +0200 Subject: [PATCH 3/8] Update russian and ukrainian weekdays based on PR feedback --- .../commonMain/kotlin/com/soywiz/klock/locale/ru.kt | 4 ++-- .../commonMain/kotlin/com/soywiz/klock/locale/uk.kt | 12 ++++++------ .../com/soywiz/klock/locale/KlockLocaleTest.kt | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/ru.kt b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/ru.kt index 92b7f37..1b70652 100644 --- a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/ru.kt +++ b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/ru.kt @@ -15,11 +15,11 @@ open class RussianKlockLocale : KlockLocale() { override val firstDayOfWeek: DayOfWeek = DayOfWeek.Monday override val daysOfWeek = listOf( - "воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота" + "воскресенье", "понедельник", "вторник", "Среда", "четверг", "пятница", "суббота" ) override val daysOfWeekShort = listOf( - "вс", "пн", "вт", "ср", "чт", "пт", "сб" + "вс", "пн", "вт", "Ср", "чт", "пт", "сб" ) override val months = listOf( diff --git a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/uk.kt b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/uk.kt index 0c688fc..6c2d0a2 100644 --- a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/uk.kt +++ b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/uk.kt @@ -13,13 +13,13 @@ open class UkrainianKlockLocale : KlockLocale() { override val firstDayOfWeek: DayOfWeek = DayOfWeek.Monday - override val daysOfWeek = listOf( - "неділя", "понеділок", "вівторок", "середа", "четвер", "п'ятниця", "субота" - ) + override val daysOfWeek = listOf( + "неділя", "понеділок", "вівторок", "Середа", "четвер", "п'ятниця", "субота" + ) - override val daysOfWeekShort = listOf( - "нд", "пн", "вт", "ср", "чт", "пт", "сб" - ) + override val daysOfWeekShort = listOf( + "нд", "пн", "вт", "Ср", "чт", "пт", "сб" + ) override val months = listOf( "січня", "лютого", "березня", "квітня", "травня", "червня", diff --git a/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt b/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt index 14ccc3c..94b2de5 100644 --- a/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt +++ b/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt @@ -137,10 +137,10 @@ class KlockLocaleTest { fun testRussianLocale() { assertEquals( """ - ср, 13 мар 2019 21:36:45 UTC + Ср, 13 мар 2019 21:36:45 UTC 13 мар 2019 г. 21:36:45 13.03.2019 21:36 - среда, 13 марта 2019 г. + Среда, 13 марта 2019 г. 13 марта 2019 г. 13 мар 2019 г. 13.03.2019 @@ -191,10 +191,10 @@ class KlockLocaleTest { fun testUkrainianLocale() { assertEquals( """ - ср, 13 бер 2019 21:36:45 UTC + Ср, 13 бер 2019 21:36:45 UTC 13 бер 2019 р. 21:36:45 13.03.2019 21:36 - середа, 13 березня 2019 р. + Середа, 13 березня 2019 р. 13 березня 2019 р. 13 бер 2019 р. 13.03.2019 @@ -233,8 +233,8 @@ class KlockLocaleTest { assertEquals("月曜日", DayOfWeek.Monday.localName(KlockLocale.japanese)) assertEquals("月", DayOfWeek.Monday.localShortName(KlockLocale.japanese)) - assertEquals("середа", DayOfWeek.Wednesday.localName(KlockLocale.ukrainian)) - assertEquals("ср", DayOfWeek.Wednesday.localShortName(KlockLocale.ukrainian)) + assertEquals("Середа", DayOfWeek.Wednesday.localName(KlockLocale.ukrainian)) + assertEquals("Ср", DayOfWeek.Wednesday.localShortName(KlockLocale.ukrainian)) assertEquals("воскресенье", DayOfWeek.Sunday.localName(KlockLocale.russian)) assertEquals("вс", DayOfWeek.Sunday.localShortName(KlockLocale.russian)) From baf202d1c7fb339d6142205e7a992e2a79eb61b2 Mon Sep 17 00:00:00 2001 From: Christopher Dambakk Date: Thu, 22 Oct 2020 20:18:34 +0200 Subject: [PATCH 4/8] Create jvm tests to cross check localization to java DateTime formatting --- .../kotlin/com/soywiz/klock/locale/nb.kt | 2 +- .../soywiz/klock/locale/KlockLocaleTest.kt | 4 +- .../com/soywiz/klock/KlockLocaleTestJvm.kt | 179 ++++++++++++++++++ 3 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt diff --git a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/nb.kt b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/nb.kt index 2f3074d..43fce53 100644 --- a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/nb.kt +++ b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/nb.kt @@ -14,7 +14,7 @@ open class NorwegianKlockLocale : KlockLocale() { override val firstDayOfWeek = DayOfWeek.Monday override val daysOfWeek = listOf( - "Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag" + "søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag" ) override val months = listOf( diff --git a/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt b/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt index 94b2de5..73386d6 100644 --- a/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt +++ b/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt @@ -65,10 +65,10 @@ class KlockLocaleTest { fun testNorwegianLocale() { assertEquals( """ - Ons, 13 mar 2019 21:36:45 UTC + ons, 13 mar 2019 21:36:45 UTC 13.03.2019 21:36:45 13.03.19 21:36 - Onsdag, 13. mars 2019 + onsdag, 13. mars 2019 13. mars 2019 13.03.2019 13.03.19 diff --git a/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt b/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt new file mode 100644 index 0000000..ea2f19b --- /dev/null +++ b/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt @@ -0,0 +1,179 @@ +package com.soywiz.klock + +import com.soywiz.klock.locale.* +import org.junit.Ignore +import org.junit.Test +import java.time.LocalDateTime +import java.time.ZoneOffset +import java.time.format.DateTimeFormatter +import java.util.* +import kotlin.test.assertEquals + +class KlockLocaleTestJvm { + + val outputPattern = "EEEE, d MMMM yyyy HH:mm:ss" + + val klockDate = DateTime( + year = 1995, + month = Month.January, + day = 18, + hour = 21, + minute = 36, + second = 45 + ) + val javaDate = LocalDateTime.of( + 1995, // year + java.time.Month.JANUARY, // month + 18, // day of month + 21, // hour + 36, // minute + 45 // second + ) + + + @Test + fun assertDatesAreTheSame() { + val klockLong = klockDate.unixMillisLong + val javaLong = javaDate.toInstant(ZoneOffset.UTC).toEpochMilli() + assertEquals(javaLong, klockLong) + } + + private fun LocalDateTime.format(pattern: String, locale: Locale) = this.format( + DateTimeFormatter.ofPattern(pattern, locale) + ) + + @Test + fun assertEnglishLocalization() { + val javaOutput = javaDate.format(outputPattern, Locale.ENGLISH) + + val klockOutput = KlockLocale.setTemporarily(KlockLocale.english) { + DateFormat(outputPattern).format(klockDate) + } + + assertEquals(javaOutput, klockOutput) + } + + @Test + fun assertNorwegianLocalization() { + val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("no-nb")) + + val klockOutput = KlockLocale.setTemporarily(KlockLocale.norwegian) { + DateFormat(outputPattern).format(klockDate) + } + + assertEquals(javaOutput, klockOutput) + } + + @Test + fun assertSpanishLocalization() { + val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("es")) + + val klockOutput = KlockLocale.setTemporarily(KlockLocale.spanish) { + DateFormat(outputPattern).format(klockDate) + } + + assertEquals(javaOutput, klockOutput) + } + + @Test + fun assertFrenchLocalization() { + val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("fr")) + + val klockOutput = KlockLocale.setTemporarily(KlockLocale.french) { + DateFormat(outputPattern).format(klockDate) + } + + assertEquals(javaOutput, klockOutput) + } + + @Test + fun assertGermanLocalization() { + val javaOutput = javaDate.format(outputPattern, Locale.GERMAN) + + val klockOutput = KlockLocale.setTemporarily(KlockLocale.german) { + DateFormat(outputPattern).format(klockDate) + } + + assertEquals(javaOutput, klockOutput) + } + + @Test + fun assertJapaneseLocalization() { + val javaOutput = javaDate.format(outputPattern, Locale.JAPAN) + + val klockOutput = KlockLocale.setTemporarily(KlockLocale.japanese) { + DateFormat(outputPattern).format(klockDate) + } + + assertEquals(javaOutput, klockOutput) + } + + @Test + fun assertDutchLocalization() { + val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("nl")) + + val klockOutput = KlockLocale.setTemporarily(KlockLocale.dutch) { + DateFormat(outputPattern).format(klockDate) + } + + assertEquals(javaOutput, klockOutput) + } + + @Test + fun assertPortugueseLocalization() { + val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("pt")) + + val klockOutput = KlockLocale.setTemporarily(KlockLocale.portuguese) { + DateFormat(outputPattern).format(klockDate) + } + + assertEquals(javaOutput, klockOutput) + } + + @Test + @Ignore("Failing... Awaiting PR feedback") + fun assertRussianLocalization() { + val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("ru")) + + val klockOutput = KlockLocale.setTemporarily(KlockLocale.russian) { + DateFormat(outputPattern).format(klockDate) + } + + assertEquals(javaOutput, klockOutput) + } + + @Test + fun assertKoreanLocalization() { + val javaOutput = javaDate.format(outputPattern, Locale.KOREA) + + val klockOutput = KlockLocale.setTemporarily(KlockLocale.korean) { + DateFormat(outputPattern).format(klockDate) + } + + assertEquals(javaOutput, klockOutput) + } + + @Test + fun assertChineseLocalization() { + val javaOutput = javaDate.format(outputPattern, Locale.CHINA) + + val klockOutput = KlockLocale.setTemporarily(KlockLocale.chinese) { + DateFormat(outputPattern).format(klockDate) + } + + assertEquals(javaOutput, klockOutput) + } + + @Test + @Ignore("Failing... Awaiting PR feedback") + fun assertUkrainianLocalization() { + val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("uk")) + + val klockOutput = KlockLocale.setTemporarily(KlockLocale.ukrainian) { + DateFormat(outputPattern).format(klockDate) + } + + assertEquals(javaOutput, klockOutput) + } + +} From 3bac87875214522ed55af8be4d7fb77bd51b77c1 Mon Sep 17 00:00:00 2001 From: Christopher Dambakk Date: Sat, 24 Oct 2020 21:41:04 +0200 Subject: [PATCH 5/8] Fix failing portuguese test and feedback on russian weekday translation --- .../kotlin/com/soywiz/klock/locale/pt.kt | 14 +++++++------- .../kotlin/com/soywiz/klock/locale/ru.kt | 4 ++-- .../kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt | 7 +++---- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/pt.kt b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/pt.kt index a7e30d5..716e12b 100644 --- a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/pt.kt +++ b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/pt.kt @@ -15,13 +15,13 @@ open class PortugueseKlockLocale : KlockLocale() { override val firstDayOfWeek: DayOfWeek = DayOfWeek.Monday override val daysOfWeek = listOf( - "domingo", - "segunda-feira", - "terça-feira", - "quarta-feira", - "quinta-feira", - "sexta-feira", - "sábado" + "Domingo", + "Segunda-feira", + "Terça-feira", + "Quarta-feira", + "Quinta-feira", + "Sexta-feira", + "Sábado" ) override val months = listOf( "janeiro", diff --git a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/ru.kt b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/ru.kt index 1b70652..92b7f37 100644 --- a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/ru.kt +++ b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/ru.kt @@ -15,11 +15,11 @@ open class RussianKlockLocale : KlockLocale() { override val firstDayOfWeek: DayOfWeek = DayOfWeek.Monday override val daysOfWeek = listOf( - "воскресенье", "понедельник", "вторник", "Среда", "четверг", "пятница", "суббота" + "воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота" ) override val daysOfWeekShort = listOf( - "вс", "пн", "вт", "Ср", "чт", "пт", "сб" + "вс", "пн", "вт", "ср", "чт", "пт", "сб" ) override val months = listOf( diff --git a/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt b/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt index ea2f19b..c3b56c2 100644 --- a/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt +++ b/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt @@ -11,9 +11,9 @@ import kotlin.test.assertEquals class KlockLocaleTestJvm { - val outputPattern = "EEEE, d MMMM yyyy HH:mm:ss" + private val outputPattern = "EEEE, d MMMM yyyy HH:mm:ss" - val klockDate = DateTime( + private val klockDate = DateTime( year = 1995, month = Month.January, day = 18, @@ -21,7 +21,7 @@ class KlockLocaleTestJvm { minute = 36, second = 45 ) - val javaDate = LocalDateTime.of( + private val javaDate = LocalDateTime.of( 1995, // year java.time.Month.JANUARY, // month 18, // day of month @@ -131,7 +131,6 @@ class KlockLocaleTestJvm { } @Test - @Ignore("Failing... Awaiting PR feedback") fun assertRussianLocalization() { val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("ru")) From d4f2284bba5f2a6e17b32524f80cd6c1c080e42f Mon Sep 17 00:00:00 2001 From: Christopher Dambakk Date: Tue, 27 Oct 2020 18:22:39 +0100 Subject: [PATCH 6/8] Final fixes to localization tests --- .../kotlin/com/soywiz/klock/locale/pt.kt | 14 +++++++------- .../kotlin/com/soywiz/klock/locale/uk.kt | 4 ++-- .../com/soywiz/klock/locale/KlockLocaleTest.kt | 12 ++++++------ .../kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt | 7 ++++--- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/pt.kt b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/pt.kt index 716e12b..a7e30d5 100644 --- a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/pt.kt +++ b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/pt.kt @@ -15,13 +15,13 @@ open class PortugueseKlockLocale : KlockLocale() { override val firstDayOfWeek: DayOfWeek = DayOfWeek.Monday override val daysOfWeek = listOf( - "Domingo", - "Segunda-feira", - "Terça-feira", - "Quarta-feira", - "Quinta-feira", - "Sexta-feira", - "Sábado" + "domingo", + "segunda-feira", + "terça-feira", + "quarta-feira", + "quinta-feira", + "sexta-feira", + "sábado" ) override val months = listOf( "janeiro", diff --git a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/uk.kt b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/uk.kt index 6c2d0a2..79bfbac 100644 --- a/klock/src/commonMain/kotlin/com/soywiz/klock/locale/uk.kt +++ b/klock/src/commonMain/kotlin/com/soywiz/klock/locale/uk.kt @@ -14,11 +14,11 @@ open class UkrainianKlockLocale : KlockLocale() { override val firstDayOfWeek: DayOfWeek = DayOfWeek.Monday override val daysOfWeek = listOf( - "неділя", "понеділок", "вівторок", "Середа", "четвер", "п'ятниця", "субота" + "неділя", "понеділок", "вівторок", "середа", "четвер", "п'ятниця", "субота" ) override val daysOfWeekShort = listOf( - "нд", "пн", "вт", "Ср", "чт", "пт", "сб" + "нд", "пн", "вт", "ср", "чт", "пт", "сб" ) override val months = listOf( diff --git a/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt b/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt index 73386d6..e51f100 100644 --- a/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt +++ b/klock/src/commonTest/kotlin/com/soywiz/klock/locale/KlockLocaleTest.kt @@ -137,10 +137,10 @@ class KlockLocaleTest { fun testRussianLocale() { assertEquals( """ - Ср, 13 мар 2019 21:36:45 UTC + ср, 13 мар 2019 21:36:45 UTC 13 мар 2019 г. 21:36:45 13.03.2019 21:36 - Среда, 13 марта 2019 г. + среда, 13 марта 2019 г. 13 марта 2019 г. 13 мар 2019 г. 13.03.2019 @@ -191,10 +191,10 @@ class KlockLocaleTest { fun testUkrainianLocale() { assertEquals( """ - Ср, 13 бер 2019 21:36:45 UTC + ср, 13 бер 2019 21:36:45 UTC 13 бер 2019 р. 21:36:45 13.03.2019 21:36 - Середа, 13 березня 2019 р. + середа, 13 березня 2019 р. 13 березня 2019 р. 13 бер 2019 р. 13.03.2019 @@ -233,8 +233,8 @@ class KlockLocaleTest { assertEquals("月曜日", DayOfWeek.Monday.localName(KlockLocale.japanese)) assertEquals("月", DayOfWeek.Monday.localShortName(KlockLocale.japanese)) - assertEquals("Середа", DayOfWeek.Wednesday.localName(KlockLocale.ukrainian)) - assertEquals("Ср", DayOfWeek.Wednesday.localShortName(KlockLocale.ukrainian)) + assertEquals("середа", DayOfWeek.Wednesday.localName(KlockLocale.ukrainian)) + assertEquals("ср", DayOfWeek.Wednesday.localShortName(KlockLocale.ukrainian)) assertEquals("воскресенье", DayOfWeek.Sunday.localName(KlockLocale.russian)) assertEquals("вс", DayOfWeek.Sunday.localShortName(KlockLocale.russian)) diff --git a/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt b/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt index c3b56c2..86f694e 100644 --- a/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt +++ b/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt @@ -132,13 +132,15 @@ class KlockLocaleTestJvm { @Test fun assertRussianLocalization() { - val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("ru")) + // Java DateTime formats wrong in java 8. Hardcoding expected value instead. +// val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("ru")) + val expectedOutput = "среда, 18 января 1995 21:36:45" val klockOutput = KlockLocale.setTemporarily(KlockLocale.russian) { DateFormat(outputPattern).format(klockDate) } - assertEquals(javaOutput, klockOutput) + assertEquals(expectedOutput, klockOutput) } @Test @@ -164,7 +166,6 @@ class KlockLocaleTestJvm { } @Test - @Ignore("Failing... Awaiting PR feedback") fun assertUkrainianLocalization() { val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("uk")) From b836be613a576f474758fd70043adeee4c5bf6d6 Mon Sep 17 00:00:00 2001 From: Christopher Dambakk Date: Tue, 27 Oct 2020 18:33:19 +0100 Subject: [PATCH 7/8] Fix failing portuguese test --- .../jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt b/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt index 86f694e..6925918 100644 --- a/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt +++ b/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt @@ -121,19 +121,21 @@ class KlockLocaleTestJvm { @Test fun assertPortugueseLocalization() { - val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("pt")) + // Java DateTime formats wrong in java 8. Hardcoding expected value instead. + // val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("pt")) + val expectedOutput = "quarta-feira, 18 janeiro 1995 21:36:45" val klockOutput = KlockLocale.setTemporarily(KlockLocale.portuguese) { DateFormat(outputPattern).format(klockDate) } - assertEquals(javaOutput, klockOutput) + assertEquals(expectedOutput, klockOutput) } @Test fun assertRussianLocalization() { // Java DateTime formats wrong in java 8. Hardcoding expected value instead. -// val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("ru")) + // val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("ru")) val expectedOutput = "среда, 18 января 1995 21:36:45" val klockOutput = KlockLocale.setTemporarily(KlockLocale.russian) { From 6cd26f304a03add96cf5a5ad9d70ecd65818732c Mon Sep 17 00:00:00 2001 From: Christopher Dambakk Date: Tue, 27 Oct 2020 21:06:25 +0100 Subject: [PATCH 8/8] Refactor after code review --- .../com/soywiz/klock/KlockLocaleTestJvm.kt | 147 +++++++----------- 1 file changed, 60 insertions(+), 87 deletions(-) diff --git a/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt b/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt index 6925918..ff5ddd0 100644 --- a/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt +++ b/klock/src/jvmTest/kotlin/com/soywiz/klock/KlockLocaleTestJvm.kt @@ -1,7 +1,6 @@ package com.soywiz.klock import com.soywiz.klock.locale.* -import org.junit.Ignore import org.junit.Test import java.time.LocalDateTime import java.time.ZoneOffset @@ -30,152 +29,126 @@ class KlockLocaleTestJvm { 45 // second ) - @Test fun assertDatesAreTheSame() { - val klockLong = klockDate.unixMillisLong val javaLong = javaDate.toInstant(ZoneOffset.UTC).toEpochMilli() + val klockLong = klockDate.unixMillisLong assertEquals(javaLong, klockLong) } - private fun LocalDateTime.format(pattern: String, locale: Locale) = this.format( - DateTimeFormatter.ofPattern(pattern, locale) - ) - @Test fun assertEnglishLocalization() { - val javaOutput = javaDate.format(outputPattern, Locale.ENGLISH) - - val klockOutput = KlockLocale.setTemporarily(KlockLocale.english) { - DateFormat(outputPattern).format(klockDate) - } - - assertEquals(javaOutput, klockOutput) + assertEquals( + expected = Locale.ENGLISH.getFormattedJavaTestDate(), + actual = KlockLocale.english.getFormattedKlockTestDate() + ) } @Test fun assertNorwegianLocalization() { - val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("no-nb")) - - val klockOutput = KlockLocale.setTemporarily(KlockLocale.norwegian) { - DateFormat(outputPattern).format(klockDate) - } - - assertEquals(javaOutput, klockOutput) + assertEquals( + expected = Locale.forLanguageTag("no-nb").getFormattedJavaTestDate(), + actual = KlockLocale.norwegian.getFormattedKlockTestDate() + ) } @Test fun assertSpanishLocalization() { - val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("es")) - - val klockOutput = KlockLocale.setTemporarily(KlockLocale.spanish) { - DateFormat(outputPattern).format(klockDate) - } - - assertEquals(javaOutput, klockOutput) + assertEquals( + expected = Locale.forLanguageTag("es").getFormattedJavaTestDate(), + actual = KlockLocale.spanish.getFormattedKlockTestDate() + ) } @Test fun assertFrenchLocalization() { - val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("fr")) - - val klockOutput = KlockLocale.setTemporarily(KlockLocale.french) { - DateFormat(outputPattern).format(klockDate) - } - - assertEquals(javaOutput, klockOutput) + assertEquals( + expected = Locale.forLanguageTag("fr").getFormattedJavaTestDate(), + actual = KlockLocale.french.getFormattedKlockTestDate() + ) } @Test fun assertGermanLocalization() { - val javaOutput = javaDate.format(outputPattern, Locale.GERMAN) - - val klockOutput = KlockLocale.setTemporarily(KlockLocale.german) { - DateFormat(outputPattern).format(klockDate) - } - - assertEquals(javaOutput, klockOutput) + assertEquals( + expected = Locale.GERMAN.getFormattedJavaTestDate(), + actual = KlockLocale.german.getFormattedKlockTestDate() + ) } @Test fun assertJapaneseLocalization() { - val javaOutput = javaDate.format(outputPattern, Locale.JAPAN) - - val klockOutput = KlockLocale.setTemporarily(KlockLocale.japanese) { - DateFormat(outputPattern).format(klockDate) - } - - assertEquals(javaOutput, klockOutput) + assertEquals( + expected = Locale.JAPAN.getFormattedJavaTestDate(), + actual = KlockLocale.japanese.getFormattedKlockTestDate() + ) } @Test fun assertDutchLocalization() { - val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("nl")) - - val klockOutput = KlockLocale.setTemporarily(KlockLocale.dutch) { - DateFormat(outputPattern).format(klockDate) - } - - assertEquals(javaOutput, klockOutput) + assertEquals( + expected = Locale.forLanguageTag("nl").getFormattedJavaTestDate(), + actual = KlockLocale.dutch.getFormattedKlockTestDate() + ) } @Test fun assertPortugueseLocalization() { // Java DateTime formats wrong in java 8. Hardcoding expected value instead. - // val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("pt")) + // val javaOutput = Locale.forLanguageTag("pt").getFormattedJavaTestDate() val expectedOutput = "quarta-feira, 18 janeiro 1995 21:36:45" - val klockOutput = KlockLocale.setTemporarily(KlockLocale.portuguese) { - DateFormat(outputPattern).format(klockDate) - } - - assertEquals(expectedOutput, klockOutput) + assertEquals( + expected = expectedOutput, + actual = KlockLocale.portuguese.getFormattedKlockTestDate() + ) } @Test fun assertRussianLocalization() { // Java DateTime formats wrong in java 8. Hardcoding expected value instead. - // val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("ru")) + // val javaOutput = Locale.forLanguageTag("ru").getFormattedJavaTestDate() val expectedOutput = "среда, 18 января 1995 21:36:45" - val klockOutput = KlockLocale.setTemporarily(KlockLocale.russian) { - DateFormat(outputPattern).format(klockDate) - } - - assertEquals(expectedOutput, klockOutput) + assertEquals( + expected = expectedOutput, + actual = KlockLocale.russian.getFormattedKlockTestDate() + ) } @Test fun assertKoreanLocalization() { - val javaOutput = javaDate.format(outputPattern, Locale.KOREA) - - val klockOutput = KlockLocale.setTemporarily(KlockLocale.korean) { - DateFormat(outputPattern).format(klockDate) - } - - assertEquals(javaOutput, klockOutput) + assertEquals( + expected = Locale.KOREA.getFormattedJavaTestDate(), + actual = KlockLocale.korean.getFormattedKlockTestDate() + ) } @Test fun assertChineseLocalization() { - val javaOutput = javaDate.format(outputPattern, Locale.CHINA) - - val klockOutput = KlockLocale.setTemporarily(KlockLocale.chinese) { - DateFormat(outputPattern).format(klockDate) - } - - assertEquals(javaOutput, klockOutput) + assertEquals( + expected = Locale.CHINA.getFormattedJavaTestDate(), + actual = KlockLocale.chinese.getFormattedKlockTestDate() + ) } @Test fun assertUkrainianLocalization() { - val javaOutput = javaDate.format(outputPattern, Locale.forLanguageTag("uk")) + assertEquals( + expected = Locale.forLanguageTag("uk").getFormattedJavaTestDate(), + actual = KlockLocale.ukrainian.getFormattedKlockTestDate() + ) + } + + private fun Locale.getFormattedJavaTestDate(): String { + return javaDate.format( + DateTimeFormatter.ofPattern(outputPattern, this) + ) + } - val klockOutput = KlockLocale.setTemporarily(KlockLocale.ukrainian) { + private fun KlockLocale.getFormattedKlockTestDate(): String { + return KlockLocale.setTemporarily(this) { DateFormat(outputPattern).format(klockDate) } - - assertEquals(javaOutput, klockOutput) } - }