Skip to content

Commit da4b2dc

Browse files
authored
Merge pull request #186 from zsoltk/routing-source
Add Routing source
2 parents e780d33 + 9ada51b commit da4b2dc

File tree

171 files changed

+3131
-2192
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

171 files changed

+3131
-2192
lines changed

android/app-example/src/main/res/layout/activity_root.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@
1515
app:layout_constraintRight_toRightOf="parent"
1616
app:layout_constraintTop_toTopOf="parent" />
1717

18-
</androidx.constraintlayout.widget.ConstraintLayout>
18+
</androidx.constraintlayout.widget.ConstraintLayout>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:id="@+id/debug_switcher"
4+
android:layout_width="match_parent"
5+
android:layout_height="match_parent"
6+
android:padding="24dp"
7+
android:orientation="horizontal"
8+
android:layout_gravity="center"
9+
android:gravity="center">
10+
11+
<Button
12+
android:id="@+id/workflow_1"
13+
android:layout_width="wrap_content"
14+
android:layout_height="wrap_content"
15+
android:text="Workflow 1" />
16+
17+
<Button
18+
android:id="@+id/workflow_2"
19+
android:layout_width="wrap_content"
20+
android:layout_height="wrap_content"
21+
android:text="Workflow 2"/>
22+
23+
</LinearLayout>

android/libraries/rib-base-test/src/main/java/com/badoo/common/ribs/InteractorTestHelper.kt

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import com.badoo.ribs.core.Interactor
77
import com.badoo.ribs.core.Node
88
import com.badoo.ribs.core.Router
99
import com.badoo.ribs.core.builder.BuildParams
10+
import com.badoo.ribs.core.routing.RoutingSource
1011
import com.badoo.ribs.core.routing.action.RoutingAction
12+
import com.badoo.ribs.core.routing.history.Routing
1113
import com.badoo.ribs.core.view.RibView
1214
import com.jakewharton.rxrelay2.Relay
1315
import io.reactivex.ObservableSource
@@ -21,17 +23,14 @@ private val buildParams = BuildParams.Empty()
2123

2224
class InteractorTestHelper<View : RibView>(
2325
val interactor: Interactor<*, View>,
24-
val viewFactory: ((ViewGroup) -> View?)? = null,
25-
router: Router<*, *, *, *, View>? = null
26+
val viewFactory: ((ViewGroup) -> View?)? = null
2627
) {
2728

28-
val router: Router<*, *, *, *, View> = router ?: TestRouter.createTestRouter()
29-
3029
var nodeCreator: () -> Node<View> = {
3130
Node(
3231
buildParams = buildParams,
3332
viewFactory = viewFactory,
34-
plugins = listOf(this.router, interactor)
33+
plugins = listOf(interactor)
3534
)
3635
}
3736

@@ -73,11 +72,10 @@ class InteractorTestHelper<View : RibView>(
7372
companion object {
7473
inline fun <reified View, ViewEvent> create(
7574
interactor: Interactor<*, View>,
76-
viewEventRelay: Relay<ViewEvent>,
77-
router: Router<*, *, *, *, View>? = null
75+
viewEventRelay: Relay<ViewEvent>
7876
): InteractorTestHelper<View> where View : RibView, View : ObservableSource<ViewEvent> {
7977
val view: View = viewEventRelay.subscribedView()
80-
return InteractorTestHelper(interactor, { view }, router)
78+
return InteractorTestHelper(interactor, { view })
8179
}
8280
}
8381
}
@@ -91,22 +89,20 @@ inline fun <reified RView, ViewEvent> Relay<ViewEvent>.subscribedView(): RView w
9189
}
9290
}
9391

94-
private class TestRouter<C : Parcelable, Permanent : C, Content : C, Overlay : C, V : RibView>(
95-
initialConfig: Content
96-
) : Router<C, Permanent, Content, Overlay, V>(
92+
private class TestRouter<C : Parcelable> : Router<C>(
9793
buildParams = buildParams,
98-
transitionHandler = null,
99-
initialConfiguration = initialConfig
94+
routingSource = RoutingSource.Permanent<C>(emptySet()),
95+
transitionHandler = null
10096
) {
10197

10298
var resolveConfiguration: (C) -> RoutingAction = { RoutingAction.noop() }
10399

104-
override fun resolveConfiguration(configuration: C): RoutingAction =
105-
resolveConfiguration.invoke(configuration)
100+
override fun resolve(routing: Routing<C>): RoutingAction =
101+
resolveConfiguration.invoke(routing.configuration)
106102

107103
companion object {
108-
fun <V : RibView> createTestRouter() =
109-
TestRouter<TestConfiguration, TestConfiguration, TestConfiguration, TestConfiguration, V>(TestConfiguration)
104+
fun createTestRouter() =
105+
TestRouter<TestConfiguration>()
110106
}
111107
}
112108

android/libraries/rib-base/src/androidTest/java/com/badoo/ribs/android/lifecycle/BaseNodesTest.kt

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@ import androidx.test.espresso.Espresso
44
import com.badoo.common.ribs.RibsRule
55
import com.badoo.ribs.android.lifecycle.helper.ExpectedState
66
import com.badoo.ribs.android.lifecycle.helper.NodeState
7+
import com.badoo.ribs.core.Rib
8+
import com.badoo.ribs.core.builder.BuildContext
9+
import com.badoo.ribs.core.builder.BuildParams
10+
import com.badoo.ribs.core.routing.configuration.feature.BackStackFeature
711
import com.badoo.ribs.core.routing.configuration.feature.operation.push
812
import com.badoo.ribs.core.routing.configuration.feature.operation.pushOverlay
913
import com.badoo.ribs.test.util.ribs.TestNode
1014
import com.badoo.ribs.test.util.ribs.root.TestRoot
1115
import com.badoo.ribs.test.util.ribs.root.TestRootRouter
1216
import org.assertj.core.api.Java6Assertions.assertThat
1317
import org.junit.Rule
18+
import java.util.UUID
1419

1520
abstract class BaseNodesTest {
1621

@@ -24,22 +29,47 @@ abstract class BaseNodesTest {
2429
val pushConfiguration2: TestRootRouter.Configuration? = null
2530
)
2631

27-
protected fun test(setup: When, expectedState: ExpectedState, testBlock: (TestRootRouter, TestNode<*>) -> Unit) {
32+
@SuppressWarnings("LongMethod")
33+
protected fun test(
34+
setup: When,
35+
expectedState: ExpectedState,
36+
testBlock: (BackStackFeature<TestRootRouter.Configuration>, TestNode<*>) -> Unit
37+
) {
2838
val rootProvider = TestRoot.Provider(
2939
initialConfiguration = setup.initialConfiguration,
3040
permanentParts = setup.permanentParts
3141
)
3242

33-
ribsRule.start { activity, savedInstanceState -> rootProvider.create(activity.dialogLauncher(), savedInstanceState) }
43+
var backStack: BackStackFeature<TestRootRouter.Configuration>? = null
3444

35-
val router: TestRootRouter = rootProvider.rootNode?.getRouter() as TestRootRouter
45+
ribsRule.start { activity, savedInstanceState ->
46+
val buildParams = BuildParams(
47+
payload = null,
48+
buildContext = BuildContext.root(savedInstanceState),
49+
identifier = Rib.Identifier(
50+
uuid = UUID.randomUUID()
51+
)
52+
)
3653

37-
testBlock.invoke(router, rootProvider.rootNode!!)
54+
// SameThreadVerifier will check if it was created on the same thread it will be used on
55+
backStack = BackStackFeature(
56+
buildParams = buildParams,
57+
initialConfiguration = setup.initialConfiguration
58+
)
3859

60+
rootProvider.create(
61+
buildParams = buildParams,
62+
dialogLauncher = activity.dialogLauncher(),
63+
savedInstanceState = savedInstanceState,
64+
routingSource = backStack!!
65+
)
66+
}
67+
68+
testBlock.invoke(backStack!!, rootProvider.rootNode!!)
3969
rootProvider.makeAssertions(expectedState)
4070
}
4171

42-
protected fun TestRootRouter.pushIt(configuration: TestRootRouter.Configuration) {
72+
protected fun BackStackFeature<TestRootRouter.Configuration>.pushIt(configuration: TestRootRouter.Configuration) {
4373
when (configuration) {
4474
is TestRootRouter.Configuration.Content -> push(configuration)
4575
is TestRootRouter.Configuration.Overlay -> pushOverlay(configuration)
@@ -48,11 +78,23 @@ abstract class BaseNodesTest {
4878

4979
private fun TestRoot.Provider.makeAssertions(expected: ExpectedState) {
5080
Espresso.onIdle()
51-
permanentNode1?.let { assertThat(it.toNodeState()).describedAs("Permanent node 1 state").isEqualTo(expected.permanentNode1) }
52-
permanentNode2?.let { assertThat(it.toNodeState()).describedAs("Permanent node 2 state").isEqualTo(expected.permanentNode2) }
53-
childNode1?.let { assertThat(it.toNodeState()).describedAs("Child node 1 state").isEqualTo(expected.node1) }
54-
childNode2?.let { assertThat(it.toNodeState()).describedAs("Child node 2 state").isEqualTo(expected.node2) }
55-
childNode3?.let { assertThat(it.toNodeState()).describedAs("Child node 3 state").isEqualTo(expected.node3) }
81+
permanentNode1?.let {
82+
assertThat(it.toNodeState()).describedAs("Permanent node 1 state")
83+
.isEqualTo(expected.permanentNode1)
84+
}
85+
permanentNode2?.let {
86+
assertThat(it.toNodeState()).describedAs("Permanent node 2 state")
87+
.isEqualTo(expected.permanentNode2)
88+
}
89+
childNode1?.let {
90+
assertThat(it.toNodeState()).describedAs("Child node 1 state").isEqualTo(expected.node1)
91+
}
92+
childNode2?.let {
93+
assertThat(it.toNodeState()).describedAs("Child node 2 state").isEqualTo(expected.node2)
94+
}
95+
childNode3?.let {
96+
assertThat(it.toNodeState()).describedAs("Child node 3 state").isEqualTo(expected.node3)
97+
}
5698
}
5799

58100
private fun TestNode<*>.toNodeState() =

android/libraries/rib-base/src/androidTest/java/com/badoo/ribs/android/lifecycle/PushTwoPopOneDefaultTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import com.badoo.ribs.test.util.runOnMainSync
66
class PushTwoPopOneDefaultTest : PushTwoPopOneTest() {
77

88
override fun pushTwoConfigurationAndPop(setup: When, expectedState: ExpectedState) {
9-
test(setup, expectedState) { router, _ ->
9+
test(setup, expectedState) { backStack, _ ->
1010
runOnMainSync {
11-
router.pushIt(setup.pushConfiguration1!!)
12-
router.pushIt(setup.pushConfiguration2!!)
13-
router.popBackStack()
11+
backStack.pushIt(setup.pushConfiguration1!!)
12+
backStack.pushIt(setup.pushConfiguration2!!)
13+
backStack.popBackStack()
1414
}
1515
}
1616
}

android/libraries/rib-base/src/androidTest/java/com/badoo/ribs/android/lifecycle/RootNodeLifecycleTest.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.badoo.ribs.android.lifecycle
22

33
import androidx.lifecycle.Lifecycle
44
import com.badoo.common.ribs.RibsRule
5+
import com.badoo.ribs.core.builder.BuildParams
56
import com.badoo.ribs.test.util.ribs.root.TestRoot
67
import com.badoo.ribs.test.util.finishActivitySync
78
import org.assertj.core.api.Assertions.assertThat
@@ -13,7 +14,13 @@ class RootNodeLifecycleTest {
1314
val node get() = provider.rootNode!!
1415

1516
@get:Rule
16-
val ribsRule = RibsRule { activity, savedInstanceState -> provider.create(activity.dialogLauncher(), savedInstanceState) }
17+
val ribsRule = RibsRule { activity, savedInstanceState ->
18+
provider.create(
19+
buildParams = BuildParams.Empty(),
20+
dialogLauncher = activity.dialogLauncher(),
21+
savedInstanceState = savedInstanceState
22+
)
23+
}
1724

1825
@Test
1926
fun whenActivityResumed_nodeIsAttached() {

android/libraries/rib-base/src/androidTest/java/com/badoo/ribs/android/lifecycle/helper/NodeState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ data class NodeState(
6565
}
6666

6767
private fun detachedToString(): String = when {
68-
ribLifeCycleState == DESTROYED && viewLifeCycleState == DESTROYED -> "DETACHED"
68+
ribLifeCycleState == DESTROYED && (viewLifeCycleState == null || viewLifeCycleState == DESTROYED) -> "DETACHED"
6969
else -> "DETACHED [!INVALID!] (rib: $ribLifeCycleState / view: $viewLifeCycleState)"
7070
}
7171
}

android/libraries/rib-base/src/androidTest/java/com/badoo/ribs/test/util/ribs/TestNode.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import com.badoo.ribs.core.view.ViewFactory
1010
class TestNode<V: RibView>(
1111
buildParams: BuildParams<*>,
1212
viewFactory: ViewFactory<Nothing?, V>,
13-
private val router: Router<*, *, *, *, V>,
13+
private val router: Router<*>,
1414
interactor: Interactor<*, V>
1515
): Node<V>(
1616
buildParams = buildParams,

android/libraries/rib-base/src/androidTest/java/com/badoo/ribs/test/util/ribs/child/TestChildRouter.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,22 @@ package com.badoo.ribs.test.util.ribs.child
33
import android.os.Parcelable
44
import com.badoo.ribs.core.Router
55
import com.badoo.ribs.core.builder.BuildParams
6+
import com.badoo.ribs.core.routing.RoutingSource
67
import com.badoo.ribs.core.routing.action.RoutingAction
8+
import com.badoo.ribs.core.routing.history.Routing
79
import com.badoo.ribs.test.util.ribs.child.TestChildRouter.Configuration
810
import kotlinx.android.parcel.Parcelize
911

1012
class TestChildRouter(
1113
buildParams: BuildParams<Nothing?>
12-
): Router<Configuration, Nothing, Configuration, Nothing, TestChildView>(
14+
): Router<Configuration>(
1315
buildParams = buildParams,
14-
initialConfiguration = Configuration.Default
16+
routingSource = RoutingSource.Empty()
1517
) {
1618
sealed class Configuration : Parcelable {
1719
@Parcelize object Default : Configuration()
1820
}
1921

20-
override fun resolveConfiguration(configuration: Configuration): RoutingAction =
22+
override fun resolve(routing: Routing<Configuration>): RoutingAction =
2123
RoutingAction.noop()
2224
}

android/libraries/rib-base/src/androidTest/java/com/badoo/ribs/test/util/ribs/root/TestRoot.kt

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import android.os.Bundle
55
import com.badoo.ribs.core.builder.BuildParams
66
import com.badoo.ribs.core.Rib
77
import com.badoo.ribs.core.builder.BuildContext
8+
import com.badoo.ribs.core.routing.RoutingSource
9+
import com.badoo.ribs.core.routing.configuration.feature.BackStackFeature
810
import com.badoo.ribs.dialog.DialogLauncher
911
import com.badoo.ribs.test.util.LifecycleObserver
1012
import com.badoo.ribs.test.util.ribs.TestNode
@@ -44,27 +46,27 @@ interface TestRoot : Rib {
4446
var rootNode: TestNode<*>? = null
4547
private set
4648

47-
private fun builder(block: (TestNode<TestChildView>) -> Unit): (BuildContext) -> TestNode<TestChildView> = {
48-
TestChildBuilder().build(it).also {
49-
block.invoke(it)
49+
private fun builder(block: (TestNode<TestChildView>) -> Unit): (BuildContext) -> TestNode<TestChildView> =
50+
{
51+
TestChildBuilder().build(it).also {
52+
block.invoke(it)
53+
}
5054
}
51-
}
5255

53-
fun create(dialogLauncher: DialogLauncher, savedInstanceState: Bundle?): TestNode<TestRootView> {
56+
fun create(
57+
buildParams: BuildParams<*>,
58+
dialogLauncher: DialogLauncher,
59+
savedInstanceState: Bundle?,
60+
routingSource: RoutingSource<Configuration> = RoutingSource.Empty()
61+
): TestNode<TestRootView> {
5462
val router = TestRootRouter(
55-
buildParams = BuildParams(
56-
payload = null,
57-
buildContext = BuildContext.root(savedInstanceState),
58-
identifier = Rib.Identifier(
59-
uuid = UUID.randomUUID()
60-
)
61-
),
63+
buildParams = buildParams,
64+
routingSource = routingSource,
6265
builderPermanent1 = builder { permanentNode1 = it },
6366
builderPermanent2 = builder { permanentNode2 = it },
6467
builder1 = builder { childNode1 = it },
6568
builder2 = builder { childNode2 = it },
6669
builder3 = builder { childNode3 = it },
67-
initialConfiguration = initialConfiguration,
6870
permanentParts = permanentParts,
6971
dialogLauncher = dialogLauncher
7072
)

0 commit comments

Comments
 (0)