diff --git a/devel/201_4.md b/devel/201_4.md index f3e08b791528564daf5a57c0763bd5b743e7fa91..9cac8df54d56b05bb23cfdac7790a4e5c1c0887e 100644 --- a/devel/201_4.md +++ b/devel/201_4.md @@ -41,4 +41,8 @@ bin/goldfish tests/goldfish/liii/path-test.scm ## 2025/07/13 path@of-drive 的文档和测试 +## 2025/07/23 path@from-env 的文档和测试 +### Agent +完成 path@from-env 的测试用例,并撰写文档,最后按照如何测试这一节运行单元测试,修复环境变量不存在时的string-length错误。 + ## 2025/07/12 path%dir? 的文档和测试 \ No newline at end of file diff --git a/goldfish/liii/path.scm b/goldfish/liii/path.scm index 348bc47aaeac5b19ec2c0b067967b3bda27da539..3510f3206632ae9679912c1e2af84356a0edbdc7 100644 --- a/goldfish/liii/path.scm +++ b/goldfish/liii/path.scm @@ -148,7 +148,8 @@ (loop ($ iter :drop 1 :get)))))))) (chained-define (@from-env name) - (path (getenv name))) + (let ((env-value (getenv name))) + (path (or env-value "")))) (define (%name) (if (string=? "." ($ parts :last)) diff --git a/tests/goldfish/liii/path-test.scm b/tests/goldfish/liii/path-test.scm index d75fd4918c86f5c48e12663680c3211b28ff295f..3fe7820828bef61c4239a046a8e466d7f18f27cf 100644 --- a/tests/goldfish/liii/path-test.scm +++ b/tests/goldfish/liii/path-test.scm @@ -751,9 +751,110 @@ integer (when (os-windows?) (check-true (> (path-getsize "C:\\Windows\\System32\\drivers\\etc\\hosts") 0))) -;; 目录大小测试 +#| +path@from-env +根据环境变量构造path对象。 + +语法 +---- +(path :from-env name) + +参数 +---- +name : string +环境变量名称。 + +返回值 +----- +path对象 +指示由环境变量值构成的路径。 + +描述 +---- +该函数从环境变量获取路径字符串并构造对应的path对象,用于便捷地获取标准环境变量中的路径值(如HOME、TEMP等)。 + +行为特征 +------ +- 环境变量不存在时返回nil对应的path对象 +- 自动处理空环境变量 +- 保持与直接构造path对象相同的路径解析规则 + +错误处理 +------ +- 当环境变量不存在时,返回path对象 +- 空环境变量值返回根路径 + +跨平台行为 +---------- +- Unix/Linux/macOS 支持HOME、USER等变量 +- Windows 支持USERPROFILE、HOMEPATH等变量 +- 路径分隔符根据系统自动处理 + +注意事项 +------ +- 推荐确认环境变量存在再使用 +- 与环境变量原始路径保持语义一致 +|# + +;; 基本环境变量测试 (when (or (os-linux?) (os-macos?)) - (check-true (> (path-getsize "/tmp") 0))) + (check (path :from-env "HOME" :to-string) => (path :home :to-string))) + +(when (os-windows?) + (check (path :from-env "USERPROFILE" :to-string) => (path :home :to-string))) + +;; 环境变量有效性验证 +(when (getenv "HOME") + (let ((home-path (path :from-env "HOME"))) + ;; 验证返回的是path对象 + (check-true (path :is-type-of home-path)) + + ;; 验证路径存在 + (check-true (home-path :exists?)) + + ;; 验证路径类型 + (check-true (home-path :dir?)) + + ;; 验证与getenv一致性 + (check (home-path :to-string) => (getenv "HOME")))) + +;; Windows 特有环境变量测试 +(when (getenv "USERPROFILE") + (let ((userprofile-path (path :from-env "USERPROFILE"))) + (check-true (path :is-type-of userprofile-path)) + (check-true (userprofile-path :exists?)) + (check-true (userprofile-path :dir?)) + (check (userprofile-path :to-string) => (getenv "USERPROFILE")))) + +;; 验证环境变量测试 + +;; 验证不存在的环境变量行为 +(when #t + (let ((nonexistent-path (path :from-env "NONEXISTENT_VAR_DEFINITELY_DOES_NOT_EXIST"))) + (check (nonexistent-path :to-string) => ""))) + +;; 标准环境变量测试 +(when (getenv "HOME") + (check-true (path :from-env "HOME" :absolute?))) + +(when (getenv "USERPROFILE") + (check-true (path :from-env "USERPROFILE" :absolute?))) + +;; 可链式操作测试 +(when (getenv "HOME") + (check-true ((path :from-env "HOME") :dir?))) + +;; 空环境变量测试 +(let ((empty-env-path (path :from-env ""))) + (check (empty-env-path :to-string) => "")) + +;; 使用环境变量构造引用路径 +(when (getenv "HOME") + (let ((temp-test (path :from-env "HOME" :/ "test_env.txt"))) + ;; 验证路径构造正确 + (check (temp-test :parent :to-string) => (getenv "HOME")))) + +;; 目录大小测试 ;; 相对路径测试 (let ((rel-file "test_rel.txt"))