sigil-stitch 0.6.2

Type-safe, import-aware, width-aware code generation for multiple languages
Documentation
//! Tests for `$V` verbatim string literal in Python.

use sigil_stitch::code_block::CodeBlock;
use sigil_stitch::prelude::*;
use sigil_stitch::spec::file_spec::FileSpec;

fn render(block: &CodeBlock) -> String {
    FileSpec::builder("test.py")
        .add_code(block.clone())
        .build()
        .unwrap()
        .render(80)
        .unwrap()
}

#[test]
fn verbatim_uses_fstring() {
    let block = sigil_quote!(Python {
        msg = $V("{name} is {age} years old")
    })
    .unwrap();
    let output = render(&block);
    assert!(
        output.contains("f\"{name} is {age} years old\""),
        "Expected f-string, got:\n{output}"
    );
}

// ── @{expr} interpolation ────────────────────────────────

#[test]
fn verbatim_at_interpolation_simple() {
    let module = "auth";
    let block = sigil_quote!(Python {
        msg = $V("@{module}: {user} logged in")
    })
    .unwrap();
    let output = render(&block);
    assert!(
        output.contains("f\"auth: {user} logged in\""),
        "got:\n{output}"
    );
}

#[test]
fn verbatim_at_interpolation_multiple() {
    let prefix = "api";
    let version = "v2";
    let block = sigil_quote!(Python {
        url = $V("@{prefix}/@{version}/{endpoint}")
    })
    .unwrap();
    let output = render(&block);
    assert!(output.contains("f\"api/v2/{endpoint}\""), "got:\n{output}");
}

#[test]
fn verbatim_at_escape() {
    let block = sigil_quote!(Python {
        email = $V("user@@example.com")
    })
    .unwrap();
    let output = render(&block);
    assert!(output.contains("f\"user@example.com\""), "got:\n{output}");
}

#[test]
fn verbatim_at_expr_method_call() {
    let items = ["a", "b", "c"];
    let block = sigil_quote!(Python {
        msg = $V("total=@{items.len()}")
    })
    .unwrap();
    let output = render(&block);
    assert!(output.contains("f\"total=3\""), "got:\n{output}");
}