smooth-frame 0.2.0

Generate Sketch-like smooth corner and smooth frame cubic Bezier paths.
Documentation
#[path = "support/sketchtool.rs"]
mod sketchtool;

use sketchtool::{
    assert_case_matches, find_sketchtool, parse_sketchtool_cases, print_alignment_table,
    sketchtool_script,
};
use std::env;
use std::process::Command;

const EXPECTED_SKETCHTOOL_CASES: usize = 1_720;

// 验证本库 SmoothRect 输出与 SketchTool 导出的矩形路径矩阵一致。
#[test]
fn sketchtool_in_memory_rect_matrix_matches() {
    let Some(sketchtool) = find_sketchtool() else {
        if env::var_os("SMOOTH_FRAME_REQUIRE_SKETCHTOOL").is_some() {
            panic!("未找到 sketchtool,但 SMOOTH_FRAME_REQUIRE_SKETCHTOOL 已启用");
        }
        eprintln!("跳过 sketchtool 集成测试:未找到 sketchtool");
        return;
    };

    let output = Command::new(&sketchtool)
        .arg("run-script")
        .arg(sketchtool_script())
        .arg("--without-activating=YES")
        .arg("--timeout=120")
        .output()
        .expect("无法运行 sketchtool");

    assert!(
        output.status.success(),
        "sketchtool 运行失败\nstdout:\n{}\nstderr:\n{}",
        String::from_utf8_lossy(&output.stdout),
        String::from_utf8_lossy(&output.stderr)
    );

    let stdout = String::from_utf8_lossy(&output.stdout);
    let cases = parse_sketchtool_cases(&stdout);
    assert_eq!(
        cases.len(),
        EXPECTED_SKETCHTOOL_CASES,
        "sketchtool 用例数量异常"
    );

    let results = cases
        .into_iter()
        .map(assert_case_matches)
        .collect::<Vec<_>>();
    print_alignment_table(&results);
}