1+ #! /bin/bash
2+ # Comprehensive test suite for zsh-github-dark
3+ set -e
4+
5+ # Colors for output
6+ RED=' \033[0;31m'
7+ GREEN=' \033[0;32m'
8+ YELLOW=' \033[0;33m'
9+ BLUE=' \033[0;34m'
10+ NC=' \033[0m' # No Color
11+
12+ TESTS_PASSED=0
13+ TESTS_FAILED=0
14+
15+ # Test function
16+ run_test () {
17+ local test_name=" $1 "
18+ local test_command=" $2 "
19+
20+ echo -n " Testing $test_name ... "
21+
22+ if eval " $test_command " 2> /dev/null; then
23+ echo -e " ${GREEN} ✓${NC} "
24+ (( TESTS_PASSED++ ))
25+ else
26+ echo -e " ${RED} ✗${NC} "
27+ (( TESTS_FAILED++ ))
28+ fi
29+ }
30+
31+ echo -e " ${BLUE} Running zsh-github-dark test suite...${NC} "
32+ echo " "
33+
34+ # ========================================
35+ # SECTION 1: Basic Project Structure Tests
36+ # ========================================
37+ echo " === Basic Project Structure Tests ==="
38+
39+ # Syntax checks
40+ run_test " .zshrc syntax" " zsh -n src/.zshrc"
41+ run_test " install.sh syntax" " bash -n install.sh"
42+ run_test " pre-commit syntax" " bash -n git-hooks/pre-commit"
43+
44+ # Required files
45+ run_test " README.md exists" " test -f README.md"
46+ run_test " LICENSE exists" " test -f LICENSE"
47+ run_test " .zshrc exists" " test -f src/.zshrc"
48+ run_test " Terminal profile exists" " test -f src/github-dark.terminal"
49+ run_test " install.sh exists" " test -f install.sh"
50+
51+ # File permissions
52+ run_test " install.sh is executable" " test -x install.sh"
53+ run_test " pre-commit is executable" " test -x git-hooks/pre-commit"
54+
55+ # Project structure validation
56+ run_test " No config file" " ! test -f .zsh-github-dark.conf.example"
57+ run_test " No scripts directory" " ! test -d scripts"
58+
59+ # Installation tests
60+ run_test " install.sh dry run" " bash install.sh --dry-run | grep -q 'DRY RUN'"
61+ run_test " uninstall dry run" " bash install.sh --uninstall --dry-run | grep -q 'Uninstaller'"
62+
63+ # ========================================
64+ # SECTION 2: Advanced .zshrc Functionality Tests
65+ # ========================================
66+ echo " "
67+ echo " === Advanced .zshrc Functionality Tests ==="
68+
69+ # Create a temporary test environment
70+ TEST_DIR=$( mktemp -d)
71+ TEST_HOME=" $TEST_DIR /home"
72+ mkdir -p " $TEST_HOME "
73+
74+ # PATH Configuration Tests
75+ echo " "
76+ echo " --- PATH Configuration ---"
77+ run_test " Homebrew path added" "
78+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; echo \$ PATH' | grep -q '/opt/homebrew/bin'
79+ "
80+
81+ run_test " Coreutils path conditional" "
82+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; exit 0'
83+ "
84+
85+ # History Configuration Tests
86+ echo " "
87+ echo " --- History Configuration ---"
88+ run_test " HISTFILE set correctly" "
89+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; [[ \$ HISTFILE == ~/.zsh_history ]]'
90+ "
91+
92+ run_test " HISTSIZE set to 10000" "
93+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; [[ \$ HISTSIZE -eq 10000 ]]'
94+ "
95+
96+ run_test " SAVEHIST set to 10000" "
97+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; [[ \$ SAVEHIST -eq 10000 ]]'
98+ "
99+
100+ run_test " History ignore dups option" "
101+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; setopt | grep -q hist_ignore_dups'
102+ "
103+
104+ run_test " History ignore space option" "
105+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; setopt | grep -q hist_ignore_space'
106+ "
107+
108+ run_test " Share history option" "
109+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; setopt | grep -q share_history'
110+ "
111+
112+ # Alias Tests
113+ echo " "
114+ echo " --- Alias Definitions ---"
115+ run_test " ls alias defined" "
116+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; alias ls' | grep -q lsd
117+ "
118+
119+ run_test " ll alias defined" "
120+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; alias ll' | grep -q 'lsd -l'
121+ "
122+
123+ run_test " la alias defined" "
124+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; alias la' | grep -q 'lsd -la'
125+ "
126+
127+ run_test " l alias defined" "
128+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; alias l' | grep -q lsd
129+ "
130+
131+ run_test " dir alias defined" "
132+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; alias dir' | grep -q lsd
133+ "
134+
135+ run_test " vdir alias defined" "
136+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; alias vdir' | grep -q 'lsd -l'
137+ "
138+
139+ # Git Integration Tests
140+ echo " "
141+ echo " --- Git Integration ---"
142+
143+ # Create a mock git repo
144+ MOCK_REPO=" $TEST_DIR /mock-repo"
145+ mkdir -p " $MOCK_REPO "
146+ cd " $MOCK_REPO "
147+ git init --quiet
148+ git config user.email " test@example.com"
149+ git config user.name " Test User"
150+ echo " test" > file.txt
151+ git add file.txt
152+ git commit -m " Initial commit" --quiet
153+
154+ run_test " _git_branch function exists" "
155+ cd $MOCK_REPO && HOME=$TEST_HOME zsh -c 'source $OLDPWD /src/.zshrc 2>/dev/null; type _git_branch' | grep -q function
156+ "
157+
158+ run_test " Git branch detection" "
159+ cd $MOCK_REPO && HOME=$TEST_HOME zsh -c 'source $OLDPWD /src/.zshrc 2>/dev/null; _git_branch' | grep -q 'main\\ |master'
160+ "
161+
162+ # Make a change to test dirty state
163+ echo " changed" >> file.txt
164+
165+ run_test " Git dirty state detection" "
166+ cd $MOCK_REPO && HOME=$TEST_HOME zsh -c 'source $OLDPWD /src/.zshrc 2>/dev/null; _git_branch' | grep -q '\\ *'
167+ "
168+
169+ cd - > /dev/null
170+
171+ # Environment Variables
172+ echo " "
173+ echo " --- Environment Variables ---"
174+ run_test " LS_COLORS exported" "
175+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; [[ -n \$ LS_COLORS ]]'
176+ "
177+
178+ run_test " LS_COLORS contains directory colors" "
179+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; echo \$ LS_COLORS' | grep -q 'di=38;5;33'
180+ "
181+
182+ run_test " LS_COLORS contains python colors" "
183+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; echo \$ LS_COLORS' | grep -q '*.py=38;5;41'
184+ "
185+
186+ run_test " LS_COLORS contains typescript colors" "
187+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; echo \$ LS_COLORS' | grep -q '*.ts=38;5;81'
188+ "
189+
190+ # Optional Tool Integration Tests
191+ echo " "
192+ echo " --- Optional Tool Integration ---"
193+ run_test " pyenv integration safe when not installed" "
194+ HOME=$TEST_HOME PATH=/usr/bin:/bin zsh -c 'source src/.zshrc 2>/dev/null; exit 0'
195+ "
196+
197+ run_test " nvm integration safe when not installed" "
198+ HOME=$TEST_HOME zsh -c 'unset NVM_DIR; source src/.zshrc 2>/dev/null; exit 0'
199+ "
200+
201+ run_test " poetry integration safe when not installed" "
202+ HOME=$TEST_HOME PATH=/usr/bin:/bin zsh -c 'source src/.zshrc 2>/dev/null; exit 0'
203+ "
204+
205+ # Key Bindings
206+ echo " "
207+ echo " --- Key Bindings ---"
208+ run_test " Up arrow key binding set" "
209+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; bindkey' | grep -q '\\ ^\\ [\\ [A.*history-search-backward'
210+ "
211+
212+ run_test " Down arrow key binding set" "
213+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; bindkey' | grep -q '\\ ^\\ [\\ [B.*history-search-forward'
214+ "
215+
216+ run_test " Ctrl+R binding set" "
217+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; bindkey' | grep -q '\\ ^R.*history-incremental-search-backward'
218+ "
219+
220+ # Prompt Functions
221+ echo " "
222+ echo " --- Prompt Functions ---"
223+ run_test " build_prompt function exists" "
224+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; type build_prompt' | grep -q function
225+ "
226+
227+ run_test " preexec function exists" "
228+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; type preexec' | grep -q function
229+ "
230+
231+ run_test " precmd function exists" "
232+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; type precmd' | grep -q function
233+ "
234+
235+ run_test " Prompt contains username" "
236+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; build_prompt; echo \$ PROMPT' | grep -q '%n'
237+ "
238+
239+ run_test " Prompt contains hostname" "
240+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; build_prompt; echo \$ PROMPT' | grep -q '%m'
241+ "
242+
243+ run_test " Prompt contains directory" "
244+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; build_prompt; echo \$ PROMPT' | grep -q '%~'
245+ "
246+
247+ run_test " Prompt has newline before prompt char" "
248+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; build_prompt; echo \$ PROMPT' | grep -q $'\\ n'
249+ "
250+
251+ # Completion System
252+ echo " "
253+ echo " --- Completion System ---"
254+ run_test " compinit is called" "
255+ HOME=$TEST_HOME zsh -c 'source src/.zshrc 2>/dev/null; type _complete' | grep -q function
256+ "
257+
258+ # Cleanup
259+ rm -rf " $TEST_DIR "
260+
261+ # ========================================
262+ # Summary
263+ # ========================================
264+ echo " "
265+ echo " ================================"
266+ echo -e " Tests passed: ${GREEN} $TESTS_PASSED ${NC} "
267+ echo -e " Tests failed: ${RED} $TESTS_FAILED ${NC} "
268+ echo " ================================"
269+
270+ if [ $TESTS_FAILED -eq 0 ]; then
271+ echo -e " ${GREEN} All tests passed!${NC} "
272+ exit 0
273+ else
274+ echo -e " ${RED} Some tests failed!${NC} "
275+ exit 1
276+ fi
0 commit comments