From 539dcb84b764857965e069094eaaa880bd463200 Mon Sep 17 00:00:00 2001 From: Hiroshi Inukai Date: Tue, 6 Oct 2026 20:18:27 +0900 Subject: [PATCH] Tests: Japanese file and folder names save, open, export and title documents A regression test for non-ASCII paths. It saves to a Japanese file name, with full-width brackets and a middle dot, inside a Japanese folder. It checks the document's title, reopens the file with its Japanese text, and exports SVG, PNG and PDF to Japanese names. Co-Authored-By: Claude Opus 5.5 --- crates/engine/src/tests_file.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/crates/engine/src/tests_file.rs b/crates/engine/src/tests_file.rs index 56d180e1..06dffc64 100644 --- a/crates/engine/src/tests_file.rs +++ b/crates/engine/src/tests_file.rs @@ -233,3 +233,30 @@ fn raster_export_too_large_is_an_error_not_a_crash() { assert!(std::fs::read(&path).unwrap().starts_with(b"\x89PNG")); let _ = std::fs::remove_dir_all(dir); } + +/// Japanese file and folder names save, open, export and title documents as typed: the native +/// format, SVG, PNG and PDF, in a folder with a Japanese name too. +#[test] +fn japanese_file_names_save_open_and_export() { + let mut s = session(); + s.execute("shape.rectangle", &json!({"x": 10, "y": 10, "width": 80, "height": 40})).unwrap(); + s.execute("text.create", &json!({"x": 10, "y": 80, "text": "日本語のテキスト"})).unwrap(); + let dir = std::env::temp_dir().join(format!("vc-日本語フォルダ-{}", std::process::id())); + std::fs::create_dir_all(&dir).unwrap(); + let path = dir.join("運動会カード(最終版)・2024.vectorcraft"); + s.execute("document.save", &json!({"path": path.to_string_lossy()})).unwrap(); + assert!(path.exists()); + assert_eq!(s.doc().unwrap().title(), "運動会カード(最終版)・2024.vectorcraft", "the tab names the file as typed"); + s.execute("document.open", &json!({"path": path.to_string_lossy()})).unwrap(); + let d = s.doc().unwrap(); + assert_eq!(d.path.as_deref(), Some(path.to_string_lossy().as_ref())); + let mut found = false; + d.doc.walk(|n| found |= matches!(&n.kind, vectorcraft_doc::NodeKind::Text(t) if t.plain_text() == "日本語のテキスト")); + assert!(found, "the Japanese text comes back"); + for (format, name) in [("svg", "書き出し.svg"), ("png", "書き出し.png"), ("pdf", "書き出し.pdf")] { + let out = dir.join(name); + s.execute("document.export", &json!({"format": format, "path": out.to_string_lossy()})).unwrap(); + assert!(std::fs::metadata(&out).is_ok_and(|m| m.len() > 0), "{name}"); + } + let _ = std::fs::remove_dir_all(dir); +}