Skip to content

Commit b2292a8

Browse files
committed
Unrelated test: A Provider variant
1 parent 72a20bd commit b2292a8

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

Diff for: tests/run/Providers.check

+8
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,11 @@ Executing query: insert into subscribers(name, email) values Daniel daniel@Rockt
1818
You've just been subscribed to RockTheJVM. Welcome, Martin
1919
Acquired connection
2020
Executing query: insert into subscribers(name, email) values Martin [email protected]
21+
22+
Injected2
23+
You've just been subscribed to RockTheJVM. Welcome, Daniel
24+
Acquired connection
25+
Executing query: insert into subscribers(name, email) values Daniel [email protected]
26+
You've just been subscribed to RockTheJVM. Welcome, Martin
27+
Acquired connection
28+
Executing query: insert into subscribers(name, email) values Martin [email protected]

Diff for: tests/run/Providers.scala

+52
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ end Providers
6565
Explicit().test()
6666
println(s"\nInjected")
6767
Injected().test()
68+
println(s"\nInjected2")
69+
Injected2().test()
6870

6971
/** Demonstrator for explicit dependency construction */
7072
class Explicit:
@@ -173,5 +175,55 @@ class Injected:
173175
end explicit
174176
end Injected
175177

178+
/** Injected with builders in companion objects */
179+
class Injected2:
180+
import Providers.*
181+
182+
case class User(name: String, email: String)
183+
184+
class UserSubscription(emailService: EmailService, db: UserDatabase):
185+
def subscribe(user: User) =
186+
emailService.email(user)
187+
db.insert(user)
188+
object UserSubscription:
189+
def apply()(using Provider[(EmailService, UserDatabase)]): UserSubscription =
190+
new UserSubscription(provided[EmailService], provided[UserDatabase])
191+
192+
class EmailService:
193+
def email(user: User) =
194+
println(s"You've just been subscribed to RockTheJVM. Welcome, ${user.name}")
195+
196+
class UserDatabase(pool: ConnectionPool):
197+
def insert(user: User) =
198+
pool.get().runQuery(s"insert into subscribers(name, email) values ${user.name} ${user.email}")
199+
object UserDatabase:
200+
def apply()(using Provider[(ConnectionPool)]): UserDatabase =
201+
new UserDatabase(provided[ConnectionPool])
202+
203+
class ConnectionPool(n: Int):
204+
def get(): Connection =
205+
println(s"Acquired connection")
206+
Connection()
207+
208+
class Connection():
209+
def runQuery(query: String): Unit =
210+
println(s"Executing query: $query")
211+
212+
def test() =
213+
given Provider[EmailService] = provide(EmailService())
214+
given Provider[ConnectionPool] = provide(ConnectionPool(10))
215+
given Provider[UserDatabase] = provide(UserDatabase())
216+
given Provider[UserSubscription] = provide(UserSubscription())
217+
218+
def subscribe(user: User)(using Provider[UserSubscription]) =
219+
val sub = UserSubscription()
220+
sub.subscribe(user)
221+
222+
subscribe(User("Daniel", "[email protected]"))
223+
subscribe(User("Martin", "[email protected]"))
224+
end test
225+
end Injected2
226+
227+
176228

177229

0 commit comments

Comments
 (0)