Skip to content

Commit

Permalink
Merge pull request #64 from tarkalabs/younes/TUIChip
Browse files Browse the repository at this point in the history
✍ Adding TUI Chip Component + Screenshot Tests
  • Loading branch information
rajajawahar authored Jul 11, 2023
2 parents 38d8b81 + 12fcce4 commit d735f81
Show file tree
Hide file tree
Showing 7 changed files with 525 additions and 4 deletions.
65 changes: 65 additions & 0 deletions .idea/androidTestResultsUserPreferences.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class UIComponentListActivity : ComponentActivity() {
TUICheckBoxRow(
checked = status.value,
enabled = true,
icon = TarkaIcons.CheckMark,
icon = TarkaIcons.CheckMark20Filled,
title = "TUICheckBoxRow",
style = TitleWithDescription("Description")
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package com.tarkalabs.uicomponents

import android.graphics.BitmapFactory
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.test.platform.app.InstrumentationRegistry
import com.tarkalabs.uicomponents.components.ChipLeadingContent
import com.tarkalabs.uicomponents.components.ChipType
import com.tarkalabs.uicomponents.components.TUIChip
import com.tarkalabs.uicomponents.components.TUIChipTags
import com.tarkalabs.uicomponents.models.TarkaIcons
import com.tarkalabs.uicomponents.theme.TUITheme
import org.junit.Rule
import org.junit.Test
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify

class TUIChipTest {

@get:Rule
val composable = createComposeRule()
val chipTags = TUIChipTags()

val context = InstrumentationRegistry.getInstrumentation().context
val assetManager = context.assets

@Test
fun display_assist_chip_avatar() {
val onClick: () -> Unit = mock()
val bitmap = BitmapFactory.decodeStream(assetManager.open("avatarTest.webp"))
composable.setContent {
TUIChip(
type = ChipType.Assist(ChipLeadingContent.Image(bitmap.asImageBitmap())),
label = "Assist chip",
onClick = onClick,
tags = chipTags.copy(parentTag = "Assist")
)
}

composable.onNodeWithTag("Assist").assertIsDisplayed()
composable.onNodeWithText("Assist chip").assertIsDisplayed()
composable.onNodeWithTag(Tags.TAG_AVATAR, useUnmergedTree = true).assertIsDisplayed()
composable.onNodeWithText("Assist chip").performClick()
verify(onClick).invoke()
}

@Test
fun display_assist_chip_icon() {
composable.setContent {
TUIChip(type = ChipType.Assist(ChipLeadingContent.Icon(TarkaIcons.Calendar24Regular)),
label = "Assist chip",
onClick = {})
}

composable.onNodeWithContentDescription(
TarkaIcons.Calendar24Regular.contentDescription, useUnmergedTree = true
).assertIsDisplayed()
}

@Test
fun display_input_chip() {
val onClick: () -> Unit = mock()
composable.setContent {
TUIChip(
type = ChipType.Input(null, true, TUITheme.colors.surface),
label = "Input chip",
onClick = onClick,
tags = chipTags.copy(parentTag = "Input"),
)
}

composable.onNodeWithTag("Input").assertIsDisplayed()
composable.onNodeWithText("Input chip").assertIsDisplayed()
composable.onNodeWithText("Input chip").performClick()
verify(onClick).invoke()
}

@Test
fun display_input_avatar() {
val bitmap = BitmapFactory.decodeStream(assetManager.open("avatarTest.webp"))
composable.setContent {
TUIChip(
type = ChipType.Input(content = ChipLeadingContent.Image(bitmap.asImageBitmap()), showTrailingDismiss = true, containerColor = TUITheme.colors.surface),
label = "Input chip",
onClick = { },
)
}

composable.onNodeWithTag(Tags.TAG_AVATAR, useUnmergedTree = true).assertIsDisplayed()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package com.tarkalabs.uicomponents.screenshots

import android.graphics.BitmapFactory
import androidx.compose.ui.graphics.asImageBitmap
import androidx.test.platform.app.InstrumentationRegistry
import com.tarkalabs.uicomponents.components.ChipLeadingContent
import com.tarkalabs.uicomponents.components.ChipSize
import com.tarkalabs.uicomponents.components.ChipType
import com.tarkalabs.uicomponents.components.TUIChip
import com.tarkalabs.uicomponents.models.TarkaIcons
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized

@RunWith(Parameterized::class)
class TUIChipScreenshotTest(
private val size: ChipSize,
private val type: ChipType,
private val darkTheme: Boolean,
private val testName: String
) : ComposeScreenshotComparator() {

companion object {
@JvmStatic
@Parameterized.Parameters
fun data(): Collection<Array<Any?>> {
val context = InstrumentationRegistry.getInstrumentation().context
val assetManager = context.assets
val bitmap = BitmapFactory.decodeStream(assetManager.open("avatarTest.webp"))
val leadingContent = listOf(
null,
ChipLeadingContent.Image(bitmap.asImageBitmap()),
ChipLeadingContent.Icon(TarkaIcons.CheckMark16Filled)
)

val types =
leadingContent.map { ChipType.Assist(it) } + filterChipTypes() + leadingContent.map {
ChipType.Input(
it, false
)
} + leadingContent.map { ChipType.Input(it, true) } + listOf(
ChipType.Suggestion(null),
ChipType.Suggestion(TarkaIcons.Calendar24Regular),
)

val chipSizes = ChipSize.values()
val darkThemeValues = listOf(true, false)
val testData = ArrayList<Array<Any?>>()
for (type in types) {
for (chipSize in chipSizes) {
for (darkTheme in darkThemeValues) {
val testName = when (type) {
is ChipType.Assist -> "ChipSize_${chipSize}_chipType_${type.javaClass.simpleName}_chipType_${type.content?.javaClass?.simpleName.toString()}_darkTheme_${darkTheme}"
is ChipType.Filter -> "ChipSize_${chipSize}_chipType_${type.javaClass.simpleName}_chipType_${type.showLeadingCheck}_chipType_${type.showTrailingCaret}_chipType_${type.showTrailingDismiss}_chipType_${type.selected}_darkTheme_${darkTheme}"
is ChipType.Input -> "ChipSize_${chipSize}_chipType_${type.javaClass.simpleName}_chipType_${type.showTrailingDismiss}_chipType_${type.content?.javaClass?.simpleName}_darkTheme_${darkTheme}"
is ChipType.Suggestion -> "ChipSize_${chipSize}_chipType_${type.javaClass.simpleName}_chipType_${type.image.toString()}_darkTheme_${darkTheme}"
}
testData.add(
arrayOf(
chipSize, type, darkTheme, testName,
)
)
}
}
}
return testData
}
}

@Test
fun test_tui_chip() {
compareScreenshotFor(darkTheme, testName) {
TUIChip(
type = type,
label = type.javaClass.simpleName,
chipSize = size,
onClick = { },
)
}
}
}

private fun filterChipTypes(): List<ChipType> {
val filterVariations = mutableListOf<ChipType>()
val booleans = listOf(true, false)
booleans.forEach { selected ->
booleans.forEach { showLeadingCheck ->
booleans.forEach { showTrailingDismiss ->
booleans.forEach { showTrailingCaret ->
filterVariations.add(
ChipType.Filter(
selected = selected,
showLeadingCheck = showLeadingCheck,
showTrailingDismiss = showTrailingDismiss,
showTrailingCaret = showTrailingCaret,
badgeCount = null
)
)
}
}
}
}
return filterVariations
}
2 changes: 1 addition & 1 deletion tarkaui/src/main/java/com/tarkalabs/uicomponents/Tags.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,5 @@ object Tags {
const val TAG_CHECK_BOX = "check_box"
const val TAG_CHECK_BOX_ROW = "check_box_row"
const val TAG_SEARCH_BAR = "search_bar"

const val TAG_CHIP_TAG = "tui_chip"
}
Loading

0 comments on commit d735f81

Please sign in to comment.