Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-mediator

In-process messaging for Pudu: requests, notifications, streams, pipeline behaviors, processors, and exception handling

0.1.0Apache-2.01

InstallClose

SenderTest.pudu

Pudu64 lines2.9 KB

GitHub ↗
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  /// Refuses the request.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  /// Answers that nothing is routed.23  fn dispatch(self: &Self, envelope: Message.Envelope, context: Context.Context) -> Message.Answer { Message.undelivered(&envelope.info, Message.NoRoute("double")) }2425  /// Refuses the stream.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}3031/// A component that only sends: it greets through whatever sender it is given.32fn 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}3536/// Runs the suite.37fn 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