diff --git a/src/BitLogger_test.mbt b/src/BitLogger_test.mbt index 6b1cf19..d2de2dc 100644 --- a/src/BitLogger_test.mbt +++ b/src/BitLogger_test.mbt @@ -268,6 +268,92 @@ test "config subtype json helpers stringify stable shapes" { ) } +test "config json helpers export stable structured shapes" { + let queue_json = queue_config_to_json( + QueueConfig::new(8, overflow=QueueOverflowPolicy::DropOldest), + ) + let queue_obj = queue_json.as_object().unwrap() + inspect(@json_parser.stringify(queue_json), content="{\"max_pending\":8,\"overflow\":\"DropOldest\"}") + inspect(queue_obj.get("max_pending").unwrap().as_number().unwrap().to_int(), content="8") + inspect(queue_obj.get("overflow").unwrap().as_string().unwrap(), content="DropOldest") + + let formatter_json = text_formatter_config_to_json( + TextFormatterConfig::new( + show_timestamp=false, + show_level=true, + show_target=false, + show_fields=true, + separator=" | ", + field_separator=",", + template="[{level}] {message} :: {fields}", + color_mode=ColorMode::Always, + color_support=ColorSupport::Basic, + style_markup=StyleMarkupMode::Builtin, + target_style_markup=StyleMarkupMode::Builtin, + fields_style_markup=StyleMarkupMode::Disabled, + style_tags={ + "accent": text_style(fg=Some("#4cc9f0"), bold=true), + }, + ), + ) + let formatter_obj = formatter_json.as_object().unwrap() + let style_tags_obj = formatter_obj.get("style_tags").unwrap().as_object().unwrap() + let accent_obj = style_tags_obj.get("accent").unwrap().as_object().unwrap() + inspect(formatter_obj.get("show_timestamp").unwrap().as_bool().unwrap(), content="false") + inspect(formatter_obj.get("show_target").unwrap().as_bool().unwrap(), content="false") + inspect(formatter_obj.get("separator").unwrap().as_string().unwrap(), content=" | ") + inspect(formatter_obj.get("field_separator").unwrap().as_string().unwrap(), content=",") + inspect(formatter_obj.get("template").unwrap().as_string().unwrap(), content="[{level}] {message} :: {fields}") + inspect(formatter_obj.get("color_mode").unwrap().as_string().unwrap(), content="always") + inspect(formatter_obj.get("color_support").unwrap().as_string().unwrap(), content="basic") + inspect(formatter_obj.get("style_markup").unwrap().as_string().unwrap(), content="builtin") + inspect(formatter_obj.get("target_style_markup").unwrap().as_string().unwrap(), content="builtin") + inspect(formatter_obj.get("fields_style_markup").unwrap().as_string().unwrap(), content="disabled") + inspect(accent_obj.get("bold").unwrap().as_bool().unwrap(), content="true") + inspect(accent_obj.get("fg").unwrap().as_string().unwrap(), content="#4cc9f0") + + let sink_json = sink_config_to_json( + SinkConfig::new( + kind=SinkKind::File, + path="demo.log", + append=false, + auto_flush=false, + rotation=Some(file_rotation(128, max_backups=2)), + text_formatter=TextFormatterConfig::new(show_timestamp=false, color_mode=ColorMode::Auto), + ), + ) + let sink_obj = sink_json.as_object().unwrap() + let sink_formatter_obj = sink_obj.get("text_formatter").unwrap().as_object().unwrap() + let rotation_obj = sink_obj.get("rotation").unwrap().as_object().unwrap() + inspect(sink_obj.get("kind").unwrap().as_string().unwrap(), content="file") + inspect(sink_obj.get("path").unwrap().as_string().unwrap(), content="demo.log") + inspect(sink_obj.get("append").unwrap().as_bool().unwrap(), content="false") + inspect(sink_obj.get("auto_flush").unwrap().as_bool().unwrap(), content="false") + inspect(sink_formatter_obj.get("show_timestamp").unwrap().as_bool().unwrap(), content="false") + inspect(sink_formatter_obj.get("color_mode").unwrap().as_string().unwrap(), content="auto") + inspect(rotation_obj.get("max_bytes").unwrap().as_number().unwrap().to_int(), content="128") + inspect(rotation_obj.get("max_backups").unwrap().as_number().unwrap().to_int(), content="2") + + let logger_json = logger_config_to_json( + LoggerConfig::new( + min_level=Level::Warn, + target="api", + timestamp=true, + sink=SinkConfig::new(kind=SinkKind::TextConsole), + queue=Some(QueueConfig::new(8, overflow=QueueOverflowPolicy::DropNewest)), + ), + ) + let logger_obj = logger_json.as_object().unwrap() + let logger_sink_obj = logger_obj.get("sink").unwrap().as_object().unwrap() + let logger_queue_obj = logger_obj.get("queue").unwrap().as_object().unwrap() + inspect(logger_obj.get("min_level").unwrap().as_string().unwrap(), content="WARN") + inspect(logger_obj.get("target").unwrap().as_string().unwrap(), content="api") + inspect(logger_obj.get("timestamp").unwrap().as_bool().unwrap(), content="true") + inspect(logger_sink_obj.get("kind").unwrap().as_string().unwrap(), content="text_console") + inspect(logger_queue_obj.get("max_pending").unwrap().as_number().unwrap().to_int(), content="8") + inspect(logger_queue_obj.get("overflow").unwrap().as_string().unwrap(), content="DropNewest") +} + test "default config helpers expose baseline config shapes" { let formatter = default_text_formatter_config() inspect(formatter.show_timestamp, content="true")