@@ -8,6 +8,7 @@ import android.content.SharedPreferences
88import io.mockk.every
99import io.mockk.mockk
1010import io.mockk.verify
11+ import java.io.File
1112import kotlin.test.BeforeTest
1213import kotlin.test.Test
1314import kotlin.test.assertEquals
@@ -98,4 +99,137 @@ class ConjugateViewModelTest {
9899 assertEquals(ConjugateSearchResult (" essere" , " IT" ), list[0 ])
99100 assertEquals(ConjugateSearchResult (" parler" , " FR" ), list[1 ])
100101 }
102+
103+ @Test
104+ fun getDownloadedLanguages_AllDatabasesExist_ReturnsAllEightAliasesInExpectedOrder () {
105+ // Arrange
106+ val expectedAliases = listOf (" EN" , " FR" , " DE" , " IT" , " PT" , " RU" , " ES" , " SV" )
107+ every { application.getDatabasePath(any()) } answers {
108+ val file = mockk<File >()
109+ every { file.exists() } returns true
110+ file
111+ }
112+ val viewModel = ConjugateViewModel (application)
113+
114+ // Act
115+ val actualLanguages = viewModel.getDownloadedLanguages()
116+
117+ // Assert
118+ assertEquals(expectedAliases, actualLanguages)
119+ assertEquals(8 , actualLanguages.size)
120+ }
121+
122+ @Test
123+ fun getDownloadedLanguages_PartialDatabasesExist_ReturnsMatchingAliases () {
124+ // Arrange
125+ every { application.getDatabasePath(any()) } answers {
126+ val dbName = firstArg<String >()
127+ val file = mockk<File >()
128+ every { file.exists() } returns (dbName == " ENConjugateData.sqlite" || dbName == " ESConjugateData.sqlite" )
129+ file
130+ }
131+ val viewModel = ConjugateViewModel (application)
132+
133+ // Act
134+ val actualLanguages = viewModel.getDownloadedLanguages()
135+
136+ // Assert
137+ assertEquals(listOf (" EN" , " ES" ), actualLanguages)
138+ }
139+
140+ @Test
141+ fun getDownloadedLanguages_NoDatabasesExist_ReturnsEmptyList () {
142+ // Arrange
143+ every { application.getDatabasePath(any()) } answers {
144+ val file = mockk<File >()
145+ every { file.exists() } returns false
146+ file
147+ }
148+ val viewModel = ConjugateViewModel (application)
149+
150+ // Act
151+ val actualLanguages = viewModel.getDownloadedLanguages()
152+
153+ // Assert
154+ assertTrue(actualLanguages.isEmpty())
155+ }
156+
157+ @Test
158+ fun getDownloadedLanguages_UnrecognizedDatabasesPresent_OnlyReturnsSupportedAliases () {
159+ // Arrange
160+ every { application.getDatabasePath(any()) } answers {
161+ val dbName = firstArg<String >()
162+ val file = mockk<File >()
163+ every { file.exists() } returns (
164+ dbName == " ENConjugateData.sqlite" ||
165+ dbName == " XYZConjugateData.sqlite" ||
166+ dbName == " UNKNOWNConjugateData.sqlite"
167+ )
168+ file
169+ }
170+ val viewModel = ConjugateViewModel (application)
171+
172+ // Act
173+ val actualLanguages = viewModel.getDownloadedLanguages()
174+
175+ // Assert
176+ assertEquals(listOf (" EN" ), actualLanguages)
177+ }
178+
179+ @Test
180+ fun getDownloadedLanguagesFormatted_FormatsCorrectlyForVariousCounts () {
181+ // Arrange
182+ val viewModel = ConjugateViewModel (application)
183+
184+ // 0 languages
185+ every { application.getDatabasePath(any()) } answers {
186+ val file = mockk<File >()
187+ every { file.exists() } returns false
188+ file
189+ }
190+ assertEquals(" " , viewModel.getDownloadedLanguagesFormatted())
191+
192+ // 1 language
193+ every { application.getDatabasePath(any()) } answers {
194+ val dbName = firstArg<String >()
195+ val file = mockk<File >()
196+ every { file.exists() } returns (dbName == " ENConjugateData.sqlite" )
197+ file
198+ }
199+ assertEquals(" English" , viewModel.getDownloadedLanguagesFormatted())
200+
201+ // 2 languages
202+ every { application.getDatabasePath(any()) } answers {
203+ val dbName = firstArg<String >()
204+ val file = mockk<File >()
205+ every { file.exists() } returns (dbName == " ENConjugateData.sqlite" || dbName == " FRConjugateData.sqlite" )
206+ file
207+ }
208+ assertEquals(" English and Français" , viewModel.getDownloadedLanguagesFormatted())
209+
210+ // 3 languages
211+ every { application.getDatabasePath(any()) } answers {
212+ val dbName = firstArg<String >()
213+ val file = mockk<File >()
214+ every { file.exists() } returns (
215+ dbName == " ENConjugateData.sqlite" ||
216+ dbName == " FRConjugateData.sqlite" ||
217+ dbName == " DEConjugateData.sqlite"
218+ )
219+ file
220+ }
221+ assertEquals(" English, Français and Deutsch" , viewModel.getDownloadedLanguagesFormatted())
222+ }
223+
224+ @Test
225+ fun testLoadRecentlyConjugatedWithUnrecognizedLanguageAlias () {
226+ every { sharedPreferences.getString(" recently_conjugated_list" , null ) } returns " parler,XYZ;mangiare,INVALID_ALIAS;speak,EN"
227+
228+ val testViewModel = ConjugateViewModel (application)
229+ val list = testViewModel.recentlyConjugated.value
230+ assertEquals(3 , list.size)
231+ assertEquals(ConjugateSearchResult (" parler" , " XYZ" ), list[0 ])
232+ assertEquals(ConjugateSearchResult (" mangiare" , " INVALID_ALIAS" ), list[1 ])
233+ assertEquals(ConjugateSearchResult (" speak" , " EN" ), list[2 ])
234+ }
101235}
0 commit comments