From 948f3f9dd5e2845b50a723ea229c2096114c192d Mon Sep 17 00:00:00 2001 From: Fredy Mederos Date: Sat, 29 Sep 2018 17:33:16 -0400 Subject: [PATCH] Including scopeId param in experimental builders Including name param in scope functions Including Tests to validate experimental builders an named scopes --- .../builder/ModuleDefinitionExt.kt | 13 ++- .../builder/ScopeAutoBuilderDSLTest.kt | 91 +++++++++++++++++++ .../org/koin/dsl/context/ModuleDefinition.kt | 4 +- 3 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 koin-projects/koin-core-ext/src/test/kotlin/org/koin/experimental/builder/ScopeAutoBuilderDSLTest.kt diff --git a/koin-projects/koin-core-ext/src/main/kotlin/org/koin/experimental/builder/ModuleDefinitionExt.kt b/koin-projects/koin-core-ext/src/main/kotlin/org/koin/experimental/builder/ModuleDefinitionExt.kt index cae977cea..8bc277130 100644 --- a/koin-projects/koin-core-ext/src/main/kotlin/org/koin/experimental/builder/ModuleDefinitionExt.kt +++ b/koin-projects/koin-core-ext/src/main/kotlin/org/koin/experimental/builder/ModuleDefinitionExt.kt @@ -17,6 +17,7 @@ package org.koin.experimental.builder import org.koin.core.parameter.ParameterDefinition import org.koin.core.parameter.emptyParameterDefinition +import org.koin.core.scope.setScope import org.koin.dsl.context.ModuleDefinition import org.koin.dsl.definition.BeanDefinition import org.koin.dsl.definition.Kind @@ -51,14 +52,18 @@ inline fun ModuleDefinition.factory( /** * Create a Scope definition for given type T * + * @param scopeId * @param name * @param override - allow definition override */ inline fun ModuleDefinition.scope( + scopeId: String, name: String = "", override: Boolean = false ): BeanDefinition { - return provide(name, false, override, Kind.Scope) { create() } + val beanDefinition = provide(name, false, override, Kind.Scope) { create() } + beanDefinition.setScope(scopeId) + return beanDefinition } /** @@ -101,14 +106,18 @@ inline fun ModuleDefinition.factoryBy( /** * Create a Scope definition for given type T, applied to R * + * @param scopeId * @param name * @param override - allow definition override */ inline fun ModuleDefinition.scopeBy( + scopeId: String, name: String = "", override: Boolean = false ): BeanDefinition { - return provide(name, false, override, Kind.Scope) { create() as R } + val beanDefinition = provide(name, false, override, Kind.Scope) { create() as R } + beanDefinition.setScope(scopeId) + return beanDefinition } /** diff --git a/koin-projects/koin-core-ext/src/test/kotlin/org/koin/experimental/builder/ScopeAutoBuilderDSLTest.kt b/koin-projects/koin-core-ext/src/test/kotlin/org/koin/experimental/builder/ScopeAutoBuilderDSLTest.kt new file mode 100644 index 000000000..724facb79 --- /dev/null +++ b/koin-projects/koin-core-ext/src/test/kotlin/org/koin/experimental/builder/ScopeAutoBuilderDSLTest.kt @@ -0,0 +1,91 @@ +package org.koin.experimental.builder + +import org.junit.Assert +import org.junit.Assert.fail +import org.junit.Test +import org.koin.dsl.module.module +import org.koin.error.NoScopeException +import org.koin.log.PrintLogger +import org.koin.standalone.StandAloneContext +import org.koin.standalone.get +import org.koin.standalone.getKoin +import org.koin.test.AutoCloseKoinTest + +/** + * Scope DSL Test using experimental functions [scope] and [scopeBy] + * @see org.koin.test.scope.ScopeDSLTest + */ +class ScopeAutoBuilderDSLTest : AutoCloseKoinTest() { + + interface IB + class A(val b: IB) + class B : IB + + @Test + fun `use scope id from DSL`() { + StandAloneContext.startKoin(listOf(module { + scopeBy("session") + }), logger = PrintLogger(showDebug = true)) + + val koin = getKoin() + + koin.createScope("session") + + val b_1 = get() + val b_2 = get() + + Assert.assertEquals(b_1, b_2) + } + + @Test + fun `use closed scope id from DSL`() { + StandAloneContext.startKoin(listOf(module { + scope("session") + }), logger = PrintLogger(showDebug = true)) + + val koin = getKoin() + + val session = koin.createScope("session") + session.close() + + try { + get() + fail() + } catch (e: NoScopeException) { + } + } + + @Test + fun `use scope id from DSL - dependency with same scope`() { + StandAloneContext.startKoin(listOf(module { + scopeBy("session") + scope("session") + }), logger = PrintLogger(showDebug = true)) + + val koin = getKoin() + + koin.createScope("session") + + val b = get() + val a = get() + + Assert.assertEquals(a.b, b) + } + + @Test + fun `use scope id and name from DSL`() { + StandAloneContext.startKoin(listOf(module { + scopeBy("session", "B1") + scopeBy("session", "B2") + }), logger = PrintLogger(showDebug = true)) + + val koin = getKoin() + + koin.createScope("session") + + val b_1 = get("B1") + val b_2 = get("B2") + + Assert.assertNotEquals(b_1, b_2) + } +} \ No newline at end of file diff --git a/koin-projects/koin-core/src/main/kotlin/org/koin/dsl/context/ModuleDefinition.kt b/koin-projects/koin-core/src/main/kotlin/org/koin/dsl/context/ModuleDefinition.kt index 1504e97b9..739f0e234 100644 --- a/koin-projects/koin-core/src/main/kotlin/org/koin/dsl/context/ModuleDefinition.kt +++ b/koin-projects/koin-core/src/main/kotlin/org/koin/dsl/context/ModuleDefinition.kt @@ -160,16 +160,18 @@ class ModuleDefinition( * Provide a Scope bean definition - scope provider * (can be released/recreated with Scope API) * + * @param scopeId * @param name * @param override - allow definition override * @param definition */ inline fun scope( scopeId: String, + name: String = "", override: Boolean = false, noinline definition: Definition ): BeanDefinition { - val beanDefinition = provide("", false, override, Kind.Scope, definition) + val beanDefinition = provide(name, false, override, Kind.Scope, definition) beanDefinition.setScope(scopeId) return beanDefinition }