katana-document-viewer 0.1.4

KatanA document viewer artifact, render evaluation, and export foundation.
Documentation
use super::shields_badge;

fn require_badge(
    src: &str,
    link: Option<String>,
) -> Result<super::SurfaceBadge, Box<dyn std::error::Error>> {
    shields_badge(src, link)
        .ok_or_else(|| std::io::Error::other("shields badge should parse").into())
}

#[test]
fn shields_badge_parses_known_color_and_link() -> Result<(), Box<dyn std::error::Error>> {
    let badge = require_badge(
        "https://img.shields.io/badge/Type-Value-blue?labelColor=green",
        Some("/to/target".to_string()),
    )?;

    assert_eq!(badge.label, "Type");
    assert_eq!(badge.message, "Value");
    assert_eq!(badge.link_target, Some("/to/target".to_string()));
    Ok(())
}

#[test]
fn shields_badge_defaults_unknown_color_to_default_style() -> Result<(), Box<dyn std::error::Error>>
{
    let badge = require_badge("https://img.shields.io/badge/left-right-unknown", None)?;

    assert_eq!(badge.label, "left");
    assert_eq!(badge.message, "right");
    Ok(())
}

#[test]
fn shields_badge_decodes_percent_encoding_and_keeps_invalid_sequences()
-> Result<(), Box<dyn std::error::Error>> {
    let badge = require_badge(
        "https://img.shields.io/badge/left%20text-right%20text-%25bad",
        None,
    )?;

    assert_eq!(badge.label, "left text");
    assert_eq!(badge.message, "right text");
    assert_eq!(badge.text(), "left text=right text");
    Ok(())
}

#[test]
fn shields_badge_rejects_invalid_src_without_badge_segment() {
    assert!(shields_badge("https://example.com/not-a-badge", None).is_none());
}

#[test]
fn shields_badge_uses_default_color_for_plain_text_color_name()
-> Result<(), Box<dyn std::error::Error>> {
    let plain = require_badge("https://img.shields.io/badge/one-two-plain", None)?;
    let fallback = require_badge("https://img.shields.io/badge/one-two-lightgrey", None)?;

    assert_eq!(plain.color, fallback.color);
    Ok(())
}

#[test]
fn shields_badge_decodes_uppercase_hex_and_invalid_utf8_falls_back()
-> Result<(), Box<dyn std::error::Error>> {
    let uppercase = require_badge("https://img.shields.io/badge/LEFT%20A-RIGHT%2FZ-red", None)?;
    let invalid_utf8 = require_badge("https://img.shields.io/badge/%FF-right-green", None)?;

    assert_eq!(uppercase.label, "LEFT A");
    assert_eq!(uppercase.message, "RIGHT/Z");
    assert_eq!(invalid_utf8.label, "%FF");
    Ok(())
}

#[test]
fn shields_badge_decodes_lowercase_hex_and_keeps_bad_hex_sequences() {
    let lowercase = shields_badge("https://img.shields.io/badge/left-right%2fside-blue", None)
        .map(|badge| badge.message);
    let invalid =
        shields_badge("https://img.shields.io/badge/%G0-right-blue", None).map(|badge| badge.label);

    assert_eq!(lowercase, Some("right/side".to_string()));
    assert_eq!(invalid, Some("%G0".to_string()));
}