Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-log

Structured event logging for Pudu: message templates, enrichment, filtering, formatting, and sinks

0.1.0Apache-2.01

InstallClose

ConsoleTest.pudu

Pudu36 lines2.5 KB

GitHub ↗
1/** @Test.Sinks.Console.Suite — console text, colours, and streams */2module PuduLangLog.Sinks.ConsoleTest34import Std.Io as Io5import Std.Test as Test6import PuduLangLog.Domain.Display as Display7import PuduLangLog.Event as Event8import PuduLangLog as Log9import PuduLangLog.Sinks.Console as Console10import PuduLangLog.Sinks.Theme as Theme11import PuduLangLog.Value as Value1213/// Runs the suite.14fn main() -> Int {15  let event = Event.create(Log.Timestamp{millis: 1790604309123, offset: 120}, Log.Warning, "Disk \{Disk\} low", [Value.property("Disk", Value.text("C"))])16  let plain = Console.Options{..Console.defaults(), colored: false}17  let colored = Console.Options{..Console.defaults(), colored: true, theme: Theme.sixteen()}18  let styled = [Display.Piece{style: Display.StringStyle, text: "a\nb"}, Display.Piece{style: Display.Plain, text: "\n"}, Display.Piece{style: Display.LevelStyle(Log.Error), text: "ERR"}]19  let checks = Test.suite("Sinks.Console", &[20      Test.equals("the default layout without colour", &Console.render(&plain, &event), &"[16:05:09 WRN] Disk C low\n"),21      Test.equals("colours wrap styled pieces", &Console.render(&colored, &event), &"[16:05:09 \u{1b}[33;1mWRN\u{1b}[0m] Disk \u{1b}[36mC\u{1b}[0m low\n"),22      Test.equals("a custom formatter replaces the template", &Console.render(&Console.Options{..plain, formatter: Some(fn(written: &Log.Event) -> Str { Event.message(written) })}, &event), &"Disk \"C\" low"),23      Test.equals("a custom template", &Console.render(&Console.Options{..plain, outputTemplate: "\{Level:u\}: \{Message:l\}"}, &event), &"WARNING: Disk C low"),24      Test.that("standard output by default", !Console.toErrors(&plain, Log.Fatal)),25      Test.equals("standard error from a level", &[Log.Information, Log.Error, Log.Fatal].map(|level: Log.Level| Console.toErrors(&Console.Options{..plain, standardErrorFromLevel: Some(Log.Error)}, level)), &[false, true, true]),26      Test.equals("painting keeps line breaks outside the escapes", &Theme.paint(&Theme.sixteen(), &styled), &"\u{1b}[36ma\u{1b}[0m\n\u{1b}[36mb\u{1b}[0m\n\u{1b}[31;1mERR\u{1b}[0m"),27      Test.equals("no theme is plain text", &Theme.paint(&Theme.none(), &styled), &"a\nb\nERR"),28      Test.that("every theme colours errors", Theme.paint(&Theme.literate(), &styled).contains("\u{1b}[48;5;0196m") && Theme.paint(&Theme.grayscale(), &styled).contains("\u{1b}[30m\u{1b}[47m") && Theme.paint(&Theme.code(), &styled).contains("\u{1b}[38;5;0197m"))29    ])30  let ran = Test.run(&checks)31  for failure in Test.failuresOf(&ran) {32    let _reported = Io.writeErrorLine(failure)33  }34  Test.report(&ran)35}36