1 changed files with 477 additions and 409 deletions
@ -1,410 +1,478 @@ |
|||||||
package require tcltest |
package require tcltest |
||||||
tcltest::configure {*}$::argv |
tcltest::configure {*}$::argv |
||||||
|
|
||||||
|
|
||||||
package require punk::lib |
package require punk::lib |
||||||
package require punk::path |
package require punk::path |
||||||
|
|
||||||
namespace eval ::testspace { |
namespace eval ::testspace { |
||||||
namespace import ::tcltest::* |
namespace import ::tcltest::* |
||||||
|
|
||||||
variable common { |
variable common { |
||||||
set result "" |
set result "" |
||||||
} |
} |
||||||
|
|
||||||
variable subfolders_tree { |
variable subfolders_tree { |
||||||
set sub_prevdir [pwd] |
set sub_prevdir [pwd] |
||||||
set sub_newbase [punk::lib::tempdir_newfolder -prefix punk_path_subfolders] |
set sub_newbase [punk::lib::tempdir_newfolder -prefix punk_path_subfolders] |
||||||
cd $sub_newbase |
cd $sub_newbase |
||||||
set sub_tree_tail __punk_path_subfolders_test__ |
set sub_tree_tail __punk_path_subfolders_test__ |
||||||
set sub_tree_root [file join $sub_newbase $sub_tree_tail] |
set sub_tree_root [file join $sub_newbase $sub_tree_tail] |
||||||
file mkdir [file join $sub_tree_root keep] |
file mkdir [file join $sub_tree_root keep] |
||||||
file mkdir [file join $sub_tree_root src vfs deep] |
file mkdir [file join $sub_tree_root src vfs deep] |
||||||
file mkdir [file join $sub_tree_root aside child grandchild] |
file mkdir [file join $sub_tree_root aside child grandchild] |
||||||
} |
} |
||||||
|
|
||||||
variable subfolders_cleanup { |
variable subfolders_cleanup { |
||||||
cd $sub_prevdir |
cd $sub_prevdir |
||||||
file delete -force $sub_newbase |
file delete -force $sub_newbase |
||||||
} |
} |
||||||
|
|
||||||
variable repeated_subfolders_tree { |
variable repeated_subfolders_tree { |
||||||
set rep_prevdir [pwd] |
set rep_prevdir [pwd] |
||||||
set rep_newbase [punk::lib::tempdir_newfolder -prefix punk_path_repeated_subfolders] |
set rep_newbase [punk::lib::tempdir_newfolder -prefix punk_path_repeated_subfolders] |
||||||
cd $rep_newbase |
cd $rep_newbase |
||||||
set rep_tree_tail __punk_path_repeated_subfolders_test__ |
set rep_tree_tail __punk_path_repeated_subfolders_test__ |
||||||
set rep_tree_root [file join $rep_newbase $rep_tree_tail] |
set rep_tree_root [file join $rep_newbase $rep_tree_tail] |
||||||
file mkdir [file join $rep_tree_root alpha a a leaf deeper] |
file mkdir [file join $rep_tree_root alpha a a leaf deeper] |
||||||
file mkdir [file join $rep_tree_root alpha a x a leaf deeper] |
file mkdir [file join $rep_tree_root alpha a x a leaf deeper] |
||||||
file mkdir [file join $rep_tree_root alpha a xx a leaf deeper] |
file mkdir [file join $rep_tree_root alpha a xx a leaf deeper] |
||||||
file mkdir [file join $rep_tree_root alpha a x y a leaf deeper] |
file mkdir [file join $rep_tree_root alpha a x y a leaf deeper] |
||||||
file mkdir [file join $rep_tree_root alpha a x y z a leaf deeper] |
file mkdir [file join $rep_tree_root alpha a x y z a leaf deeper] |
||||||
file mkdir [file join $rep_tree_root alpha a x y z keep] |
file mkdir [file join $rep_tree_root alpha a x y z keep] |
||||||
file mkdir [file join $rep_tree_root alpha a q aa leaf deeper] |
file mkdir [file join $rep_tree_root alpha a q aa leaf deeper] |
||||||
file mkdir [file join $rep_tree_root alpha aa x a leaf deeper] |
file mkdir [file join $rep_tree_root alpha aa x a leaf deeper] |
||||||
} |
} |
||||||
|
|
||||||
variable repeated_subfolders_cleanup { |
variable repeated_subfolders_cleanup { |
||||||
cd $rep_prevdir |
cd $rep_prevdir |
||||||
file delete -force $rep_newbase |
file delete -force $rep_newbase |
||||||
} |
} |
||||||
|
|
||||||
variable treefilenames_tree { |
variable treefilenames_tree { |
||||||
set tf_prevdir [pwd] |
set tf_prevdir [pwd] |
||||||
set tf_newbase [punk::lib::tempdir_newfolder -prefix punk_path_treefilenames] |
set tf_newbase [punk::lib::tempdir_newfolder -prefix punk_path_treefilenames] |
||||||
cd $tf_newbase |
cd $tf_newbase |
||||||
set tf_tree_tail __punk_path_treefilenames_test__ |
set tf_tree_tail __punk_path_treefilenames_test__ |
||||||
set tf_tree_root [file join $tf_newbase $tf_tree_tail] |
set tf_tree_root [file join $tf_newbase $tf_tree_tail] |
||||||
file mkdir [file join $tf_tree_root keep] |
file mkdir [file join $tf_tree_root keep] |
||||||
file mkdir [file join $tf_tree_root src vfs deep] |
file mkdir [file join $tf_tree_root src vfs deep] |
||||||
file mkdir [file join $tf_tree_root aside child grandchild] |
file mkdir [file join $tf_tree_root aside child grandchild] |
||||||
foreach relpath { |
foreach relpath { |
||||||
keep/keep.txt |
keep/keep.txt |
||||||
src/srcroot.txt |
src/srcroot.txt |
||||||
src/vfs/vfs.txt |
src/vfs/vfs.txt |
||||||
src/vfs/deep/deep.txt |
src/vfs/deep/deep.txt |
||||||
aside/aside.txt |
aside/aside.txt |
||||||
aside/child/child.txt |
aside/child/child.txt |
||||||
aside/child/grandchild/grandchild.txt |
aside/child/grandchild/grandchild.txt |
||||||
b/other/other.txt |
b/other/other.txt |
||||||
} { |
alpha/subdir/direct.txt |
||||||
set filepath [file join $tf_tree_root $relpath] |
alpha/subdir/deep/deep.txt |
||||||
file mkdir [file dirname $filepath] |
} { |
||||||
set channel [open $filepath w] |
set filepath [file join $tf_tree_root $relpath] |
||||||
puts $channel $relpath |
file mkdir [file dirname $filepath] |
||||||
close $channel |
set channel [open $filepath w] |
||||||
} |
puts $channel $relpath |
||||||
} |
close $channel |
||||||
|
} |
||||||
variable treefilenames_cleanup { |
} |
||||||
cd $tf_prevdir |
|
||||||
file delete -force $tf_newbase |
variable treefilenames_cleanup { |
||||||
} |
cd $tf_prevdir |
||||||
|
file delete -force $tf_newbase |
||||||
test globmatchpath_basic {Test single star between slashes pathglob argument will match exactly a single level} \ |
} |
||||||
-setup $common -body { |
|
||||||
set result [list \ |
test globmatchpath_basic {Test single star between slashes pathglob argument will match exactly a single level} \ |
||||||
[punk::path::globmatchpath /etc/*/*.doc /etc/A/test.doc] \ |
-setup $common -body { |
||||||
[punk::path::globmatchpath /etc/*/*.doc /etc/A/B/test.doc] \ |
set result [list \ |
||||||
[punk::path::globmatchpath /etc/*/*.doc /etc/test.doc] \ |
[punk::path::globmatchpath /etc/*/*.doc /etc/A/test.doc] \ |
||||||
] |
[punk::path::globmatchpath /etc/*/*.doc /etc/A/B/test.doc] \ |
||||||
} \ |
[punk::path::globmatchpath /etc/*/*.doc /etc/test.doc] \ |
||||||
-cleanup { |
] |
||||||
} \ |
} \ |
||||||
-result {1 0 0} |
-cleanup { |
||||||
|
} \ |
||||||
test subfolders_exclude_trailing_doublestar {Trailing /** prunes descendants but keeps the matching base directory} \ |
-result {1 0 0} |
||||||
-setup $subfolders_tree -body { |
|
||||||
set result [lsort [punk::path::subfolders -recursive -exclude-paths {**/src/**} .]] |
test subfolders_exclude_trailing_doublestar {Trailing /** prunes descendants but keeps the matching base directory} \ |
||||||
set expected [lsort [list \ |
-setup $subfolders_tree -body { |
||||||
[file join . $sub_tree_tail] \ |
set result [lsort [punk::path::subfolders -recursive -exclude-paths {**/src/**} .]] |
||||||
[file join . $sub_tree_tail aside] \ |
set expected [lsort [list \ |
||||||
[file join . $sub_tree_tail aside child] \ |
[file join . $sub_tree_tail] \ |
||||||
[file join . $sub_tree_tail aside child grandchild] \ |
[file join . $sub_tree_tail aside] \ |
||||||
[file join . $sub_tree_tail keep] \ |
[file join . $sub_tree_tail aside child] \ |
||||||
[file join . $sub_tree_tail src] \ |
[file join . $sub_tree_tail aside child grandchild] \ |
||||||
]] |
[file join . $sub_tree_tail keep] \ |
||||||
expr {$result eq $expected} |
[file join . $sub_tree_tail src] \ |
||||||
} \ |
]] |
||||||
-cleanup $subfolders_cleanup \ |
expr {$result eq $expected} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $subfolders_cleanup \ |
||||||
test subfolders_exclude_single_segment {Single-level excludes omit the node but still recurse into it} \ |
-result 1 |
||||||
-setup $subfolders_tree -body { |
|
||||||
set result [lsort [punk::path::subfolders -recursive -exclude-paths {**/aside/*} .]] |
test subfolders_exclude_single_segment {Single-level excludes omit the node but still recurse into it} \ |
||||||
set expected [lsort [list \ |
-setup $subfolders_tree -body { |
||||||
[file join . $sub_tree_tail] \ |
set result [lsort [punk::path::subfolders -recursive -exclude-paths {**/aside/*} .]] |
||||||
[file join . $sub_tree_tail aside] \ |
set expected [lsort [list \ |
||||||
[file join . $sub_tree_tail aside child grandchild] \ |
[file join . $sub_tree_tail] \ |
||||||
[file join . $sub_tree_tail keep] \ |
[file join . $sub_tree_tail aside] \ |
||||||
[file join . $sub_tree_tail src] \ |
[file join . $sub_tree_tail aside child grandchild] \ |
||||||
[file join . $sub_tree_tail src vfs] \ |
[file join . $sub_tree_tail keep] \ |
||||||
[file join . $sub_tree_tail src vfs deep] \ |
[file join . $sub_tree_tail src] \ |
||||||
]] |
[file join . $sub_tree_tail src vfs] \ |
||||||
expr {$result eq $expected} |
[file join . $sub_tree_tail src vfs deep] \ |
||||||
} \ |
]] |
||||||
-cleanup $subfolders_cleanup \ |
expr {$result eq $expected} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $subfolders_cleanup \ |
||||||
test subfolders_exclude_exact_segment {Exact segment excludes omit the node but still traverse below it} \ |
-result 1 |
||||||
-setup $subfolders_tree -body { |
|
||||||
set result [lsort [punk::path::subfolders -recursive -exclude-paths {**/aside} .]] |
test subfolders_exclude_exact_segment {Exact segment excludes omit the node but still traverse below it} \ |
||||||
set expected [lsort [list \ |
-setup $subfolders_tree -body { |
||||||
[file join . $sub_tree_tail] \ |
set result [lsort [punk::path::subfolders -recursive -exclude-paths {**/aside} .]] |
||||||
[file join . $sub_tree_tail aside child] \ |
set expected [lsort [list \ |
||||||
[file join . $sub_tree_tail aside child grandchild] \ |
[file join . $sub_tree_tail] \ |
||||||
[file join . $sub_tree_tail keep] \ |
[file join . $sub_tree_tail aside child] \ |
||||||
[file join . $sub_tree_tail src] \ |
[file join . $sub_tree_tail aside child grandchild] \ |
||||||
[file join . $sub_tree_tail src vfs] \ |
[file join . $sub_tree_tail keep] \ |
||||||
[file join . $sub_tree_tail src vfs deep] \ |
[file join . $sub_tree_tail src] \ |
||||||
]] |
[file join . $sub_tree_tail src vfs] \ |
||||||
expr {$result eq $expected} |
[file join . $sub_tree_tail src vfs deep] \ |
||||||
} \ |
]] |
||||||
-cleanup $subfolders_cleanup \ |
expr {$result eq $expected} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $subfolders_cleanup \ |
||||||
test subfolders_exclude_combined_patterns {Subtree and exact excludes compose correctly in recursive traversal} \ |
-result 1 |
||||||
-setup $subfolders_tree -body { |
|
||||||
set result [lsort [punk::path::subfolders -recursive -exclude-paths {**/src/** **/aside} .]] |
test subfolders_exclude_combined_patterns {Subtree and exact excludes compose correctly in recursive traversal} \ |
||||||
set expected [lsort [list \ |
-setup $subfolders_tree -body { |
||||||
[file join . $sub_tree_tail] \ |
set result [lsort [punk::path::subfolders -recursive -exclude-paths {**/src/** **/aside} .]] |
||||||
[file join . $sub_tree_tail aside child] \ |
set expected [lsort [list \ |
||||||
[file join . $sub_tree_tail aside child grandchild] \ |
[file join . $sub_tree_tail] \ |
||||||
[file join . $sub_tree_tail keep] \ |
[file join . $sub_tree_tail aside child] \ |
||||||
[file join . $sub_tree_tail src] \ |
[file join . $sub_tree_tail aside child grandchild] \ |
||||||
]] |
[file join . $sub_tree_tail keep] \ |
||||||
expr {$result eq $expected} |
[file join . $sub_tree_tail src] \ |
||||||
} \ |
]] |
||||||
-cleanup $subfolders_cleanup \ |
expr {$result eq $expected} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $subfolders_cleanup \ |
||||||
test subfolders_repeated_segments_single_star {Repeated segment exclude with one wildcard segment prunes only that shape} \ |
-result 1 |
||||||
-setup $repeated_subfolders_tree -body { |
|
||||||
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/a/**} .] |
test subfolders_repeated_segments_single_star {Repeated segment exclude with one wildcard segment prunes only that shape} \ |
||||||
expr { \ |
-setup $repeated_subfolders_tree -body { |
||||||
[file join . $rep_tree_tail alpha a x a] in $result \ |
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/a/**} .] |
||||||
&& [file join . $rep_tree_tail alpha a x a leaf] ni $result \ |
expr { \ |
||||||
&& [file join . $rep_tree_tail alpha a x a leaf deeper] ni $result \ |
[file join . $rep_tree_tail alpha a x a] in $result \ |
||||||
&& [file join . $rep_tree_tail alpha a x y a leaf] in $result \ |
&& [file join . $rep_tree_tail alpha a x a leaf] ni $result \ |
||||||
&& [file join . $rep_tree_tail alpha a x y z keep] in $result \ |
&& [file join . $rep_tree_tail alpha a x a leaf deeper] ni $result \ |
||||||
} |
&& [file join . $rep_tree_tail alpha a x y a leaf] in $result \ |
||||||
} \ |
&& [file join . $rep_tree_tail alpha a x y z keep] in $result \ |
||||||
-cleanup $repeated_subfolders_cleanup \ |
} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $repeated_subfolders_cleanup \ |
||||||
test subfolders_repeated_segments_two_single_stars {Repeated segment exclude with two wildcard segments prunes only that shape} \ |
-result 1 |
||||||
-setup $repeated_subfolders_tree -body { |
|
||||||
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/*/a/**} .] |
test subfolders_repeated_segments_two_single_stars {Repeated segment exclude with two wildcard segments prunes only that shape} \ |
||||||
expr { \ |
-setup $repeated_subfolders_tree -body { |
||||||
[file join . $rep_tree_tail alpha a x y a] in $result \ |
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/*/a/**} .] |
||||||
&& [file join . $rep_tree_tail alpha a x y a leaf] ni $result \ |
expr { \ |
||||||
&& [file join . $rep_tree_tail alpha a x y a leaf deeper] ni $result \ |
[file join . $rep_tree_tail alpha a x y a] in $result \ |
||||||
&& [file join . $rep_tree_tail alpha a x a leaf] in $result \ |
&& [file join . $rep_tree_tail alpha a x y a leaf] ni $result \ |
||||||
&& [file join . $rep_tree_tail alpha a x y z a leaf] in $result \ |
&& [file join . $rep_tree_tail alpha a x y a leaf deeper] ni $result \ |
||||||
} |
&& [file join . $rep_tree_tail alpha a x a leaf] in $result \ |
||||||
} \ |
&& [file join . $rep_tree_tail alpha a x y z a leaf] in $result \ |
||||||
-cleanup $repeated_subfolders_cleanup \ |
} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $repeated_subfolders_cleanup \ |
||||||
test subfolders_repeated_segments_middle_doublestar {Repeated segment exclude with middle doublestar prunes repeated a descendants at multiple depths} \ |
-result 1 |
||||||
-setup $repeated_subfolders_tree -body { |
|
||||||
set result [punk::path::subfolders -recursive -exclude-paths {**/a/**/a/**} .] |
test subfolders_repeated_segments_middle_doublestar {Repeated segment exclude with middle doublestar prunes repeated a descendants at multiple depths} \ |
||||||
expr { \ |
-setup $repeated_subfolders_tree -body { |
||||||
[file join . $rep_tree_tail alpha a x a] in $result \ |
set result [punk::path::subfolders -recursive -exclude-paths {**/a/**/a/**} .] |
||||||
&& [file join . $rep_tree_tail alpha a x y a] in $result \ |
expr { \ |
||||||
&& [file join . $rep_tree_tail alpha a x y z a] in $result \ |
[file join . $rep_tree_tail alpha a x a] in $result \ |
||||||
&& [file join . $rep_tree_tail alpha a x a leaf] ni $result \ |
&& [file join . $rep_tree_tail alpha a x y a] in $result \ |
||||||
&& [file join . $rep_tree_tail alpha a x y a leaf] ni $result \ |
&& [file join . $rep_tree_tail alpha a x y z a] in $result \ |
||||||
&& [file join . $rep_tree_tail alpha a x y z a leaf] ni $result \ |
&& [file join . $rep_tree_tail alpha a x a leaf] ni $result \ |
||||||
} |
&& [file join . $rep_tree_tail alpha a x y a leaf] ni $result \ |
||||||
} \ |
&& [file join . $rep_tree_tail alpha a x y z a leaf] ni $result \ |
||||||
-cleanup $repeated_subfolders_cleanup \ |
} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $repeated_subfolders_cleanup \ |
||||||
test subfolders_repeated_segments_nonmatching_pattern {Repeated path segments are retained when pattern literals do not match} \ |
-result 1 |
||||||
-setup $repeated_subfolders_tree -body { |
|
||||||
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/b/**} .] |
test subfolders_repeated_segments_nonmatching_pattern {Repeated path segments are retained when pattern literals do not match} \ |
||||||
expr { \ |
-setup $repeated_subfolders_tree -body { |
||||||
[file join . $rep_tree_tail alpha a x a leaf] in $result \ |
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/b/**} .] |
||||||
&& [file join . $rep_tree_tail alpha a x y a leaf] in $result \ |
expr { \ |
||||||
&& [file join . $rep_tree_tail alpha a x y z a leaf] in $result \ |
[file join . $rep_tree_tail alpha a x a leaf] in $result \ |
||||||
} |
&& [file join . $rep_tree_tail alpha a x y a leaf] in $result \ |
||||||
} \ |
&& [file join . $rep_tree_tail alpha a x y z a leaf] in $result \ |
||||||
-cleanup $repeated_subfolders_cleanup \ |
} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $repeated_subfolders_cleanup \ |
||||||
test subfolders_repeated_segments_exact_boundary {Exact repeated segment excludes boundary node but still traverses below it} \ |
-result 1 |
||||||
-setup $repeated_subfolders_tree -body { |
|
||||||
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/a} .] |
test subfolders_repeated_segments_exact_boundary {Exact repeated segment excludes boundary node but still traverses below it} \ |
||||||
expr { \ |
-setup $repeated_subfolders_tree -body { |
||||||
[file join . $rep_tree_tail alpha a x a] ni $result \ |
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/a} .] |
||||||
&& [file join . $rep_tree_tail alpha a x a leaf] in $result \ |
expr { \ |
||||||
&& [file join . $rep_tree_tail alpha a x y a] in $result \ |
[file join . $rep_tree_tail alpha a x a] ni $result \ |
||||||
} |
&& [file join . $rep_tree_tail alpha a x a leaf] in $result \ |
||||||
} \ |
&& [file join . $rep_tree_tail alpha a x y a] in $result \ |
||||||
-cleanup $repeated_subfolders_cleanup \ |
} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $repeated_subfolders_cleanup \ |
||||||
test subfolders_repeated_segments_adjacent_literals {Adjacent repeated literals match only adjacent path segments} \ |
-result 1 |
||||||
-setup $repeated_subfolders_tree -body { |
|
||||||
set result [punk::path::subfolders -recursive -exclude-paths {**/a/a/**} .] |
test subfolders_repeated_segments_adjacent_literals {Adjacent repeated literals match only adjacent path segments} \ |
||||||
expr { \ |
-setup $repeated_subfolders_tree -body { |
||||||
[file join . $rep_tree_tail alpha a a] in $result \ |
set result [punk::path::subfolders -recursive -exclude-paths {**/a/a/**} .] |
||||||
&& [file join . $rep_tree_tail alpha a a leaf] ni $result \ |
expr { \ |
||||||
&& [file join . $rep_tree_tail alpha a x a leaf] in $result \ |
[file join . $rep_tree_tail alpha a a] in $result \ |
||||||
} |
&& [file join . $rep_tree_tail alpha a a leaf] ni $result \ |
||||||
} \ |
&& [file join . $rep_tree_tail alpha a x a leaf] in $result \ |
||||||
-cleanup $repeated_subfolders_cleanup \ |
} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $repeated_subfolders_cleanup \ |
||||||
test subfolders_repeated_segments_question_segment {Question mark wildcard matches exactly one character within one segment} \ |
-result 1 |
||||||
-setup $repeated_subfolders_tree -body { |
|
||||||
set result [punk::path::subfolders -recursive -exclude-paths {**/a/?/a/**} .] |
test subfolders_repeated_segments_question_segment {Question mark wildcard matches exactly one character within one segment} \ |
||||||
expr { \ |
-setup $repeated_subfolders_tree -body { |
||||||
[file join . $rep_tree_tail alpha a x a] in $result \ |
set result [punk::path::subfolders -recursive -exclude-paths {**/a/?/a/**} .] |
||||||
&& [file join . $rep_tree_tail alpha a x a leaf] ni $result \ |
expr { \ |
||||||
&& [file join . $rep_tree_tail alpha a xx a leaf] in $result \ |
[file join . $rep_tree_tail alpha a x a] in $result \ |
||||||
} |
&& [file join . $rep_tree_tail alpha a x a leaf] ni $result \ |
||||||
} \ |
&& [file join . $rep_tree_tail alpha a xx a leaf] in $result \ |
||||||
-cleanup $repeated_subfolders_cleanup \ |
} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $repeated_subfolders_cleanup \ |
||||||
test subfolders_repeated_segments_similar_names {Similar segment names do not match repeated literal a patterns accidentally} \ |
-result 1 |
||||||
-setup $repeated_subfolders_tree -body { |
|
||||||
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/a/**} .] |
test subfolders_repeated_segments_similar_names {Similar segment names do not match repeated literal a patterns accidentally} \ |
||||||
expr { \ |
-setup $repeated_subfolders_tree -body { |
||||||
[file join . $rep_tree_tail alpha a q aa leaf] in $result \ |
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/a/**} .] |
||||||
&& [file join . $rep_tree_tail alpha aa x a leaf] in $result \ |
expr { \ |
||||||
} |
[file join . $rep_tree_tail alpha a q aa leaf] in $result \ |
||||||
} \ |
&& [file join . $rep_tree_tail alpha aa x a leaf] in $result \ |
||||||
-cleanup $repeated_subfolders_cleanup \ |
} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $repeated_subfolders_cleanup \ |
||||||
test subfolders_repeated_segments_similar_name_patterns {Similar literal aa patterns match only their own segment shapes} \ |
-result 1 |
||||||
-setup $repeated_subfolders_tree -body { |
|
||||||
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/aa/** **/aa/*/a/**} .] |
test subfolders_repeated_segments_similar_name_patterns {Similar literal aa patterns match only their own segment shapes} \ |
||||||
expr { \ |
-setup $repeated_subfolders_tree -body { |
||||||
[file join . $rep_tree_tail alpha a q aa] in $result \ |
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/aa/** **/aa/*/a/**} .] |
||||||
&& [file join . $rep_tree_tail alpha a q aa leaf] ni $result \ |
expr { \ |
||||||
&& [file join . $rep_tree_tail alpha aa x a] in $result \ |
[file join . $rep_tree_tail alpha a q aa] in $result \ |
||||||
&& [file join . $rep_tree_tail alpha aa x a leaf] ni $result \ |
&& [file join . $rep_tree_tail alpha a q aa leaf] ni $result \ |
||||||
&& [file join . $rep_tree_tail alpha a x a leaf] in $result \ |
&& [file join . $rep_tree_tail alpha aa x a] in $result \ |
||||||
} |
&& [file join . $rep_tree_tail alpha aa x a leaf] ni $result \ |
||||||
} \ |
&& [file join . $rep_tree_tail alpha a x a leaf] in $result \ |
||||||
-cleanup $repeated_subfolders_cleanup \ |
} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $repeated_subfolders_cleanup \ |
||||||
test subfolders_repeated_segments_overlapping_patterns {Overlapping repeated segment excludes prune each matching shape independently} \ |
-result 1 |
||||||
-setup $repeated_subfolders_tree -body { |
|
||||||
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/a/** **/a/*/*/a/**} .] |
test subfolders_repeated_segments_overlapping_patterns {Overlapping repeated segment excludes prune each matching shape independently} \ |
||||||
expr { \ |
-setup $repeated_subfolders_tree -body { |
||||||
[file join . $rep_tree_tail alpha a x a leaf] ni $result \ |
set result [punk::path::subfolders -recursive -exclude-paths {**/a/*/a/** **/a/*/*/a/**} .] |
||||||
&& [file join . $rep_tree_tail alpha a x y a leaf] ni $result \ |
expr { \ |
||||||
&& [file join . $rep_tree_tail alpha a x y z a leaf] in $result \ |
[file join . $rep_tree_tail alpha a x a leaf] ni $result \ |
||||||
&& [file join . $rep_tree_tail alpha a x y z keep] in $result \ |
&& [file join . $rep_tree_tail alpha a x y a leaf] ni $result \ |
||||||
} |
&& [file join . $rep_tree_tail alpha a x y z a leaf] in $result \ |
||||||
} \ |
&& [file join . $rep_tree_tail alpha a x y z keep] in $result \ |
||||||
-cleanup $repeated_subfolders_cleanup \ |
} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $repeated_subfolders_cleanup \ |
||||||
test treefilenames_recurse_nested_positive_glob {Positive glob traversal reaches nested matches below unmatched ancestors} \ |
-result 1 |
||||||
-setup $treefilenames_tree -body { |
|
||||||
set result [lsort [punk::path::treefilenames -sort none -directory . -include-paths {**/src/**} *.txt]] |
test treefilenames_recurse_nested_positive_glob {Positive glob traversal reaches nested matches below unmatched ancestors} \ |
||||||
set expected [lsort [list \ |
-setup $treefilenames_tree -body { |
||||||
[file join . $tf_tree_tail src vfs deep deep.txt] \ |
set result [lsort [punk::path::treefilenames -sort none -directory . -include-paths {**/src/**} *.txt]] |
||||||
[file join . $tf_tree_tail src vfs vfs.txt] \ |
set expected [lsort [list \ |
||||||
]] |
[file join . $tf_tree_tail src vfs deep deep.txt] \ |
||||||
expr {$result eq $expected} |
[file join . $tf_tree_tail src vfs vfs.txt] \ |
||||||
} \ |
]] |
||||||
-cleanup $treefilenames_cleanup \ |
expr {$result eq $expected} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $treefilenames_cleanup \ |
||||||
test treefilenames_nonexistent_glob_path_returns_empty {Non-matching glob_paths subtree should return no files} \ |
-result 1 |
||||||
-setup $treefilenames_tree -body { |
|
||||||
set result [punk::path::treefilenames -sort none -directory . -include-paths {**/nonexistantfolder/**} *] |
test treefilenames_nonexistent_glob_path_returns_empty {Non-matching glob_paths subtree should return no files} \ |
||||||
expr {$result eq [list]} |
-setup $treefilenames_tree -body { |
||||||
} \ |
set result [punk::path::treefilenames -sort none -directory . -include-paths {**/nonexistantfolder/**} *] |
||||||
-cleanup $treefilenames_cleanup \ |
expr {$result eq [list]} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $treefilenames_cleanup \ |
||||||
test treefilenames_tailbase_newbase_returns_tree_tail {Tailbase can trim returned filenames to the tree folder} \ |
-result 1 |
||||||
-setup $treefilenames_tree -body { |
|
||||||
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_newbase *.txt]] |
test treefilenames_include_paths_subdir_boundary_before_exact {Include paths include internal and trailing subdir matches when subtree pattern appears first} \ |
||||||
set expected [lsort [list \ |
-setup $treefilenames_tree -body { |
||||||
[file join $tf_tree_tail aside aside.txt] \ |
set result [lsort [punk::path::treefilenames -sort none -directory . -include-paths {**/subdir/** **/subdir} *.txt]] |
||||||
[file join $tf_tree_tail aside child child.txt] \ |
set expected [lsort [list \ |
||||||
[file join $tf_tree_tail aside child grandchild grandchild.txt] \ |
[file join . $tf_tree_tail alpha subdir deep deep.txt] \ |
||||||
[file join $tf_tree_tail b other other.txt] \ |
[file join . $tf_tree_tail alpha subdir direct.txt] \ |
||||||
[file join $tf_tree_tail keep keep.txt] \ |
]] |
||||||
[file join $tf_tree_tail src srcroot.txt] \ |
if {$result ne $expected} { |
||||||
[file join $tf_tree_tail src vfs deep deep.txt] \ |
error "result mismatch\nexpected: $expected\nactual: $result" |
||||||
[file join $tf_tree_tail src vfs vfs.txt] \ |
} |
||||||
]] |
expr {$result eq $expected} |
||||||
expr {$result eq $expected} |
} \ |
||||||
} \ |
-cleanup $treefilenames_cleanup \ |
||||||
-cleanup $treefilenames_cleanup \ |
-result 1 |
||||||
-result 1 |
|
||||||
|
test treefilenames_include_paths_subdir_exact_before_boundary {Include paths include internal and trailing subdir matches when exact pattern appears first} \ |
||||||
test treefilenames_tailbase_tree_root_returns_tree_relative {Tailbase can trim returned filenames to paths below the search root} \ |
-setup $treefilenames_tree -body { |
||||||
-setup $treefilenames_tree -body { |
set result [lsort [punk::path::treefilenames -sort none -directory . -include-paths {**/subdir **/subdir/**} *.txt]] |
||||||
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_tree_root *.txt]] |
set expected [lsort [list \ |
||||||
set expected [lsort [list \ |
[file join . $tf_tree_tail alpha subdir deep deep.txt] \ |
||||||
[file join aside aside.txt] \ |
[file join . $tf_tree_tail alpha subdir direct.txt] \ |
||||||
[file join aside child child.txt] \ |
]] |
||||||
[file join aside child grandchild grandchild.txt] \ |
if {$result ne $expected} { |
||||||
[file join b other other.txt] \ |
error "result mismatch\nexpected: $expected\nactual: $result" |
||||||
[file join keep keep.txt] \ |
} |
||||||
[file join src srcroot.txt] \ |
expr {$result eq $expected} |
||||||
[file join src vfs deep deep.txt] \ |
} \ |
||||||
[file join src vfs vfs.txt] \ |
-cleanup $treefilenames_cleanup \ |
||||||
]] |
-result 1 |
||||||
expr {$result eq $expected} |
|
||||||
} \ |
test treefilenames_tailbase_newbase_returns_tree_tail {Tailbase can trim returned filenames to the tree folder} \ |
||||||
-cleanup $treefilenames_cleanup \ |
-setup $treefilenames_tree -body { |
||||||
-result 1 |
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_newbase *.txt]] |
||||||
|
set expected [lsort [list \ |
||||||
test treefilenames_tailbase_exclude_paths_match_returned_paths {Exclude paths match tailbase-relative returned paths} \ |
[file join $tf_tree_tail alpha subdir deep deep.txt] \ |
||||||
-setup $treefilenames_tree -body { |
[file join $tf_tree_tail alpha subdir direct.txt] \ |
||||||
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_tree_root -exclude-paths {aside aside/** src/vfs/**} *.txt]] |
[file join $tf_tree_tail aside aside.txt] \ |
||||||
set expected [lsort [list \ |
[file join $tf_tree_tail aside child child.txt] \ |
||||||
[file join b other other.txt] \ |
[file join $tf_tree_tail aside child grandchild grandchild.txt] \ |
||||||
[file join keep keep.txt] \ |
[file join $tf_tree_tail b other other.txt] \ |
||||||
[file join src srcroot.txt] \ |
[file join $tf_tree_tail keep keep.txt] \ |
||||||
[file join src vfs vfs.txt] \ |
[file join $tf_tree_tail src srcroot.txt] \ |
||||||
]] |
[file join $tf_tree_tail src vfs deep deep.txt] \ |
||||||
expr {$result eq $expected} |
[file join $tf_tree_tail src vfs vfs.txt] \ |
||||||
} \ |
]] |
||||||
-cleanup $treefilenames_cleanup \ |
expr {$result eq $expected} |
||||||
-result 1 |
} \ |
||||||
|
-cleanup $treefilenames_cleanup \ |
||||||
test treefilenames_tailbase_include_paths_match_tree_root_relative_paths {Include paths match tailbase-relative paths below the tree root} \ |
-result 1 |
||||||
-setup $treefilenames_tree -body { |
|
||||||
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_tree_root -include-paths {src/**} *.txt]] |
test treefilenames_tailbase_tree_root_returns_tree_relative {Tailbase can trim returned filenames to paths below the search root} \ |
||||||
set expected [lsort [list \ |
-setup $treefilenames_tree -body { |
||||||
[file join src vfs deep deep.txt] \ |
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_tree_root *.txt]] |
||||||
[file join src vfs vfs.txt] \ |
set expected [lsort [list \ |
||||||
]] |
[file join alpha subdir deep deep.txt] \ |
||||||
expr {$result eq $expected} |
[file join alpha subdir direct.txt] \ |
||||||
} \ |
[file join aside aside.txt] \ |
||||||
-cleanup $treefilenames_cleanup \ |
[file join aside child child.txt] \ |
||||||
-result 1 |
[file join aside child grandchild grandchild.txt] \ |
||||||
|
[file join b other other.txt] \ |
||||||
test treefilenames_tailbase_include_paths_match_newbase_relative_paths {Include paths include the tree folder when tailbase is above the search root} \ |
[file join keep keep.txt] \ |
||||||
-setup $treefilenames_tree -body { |
[file join src srcroot.txt] \ |
||||||
set include_path [file join $tf_tree_tail src **] |
[file join src vfs deep deep.txt] \ |
||||||
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_newbase -include-paths [list $include_path] *.txt]] |
[file join src vfs vfs.txt] \ |
||||||
set expected [lsort [list \ |
]] |
||||||
[file join $tf_tree_tail src vfs deep deep.txt] \ |
expr {$result eq $expected} |
||||||
[file join $tf_tree_tail src vfs vfs.txt] \ |
} \ |
||||||
]] |
-cleanup $treefilenames_cleanup \ |
||||||
expr {$result eq $expected} |
-result 1 |
||||||
} \ |
|
||||||
-cleanup $treefilenames_cleanup \ |
test treefilenames_tailbase_exclude_paths_match_returned_paths {Exclude paths match tailbase-relative returned paths} \ |
||||||
-result 1 |
-setup $treefilenames_tree -body { |
||||||
|
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_tree_root -exclude-paths {aside aside/** src/vfs/**} *.txt]] |
||||||
test treefilenames_tailbase_include_and_exclude_paths_share_relative_base {Include and exclude paths use the same tailbase-relative base} \ |
set expected [lsort [list \ |
||||||
-setup $treefilenames_tree -body { |
[file join alpha subdir deep deep.txt] \ |
||||||
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_tree_root -include-paths {src/**} -exclude-paths {src/vfs/**} *.txt]] |
[file join alpha subdir direct.txt] \ |
||||||
set expected [list [file join src vfs vfs.txt]] |
[file join b other other.txt] \ |
||||||
expr {$result eq $expected} |
[file join keep keep.txt] \ |
||||||
} \ |
[file join src srcroot.txt] \ |
||||||
-cleanup $treefilenames_cleanup \ |
[file join src vfs vfs.txt] \ |
||||||
-result 1 |
]] |
||||||
|
expr {$result eq $expected} |
||||||
test treefilenames_rejects_internal_call_flags {Internal recursion state flags are not public API} \ |
} \ |
||||||
-setup $treefilenames_tree -body { |
-cleanup $treefilenames_cleanup \ |
||||||
set results [list] |
-result 1 |
||||||
foreach arglist { |
|
||||||
{-call-depth-internal 1 -directory . *} |
test treefilenames_tailbase_include_paths_match_tree_root_relative_paths {Include paths match tailbase-relative paths below the tree root} \ |
||||||
{-call-subvector {a b} -directory . *} |
-setup $treefilenames_tree -body { |
||||||
{-call-allbelow 1 -directory . *} |
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_tree_root -include-paths {src/**} *.txt]] |
||||||
} { |
set expected [lsort [list \ |
||||||
lappend results [catch {punk::path::treefilenames {*}$arglist}] |
[file join src vfs deep deep.txt] \ |
||||||
} |
[file join src vfs vfs.txt] \ |
||||||
expr {$results eq {1 1 1}} |
]] |
||||||
} \ |
expr {$result eq $expected} |
||||||
-cleanup $treefilenames_cleanup \ |
} \ |
||||||
-result 1 |
-cleanup $treefilenames_cleanup \ |
||||||
} |
-result 1 |
||||||
|
|
||||||
|
test treefilenames_tailbase_include_paths_subdir_boundary_before_exact {Tailbase include paths include internal and trailing subdir matches when subtree pattern appears first} \ |
||||||
|
-setup $treefilenames_tree -body { |
||||||
|
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_tree_root -include-paths {**/subdir/** **/subdir} *.txt]] |
||||||
|
set expected [lsort [list \ |
||||||
|
[file join alpha subdir deep deep.txt] \ |
||||||
|
[file join alpha subdir direct.txt] \ |
||||||
|
]] |
||||||
|
if {$result ne $expected} { |
||||||
|
error "result mismatch\nexpected: $expected\nactual: $result" |
||||||
|
} |
||||||
|
expr {$result eq $expected} |
||||||
|
} \ |
||||||
|
-cleanup $treefilenames_cleanup \ |
||||||
|
-result 1 |
||||||
|
|
||||||
|
test treefilenames_tailbase_include_paths_subdir_exact_before_boundary {Tailbase include paths include internal and trailing subdir matches when exact pattern appears first} \ |
||||||
|
-setup $treefilenames_tree -body { |
||||||
|
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_tree_root -include-paths {**/subdir **/subdir/**} *.txt]] |
||||||
|
set expected [lsort [list \ |
||||||
|
[file join alpha subdir deep deep.txt] \ |
||||||
|
[file join alpha subdir direct.txt] \ |
||||||
|
]] |
||||||
|
if {$result ne $expected} { |
||||||
|
error "result mismatch\nexpected: $expected\nactual: $result" |
||||||
|
} |
||||||
|
expr {$result eq $expected} |
||||||
|
} \ |
||||||
|
-cleanup $treefilenames_cleanup \ |
||||||
|
-result 1 |
||||||
|
|
||||||
|
test treefilenames_tailbase_include_paths_match_newbase_relative_paths {Include paths include the tree folder when tailbase is above the search root} \ |
||||||
|
-setup $treefilenames_tree -body { |
||||||
|
set include_path [file join $tf_tree_tail src **] |
||||||
|
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_newbase -include-paths [list $include_path] *.txt]] |
||||||
|
set expected [lsort [list \ |
||||||
|
[file join $tf_tree_tail src vfs deep deep.txt] \ |
||||||
|
[file join $tf_tree_tail src vfs vfs.txt] \ |
||||||
|
]] |
||||||
|
expr {$result eq $expected} |
||||||
|
} \ |
||||||
|
-cleanup $treefilenames_cleanup \ |
||||||
|
-result 1 |
||||||
|
|
||||||
|
test treefilenames_tailbase_include_and_exclude_paths_share_relative_base {Include and exclude paths use the same tailbase-relative base} \ |
||||||
|
-setup $treefilenames_tree -body { |
||||||
|
set result [lsort [punk::path::treefilenames -sort none -directory $tf_tree_root -tailbase $tf_tree_root -include-paths {src/**} -exclude-paths {src/vfs/**} *.txt]] |
||||||
|
set expected [list [file join src vfs vfs.txt]] |
||||||
|
expr {$result eq $expected} |
||||||
|
} \ |
||||||
|
-cleanup $treefilenames_cleanup \ |
||||||
|
-result 1 |
||||||
|
|
||||||
|
test treefilenames_rejects_internal_call_flags {Internal recursion state flags are not public API} \ |
||||||
|
-setup $treefilenames_tree -body { |
||||||
|
set results [list] |
||||||
|
foreach arglist { |
||||||
|
{-call-depth-internal 1 -directory . *} |
||||||
|
{-call-subvector {a b} -directory . *} |
||||||
|
{-call-allbelow 1 -directory . *} |
||||||
|
} { |
||||||
|
lappend results [catch {punk::path::treefilenames {*}$arglist}] |
||||||
|
} |
||||||
|
expr {$results eq {1 1 1}} |
||||||
|
} \ |
||||||
|
-cleanup $treefilenames_cleanup \ |
||||||
|
-result 1 |
||||||
|
} |
||||||
|
|
||||||
tcltest::cleanupTests ;#needed to produce test summary. |
tcltest::cleanupTests ;#needed to produce test summary. |
||||||
Loading…
Reference in new issue