Skip to content

Commit

Permalink
Unrelated test: A Provider variant
Browse files Browse the repository at this point in the history
  • Loading branch information
odersky committed Aug 10, 2024
1 parent 72a20bd commit b2292a8
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
8 changes: 8 additions & 0 deletions tests/run/Providers.check
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,11 @@ Executing query: insert into subscribers(name, email) values Daniel daniel@Rockt
You've just been subscribed to RockTheJVM. Welcome, Martin
Acquired connection
Executing query: insert into subscribers(name, email) values Martin [email protected]

Injected2
You've just been subscribed to RockTheJVM. Welcome, Daniel
Acquired connection
Executing query: insert into subscribers(name, email) values Daniel [email protected]
You've just been subscribed to RockTheJVM. Welcome, Martin
Acquired connection
Executing query: insert into subscribers(name, email) values Martin [email protected]
52 changes: 52 additions & 0 deletions tests/run/Providers.scala
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ end Providers
Explicit().test()
println(s"\nInjected")
Injected().test()
println(s"\nInjected2")
Injected2().test()

/** Demonstrator for explicit dependency construction */
class Explicit:
Expand Down Expand Up @@ -173,5 +175,55 @@ class Injected:
end explicit
end Injected

/** Injected with builders in companion objects */
class Injected2:
import Providers.*

case class User(name: String, email: String)

class UserSubscription(emailService: EmailService, db: UserDatabase):
def subscribe(user: User) =
emailService.email(user)
db.insert(user)
object UserSubscription:
def apply()(using Provider[(EmailService, UserDatabase)]): UserSubscription =
new UserSubscription(provided[EmailService], provided[UserDatabase])

class EmailService:
def email(user: User) =
println(s"You've just been subscribed to RockTheJVM. Welcome, ${user.name}")

class UserDatabase(pool: ConnectionPool):
def insert(user: User) =
pool.get().runQuery(s"insert into subscribers(name, email) values ${user.name} ${user.email}")
object UserDatabase:
def apply()(using Provider[(ConnectionPool)]): UserDatabase =
new UserDatabase(provided[ConnectionPool])

class ConnectionPool(n: Int):
def get(): Connection =
println(s"Acquired connection")
Connection()

class Connection():
def runQuery(query: String): Unit =
println(s"Executing query: $query")

def test() =
given Provider[EmailService] = provide(EmailService())
given Provider[ConnectionPool] = provide(ConnectionPool(10))
given Provider[UserDatabase] = provide(UserDatabase())
given Provider[UserSubscription] = provide(UserSubscription())

def subscribe(user: User)(using Provider[UserSubscription]) =
val sub = UserSubscription()
sub.subscribe(user)

subscribe(User("Daniel", "[email protected]"))
subscribe(User("Martin", "[email protected]"))
end test
end Injected2




0 comments on commit b2292a8

Please sign in to comment.