use symbolic_mgu::logic::create_dict;
use symbolic_mgu::{
register_formatter, Color, EnumTermFactory, MguError, NodeByte, OutputFormatter, Statement,
Term, WideMetavariable, WideMetavariableFactory,
};
#[derive(Debug, Clone, Copy)]
struct JsonFormatter;
impl OutputFormatter for JsonFormatter {
fn name(&self) -> &str {
"json"
}
fn get_boolean_color(&self) -> Option<Color> {
None }
fn get_setvar_color(&self) -> Option<Color> {
None
}
fn get_class_color(&self) -> Option<Color> {
None
}
}
type WideStatement = Statement<
symbolic_mgu::SimpleType,
WideMetavariable,
NodeByte,
symbolic_mgu::EnumTerm<symbolic_mgu::SimpleType, WideMetavariable, NodeByte>,
>;
#[test]
fn test_custom_formatter_implementation() -> Result<(), MguError> {
register_formatter("json-test", JsonFormatter);
let term_factory = EnumTermFactory::new();
let metavar_factory = WideMetavariableFactory();
let dict = create_dict(
&term_factory,
&metavar_factory,
NodeByte::Implies,
NodeByte::Not,
)?;
let result: WideStatement =
Statement::from_compact_proof("DD211", &metavar_factory, &term_factory, &dict)?;
let formatter = symbolic_mgu::get_formatter("json-test");
let output = result.get_assertion().format_with(&*formatter);
println!("Custom JSON formatter output: {}", output);
assert!(!output.is_empty(), "Formatter should produce output");
assert_eq!(formatter.name(), "json");
Ok(())
}
#[test]
fn test_custom_formatter_with_complex_proof() -> Result<(), MguError> {
let depth = 10;
let mut proof = "D1".repeat(depth);
proof.push('1');
let term_factory = EnumTermFactory::new();
let metavar_factory = WideMetavariableFactory();
let dict = create_dict(
&term_factory,
&metavar_factory,
NodeByte::Implies,
NodeByte::Not,
)?;
let result: WideStatement =
Statement::from_compact_proof(&proof, &metavar_factory, &term_factory, &dict)?;
let formatter = JsonFormatter;
let output = result.get_assertion().format_with(&formatter);
println!(
"Complex proof with custom formatter ({} chars): {}",
output.len(),
output
);
assert!(!output.is_empty());
assert!(output.contains('→'), "Should contain implication operator");
Ok(())
}
#[test]
fn test_formatter_trait_methods() {
let formatter = JsonFormatter;
assert_eq!(formatter.name(), "json");
assert_eq!(formatter.get_boolean_color(), None);
assert_eq!(formatter.get_setvar_color(), None);
assert_eq!(formatter.get_class_color(), None);
}
#[test]
fn test_formatter_registration_and_retrieval() {
register_formatter("json-test-2", JsonFormatter);
let retrieved = symbolic_mgu::get_formatter("json-test-2");
assert_eq!(retrieved.name(), "json");
let fallback = symbolic_mgu::get_formatter("nonexistent-formatter-xyz");
assert_eq!(fallback.name(), "display");
}