zdharma-continuum.zinit/tests/config-zstyle.zunit
vladdoster 8f89f88cfd feat(zsh): allow configuring settings like HOME_DIR/BIN_DIR via zstyle
Resolve ZINIT[...] settings from `zstyle ':zinit:config' <attr>` before
the BIN_DIR/HOME_DIR/derived-dir logic runs. The attribute name is the
hash field lowercased with `_` replaced by `-` (HOME_DIR -> home-dir).

An explicitly-set ZINIT[KEY] always wins over zstyle, which wins over
the built-in default; fully backward-compatible.

Signed-off-by: Vladislav Doster <mvdoster@gmail.com>
2026-06-18 19:05:42 -05:00

69 lines
2.7 KiB
Bash

#!/usr/bin/env zunit
# vim:ft=zsh:sw=4:sts=4:et:foldmarker={,}:foldmethod=marker
#
# zdharma-continuum/zinit/tests/config-zstyle.zunit
# Copyright (c) 2016-2021 Sebastian Gniazdowski
# Copyright (c) 2021-2024 zdharma-continuum
# Homepage: https://github.com/zdharma-continuum/zinit
# License: MIT License
#
# Tests for configuring ZINIT[...] settings via `zstyle ':zinit:config' ...'.
#
# NOTE: the test bootstrap pre-sets every ZINIT[KEY], which would mask the
# zstyle path. Each test therefore exercises the feature in a CLEAN
# `zsh -fc` subshell that sets a zstyle, sources the patched zinit.zsh
# (located at ${ZINIT[BIN_DIR]}/zinit.zsh inside the test env) and prints the
# resulting hash field.
#
# The subshell is captured with `$(...)` rather than zunit's `run`: `run`
# re-`eval`s its arguments in the *outer* process, where the bootstrap has
# already populated ZINIT[HOME_DIR] et al., which would clobber the inner
# `${ZINIT[...]}` reads we want to observe. Single-quoting the inner script
# defers those reads to the subshell; only ${ZINIT[BIN_DIR]} is expanded
# (concatenated in) by the outer shell to locate zinit.zsh.
#
@test 'zstyle fills an unset key' {
output=$(zsh -fc 'zmodload zsh/zutil; typeset -gAH ZINIT
ZINIT[BIN_DIR]='"${ZINIT[BIN_DIR]}"'
zstyle ":zinit:config" home-dir /tmp/zi-fromstyle
source '"${ZINIT[BIN_DIR]}"'/zinit.zsh >/dev/null 2>&1
print -r -- ${ZINIT[HOME_DIR]}')
state=$?
assert $state equals 0
assert $output same_as '/tmp/zi-fromstyle'
}
@test 'explicit ZINIT[KEY] beats zstyle' {
output=$(zsh -fc 'zmodload zsh/zutil; typeset -gAH ZINIT
ZINIT[BIN_DIR]='"${ZINIT[BIN_DIR]}"'
ZINIT[HOME_DIR]=/tmp/zi-explicit
zstyle ":zinit:config" home-dir /tmp/zi-fromstyle
source '"${ZINIT[BIN_DIR]}"'/zinit.zsh >/dev/null 2>&1
print -r -- ${ZINIT[HOME_DIR]}')
state=$?
assert $state equals 0
assert $output same_as '/tmp/zi-explicit'
}
@test 'derived dir follows zstyle-provided home-dir' {
output=$(zsh -fc 'zmodload zsh/zutil; typeset -gAH ZINIT
ZINIT[BIN_DIR]='"${ZINIT[BIN_DIR]}"'
zstyle ":zinit:config" home-dir /tmp/zi-fromstyle
source '"${ZINIT[BIN_DIR]}"'/zinit.zsh >/dev/null 2>&1
print -r -- ${ZINIT[PLUGINS_DIR]}')
state=$?
assert $state equals 0
assert $output same_as '/tmp/zi-fromstyle/plugins'
}
@test 'no zstyle, no array still resolves a default home-dir' {
output=$(zsh -fc 'zmodload zsh/zutil; typeset -gAH ZINIT
ZINIT[BIN_DIR]='"${ZINIT[BIN_DIR]}"'
source '"${ZINIT[BIN_DIR]}"'/zinit.zsh >/dev/null 2>&1
[[ -n ${ZINIT[HOME_DIR]} ]] && print OK')
state=$?
assert $state equals 0
assert $output same_as 'OK'
}