diff --git a/app/src/test/kotlin/com/bitchat/android/service/PeerAvailabilityPluralTest.kt b/app/src/test/kotlin/com/bitchat/android/service/PeerAvailabilityPluralTest.kt new file mode 100644 index 00000000..2605fb42 --- /dev/null +++ b/app/src/test/kotlin/com/bitchat/android/service/PeerAvailabilityPluralTest.kt @@ -0,0 +1,39 @@ +package com.bitchat.android.service + +import android.icu.text.PluralRules +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import java.io.File +import java.util.Locale + +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [28], manifest = Config.NONE) +class PeerAvailabilityPluralTest { + @Test + fun `plural categories preserve the actual peer count`() { + // The JVM suite does not package app resources. Read the shipped catalog, + // then select its bucket using Android's ICU rules rather than guessing + // that the category named "one" can only describe the number 1. + for (qualifier in listOf("fil", "ru", "uk", "fr", "pt-rBR", "bn", "fa", "hi")) { + val locale = Locale.forLanguageTag(qualifier.replace("-r", "-")) + val strings = File("src/main/res/values-$qualifier/strings.xml").readText() + val body = Regex( + """(.*?)""", + RegexOption.DOT_MATCHES_ALL + ).find(strings)!!.groupValues[1] + val items = Regex("""(.*?)""") + .findAll(body).associate { it.groupValues[1] to it.groupValues[2] } + val rules = PluralRules.forLocale(locale) + for (count in listOf(0, 1, 2, 3, 5, 21, 31, 101)) { + val category = rules.select(count.toDouble()) + val template = items[category] ?: items.getValue("other") + val message = String.format(locale, template, count) + val expected = String.format(locale, "%d", count) + assertTrue("$qualifier count $count rendered as $message", message.contains(expected)) + } + } + } +}