1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.avatarpicker.tests.unit.domain
17 
18 import android.content.res.Resources
19 import androidx.test.platform.app.InstrumentationRegistry
20 import com.android.avatarpicker.data.ColoredIconsRepository
21 import com.android.avatarpicker.data.IllustrationsRepository
22 import com.android.avatarpicker.data.MediaRepository
23 import com.android.avatarpicker.domain.GroupedSelectableItemsUseCase
24 import com.android.avatarpicker.domain.GroupedSelectableItemsUseCaseImpl
25 import com.android.avatarpicker.tests.R
26 import com.android.avatarpicker.ui.details.items.SelectableType
27 import com.google.common.truth.Truth
28 import kotlinx.coroutines.ExperimentalCoroutinesApi
29 import kotlinx.coroutines.launch
30 import kotlinx.coroutines.test.StandardTestDispatcher
31 import kotlinx.coroutines.test.advanceUntilIdle
32 import kotlinx.coroutines.test.runTest
33 import org.junit.Assert.*
34 import org.junit.Before
35 import org.junit.Test
36 
37 class GroupedSelectableItemsUseCaseImplTest {
38     private lateinit var resources: Resources
39     private lateinit var illustrationsRepository: IllustrationsRepository
40     private lateinit var coloredIconsRepository: ColoredIconsRepository
41     private lateinit var mediaRepository: MediaRepository
42     private lateinit var useCase: GroupedSelectableItemsUseCase
43 
44     @Before
setupnull45     fun setup() {
46         resources =
47             InstrumentationRegistry.getInstrumentation().getContext().getResources()
48         illustrationsRepository = IllustrationsRepository(resources)
49         coloredIconsRepository = ColoredIconsRepository(resources)
50         mediaRepository = MediaRepository()
51     }
52 
53     @OptIn(ExperimentalCoroutinesApi::class)
54     @Test
<lambda>null55     fun testUseCaseDefaultIcons() = runTest {
56         illustrationsRepository.imagesDescriptionsResId = R.array.avatar_image_descriptions_empty
57         illustrationsRepository.imagesResId = R.array.avatar_images_empty
58         var items = mutableListOf<List<SelectableType>>()
59         useCase =
60             GroupedSelectableItemsUseCaseImpl(mediaRepository,
61                 coloredIconsRepository,
62                 illustrationsRepository,
63                 StandardTestDispatcher(this.testScheduler))
64         launch { items.addAll(useCase()) }
65         advanceUntilIdle()
66         Truth.assertThat(items.size).isEqualTo(1)
67         Truth.assertThat(items[0].size).isEqualTo(10)
68     }
69 
70     @OptIn(ExperimentalCoroutinesApi::class)
71     @Test
<lambda>null72     fun testUseCaseIllustrations() = runTest {
73         illustrationsRepository.imagesDescriptionsResId = R.array.avatar_image_descriptions_png
74         illustrationsRepository.imagesResId = R.array.avatar_images_png
75         var items = mutableListOf<List<SelectableType>>()
76         useCase =
77             GroupedSelectableItemsUseCaseImpl(mediaRepository,
78                 coloredIconsRepository,
79                 illustrationsRepository,
80                 StandardTestDispatcher(this.testScheduler))
81         launch { items.addAll(useCase()) }
82         advanceUntilIdle()
83         Truth.assertThat(items.size).isEqualTo(2)
84         Truth.assertThat(items[0].size).isEqualTo(2)
85         Truth.assertThat(items[1].size).isEqualTo(3)
86     }
87 }