@@ -592,6 +592,104 @@ T["shell_quote_windows"]["handles spaces"] = function()
592592 h .eq (' "hello world"' , result )
593593end
594594
595+ T [" path_join" ] = new_set ()
596+
597+ T [" path_join" ][" joins two path parts" ] = function ()
598+ local result = child .lua ([[
599+ local GitUtils = require("codecompanion._extensions.gitcommit.git_utils")
600+ local result = GitUtils.path_join("src", "main.lua")
601+ local has_sep = GitUtils.is_windows() and result:find("\\") ~= nil or result:find("/") ~= nil
602+ return has_sep and result:match("main%.lua") ~= nil
603+ ]] )
604+ h .eq (true , result )
605+ end
606+
607+ T [" path_join" ][" joins multiple path parts" ] = function ()
608+ local result = child .lua ([[
609+ local GitUtils = require("codecompanion._extensions.gitcommit.git_utils")
610+ local result = GitUtils.path_join("src", "components", "ui", "Button.tsx")
611+ return result:match("src") ~= nil
612+ and result:match("components") ~= nil
613+ and result:match("ui") ~= nil
614+ and result:match("Button%.tsx") ~= nil
615+ ]] )
616+ h .eq (true , result )
617+ end
618+
619+ T [" path_join" ][" handles windows backslashes" ] = function ()
620+ local result = child .lua ([[
621+ local GitUtils = require("codecompanion._extensions.gitcommit.git_utils")
622+ local result = GitUtils.path_join("C:\\\\Users", "test", "file.lua")
623+ local has_backslash = result:find("\\") ~= nil
624+ local has_users = result:find("Users") ~= nil
625+ local has_test = result:find("test") ~= nil
626+ local has_file = result:find("file%.lua") ~= nil
627+ return has_backslash and has_users and has_test and has_file
628+ ]] )
629+ h .eq (true , result )
630+ end
631+
632+ T [" path_join" ][" handles mixed separators" ] = function ()
633+ local result = child .lua ([[
634+ local GitUtils = require("codecompanion._extensions.gitcommit.git_utils")
635+ local result = GitUtils.path_join("C:/project", "src", "main.lua")
636+ return result:match("src") ~= nil and result:match("main%.lua") ~= nil
637+ ]] )
638+ h .eq (true , result )
639+ end
640+
641+ T [" path_join" ][" handles trailing slashes" ] = function ()
642+ local result = child .lua ([[
643+ local GitUtils = require("codecompanion._extensions.gitcommit.git_utils")
644+ local result = GitUtils.path_join("src/", "test/")
645+ return not result:match("//") and result:match("src") ~= nil and result:match("test") ~= nil
646+ ]] )
647+ h .eq (true , result )
648+ end
649+
650+ T [" path_join" ][" handles leading slashes in middle parts" ] = function ()
651+ local result = child .lua ([[
652+ local GitUtils = require("codecompanion._extensions.gitcommit.git_utils")
653+ local result = GitUtils.path_join("src", "/utils.lua")
654+ return not result:match("/utils") and result:match("utils%.lua") ~= nil
655+ ]] )
656+ h .eq (true , result )
657+ end
658+
659+ T [" path_join" ][" handles single part" ] = function ()
660+ local result = child .lua ([[
661+ local GitUtils = require("codecompanion._extensions.gitcommit.git_utils")
662+ return GitUtils.path_join("test.lua") == "test.lua"
663+ ]] )
664+ h .eq (true , result )
665+ end
666+
667+ T [" path_join" ][" returns empty string for no parts" ] = function ()
668+ local result = child .lua ([[
669+ local GitUtils = require("codecompanion._extensions.gitcommit.git_utils")
670+ return GitUtils.path_join() == ""
671+ ]] )
672+ h .eq (true , result )
673+ end
674+
675+ T [" path_join" ][" handles empty middle parts" ] = function ()
676+ local result = child .lua ([[
677+ local GitUtils = require("codecompanion._extensions.gitcommit.git_utils")
678+ local result = GitUtils.path_join("src", "", "test.lua")
679+ return not result:match("//") and result:match("test%.lua") ~= nil
680+ ]] )
681+ h .eq (true , result )
682+ end
683+
684+ T [" path_join" ][" preserves dots in path" ] = function ()
685+ local result = child .lua ([[
686+ local GitUtils = require("codecompanion._extensions.gitcommit.git_utils")
687+ local result = GitUtils.path_join("..", "utils.lua")
688+ return result:match("%.%.") ~= nil and result:match("utils%.lua") ~= nil
689+ ]] )
690+ h .eq (true , result )
691+ end
692+
595693T [" is_windows" ] = new_set ()
596694
597695T [" is_windows" ][" returns boolean" ] = function ()
0 commit comments