github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/eval/chdir_test.go (about) 1 package eval_test 2 3 import ( 4 "os" 5 "testing" 6 7 "github.com/markusbkk/elvish/pkg/env" 8 . "github.com/markusbkk/elvish/pkg/eval" 9 10 . "github.com/markusbkk/elvish/pkg/eval/evaltest" 11 "github.com/markusbkk/elvish/pkg/parse" 12 "github.com/markusbkk/elvish/pkg/testutil" 13 ) 14 15 func TestChdir(t *testing.T) { 16 dst := testutil.TempDir(t) 17 18 ev := NewEvaler() 19 20 argDirInBefore, argDirInAfter := "", "" 21 ev.AddBeforeChdir(func(dir string) { argDirInBefore = dir }) 22 ev.AddAfterChdir(func(dir string) { argDirInAfter = dir }) 23 24 back := saveWd() 25 defer back() 26 27 err := ev.Chdir(dst) 28 29 if err != nil { 30 t.Errorf("Chdir => error %v", err) 31 } 32 if envPwd := os.Getenv(env.PWD); envPwd != dst { 33 t.Errorf("$PWD is %q after Chdir, want %q", envPwd, dst) 34 } 35 36 if argDirInBefore != dst { 37 t.Errorf("Chdir called before-hook with %q, want %q", 38 argDirInBefore, dst) 39 } 40 if argDirInAfter != dst { 41 t.Errorf("Chdir called before-hook with %q, want %q", 42 argDirInAfter, dst) 43 } 44 } 45 46 func TestChdirElvishHooks(t *testing.T) { 47 dst := testutil.TempDir(t) 48 49 back := saveWd() 50 defer back() 51 52 Test(t, 53 That(` 54 var dir-in-before dir-in-after = '' '' 55 set @before-chdir = {|dst| set dir-in-before = $dst } 56 set @after-chdir = {|dst| set dir-in-after = $dst } 57 cd `+parse.Quote(dst)+` 58 put $dir-in-before $dir-in-after 59 `).Puts(dst, dst), 60 ) 61 } 62 63 func TestChdirError(t *testing.T) { 64 testutil.InTempDir(t) 65 66 ev := NewEvaler() 67 err := ev.Chdir("i/dont/exist") 68 if err == nil { 69 t.Errorf("Chdir => no error when dir does not exist") 70 } 71 } 72 73 // Saves the current working directory, and returns a function for returning to 74 // it. 75 func saveWd() func() { 76 wd, err := os.Getwd() 77 if err != nil { 78 panic(err) 79 } 80 return func() { 81 testutil.MustChdir(wd) 82 } 83 }