nushell/crates/nu-std/tests/test_dirs.nu
Bram Geron 86f12ffe61
Fix bug in std dirs drop; improve documentation (#9449)
# Description

When the directory stack contains only two directories, then std dirs
drop
used to misbehave and (essentially) drop the other directory, instead of
dropping the current directory.

This is fixed by always cd'ing for std dirs drop.

Before:

    /tmp〉enter ..
    /〉dexit
    /〉

After:

    /tmp〉enter ..
    /〉dexit
    /tmp〉


Additionally, I propose to explain the relevant environment variables a
bit
more thoroughly.


# User-Facing Changes

- Fix bug in dexit (std dirs drop) when two directories are remaining

# Tests + Formatting

Added a regression test. Made the existing test easier to understand.
2023-06-16 10:42:50 +02:00

130 lines
4.3 KiB
Text

use std assert
use std assert
use std log
# A couple of nuances to understand when testing module that exports environment:
# Each 'use' for that module in the test script will execute the def-env block.
# PWD at the time of the `use` will be what the export def-env block will see.
def before-each [] {
# need some directories to play with
let base_path = ($nu.temp-path | path join $"test_dirs_(random uuid)")
let path_a = ($base_path | path join "a")
let path_b = ($base_path | path join "b")
mkdir $base_path $path_a $path_b
{base_path: $base_path, path_a: $path_a, path_b: $path_b}
}
def after-each [] {
let base_path = $in.base_path
cd $base_path
cd ..
rm -r $base_path
}
def cur_dir_check [expect_dir, scenario] {
log debug $"check dir ($expect_dir), scenario ($scenario)"
assert equal $expect_dir $env.PWD $"expected not PWD after ($scenario)"
}
def cur_ring_check [expect_dir:string, expect_position: int scenario:string] {
log debug $"check ring ($expect_dir), position ($expect_position) scenario ($scenario)"
assert ($expect_position < ($env.DIRS_LIST | length)) $"ring big enough after ($scenario)"
assert equal $expect_position $env.DIRS_POSITION $"position in ring after ($scenario)"
}
def test_dirs_command [] {
# careful with order of these statements!
# must capture value of $in before executing `use`s
let $c = $in
# must set PWD *before* doing `use` that will run the def-env block in dirs module.
cd $c.base_path
# must execute these uses for the UOT commands *after* the test and *not* just put them at top of test module.
# the def-env gets messed up
use std dirs
# Stack: [BASE]
assert equal [$c.base_path] $env.DIRS_LIST "list is just pwd after initialization"
dirs next
assert equal $c.base_path $env.DIRS_LIST.0 "next wraps at end of list"
dirs prev
assert equal $c.base_path $env.DIRS_LIST.0 "prev wraps at top of list"
# Stack becomes: [base PATH_B path_a]
dirs add $c.path_b $c.path_a
assert equal $c.path_b $env.PWD "add changes PWD to first added dir"
assert length $env.DIRS_LIST 3 "add in fact adds to list"
assert equal $c.path_a $env.DIRS_LIST.2 "add in fact adds to list"
# Stack becomes: [BASE path_b path_a]
dirs next 2
# assert (not) equal requires span.start of first arg < span.end of 2nd
assert equal $env.PWD $c.base_path "next wraps at end of list"
# Stack becomes: [base path_b PATH_A]
dirs prev 1
assert equal $c.path_a $env.PWD "prev wraps at start of list"
cur_dir_check $c.path_a "prev wraps to end from start of list"
# Stack becomes: [base PATH_B]
dirs drop
assert length $env.DIRS_LIST 2 "drop removes from list"
assert equal $env.PWD $c.path_b "drop changes PWD to previous in list (before dropped element)"
assert equal (dirs show) [[active path]; [false $c.base_path] [true $c.path_b]] "show table contains expected information"
# Stack becomes: [BASE]
dirs drop
assert length $env.DIRS_LIST 1 "drop removes from list"
assert equal $env.PWD $c.base_path "drop changes PWD (regression test for #9449)"
}
def test_dirs_next [] {
# must capture value of $in before executing `use`s
let $c = $in
# must set PWD *before* doing `use` that will run the def-env block in dirs module.
cd $c.base_path
assert equal $env.PWD $c.base_path "test setup"
use std dirs
cur_dir_check $c.base_path "use module test setup"
dirs add $c.path_a $c.path_b
cur_ring_check $c.path_a 1 "add 2, but pwd is first one added"
dirs next
cur_ring_check $c.path_b 2 "next to third"
dirs next
cur_ring_check $c.base_path 0 "next from top wraps to bottom of ring"
}
def test_dirs_cd [] {
# must capture value of $in before executing `use`s
let $c = $in
# must set PWD *before* doing `use` that will run the def-env block in dirs module.
cd $c.base_path
use std dirs
cur_dir_check $c.base_path "use module test setup"
cd $c.path_b
cur_ring_check $c.path_b 0 "cd with empty ring"
dirs add $c.path_a
cur_dir_check $c.path_a "can add 2nd directory"
cd $c.path_b
cur_ring_check $c.path_b 1 "cd at 2nd item on ring"
dirs next
cur_ring_check $c.path_b 0 "cd updates current position in non-empty ring"
assert equal [$c.path_b $c.path_b] $env.DIRS_LIST "cd updated both positions in ring"
}