Skip to content

Commit

Permalink
feat(core): add extension for global sematic provider usage
Browse files Browse the repository at this point in the history
  • Loading branch information
Vacxe committed Jun 18, 2024
1 parent bff2ea9 commit 7d0eddb
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package io.github.kakaocup.compose.exception

class KakaoComposeException(message: String) : Exception(message)
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import io.github.kakaocup.compose.node.assertion.TextResourcesNodeAssertions
import io.github.kakaocup.compose.node.builder.NodeMatcher
import io.github.kakaocup.compose.node.builder.NodeProvider
import io.github.kakaocup.compose.node.builder.ViewBuilder
import io.github.kakaocup.compose.utilities.checkNotNull
import io.github.kakaocup.compose.utilities.orGlobal

@ComposeMarker
abstract class BaseNode<out T : BaseNode<T>> constructor(
Expand Down Expand Up @@ -46,15 +48,14 @@ abstract class BaseNode<out T : BaseNode<T>> constructor(
)

override val delegate: ComposeDelegate by lazy(LazyThreadSafetyMode.NONE) {
val semanticsProvider = requireNotNull(semanticsProvider ?: KakaoCompose.Global.semanticsProvider) { "SemanticsProvider not is null: Provide via constructor or use KakaoComposeTestRule" }
ComposeDelegate(
nodeProvider = NodeProvider(
nodeMatcher = NodeMatcher(
matcher = combineSemanticMatchers(),
position = nodeMatcher.position,
useUnmergedTree = nodeMatcher.useUnmergedTree
),
semanticsProvider = semanticsProvider
semanticsProvider = semanticsProvider.orGlobal().checkNotNull()
),
parentDelegate = parentNode?.delegate
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import io.github.kakaocup.compose.node.core.ComposeMarker
import io.github.kakaocup.compose.node.core.BaseNode
import io.github.kakaocup.compose.node.builder.NodeMatcher
import io.github.kakaocup.compose.node.builder.ViewBuilder
import io.github.kakaocup.compose.utilities.checkNotNull
import io.github.kakaocup.compose.utilities.orGlobal

@Suppress("UNCHECKED_CAST")
@ComposeMarker
Expand Down Expand Up @@ -34,9 +36,7 @@ open class ComposeScreen<out T : ComposeScreen<T>> : BaseNode<T> {
) : super(semanticsProvider, nodeMatcher)

fun onNode(viewBuilderAction: ViewBuilder.() -> Unit) = KNode(
requireNotNull(
semanticsProvider ?: KakaoCompose.Global.semanticsProvider
) { "SemanticsProvider not is null: Provide via constructor or use KakaoComposeTestRule" },
semanticsProvider.orGlobal().checkNotNull(),
viewBuilderAction,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@ import androidx.compose.ui.test.filter
import androidx.compose.ui.test.filterToOne
import androidx.compose.ui.test.onChildren
import io.github.kakaocup.compose.KakaoCompose
import io.github.kakaocup.compose.exception.KakaoComposeException
import io.github.kakaocup.compose.node.assertion.LazyListNodeAssertions
import io.github.kakaocup.compose.node.builder.NodeMatcher
import io.github.kakaocup.compose.node.builder.ViewBuilder
import io.github.kakaocup.compose.node.core.BaseNode
import io.github.kakaocup.compose.utilities.checkNotNull
import io.github.kakaocup.compose.utilities.orGlobal

/**
* Node class with special api to test Lazy List (LazyColumn or LazyRow)
Expand Down Expand Up @@ -68,10 +71,9 @@ class KLazyListNode(
}.provideItem

performScrollToIndex(position)

val semanticsProvider = requireNotNull(semanticsProvider ?: KakaoCompose.Global.semanticsProvider) { "SemanticsProvider not is null: Provide via constructor or use KakaoComposeTestRule" }

val semanticsNode = semanticsProvider
.orGlobal()
.checkNotNull()
.onNode(semanticsMatcher)
.onChildren()
.filterToOne(positionMatcher(position))
Expand All @@ -80,6 +82,8 @@ class KLazyListNode(
function(provideItem(
semanticsNode,
semanticsProvider
.orGlobal()
.checkNotNull()
) as T)
}

Expand All @@ -100,9 +104,9 @@ class KLazyListNode(

performScrollToNode(nodeMatcher.matcher)

val semanticsProvider = requireNotNull(semanticsProvider ?: KakaoCompose.Global.semanticsProvider) { "SemanticsProvider not is null: Provide via constructor or use KakaoComposeTestRule" }

val semanticsNode = semanticsProvider
.orGlobal()
.checkNotNull()
.onNode(semanticsMatcher)
.onChildren()
.filter(nodeMatcher.matcher)[nodeMatcher.position]
Expand All @@ -111,6 +115,8 @@ class KLazyListNode(
return provideItem(
semanticsNode,
semanticsProvider
.orGlobal()
.checkNotNull()
) as T
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package io.github.kakaocup.compose.rule

import androidx.compose.ui.test.SemanticsMatcher
import androidx.compose.ui.test.SemanticsNodeInteraction
import androidx.compose.ui.test.SemanticsNodeInteractionCollection
import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import io.github.kakaocup.compose.KakaoCompose
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement

class KakaoComposeTestRule(
val semanticsProvider: SemanticsNodeInteractionsProvider?,
val semanticsProvider: SemanticsNodeInteractionsProvider,
) : TestRule {
override fun apply(base: Statement, description: Description): Statement =
object : Statement() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.github.kakaocup.compose.utilities

import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import io.github.kakaocup.compose.KakaoCompose
import io.github.kakaocup.compose.exception.KakaoComposeException

fun SemanticsNodeInteractionsProvider?.orGlobal(): SemanticsNodeInteractionsProvider? =
this ?: KakaoCompose.Global.semanticsProvider

fun SemanticsNodeInteractionsProvider?.checkNotNull(): SemanticsNodeInteractionsProvider =
this ?: throw KakaoComposeException("SemanticsProvider is null: Provide via constructor or use KakaoComposeTestRule")

0 comments on commit 7d0eddb

Please sign in to comment.