Skip to content

Commit

Permalink
Added new tests for family usage
Browse files Browse the repository at this point in the history
  • Loading branch information
devlaam committed Jul 2, 2023
1 parent f9df8d8 commit 1d4ce32
Show file tree
Hide file tree
Showing 6 changed files with 879 additions and 65 deletions.
267 changes: 267 additions & 0 deletions shared/src/test/scala/s2a/leucine/actors/family/accept.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,267 @@
package s2a.leucine.actors


import scala.concurrent.duration.FiniteDuration
import scala.concurrent.duration.DurationInt
import scala.annotation.nowarn
import utest.*

import s2a.control.{Buffer, Deferred}
import s2a.leucine.actors.Actor.Anonymous
import s2a.control.Helpers.*


object SiblingAcceptSupply extends TestSuite, SiblingCommon :
import TestMethods.*

class Grandma(name: String) extends AcceptActor(Grandma,name), FamilyRoot(Grandma) :
new Mama("m1",this)
new Mama("m2",this)
new Mama("m3",this)
def receive(letter: Letter, sender: Sender): Unit = letter match
case Grandma.Hello => children.foreach(child => child.send(Mama.Hello,this))
case Grandma.FamilyHello => children.foreach(child => child.send(Grandma.FamilyHello,sender))

object Grandma extends AcceptDefine, FamilyDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter
type ChildActor = Mama
sealed trait ChildLetter extends Letter, Mama.Letter
case object FamilyHello extends ChildLetter

class Mama(name: String, val parent: Grandma) extends AcceptActor(Mama,name), FamilyBranch[Grandma,Mama.type](Mama) :
new Son("s1",this); new Daughter("d1",this)
new Son("s2",this); new Daughter("d2",this)
new Son("s3",this); new Daughter("d3",this)
def receive(letter: Letter, sender: Sender): Unit = letter match
case Mama.Hello =>
children.collect{ case (son : Son) => son.send(Son.Hello,this) }
children.collect{ case (daughter : Daughter) => daughter.send(Daughter.Hello,this) }
case Grandma.FamilyHello =>
children.foreach(child => child.send(Mama.FamilyHello,this))

object Mama extends AcceptDefine, FamilyDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter
type ChildActor = Son | Daughter
sealed trait ChildLetter extends Son.Letter, Daughter.Letter
case object FamilyHello extends ChildLetter

trait Child extends BareActor, FamilyLeaf[Mama] :
def send[Sender <: Mama.FamilyAccept](letter: Mama.FamilyLetter[Actor], sender: Sender): Boolean

class Son(name: String, val parent: Mama) extends AcceptActor(Son,name), Child :
def send[Sender <: Mama.FamilyAccept](letter: Mama.FamilyLetter[Actor], sender: Sender): Boolean = super[AcceptActor].send(letter,sender)
def receive(letter: Letter, sender: Sender): Unit = letter match
case Son.Hello => writeln(s"$name-SH-${sender.name}")
case Mama.FamilyHello => writeln(s"$name-MF-${sender.name}")

object Son extends AcceptDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter

class Daughter(name: String, val parent: Mama) extends AcceptActor(Daughter,name), Child :
def send[Sender <: Mama.FamilyAccept](letter: Mama.FamilyLetter[Actor], sender: Sender): Boolean = super[AcceptActor].send(letter,sender)
def receive(letter: Letter, sender: Sender): Unit = letter match
case Daughter.Hello => writeln(s"$name-DH-${sender.name}")
case Mama.FamilyHello => writeln(s"$name-MF-${sender.name}")

object Daughter extends AcceptDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter

def start(): Unit =
given Actor.Anonymous = Actor.Anonymous
val grandma: Grandma = Grandma("Oma")
grandma ! Grandma.Hello
grandma ! Grandma.FamilyHello


object SiblingAcceptRelaySupply extends TestSuite, SiblingCommon :
import TestMethods.*

class Grandma(name: String) extends AcceptActor(Grandma,name), FamilyRoot(Grandma) :
new Mama("m1",this)
new Mama("m2",this)
new Mama("m3",this)
def receive(letter: Letter, sender: Sender): Unit = letter match
case Grandma.Hello => children.foreach(child => child.send(Mama.Hello,this))
case Grandma.FamilyHello => children.foreach(child => child.send(Grandma.FamilyHello,sender))

object Grandma extends AcceptDefine, FamilyDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter
type ChildActor = Mama
sealed trait ChildLetter extends Letter, Mama.Letter
case object FamilyHello extends FamilyLetter[Actor]

class Mama(name: String, val parent: Grandma) extends AcceptActor(Mama,name), FamilyBranchRelay[Grandma,Mama.type](Mama) :
new Son("s1",this); new Daughter("d1",this)
new Son("s2",this); new Daughter("d2",this)
new Son("s3",this); new Daughter("d3",this)
def receive(letter: Letter, sender: Sender): Unit = letter match
case Mama.Hello =>
children.collect{ case (son : Son) => son.send(Son.Hello,this) }
children.collect{ case (daughter : Daughter) => daughter.send(Daughter.Hello,this) }
case Grandma.FamilyHello =>
relayAll(Mama.FamilyHello,this)

object Mama extends AcceptDefine, FamilyDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter
type ChildActor = BareActor
sealed trait ChildLetter extends Son.Letter, Daughter.Letter
case object FamilyHello extends ChildLetter

class Son(name: String, val parent: Mama) extends AcceptActor(Son,name), FamilyLeafRelayed[Mama] :
def receive(letter: Letter, sender: Sender): Unit = letter match
case Son.Hello => writeln(s"$name-SH-${sender.name}")
case Mama.FamilyHello => writeln(s"$name-MF-${sender.name}")

object Son extends AcceptDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter

class Daughter(name: String, val parent: Mama) extends AcceptActor(Daughter,name), FamilyLeafRelayed[Mama] :
def receive(letter: Letter, sender: Sender): Unit = letter match
case Daughter.Hello => writeln(s"$name-DH-${sender.name}")
case Mama.FamilyHello => writeln(s"$name-MF-${sender.name}")

object Daughter extends AcceptDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter

def start(): Unit =
given Actor.Anonymous = Actor.Anonymous
val grandma: Grandma = Grandma("Oma")
grandma ! Grandma.Hello
grandma ! Grandma.FamilyHello


object SiblingAcceptRelayedSupply extends TestSuite, SiblingCommon :
import TestMethods.*

class Grandma(name: String) extends AcceptActor(Grandma,name), FamilyRootRelay(Grandma) :
new Mama("m1",this)
new Mama("m2",this)
new Mama("m3",this)
def receive(letter: Letter, sender: Sender): Unit = letter match
case Grandma.Hello => children.foreach(child => child.send(Mama.Hello,this))
case Grandma.FamilyHello => relayAll(Grandma.FamilyHello,sender)


object Grandma extends AcceptDefine, FamilyDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter
type ChildActor = Mama
sealed trait ChildLetter extends Letter, Mama.Letter
case object FamilyHello extends FamilyLetter[Actor]

class Mama(name: String, val parent: Grandma) extends AcceptActor(Mama,name), FamilyBranchRelayed[Grandma,Mama.type](Mama) :
new Son("s1",this); new Daughter("d1",this)
new Son("s2",this); new Daughter("d2",this)
new Son("s3",this); new Daughter("d3",this)
def receive(letter: Letter, sender: Sender): Unit = letter match
case Mama.Hello =>
children.collect{ case (son : Son) => son.send(Son.Hello,this) }
children.collect{ case (daughter : Daughter) => daughter.send(Daughter.Hello,this) }
case Grandma.FamilyHello =>
children.foreach(child => child.send(Mama.FamilyHello,this))

object Mama extends AcceptDefine, FamilyDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter
type ChildActor = Son | Daughter
sealed trait ChildLetter extends Son.Letter, Daughter.Letter
case object FamilyHello extends ChildLetter

trait Child extends BareActor, FamilyLeaf[Mama] :
def send[Sender <: Mama.FamilyAccept](letter: Mama.FamilyLetter[Actor], sender: Sender): Boolean

class Son(name: String, val parent: Mama) extends AcceptActor(Son,name), Child :
def send[Sender <: Mama.FamilyAccept](letter: Mama.FamilyLetter[Actor], sender: Sender): Boolean = super[AcceptActor].send(letter,sender)
def receive(letter: Letter, sender: Sender): Unit = letter match
case Son.Hello => writeln(s"$name-SH-${sender.name}")
case Mama.FamilyHello => writeln(s"$name-MF-${sender.name}")

object Son extends AcceptDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter

class Daughter(name: String, val parent: Mama) extends AcceptActor(Daughter,name), Child :
def send[Sender <: Mama.FamilyAccept](letter: Mama.FamilyLetter[Actor], sender: Sender): Boolean = super[AcceptActor].send(letter,sender)
def receive(letter: Letter, sender: Sender): Unit = letter match
case Daughter.Hello => writeln(s"$name-DH-${sender.name}")
case Mama.FamilyHello => writeln(s"$name-MF-${sender.name}")

object Daughter extends AcceptDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter

def start(): Unit =
given Actor.Anonymous = Actor.Anonymous
val grandma: Grandma = Grandma("Oma")
grandma ! Grandma.Hello
grandma ! Grandma.FamilyHello



object SiblingAcceptRelayRelayedSupply extends TestSuite, SiblingCommon :
import TestMethods.*

class Grandma(name: String) extends AcceptActor(Grandma,name), FamilyRootRelay(Grandma) :
new Mama("m1",this)
new Mama("m2",this)
new Mama("m3",this)
def receive(letter: Letter, sender: Sender): Unit = letter match
case Grandma.Hello => children.foreach(child => child.send(Mama.Hello,this))
case Grandma.FamilyHello => relayAll(Grandma.FamilyHello,sender)

object Grandma extends AcceptDefine, FamilyDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter
type ChildActor = Mama
sealed trait ChildLetter extends Letter, Mama.Letter
case object FamilyHello extends FamilyLetter[Actor]

class Mama(name: String, val parent: Grandma) extends AcceptActor(Mama,name), FamilyBranchRelayRelayed[Grandma,Mama.type](Mama) :
new Son("s1",this); new Daughter("d1",this)
new Son("s2",this); new Daughter("d2",this)
new Son("s3",this); new Daughter("d3",this)
def receive(letter: Letter, sender: Sender): Unit = letter match
case Mama.Hello =>
children.collect{ case (son : Son) => son.send(Son.Hello,this) }
children.collect{ case (daughter : Daughter) => daughter.send(Daughter.Hello,this) }
case Grandma.FamilyHello =>
relayAll(Mama.FamilyHello,this)

object Mama extends AcceptDefine, FamilyDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter
type ChildActor = BareActor
sealed trait ChildLetter extends Son.Letter, Daughter.Letter
case object FamilyHello extends ChildLetter

class Son(name: String, val parent: Mama) extends AcceptActor(Son,name), FamilyLeafRelayed[Mama] :
def receive(letter: Letter, sender: Sender): Unit = letter match
case Son.Hello => writeln(s"$name-SH-${sender.name}")
case Mama.FamilyHello => writeln(s"$name-MF-${sender.name}")

object Son extends AcceptDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter

class Daughter(name: String, val parent: Mama) extends AcceptActor(Daughter,name), FamilyLeafRelayed[Mama] :
def receive(letter: Letter, sender: Sender): Unit = letter match
case Daughter.Hello => writeln(s"$name-DH-${sender.name}")
case Mama.FamilyHello => writeln(s"$name-MF-${sender.name}")

object Daughter extends AcceptDefine, Stateless :
sealed trait Letter extends Actor.Letter[Actor]
case object Hello extends Letter

def start(): Unit =
given Actor.Anonymous = Actor.Anonymous
val grandma: Grandma = Grandma("Oma")
grandma ! Grandma.Hello
grandma ! Grandma.FamilyHello
Loading

0 comments on commit 1d4ce32

Please sign in to comment.