github.com/kolbycrouch/elvish@v0.14.1-0.20210614162631-215b9ac1c423/pkg/eval/chdir_test.go (about)

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