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  }