Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/test store improvements #4

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,20 @@ private constructor(
Prism.id(),
testDispatcher
)
fun <State, Action : Comparable<Action>, Environment> create (
state: State,
reducer: Reducer<State, Action, Environment>,
environment: Environment,
testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()
) =
TestStore(
state,
reducer,
environment,
Lens.id(),
Prism.id(),
testDispatcher
)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What would be the benefit of introducing create over the already existing invoke method? You should be able to instantiate it with TestStore(...) vs TestStore.create(...).

Copy link
Author

@horvathtamasattila horvathtamasattila Mar 29, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When you mess up something while instantiating a test store (types or something), using invoke the error message is not clear (or non-existent). This was more like for debugging, but I can take it out.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would keep the API surface to a minimum for now and introduce new ones only if necessary. If we have concrete examples and better understand what's happening with invoke, we can reconsider create (or any alternatives).

}

fun <S, A> scope(
Expand All @@ -84,7 +98,9 @@ private constructor(
fromLocalAction,
testDispatcher
)


@kotlin.ExperimentalStdlibApi
@OptIn(kotlin.ExperimentalStdlibApi::class)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These should not be necessary, we are enabling usage of experimental APIs globally in build.gradle.kts.

fun assert(block: AssertionBuilder<LocalAction, LocalState, Environment>.() -> Unit) {
val assertion = AssertionBuilder<LocalAction, LocalState, Environment> {
toLocalState.get(state)
Expand Down Expand Up @@ -112,33 +128,37 @@ private constructor(

when (step) {
is Step.Send<LocalAction, LocalState, Environment> -> {
require(receivedActions.isEmpty()) { "Must handle all actions" }
require(receivedActions.isEmpty()) { "Must handle all actions. Unhandled actions:\n" + receivedActions.joinToString(separator = "\n") }
runReducer(fromLocalAction.reverseGet(step.action))
expectedState = step.block(expectedState)
}
is Step.Receive<LocalAction, LocalState, Environment> -> {
require(receivedActions.isNotEmpty()) { "Expected to receive an action, but received none" }
require(receivedActions.isNotEmpty()) {
"Expected to receive" + receivedActions.joinToString(separator = "\n") + "but received none"
}
val receivedAction = receivedActions.removeFirst()
require(step.action == receivedAction) { "Actual and expected actions do not match" }
require(step.action == receivedAction) {
"Actual and expected states do not match.\n\n${step.action}\n---vs---\n$receivedAction"
}
runReducer(fromLocalAction.reverseGet(step.action))
expectedState = step.block(expectedState)
}
is Step.Environment<LocalAction, LocalState, Environment> -> {
require(receivedActions.isEmpty()) { "Must handle all received actions before performing this work" }
require(receivedActions.isEmpty()) {
"Must handle all received actions before performing this work." + receivedActions.joinToString(separator = "\n") + "are not handled"
}
step.block(environment)
}
is Step.Do -> step.block()
}

val actualState = toLocalState.get(state)
require(actualState == expectedState) {
println(actualState)
println("---vs---")
println(expectedState)
"Actual and expected states do not match"
"Actual and expected states do not match\n\n$actualState\n---vs---\n$expectedState"
}
}

require(receivedActions.isEmpty()) { "Must handle all actions" }
require(receivedActions.isEmpty()) { "Must handle all actions. Unhandled actions:\n" + receivedActions.joinToString(separator = "\n") }
}
}