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

LevelsTest.pudu

Pudu52 lines4.0 KB

GitHub ↗
1/** @Test.Domain.Levels.Suite — level ranks, names, parsing, and monikers */2module PuduLangLog.Domain.LevelsTest34import Std.Io as Io5import Std.Test as Test6import PuduLangLog.Domain.Levels as Levels7import PuduLangLog.Domain.Padding as Padding8import PuduLangLog as Log910/// The moniker of every level under one format.11fn monikers(format: Str) -> Array[Str] {12  Log.LEVELS.map(|level: Log.Level| Levels.moniker(level, &Some(format)))13}1415/// Runs the suite.16fn main() -> Int {17  let checks = Test.suite("Domain.Levels", &[18      Test.equals("ranks run from verbose to fatal", &Log.LEVELS.map(|level: Log.Level| Levels.rank(level)), &[0, 1, 2, 3, 4, 5]),19      Test.equals("full names", &Log.LEVELS.map(|level: Log.Level| Levels.name(level)), &["Verbose", "Debug", "Information", "Warning", "Error", "Fatal"]),20      Test.that("a level passes itself", Levels.passes(Log.Warning, Log.Warning)),21      Test.that("a higher level passes", Levels.passes(Log.Error, Log.Warning)),22      Test.that("a lower level does not pass", !Levels.passes(Log.Information, Log.Warning)),23      Test.equals("the stricter of two levels", &(Levels.stricter(Log.Debug, Log.Error), Levels.stricter(Log.Fatal, Log.Verbose), Levels.stricter(Log.Warning, Log.Warning)), &(Log.Error, Log.Fatal, Log.Warning)),24      Test.equals("names parse ignoring case and spaces", &(Levels.parse(" warning "), Levels.parse("FATAL"), Levels.parse("Information")), &(Some(Log.Warning), Some(Log.Fatal), Some(Log.Information))),25      Test.equals("numbers parse", &(Levels.parse("0"), Levels.parse("5")), &(Some(Log.Verbose), Some(Log.Fatal))),26      Test.equals("unknown names do not parse", &(Levels.parse("info"), Levels.parse("6"), Levels.parse("")), &(None, None, None)),27      Test.equals("u3 monikers", &monikers("u3"), &["VRB", "DBG", "INF", "WRN", "ERR", "FTL"]),28      Test.equals("w3 monikers", &monikers("w3"), &["vrb", "dbg", "inf", "wrn", "err", "ftl"]),29      Test.equals("t4 monikers", &monikers("t4"), &["Verb", "Dbug", "Info", "Warn", "Eror", "Fatl"]),30      Test.equals("u1 monikers", &monikers("u1"), &["V", "D", "I", "W", "E", "F"]),31      Test.equals("a two-digit width shorter than a name", &monikers("u10"), &["VERBOSE", "DEBUG", "INFORMATIO", "WARNING", "ERROR", "FATAL"]),32      Test.equals("two-digit widths", &monikers("t11"), &["Verbose", "Debug", "Information", "Warning", "Error", "Fatal"]),33      Test.equals("a width past the name gives the name", &monikers("u9"), &["VERBOSE", "DEBUG", "INFORMATI", "WARNING", "ERROR", "FATAL"]),34      Test.equals("width zero is empty", &monikers("u0"), &["", "", "", "", "", ""]),35      Test.equals("a lone case letter cases the full name", &(Levels.moniker(Log.Warning, &Some("u")), Levels.moniker(Log.Warning, &Some("w"))), &("WARNING", "warning")),36      Test.equals("no format gives the full name", &Levels.moniker(Log.Debug, &None), &"Debug"),37      Test.equals("an unknown case letter gives the full name", &Levels.moniker(Log.Error, &Some("x3")), &"Error"),38      Test.equals("a width that is not digits keeps the full name", &(Levels.moniker(Log.Error, &Some("uab")), Levels.moniker(Log.Error, &Some("u3x"))), &("Error", "Error")),39      Test.equals("a format of four characters keeps the full name", &Levels.moniker(Log.Error, &Some("u123")), &"Error"),40      Test.equals("left alignment pads on the right", &Padding.padded("ab", &Some(Log.Alignment{left: true, width: 5})), &"ab   "),41      Test.equals("right alignment pads on the left", &Padding.padded("ab", &Some(Log.Alignment{left: false, width: 5})), &"   ab"),42      Test.equals("wide text is not padded", &(Padding.padded("abcdef", &Some(Log.Alignment{left: false, width: 5})), Padding.padded("abcde", &Some(Log.Alignment{left: true, width: 5}))), &("abcdef", "abcde")),43      Test.equals("no alignment leaves text", &Padding.padded("ab", &None), &"ab"),44      Test.equals("case formats", &(Padding.cased("Ab", &Some("u")), Padding.cased("Ab", &Some("w")), Padding.cased("Ab", &Some("x")), Padding.cased("Ab", &None)), &("AB", "ab", "Ab", "Ab"))45    ])46  let ran = Test.run(&checks)47  for failure in Test.failuresOf(&ran) {48    let _reported = Io.writeErrorLine(failure)49  }50  Test.report(&ran)51}52