
SenderTest.pudu
Pudu64 lines2.9 KB
1/** @Test.Sender.Suite — components depending on the sender seam, with a mediator or a double */2module PuduLangMediator.SenderTest34import Std.Io as Io5import Std.Test as Test6import PuduLangMediator.Context as Context7import PuduLangMediator.Mediator as Mediator8import PuduLangMediator.Message as Message9import PuduLangMediator as Messaging10import PuduLangMediator.Registration as Registration11import PuduLangMediator.Request as Request12import PuduLangMediator.Sender as Sender13import PuduLangMediator.Stream as Stream1415/** @Test.Sender.Refusing — a test double that refuses everything */16type Refusing = {}1718impl Sender.Sender for Refusing {19 20 fn send[Q, R, E](self: &Self, subject: &Request.Kind[Q, R, E], request: Q, context: Context.Context) -> Messaging.Outcome[R, E] { Messaging.refuse("double") }2122 23 fn dispatch(self: &Self, envelope: Message.Envelope, context: Context.Context) -> Message.Answer { Message.undelivered(&envelope.info, Message.NoRoute("double")) }2425 26 fn stream[Q, T, E](self: &Self, subject: &Stream.Kind[Q, T, E], request: Q, context: Context.Context, sink: Stream.Sink[T]) -> Messaging.Outcome[(), E] {27 Messaging.refuse("double")28 }29}303132fn greeting(sender: dynamic Sender.Sender, greet: &Request.Kind[Str, Str, Str], name: Str) -> Messaging.Outcome[Str, Str] {33 sender.send(greet, name, Context.create())34}353637fn main() -> Int {38 let greet: Request.Kind[Str, Str, Str] = Request.kind("greet")39 let digits: Stream.Kind[Int, Int, Str] = Stream.kind("digits")40 let mediator = match Mediator.build([41 Registration.handler(&greet, |name: Str, _context: Context.Context| Ok("hello " + name)),42 Registration.streamHandler(&digits, fn(count: Int, _context: Context.Context, sink: Stream.Sink[Int]) -> Messaging.Outcome[(), Str] {43 Stream.each(&[1, 2, 3].slice(0, count), sink)44 })45 ]) {46 case Ok(found) => found47 case Err(invalid) => panic(Mediator.explain(&invalid))48 }49 let real: dynamic Sender.Sender = mediator50 let double: dynamic Sender.Sender = Refusing{}51 let checks = Test.suite("Sender", &[52 Test.equals("a mediator stands for a sender", &greeting(real, &greet, "ada"), &Ok("hello ada")),53 Test.equals("a double stands for one too", &greeting(double, &greet, "ada"), &Err(Messaging.Refused("double"))),54 Test.equals("a mediator dispatches as a sender", &Request.answerOf(&greet, &real.dispatch(Request.envelope(&greet, "env"), Context.create())), &Some(Ok("hello env"))),55 Test.equals("a mediator streams as a sender", &real.stream(&digits, 2, Context.create(), |_item: Int| true), &Ok(())),56 Test.that("a double's dispatch is undelivered", double.dispatch(Request.envelope(&greet, "env"), Context.create()).failed)57 ])58 let ran = Test.run(&checks)59 for failure in Test.failuresOf(&ran) {60 let _reported = Io.writeErrorLine(failure)61 }62 Test.report(&ran)63}64