Merge pull request #944 from dritter/prepare_066

Preparing for v0.6.6 release!
pull/22/head
Ben Hilburn 6 years ago committed by GitHub
commit e207dec8de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,33 +1,77 @@
sudo: true
dist: trusty
language: sh language: sh
os:
- linux
- osx
osx_image: xcode9.4
addons: addons:
apt: apt:
packages: packages:
- build-essential - build-essential
- git
- mercurial
- subversion
- jq
- node
- golang
- ruby
- python
- python-virtualenv
before_install:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi
env:
global:
- ZSH_DIST=$HOME/.zshdist
matrix:
# Use _ZSH_VERSION since if ZSH_VERSION is present, travis cacher thinks it
# is running in zsh and tries to use zsh specific functions.
- _ZSH_VERSION=5.5.1
- _ZSH_VERSION=5.5
- _ZSH_VERSION=5.4.2
- _ZSH_VERSION=5.4.1
- _ZSH_VERSION=5.3.1
- _ZSH_VERSION=5.3
- _ZSH_VERSION=5.2
- _ZSH_VERSION=5.1.1
cache:
directories:
- $ZSH_DIST
before_script: before_script:
- >
setup_zsh() {
dest="$ZSH_DIST/$1"
if [[ ! -d $dest/bin ]]; then
coreutils_mktemp="mktemp"
if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
coreutils_mktemp="gmktemp"
fi
tmp="$(${coreutils_mktemp} --directory --tmpdir="${TMPDIR:/tmp}" zshbuild.XXXXXX)"
(
cd "$tmp" &&
curl -L http://downloads.sourceforge.net/zsh/zsh-${1}.tar.gz | tar zx &&
cd zsh-$1 &&
./configure --prefix="$dest" &&
make &&
mkdir -p "$dest" &&
make install ||
echo "Failed to build zsh-${1}!"
)
fi
export PATH="$dest/bin:$PATH"
}
- setup_zsh $_ZSH_VERSION
# Show the git version being used to test. # Show the git version being used to test.
- "git --version" - "git --version"
# Show the mercurial version being used to test.
- "hg --version"
# Show the zsh version being used to test. # Show the zsh version being used to test.
- "zsh --version" - "zsh --version"
install:
- "sudo apt-get update -qq"
- "sudo apt-get install -y zsh"
- "sudo chsh -s $(which zsh)"
- "sudo apt-get install -y git mercurial subversion jq node golang ruby python python-virtualenv"
script: script:
- test/powerlevel9k.spec - test/suite.spec
- test/functions/utilities.spec
- test/functions/colors.spec
- test/functions/icons.spec
- test/segments/command_execution_time.spec
- test/segments/dir.spec
- test/segments/rust_version.spec
- test/segments/go_version.spec
- test/segments/vcs.spec
- test/segments/kubecontext.spec
- test/segments/laravel_version.spec
- test/segments/status.spec

@ -374,7 +374,7 @@ The `date` segment shows the current system date.
| Variable | Default Value | Description | | Variable | Default Value | Description |
|----------|---------------|-------------| |----------|---------------|-------------|
|`POWERLEVEL9K_DATE_FORMAT`|`%D{%d.%m.%y}`|[ZSH time format](http://zsh.sourceforge.net/Doc/Release Prompt-Expansion.html) to use in this segment.| |`POWERLEVEL9K_DATE_FORMAT`|`%D{%d.%m.%y}`|[ZSH time format](http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Date-and-time) to use in this segment.|
##### dir ##### dir
@ -386,12 +386,14 @@ Powerline" fonts, there are additional glyphs, as well:
| None | None | ![](https://cloud.githubusercontent.com/assets/1544760/12183451/40ec4016-b58f-11e5-9b9e-74e2b2f0b8b3.png) | At the root of your home folder | | None | None | ![](https://cloud.githubusercontent.com/assets/1544760/12183451/40ec4016-b58f-11e5-9b9e-74e2b2f0b8b3.png) | At the root of your home folder |
| None | None | ![](https://cloud.githubusercontent.com/assets/1544760/12369315/8a5d762c-bbf5-11e5-8a20-ca1179f48d6c.png) | Within a subfolder of your home directory | | None | None | ![](https://cloud.githubusercontent.com/assets/1544760/12369315/8a5d762c-bbf5-11e5-8a20-ca1179f48d6c.png) | Within a subfolder of your home directory |
| None | None | ![](https://cloud.githubusercontent.com/assets/1544760/12183452/40f79286-b58f-11e5-9b8c-ed1343a07b08.png) | Outside of your home folder | | None | None | ![](https://cloud.githubusercontent.com/assets/1544760/12183452/40f79286-b58f-11e5-9b8c-ed1343a07b08.png) | Outside of your home folder |
| None | None | ⚙ | Within the `/etc` directory |
To turn off these icons you could set these variables to an empty string. To turn off these icons you could set these variables to an empty string.
```zsh ```zsh
POWERLEVEL9K_HOME_ICON='' POWERLEVEL9K_HOME_ICON=''
POWERLEVEL9K_HOME_SUB_ICON='' POWERLEVEL9K_HOME_SUB_ICON=''
POWERLEVEL9K_FOLDER_ICON='' POWERLEVEL9K_FOLDER_ICON=''
POWERLEVEL9K_ETC_ICON=''
``` ```
You can limit the output to a certain length by truncating long paths. You can limit the output to a certain length by truncating long paths.
Customizations available are: Customizations available are:

@ -1,25 +1,45 @@
# Structure # Tests
The Unit-Tests do not follow exactly the file structure of Powerlevel9k itself. ## Automated Tests
## Basic Tests The Unit-Tests do not follow exactly the file structure of Powerlevel9k itself,
but we try to reflect the structure as much as possible. All tests are located
under `test/`. Segment specific tests under `test/segments/` (one file per
segment).
Basic Tests belong in `test/powerlevel9k.spec` if they test basic functionality of ### Installation
Powerlevel9k itself. Basic functions from the `functions` directory have their
Tests in separate files under `test/functions`.
## Segment Tests In order to execute the tests you need to install `shunit2`, which is a
submodule. To install the submodule, you can execute
`git submodule init && git submodule update`.
These Tests tend to be more complex in setup than the basic tests. To avoid ending ### Executing tests
up in a huge single file, there is one file per segment in `test/segments`.
# Manual Testing The tests are shell scripts on their own. So you can execute them right away.
To execute all tests you could just execute `./test/suite.spec`.
### General Test Structure
The tests usually have a `setUp()` function which is executed before every
test function. Speaking of, test functions must be prefixed with `test`. In
the tests, you can do [different Assertions](https://github.com/kward/shunit2#-asserts).
It is always a good idea to mock the program you want to test (just have a
look at other tests), so that the testrunner does not have to have all
programs installed.
### Travis
We use [Travis](https://travis-ci.org/) for Continuous Integration. This
service executes our tests after every push. For now, we need to tell travis
where to find the tests, which is what happens in the `.travis.yml` file.
## Manual Testing
If unit tests are not sufficient (e.g. you have an issue with your prompt that If unit tests are not sufficient (e.g. you have an issue with your prompt that
occurs only in a specific ZSH framework) then you can use either Docker or occurs only in a specific ZSH framework) then you can use either Docker or
or our Vagrant. or our Vagrant.
## Docker ### Docker
This is the easiest to use _if_ you have Docker already installed and running. This is the easiest to use _if_ you have Docker already installed and running.
@ -42,7 +62,7 @@ You can get Docker at <https://www.docker.com/community-edition>.
**Note:** Not all frameworks work with all versions of ZSH (or the underlying OS). **Note:** Not all frameworks work with all versions of ZSH (or the underlying OS).
## Vagrant ### Vagrant
Currently there are two test VMs. `test-vm` is an Ubuntu machine with several Currently there are two test VMs. `test-vm` is an Ubuntu machine with several
pre-installed ZSH frameworks. And there is `test-bsd-vm` which is a FreeBSD! pre-installed ZSH frameworks. And there is `test-bsd-vm` which is a FreeBSD!

@ -1,111 +1,236 @@
#!/usr/bin/env zsh #!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 #vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
source functions/colors.zsh
source functions/icons.zsh
source functions/utilities.zsh
# Map our $OS to neofetch $os
os="$OS"
trim() {
set -f
# shellcheck disable=2048,2086
set -- $*
printf '%s\n' "${*//[[:space:]]/}"
set +f
}
get_ppid() {
# Get parent process ID of PID.
case "$os" in
"Windows")
ppid="$(ps -p "${1:-$PPID}" | awk '{printf $2}')"
ppid="${ppid/PPID}"
;;
"Linux")
ppid="$(grep -i -F "PPid:" "/proc/${1:-$PPID}/status")"
ppid="$(trim "${ppid/PPid:}")"
;;
*)
ppid="$(ps -p "${1:-$PPID}" -o ppid=)"
;;
esac
printf "%s" "$ppid"
}
get_process_name() {
# Get PID name.
case "$os" in
"Windows")
name="$(ps -p "${1:-$PPID}" | awk '{printf $8}')"
name="${name/COMMAND}"
name="${name/*\/}"
;;
"Linux")
name="$(< "/proc/${1:-$PPID}/comm")"
;;
*)
name="$(ps -p "${1:-$PPID}" -o comm=)"
;;
esac
printf "%s" "$name"
}
# Taken from NeoFetch (slightly modified) # Taken from NeoFetch (slightly modified)
get_term() { get_term() {
local term local term
# If function was run, stop here. # If function was run, stop here.
#((term_run == 1)) && return # ((term_run == 1)) && return
# Workaround for macOS systems that # Workaround for macOS systems that
# don't support the block below. # don't support the block below.
case "$TERM_PROGRAM" in case "$TERM_PROGRAM" in
"iTerm.app") term="iTerm2" ;; "iTerm.app") term="iTerm2" ;;
"Terminal.app") term="Apple Terminal" ;; "Terminal.app") term="Apple Terminal" ;;
"Hyper") term="HyperTerm" ;; "Hyper") term="HyperTerm" ;;
*) term="${TERM_PROGRAM/\.app}" ;; *) term="${TERM_PROGRAM/\.app}" ;;
esac esac
# Most likely TosWin2 on FreeMiNT - quick check
[[ "$TERM" == "tw52" || "$TERM" == "tw100" ]] && \
term="TosWin2"
[[ "$SSH_CONNECTION" ]] && \
term="$SSH_TTY"
# Check $PPID for terminal emulator. # Check $PPID for terminal emulator.
while [[ -z "$term" ]]; do while [[ -z "$term" ]]; do
parent="$(get_ppid "$parent")" parent="$(get_ppid "$parent")"
[[ -z "$parent" ]] && break
name="$(get_process_name "$parent")" name="$(get_process_name "$parent")"
case "${name// }" in case "${name// }" in
"${SHELL/*\/}" | *"sh" | "tmux"* | "screen" | "su"*) ;; "${SHELL/*\/}"|*"sh"|"screen"|"su"*) ;;
"login"* | *"Login"* | "init" | "(init)") term="$(tty)" ;;
"ruby" | "1" | "systemd" | "sshd"* | "python"* | "USER"*"PID"*) break ;; "login"*|*"Login"*|"init"|"(init)")
term="$(tty)"
;;
"ruby"|"1"|"tmux"*|"systemd"|"sshd"*|"python"*|"USER"*"PID"*|"kdeinit"*|"launchd"*)
break
;;
"gnome-terminal-") term="gnome-terminal" ;; "gnome-terminal-") term="gnome-terminal" ;;
*) term="${name##*/}" ;; "urxvtd") term="urxvt" ;;
*"nvim") term="Neovim Terminal" ;;
*"NeoVimServer"*) term="VimR Terminal" ;;
*) term="${name##*/}" ;;
esac esac
done done
# Log that the function was run. # Log that the function was run.
#term_run=1 # term_run=1
echo "${term}" echo "${term}"
} }
get_term_font() { get_term_font() {
local term="${1}" local term="${1}"
#((term_run != 1)) && get_term # ((term_run != 1)) && get_term
case "$term" in case "$term" in
"alacritty"*) "alacritty"*)
term_font="$(awk -F ':|#' '/normal:/ {getline; print}' "${XDG_CONFIG_HOME}/alacritty/alacritty.yml")" shopt -s nullglob
confs=({$XDG_CONFIG_HOME,$HOME}/{alacritty,}/{.,}alacritty.ym?)
shopt -u nullglob
[[ -f "${confs[0]}" ]] || return
term_font="$(awk -F ':|#' '/normal:/ {getline; print}' "${confs[0]}")"
term_font="${term_font/*family:}" term_font="${term_font/*family:}"
term_font="${term_font/$'\n'*}" term_font="${term_font/$'\n'*}"
term_font="${term_font/\#*}" term_font="${term_font/\#*}"
;; ;;
"Apple_Terminal") "Apple_Terminal")
term_font="$(osascript -e 'tell application "Terminal" to font name of window frontmost')" term_font="$(osascript <<END
tell application "Terminal" to font name of window frontmost
END
)"
;; ;;
"iTerm2") "iTerm2")
# Unfortunately the profile name is not unique, but it seems to be the only thing # Unfortunately the profile name is not unique, but it seems to be the only thing
# that identifies an active profile. There is the "id of current session of current window" # that identifies an active profile. There is the "id of current session of current win-
# thou, but that does not match to a guid in the plist. # dow" though, but that does not match to a guid in the plist.
# So, be warned! Collisions may occur! # So, be warned, collisions may occur!
# See: https://groups.google.com/forum/#!topic/iterm2-discuss/0tO3xZ4Zlwg # See: https://groups.google.com/forum/#!topic/iterm2-discuss/0tO3xZ4Zlwg
# and: https://gitlab.com/gnachman/iterm2/issues/5586 local current_profile_name profiles_count profile_name diff_font
local currentProfileName=$(osascript -e 'tell application "iTerm2" to profile name of current session of current window')
current_profile_name="$(osascript <<END
tell application "iTerm2" to profile name \
of current session of current window
END
)"
# Warning: Dynamic profiles are not taken into account here! # Warning: Dynamic profiles are not taken into account here!
# https://www.iterm2.com/documentation-dynamic-profiles.html # https://www.iterm2.com/documentation-dynamic-profiles.html
font_file="${HOME}/Library/Preferences/com.googlecode.iterm2.plist"
local nonAsciiFont
# Count Guids in "New Bookmarks"; they should be unique # Count Guids in "New Bookmarks"; they should be unique
local profilesCount=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:" ~/Library/Preferences/com.googlecode.iterm2.plist 2>/dev/null | grep -c "Guid") profiles_count="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:'" "$font_file" | \
for idx in $(seq 0 "${profilesCount}"); do grep -w -c "Guid")"
local profileName=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Name:" ~/Library/Preferences/com.googlecode.iterm2.plist 2>/dev/null)
if [[ "${profileName}" == "${currentProfileName}" ]]; then for ((i=0; i<profiles_count; i++)); do
profile_name="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:${i}:Name:'" "$font_file")"
if [[ "$profile_name" == "$current_profile_name" ]]; then
# "Normal Font" # "Normal Font"
term_font=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Normal\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist) term_font="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:${i}:Normal Font:'" \
"$font_file")"
# Font for non-ascii characters # Font for non-ascii characters
# Only check for a different non-ascii font, if the user checked # Only check for a different non-ascii font, if the user checked
# the "use a different font for non-ascii text" switch. # the "use a different font for non-ascii text" switch.
local useDifferentFont=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Use\ Non-ASCII\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist) diff_font="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:${i}:Use Non-ASCII Font:'" \
if [[ "$useDifferentFont" == "true" ]]; then "$font_file")"
local nonAsciiFont=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Non\ Ascii\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist)
if [[ "$term_font" != "$nonAsciiFont" ]]; then if [[ "$diff_font" == "true" ]]; then
term_font="$term_font (normal) / $nonAsciiFont (non-ascii)" non_ascii="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:${i}:Non Ascii Font:'" \
fi "$font_file")"
[[ "$term_font" != "$non_ascii" ]] && \
term_font="$term_font (normal) / $non_ascii (non-ascii)"
fi fi
fi fi
done done
;; ;;
"deepin-terminal"*) "deepin-terminal"*)
term_font="$(awk -F '=' '/font=/ {a=$2} /font_size/ {b=$2} END{print a " " b}' "${XDG_CONFIG_HOME}/deepin/deepin-terminal/config.conf")" term_font="$(awk -F '=' '/font=/ {a=$2} /font_size/ {b=$2} END {print a " " b}' \
"${XDG_CONFIG_HOME}/deepin/deepin-terminal/config.conf")"
;;
"GNUstep_Terminal")
term_font="$(awk -F '>|<' '/>TerminalFont</ {getline; f=$3}
/>TerminalFontSize</ {getline; s=$3} END {print f " " s}' \
"${HOME}/GNUstep/Defaults/Terminal.plist")"
;; ;;
"Hyper"*) "Hyper"*)
term_font="$(awk -F "," '/fontFamily/ {a=$1} END{print a}' "${HOME}/.hyper.js" | awk -F "'" '{a=$2} END{print a}')" term_font="$(awk -F':|,' '/fontFamily/ {print $2; exit}' "${HOME}/.hyper.js")"
term_font="$(trim_quotes "$term_font")"
;;
"kitty"*)
shopt -s nullglob
confs=({$KITTY_CONFIG_DIRECTORY,$XDG_CONFIG_HOME,~/Library/Preferences}/kitty/kitty.con?)
shopt -u nullglob
[[ -f "${confs[0]}" ]] || return
term_font="$(awk '/^([[:space:]]*|[^#_])font_family[[:space:]]+/ {
$1 = "";
gsub(/^[[:space:]]/, "");
font = $0
}
/^([[:space:]]*|[^#_])font_size[[:space:]]+/ {
size = $2
}
END { print font " " size}' "${confs[0]}")"
;; ;;
"konsole"*) "konsole"*)
# Get Process ID of current konsole window / tab # Get Process ID of current konsole window / tab
child="$(get_ppid "$$")" child="$(get_ppid "$$")"
konsole_instances=($(qdbus | grep 'org.kde.konsole')) IFS=$'\n' read -d "" -ra konsole_instances < <(qdbus | grep -F 'org.kde.konsole')
for i in "${konsole_instances[@]}"; do for i in "${konsole_instances[@]}"; do
konsole_sessions=($(qdbus "${i}" | grep '/Sessions/')) IFS=$'\n' read -d "" -ra konsole_sessions < <(qdbus "$i" | grep -F '/Sessions/')
for session in "${konsole_sessions[@]}"; do for session in "${konsole_sessions[@]}"; do
if ((child == "$(qdbus "${i}" "${session}" processId)")); then if ((child == "$(qdbus "$i" "$session" processId)")); then
profile="$(qdbus "${i}" "${session}" environment | awk -F '=' '/KONSOLE_PROFILE_NAME/ {print $2}')" profile="$(qdbus "$i" "$session" environment |\
awk -F '=' '/KONSOLE_PROFILE_NAME/ {print $2}')"
break break
fi fi
done done
@ -113,9 +238,53 @@ get_term_font() {
done done
# We could have two profile files for the same profile name, take first match # We could have two profile files for the same profile name, take first match
profile_filename="$(grep -l "Name=${profile}" "${HOME}"/.local/share/konsole/*.profile)" profile_filename="$(grep -l "Name=${profile}" "$HOME"/.local/share/konsole/*.profile)"
profile_filename="${profile_filename/$'\n'*}" profile_filename="${profile_filename/$'\n'*}"
[[ "$profile_filename" ]] && term_font="$(awk -F '=|,' '/Font=/ {print $2 " " $3}' "$profile_filename")"
[[ "$profile_filename" ]] && \
term_font="$(awk -F '=|,' '/Font=/ {print $2 " " $3}' "$profile_filename")"
;;
"lxterminal"*)
term_font="$(awk -F '=' '/fontname=/ {print $2; exit}' \
"${XDG_CONFIG_HOME}/lxterminal/lxterminal.conf")"
;;
"mate-terminal")
# To get the actual config we have to create a temporarily file with the
# --save-config option.
mateterm_config="/tmp/mateterm.cfg"
# Ensure /tmp exists and we do not overwrite anything.
if [[ -d /tmp && ! -f "$mateterm_config" ]]; then
mate-terminal --save-config="$mateterm_config"
role="$(xprop -id "${WINDOWID}" WM_WINDOW_ROLE)"
role="${role##* }"
role="${role//\"}"
profile="$(awk -F '=' -v r="$role" \
'$0~r {
getline;
if(/Maximized/) getline;
if(/Fullscreen/) getline;
id=$2"]"
} $0~id {if(id) {getline; print $2; exit}}' \
"$mateterm_config")"
rm -f "$mateterm_config"
mate_get() {
gsettings get org.mate.terminal.profile:/org/mate/terminal/profiles/"$1"/ "$2"
}
if [[ "$(mate_get "$profile" "use-system-font")" == "true" ]]; then
term_font="$(gsettings get org.mate.interface monospace-font-name)"
else
term_font="$(mate_get "$profile" "font")"
fi
term_font="$(trim_quotes "$term_font")"
fi
;; ;;
"mintty") "mintty")
@ -124,30 +293,91 @@ get_term_font() {
"pantheon"*) "pantheon"*)
term_font="$(gsettings get org.pantheon.terminal.settings font)" term_font="$(gsettings get org.pantheon.terminal.settings font)"
[[ -z "${term_font//\'}" ]] && term_font="$(gsettings get org.gnome.desktop.interface monospace-font-name)"
[[ -z "${term_font//\'}" ]] && \
term_font="$(gsettings get org.gnome.desktop.interface monospace-font-name)"
term_font="$(trim_quotes "$term_font")" term_font="$(trim_quotes "$term_font")"
;; ;;
"qterminal")
term_font="$(awk -F '=' '/fontFamily=/ {a=$2} /fontSize=/ {b=$2} END {print a " " b}' \
"${XDG_CONFIG_HOME}/qterminal.org/qterminal.ini")"
;;
"sakura"*) "sakura"*)
term_font="$(awk -F '=' '/^font=/ {a=$2} END{print a}' "${XDG_CONFIG_HOME}/sakura/sakura.conf")" term_font="$(awk -F '=' '/^font=/ {print $2; exit}' \
"${XDG_CONFIG_HOME}/sakura/sakura.conf")"
;;
"st")
term_font="$(ps -o command= -p "$parent" | grep -F -- "-f")"
if [[ "$term_font" ]]; then
term_font="${term_font/*-f/}"
term_font="${term_font/ -*/}"
else
# On Linux we can get the exact path to the running binary through the procfs
# (in case `st` is launched from outside of $PATH) on other systems we just
# have to guess and assume `st` is invoked from somewhere in the users $PATH
[[ -L /proc/$parent/exe ]] && binary="/proc/$parent/exe" || binary="$(type -p st)"
# Grep the output of strings on the `st` binary for anything that looks vaguely
# like a font definition. NOTE: There is a slight limitation in this approach.
# Technically "Font Name" is a valid font. As it doesn't specify any font options
# though it is hard to match it correctly amongst the rest of the noise.
[[ -n "$binary" ]] && \
term_font="$(strings "$binary" | grep -F -m 1 \
-e "pixelsize=" \
-e "size=" \
-e "antialias=" \
-e "autohint=")"
fi
term_font="${term_font/xft:}"
term_font="${term_font/:*}"
;; ;;
"terminology") "terminology")
term_font="$(strings "${XDG_CONFIG_HOME}/terminology/config/standard/base.cfg" | awk '/^font\.name$/{print a}{a=$0}')" term_font="$(strings "${XDG_CONFIG_HOME}/terminology/config/standard/base.cfg" |\
awk '/^font\.name$/{print a}{a=$0}')"
term_font="${term_font/.pcf}" term_font="${term_font/.pcf}"
term_font="${term_font/:*}" term_font="${term_font/:*}"
;; ;;
"termite") "termite")
[[ -f "${XDG_CONFIG_HOME}/termite/config" ]] && termite_config="${XDG_CONFIG_HOME}/termite/config" [[ -f "${XDG_CONFIG_HOME}/termite/config" ]] && \
term_font="$(awk -F '= ' '/\[options\]/ {opt=1} /^font/ {if(opt==1) a=$2; opt=0} END{print a}' "/etc/xdg/termite/config" "$termite_config")" termite_config="${XDG_CONFIG_HOME}/termite/config"
term_font="$(awk -F '= ' '/\[options\]/ {
opt=1
}
/^\s*font/ {
if(opt==1) a=$2;
opt=0
} END {print a}' "/etc/xdg/termite/config" \
"$termite_config")"
;; ;;
"urxvt" | "urxvtd" | "rxvt-unicode" | "xterm") "urxvt" | "urxvtd" | "rxvt-unicode" | "xterm")
term_font="$(grep -i -F "${term/d}*font" < <(xrdb -query))" xrdb="$(xrdb -query)"
term_font="${term_font/*font:}" term_font="$(grep -im 1 -e "^${term/d}"'\**\.*font' -e '^\*font' <<< "$xrdb")"
term_font="${term_font/*"*font:"}"
term_font="${term_font/*".font:"}"
term_font="${term_font/*"*.font:"}"
term_font="$(trim "$term_font")" term_font="$(trim "$term_font")"
[[ -z "$term_font" && "$term" == "xterm" ]] && \
term_font="$(grep '^XTerm.vt100.faceName' <<< "$xrdb")"
term_font="$(trim "${term_font/*"faceName:"}")"
# xft: isn't required at the beginning so we prepend it if it's missing
[[ "${term_font:0:1}" != "-" && \
"${term_font:0:4}" != "xft:" ]] && \
term_font="xft:$term_font"
# Xresources has two different font formats, this checks which # Xresources has two different font formats, this checks which
# one is in use and formats it accordingly. # one is in use and formats it accordingly.
case "$term_font" in case "$term_font" in
@ -156,12 +386,23 @@ get_term_font() {
term_font="${term_font/:*}" term_font="${term_font/:*}"
;; ;;
"-"*) term_font="$(awk -F '\\-' '{printf $3}' <<< "$term_font")" ;; "-"*)
IFS=- read -r _ _ term_font _ <<< "$term_font"
;;
esac esac
;; ;;
"xfce4-terminal") "xfce4-terminal")
term_font="$(awk -F '=' '/^FontName/ {a=$2} END{print a}' "${XDG_CONFIG_HOME}/xfce4/terminal/terminalrc")" term_font="$(awk -F '=' '/^FontName/{a=$2}/^FontUseSystem=TRUE/{a=$0} END {print a}' \
"${XDG_CONFIG_HOME}/xfce4/terminal/terminalrc")"
[[ "$term_font" == "FontUseSystem=TRUE" ]] && \
term_font="$(gsettings get org.gnome.desktop.interface monospace-font-name)"
term_font="$(trim_quotes "$term_font")"
# Default fallback font hardcoded in terminal-preferences.c
[[ -z "$term_font" ]] && term_font="Monospace 12"
;; ;;
esac esac

@ -6,7 +6,7 @@ RUN \
DEBIAN_FRONTEND=noninteractive apt-get install -y \ DEBIAN_FRONTEND=noninteractive apt-get install -y \
curl \ curl \
git \ git \
zsh \ zsh=5.0.2-3ubuntu6.2 \
mercurial \ mercurial \
subversion \ subversion \
golang \ golang \

@ -6,7 +6,7 @@ RUN \
DEBIAN_FRONTEND=noninteractive apt-get install -y \ DEBIAN_FRONTEND=noninteractive apt-get install -y \
curl \ curl \
git \ git \
zsh \ zsh=5.1.1-1ubuntu2.2 \
mercurial \ mercurial \
subversion \ subversion \
golang \ golang \

@ -1,4 +1,4 @@
FROM ubuntu:17.04 FROM ubuntu:17.10
RUN \ RUN \
apt-get update && \ apt-get update && \
@ -6,7 +6,7 @@ RUN \
DEBIAN_FRONTEND=noninteractive apt-get install -y \ DEBIAN_FRONTEND=noninteractive apt-get install -y \
curl \ curl \
git \ git \
zsh \ zsh=5.2-5ubuntu1.2 \
mercurial \ mercurial \
subversion \ subversion \
golang \ golang \

@ -0,0 +1,40 @@
FROM debian:stretch
# We switched here to debian, as there seems no ZSH 5.3 in ubuntu.
RUN \
apt-get update && \
echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \
DEBIAN_FRONTEND=noninteractive apt-get install -y \
curl \
git \
zsh=5.3.1-4+b2 \
mercurial \
subversion \
golang \
jq \
nodejs \
ruby \
python \
python-virtualenv \
sudo \
locales
RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred
# Locale generation is different in debian. We need to enable en_US
# locale and then regenerate locales.
RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
RUN locale-gen "en_US.UTF-8"
COPY docker/fred-sudoers /etc/sudoers.d/fred
USER fred
WORKDIR /home/fred
ENV LANG=en_US.UTF-8
ENV TERM=xterm-256color
ENV DEFAULT_USER=fred
ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true
RUN touch .zshrc
CMD ["/bin/zsh", "-l"]

@ -0,0 +1,35 @@
FROM ubuntu:18.04
RUN \
apt-get update && \
echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \
DEBIAN_FRONTEND=noninteractive apt-get install -y \
curl \
git \
zsh=5.4.2-3ubuntu3 \
mercurial \
subversion \
golang \
jq \
nodejs \
ruby \
python \
python-virtualenv \
sudo \
locales
RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred
RUN locale-gen "en_US.UTF-8"
COPY docker/fred-sudoers /etc/sudoers.d/fred
USER fred
WORKDIR /home/fred
ENV LANG=en_US.UTF-8
ENV TERM=xterm-256color
ENV DEFAULT_USER=fred
ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true
RUN touch .zshrc
CMD ["/bin/zsh", "-l"]

@ -0,0 +1,35 @@
FROM ubuntu:18.10
RUN \
apt-get update && \
echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \
DEBIAN_FRONTEND=noninteractive apt-get install -y \
curl \
git \
zsh=5.5.1-1ubuntu1 \
mercurial \
subversion \
golang \
jq \
nodejs \
ruby \
python \
python-virtualenv \
sudo \
locales
RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred
RUN locale-gen "en_US.UTF-8"
COPY docker/fred-sudoers /etc/sudoers.d/fred
USER fred
WORKDIR /home/fred
ENV LANG=en_US.UTF-8
ENV TERM=xterm-256color
ENV DEFAULT_USER=fred
ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true
RUN touch .zshrc
CMD ["/bin/zsh", "-l"]

@ -9,7 +9,7 @@ for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
ln -nsf "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}" ln -nsf "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done done
ln -s "${HOME}/p9k/powerlevel9k.zsh-theme" \ ln -snf "${HOME}/p9k/powerlevel9k.zsh-theme" \
"${HOME}/.zprezto/modules/prompt/functions/prompt_powerlevel9k_setup" "${HOME}/.zprezto/modules/prompt/functions/prompt_powerlevel9k_setup"
echo "zstyle ':prezto:module:prompt' theme 'powerlevel9k'" \ echo "zstyle ':prezto:module:prompt' theme 'powerlevel9k'" \

@ -0,0 +1,7 @@
ARG base
FROM p9k:${base}
COPY docker/zshing/install.zsh /tmp/
RUN zsh /tmp/install.zsh
COPY ./ p9k/

@ -0,0 +1,16 @@
#!zsh
# install zshing https://github.com/zakariaGatter/zshing
git clone https://github.com/zakariaGatter/zshing.git ~/.zshing/zshing
# Link P9K in zshing directory
ln -nsf ~/p9k ~/.zshing/powerlevel9k
{
echo
echo 'ZSHING_PLUGINS=(
"bhilburn/powerlevel9k"
)'
echo
echo "source ~/.zshing/zshing/zshing.zsh"
} >> ~/.zshrc

@ -6,6 +6,270 @@
# https://github.com/bhilburn/powerlevel9k # https://github.com/bhilburn/powerlevel9k
################################################################ ################################################################
typeset -gAh __P9K_COLORS
# https://jonasjacek.github.io/colors/
# use color names by default to allow dark/light themes to adjust colors based on names
__P9K_COLORS=(
black 000
maroon 001
green 002
olive 003
navy 004
purple 005
teal 006
silver 007
grey 008
red 009
lime 010
yellow 011
blue 012
fuchsia 013
magenta 013
aqua 014
cyan 014
white 015
grey0 016
navyblue 017
darkblue 018
blue3 019
blue3 020
blue1 021
darkgreen 022
deepskyblue4 023
deepskyblue4 024
deepskyblue4 025
dodgerblue3 026
dodgerblue2 027
green4 028
springgreen4 029
turquoise4 030
deepskyblue3 031
deepskyblue3 032
dodgerblue1 033
green3 034
springgreen3 035
darkcyan 036
lightseagreen 037
deepskyblue2 038
deepskyblue1 039
green3 040
springgreen3 041
springgreen2 042
cyan3 043
darkturquoise 044
turquoise2 045
green1 046
springgreen2 047
springgreen1 048
mediumspringgreen 049
cyan2 050
cyan1 051
darkred 052
deeppink4 053
purple4 054
purple4 055
purple3 056
blueviolet 057
orange4 058
grey37 059
mediumpurple4 060
slateblue3 061
slateblue3 062
royalblue1 063
chartreuse4 064
darkseagreen4 065
paleturquoise4 066
steelblue 067
steelblue3 068
cornflowerblue 069
chartreuse3 070
darkseagreen4 071
cadetblue 072
cadetblue 073
skyblue3 074
steelblue1 075
chartreuse3 076
palegreen3 077
seagreen3 078
aquamarine3 079
mediumturquoise 080
steelblue1 081
chartreuse2 082
seagreen2 083
seagreen1 084
seagreen1 085
aquamarine1 086
darkslategray2 087
darkred 088
deeppink4 089
darkmagenta 090
darkmagenta 091
darkviolet 092
purple 093
orange4 094
lightpink4 095
plum4 096
mediumpurple3 097
mediumpurple3 098
slateblue1 099
yellow4 100
wheat4 101
grey53 102
lightslategrey 103
mediumpurple 104
lightslateblue 105
yellow4 106
darkolivegreen3 107
darkseagreen 108
lightskyblue3 109
lightskyblue3 110
skyblue2 111
chartreuse2 112
darkolivegreen3 113
palegreen3 114
darkseagreen3 115
darkslategray3 116
skyblue1 117
chartreuse1 118
lightgreen 119
lightgreen 120
palegreen1 121
aquamarine1 122
darkslategray1 123
red3 124
deeppink4 125
mediumvioletred 126
magenta3 127
darkviolet 128
purple 129
darkorange3 130
indianred 131
hotpink3 132
mediumorchid3 133
mediumorchid 134
mediumpurple2 135
darkgoldenrod 136
lightsalmon3 137
rosybrown 138
grey63 139
mediumpurple2 140
mediumpurple1 141
gold3 142
darkkhaki 143
navajowhite3 144
grey69 145
lightsteelblue3 146
lightsteelblue 147
yellow3 148
darkolivegreen3 149
darkseagreen3 150
darkseagreen2 151
lightcyan3 152
lightskyblue1 153
greenyellow 154
darkolivegreen2 155
palegreen1 156
darkseagreen2 157
darkseagreen1 158
paleturquoise1 159
red3 160
deeppink3 161
deeppink3 162
magenta3 163
magenta3 164
magenta2 165
darkorange3 166
indianred 167
hotpink3 168
hotpink2 169
orchid 170
mediumorchid1 171
orange3 172
lightsalmon3 173
lightpink3 174
pink3 175
plum3 176
violet 177
gold3 178
lightgoldenrod3 179
tan 180
mistyrose3 181
thistle3 182
plum2 183
yellow3 184
khaki3 185
lightgoldenrod2 186
lightyellow3 187
grey84 188
lightsteelblue1 189
yellow2 190
darkolivegreen1 191
darkolivegreen1 192
darkseagreen1 193
honeydew2 194
lightcyan1 195
red1 196
deeppink2 197
deeppink1 198
deeppink1 199
magenta2 200
magenta1 201
orangered1 202
indianred1 203
indianred1 204
hotpink 205
hotpink 206
mediumorchid1 207
darkorange 208
salmon1 209
lightcoral 210
palevioletred1 211
orchid2 212
orchid1 213
orange1 214
sandybrown 215
lightsalmon1 216
lightpink1 217
pink1 218
plum1 219
gold1 220
lightgoldenrod2 221
lightgoldenrod2 222
navajowhite1 223
mistyrose1 224
thistle1 225
yellow1 226
lightgoldenrod1 227
khaki1 228
wheat1 229
cornsilk1 230
grey100 231
grey3 232
grey7 233
grey11 234
grey15 235
grey19 236
grey23 237
grey27 238
grey30 239
grey35 240
grey39 241
grey42 242
grey46 243
grey50 244
grey54 245
grey58 246
grey62 247
grey66 248
grey70 249
grey74 250
grey78 251
grey82 252
grey85 253
grey89 254
grey93 255
)
function termColors() { function termColors() {
if [[ $POWERLEVEL9K_IGNORE_TERM_COLORS == true ]]; then if [[ $POWERLEVEL9K_IGNORE_TERM_COLORS == true ]]; then
return return
@ -28,339 +292,56 @@ function termColors() {
# get the proper color code if it does not exist as a name. # get the proper color code if it does not exist as a name.
function getColor() { function getColor() {
# no need to check numerical values # If Color is not numerical, try to get the color code.
if [[ "$1" = <-> ]]; then if [[ "$1" != <-> ]]; then
if [[ "$1" = <8-15> ]]; then 1=$(getColorCode $1)
1=$(($1 - 8))
fi
else
# named color added to parameter expansion print -P to test if the name exists in terminal
local named="%K{$1}"
# https://misc.flogisoft.com/bash/tip_colors_and_formatting
local default="$'\033'\[49m"
# http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html
local quoted=$(printf "%q" $(print -P "$named"))
if [[ $quoted = "$'\033'\[49m" && $1 != "black" ]]; then
# color not found, so try to get the code
1=$(getColorCode $1)
fi
fi fi
echo -n "$1" echo -n "$1"
} }
# empty paramenter resets (stops) background color # empty paramenter resets (stops) background color
function backgroundColor() { function backgroundColor() {
if [[ -z $1 ]]; then echo -n "%K{$(getColor $1)}"
echo -n "%k"
else
echo -n "%K{$(getColor $1)}"
fi
} }
# empty paramenter resets (stops) foreground color # empty paramenter resets (stops) foreground color
function foregroundColor() { function foregroundColor() {
if [[ -z $1 ]]; then echo -n "%F{$(getColor $1)}"
echo -n "%f"
else
echo -n "%F{$(getColor $1)}"
fi
} }
# Get numerical color codes. That way we translate ANSI codes # Get numerical color codes. That way we translate ANSI codes
# into ZSH-Style color codes. # into ZSH-Style color codes.
function getColorCode() { function getColorCode() {
# Check if given value is already numerical # Early exit: Check if given value is already numerical
if [[ "$1" = <-> ]]; then if [[ "$1" == <-> ]]; then
# ANSI color codes distinguish between "foreground" # Pad color with zeroes
# and "background" colors. We don't need to do that, echo -n "${(l:3::0:)1}"
# as ZSH uses a 256 color space anyway. return
if [[ "$1" = <8-15> ]]; then fi
echo -n $(($1 - 8))
else
echo -n "$1"
fi
else
typeset -A codes
# https://jonasjacek.github.io/colors/
# use color names by default to allow dark/light themes to adjust colors based on names
codes[black]=000
codes[maroon]=001
codes[green]=002
codes[olive]=003
codes[navy]=004
codes[purple]=005
codes[teal]=006
codes[silver]=007
codes[grey]=008
codes[red]=009
codes[lime]=010
codes[yellow]=011
codes[blue]=012
codes[fuchsia]=013
codes[aqua]=014
codes[white]=015
codes[grey0]=016
codes[navyblue]=017
codes[darkblue]=018
codes[blue3]=019
codes[blue3]=020
codes[blue1]=021
codes[darkgreen]=022
codes[deepskyblue4]=023
codes[deepskyblue4]=024
codes[deepskyblue4]=025
codes[dodgerblue3]=026
codes[dodgerblue2]=027
codes[green4]=028
codes[springgreen4]=029
codes[turquoise4]=030
codes[deepskyblue3]=031
codes[deepskyblue3]=032
codes[dodgerblue1]=033
codes[green3]=034
codes[springgreen3]=035
codes[darkcyan]=036
codes[lightseagreen]=037
codes[deepskyblue2]=038
codes[deepskyblue1]=039
codes[green3]=040
codes[springgreen3]=041
codes[springgreen2]=042
codes[cyan3]=043
codes[darkturquoise]=044
codes[turquoise2]=045
codes[green1]=046
codes[springgreen2]=047
codes[springgreen1]=048
codes[mediumspringgreen]=049
codes[cyan2]=050
codes[cyan1]=051
codes[darkred]=052
codes[deeppink4]=053
codes[purple4]=054
codes[purple4]=055
codes[purple3]=056
codes[blueviolet]=057
codes[orange4]=058
codes[grey37]=059
codes[mediumpurple4]=060
codes[slateblue3]=061
codes[slateblue3]=062
codes[royalblue1]=063
codes[chartreuse4]=064
codes[darkseagreen4]=065
codes[paleturquoise4]=066
codes[steelblue]=067
codes[steelblue3]=068
codes[cornflowerblue]=069
codes[chartreuse3]=070
codes[darkseagreen4]=071
codes[cadetblue]=072
codes[cadetblue]=073
codes[skyblue3]=074
codes[steelblue1]=075
codes[chartreuse3]=076
codes[palegreen3]=077
codes[seagreen3]=078
codes[aquamarine3]=079
codes[mediumturquoise]=080
codes[steelblue1]=081
codes[chartreuse2]=082
codes[seagreen2]=083
codes[seagreen1]=084
codes[seagreen1]=085
codes[aquamarine1]=086
codes[darkslategray2]=087
codes[darkred]=088
codes[deeppink4]=089
codes[darkmagenta]=090
codes[darkmagenta]=091
codes[darkviolet]=092
codes[purple]=093
codes[orange4]=094
codes[lightpink4]=095
codes[plum4]=096
codes[mediumpurple3]=097
codes[mediumpurple3]=098
codes[slateblue1]=099
codes[yellow4]=100
codes[wheat4]=101
codes[grey53]=102
codes[lightslategrey]=103
codes[mediumpurple]=104
codes[lightslateblue]=105
codes[yellow4]=106
codes[darkolivegreen3]=107
codes[darkseagreen]=108
codes[lightskyblue3]=109
codes[lightskyblue3]=110
codes[skyblue2]=111
codes[chartreuse2]=112
codes[darkolivegreen3]=113
codes[palegreen3]=114
codes[darkseagreen3]=115
codes[darkslategray3]=116
codes[skyblue1]=117
codes[chartreuse1]=118
codes[lightgreen]=119
codes[lightgreen]=120
codes[palegreen1]=121
codes[aquamarine1]=122
codes[darkslategray1]=123
codes[red3]=124
codes[deeppink4]=125
codes[mediumvioletred]=126
codes[magenta3]=127
codes[darkviolet]=128
codes[purple]=129
codes[darkorange3]=130
codes[indianred]=131
codes[hotpink3]=132
codes[mediumorchid3]=133
codes[mediumorchid]=134
codes[mediumpurple2]=135
codes[darkgoldenrod]=136
codes[lightsalmon3]=137
codes[rosybrown]=138
codes[grey63]=139
codes[mediumpurple2]=140
codes[mediumpurple1]=141
codes[gold3]=142
codes[darkkhaki]=143
codes[navajowhite3]=144
codes[grey69]=145
codes[lightsteelblue3]=146
codes[lightsteelblue]=147
codes[yellow3]=148
codes[darkolivegreen3]=149
codes[darkseagreen3]=150
codes[darkseagreen2]=151
codes[lightcyan3]=152
codes[lightskyblue1]=153
codes[greenyellow]=154
codes[darkolivegreen2]=155
codes[palegreen1]=156
codes[darkseagreen2]=157
codes[darkseagreen1]=158
codes[paleturquoise1]=159
codes[red3]=160
codes[deeppink3]=161
codes[deeppink3]=162
codes[magenta3]=163
codes[magenta3]=164
codes[magenta2]=165
codes[darkorange3]=166
codes[indianred]=167
codes[hotpink3]=168
codes[hotpink2]=169
codes[orchid]=170
codes[mediumorchid1]=171
codes[orange3]=172
codes[lightsalmon3]=173
codes[lightpink3]=174
codes[pink3]=175
codes[plum3]=176
codes[violet]=177
codes[gold3]=178
codes[lightgoldenrod3]=179
codes[tan]=180
codes[mistyrose3]=181
codes[thistle3]=182
codes[plum2]=183
codes[yellow3]=184
codes[khaki3]=185
codes[lightgoldenrod2]=186
codes[lightyellow3]=187
codes[grey84]=188
codes[lightsteelblue1]=189
codes[yellow2]=190
codes[darkolivegreen1]=191
codes[darkolivegreen1]=192
codes[darkseagreen1]=193
codes[honeydew2]=194
codes[lightcyan1]=195
codes[red1]=196
codes[deeppink2]=197
codes[deeppink1]=198
codes[deeppink1]=199
codes[magenta2]=200
codes[magenta1]=201
codes[orangered1]=202
codes[indianred1]=203
codes[indianred1]=204
codes[hotpink]=205
codes[hotpink]=206
codes[mediumorchid1]=207
codes[darkorange]=208
codes[salmon1]=209
codes[lightcoral]=210
codes[palevioletred1]=211
codes[orchid2]=212
codes[orchid1]=213
codes[orange1]=214
codes[sandybrown]=215
codes[lightsalmon1]=216
codes[lightpink1]=217
codes[pink1]=218
codes[plum1]=219
codes[gold1]=220
codes[lightgoldenrod2]=221
codes[lightgoldenrod2]=222
codes[navajowhite1]=223
codes[mistyrose1]=224
codes[thistle1]=225
codes[yellow1]=226
codes[lightgoldenrod1]=227
codes[khaki1]=228
codes[wheat1]=229
codes[cornsilk1]=230
codes[grey100]=231
codes[grey3]=232
codes[grey7]=233
codes[grey11]=234
codes[grey15]=235
codes[grey19]=236
codes[grey23]=237
codes[grey27]=238
codes[grey30]=239
codes[grey35]=240
codes[grey39]=241
codes[grey42]=242
codes[grey46]=243
codes[grey50]=244
codes[grey54]=245
codes[grey58]=246
codes[grey62]=247
codes[grey66]=248
codes[grey70]=249
codes[grey74]=250
codes[grey78]=251
codes[grey82]=252
codes[grey85]=253
codes[grey89]=254
codes[grey93]=255
# for testing purposes in terminal local colorName="${1}"
if [[ "$1" == "foreground" ]]; then # Check if value is none with any case.
# call via `getColorCode foreground` if [[ "${(L)colorName}" == "none" ]]; then
for i in "${(k@)codes}"; do echo -n 'none'
print -P "$(foregroundColor $i)$(getColor $i) - $i$(foregroundColor)" elif [[ "${colorName}" == "foreground" ]]; then
done # for testing purposes in terminal
elif [[ "$1" == "background" ]]; then # call via `getColorCode foreground`
# call via `getColorCode background` for i in "${(k@)__P9K_COLORS}"; do
for i in "${(k@)codes}"; do print -P "$(foregroundColor $i)$(getColor $i) - $i%f"
print -P "$(backgroundColor $i)$(getColor $i) - $i$(backgroundColor)" done
done elif [[ "${colorName}" == "background" ]]; then
else # call via `getColorCode background`
#[[ -n "$1" ]] bg="%K{$1}" || bg="%k" for i in "${(k@)__P9K_COLORS}"; do
# Strip eventual "bg-" prefixes print -P "$(backgroundColor $i)$(getColor $i) - $i%k"
1=${1#bg-} done
# Strip eventual "fg-" prefixes else
1=${1#fg-} # Strip eventual "bg-" prefixes
# Strip eventual "br" prefixes ("bright" colors) colorName=${colorName#bg-}
1=${1#br} # Strip eventual "fg-" prefixes
echo -n $codes[$1] colorName=${colorName#fg-}
fi # Strip eventual "br" prefixes ("bright" colors)
colorName=${colorName#br}
echo -n $__P9K_COLORS[$colorName]
fi fi
} }

@ -48,24 +48,24 @@ case $POWERLEVEL9K_MODE in
FREEBSD_ICON $'\U1F608 ' # 😈 FREEBSD_ICON $'\U1F608 ' # 😈
ANDROID_ICON $'\uE270' #  ANDROID_ICON $'\uE270' # 
LINUX_ICON $'\uE271' #  LINUX_ICON $'\uE271' # 
LINUX_ARCH_ICON 'Arc' LINUX_ARCH_ICON $'\uE271' # 
LINUX_DEBIAN_ICON 'Deb' LINUX_DEBIAN_ICON $'\uE271' # 
LINUX_UBUNTU_ICON 'Ubu' LINUX_UBUNTU_ICON $'\uE271' # 
LINUX_CENTOS_ICON 'Cen' LINUX_CENTOS_ICON $'\uE271' # 
LINUX_COREOS_ICON 'Cor' LINUX_COREOS_ICON $'\uE271' # 
LINUX_ELEMENTARY_ICON 'Elm' LINUX_ELEMENTARY_ICON $'\uE271' # 
LINUX_MINT_ICON 'LMi' LINUX_MINT_ICON $'\uE271' # 
LINUX_FEDORA_ICON 'Fed' LINUX_FEDORA_ICON $'\uE271' # 
LINUX_GENTOO_ICON 'Gen' LINUX_GENTOO_ICON $'\uE271' # 
LINUX_MAGEIA_ICON 'Mag' LINUX_MAGEIA_ICON $'\uE271' # 
LINUX_NIXOS_ICON 'Nix' LINUX_NIXOS_ICON $'\uE271' # 
LINUX_MANJARO_ICON 'Man' LINUX_MANJARO_ICON $'\uE271' # 
LINUX_DEVUAN_ICON 'Dev' LINUX_DEVUAN_ICON $'\uE271' # 
LINUX_ALPINE_ICON 'Alp' LINUX_ALPINE_ICON $'\uE271' # 
LINUX_AOSC_ICON 'Aos' LINUX_AOSC_ICON $'\uE271' # 
LINUX_OPENSUSE_ICON 'OSu' LINUX_OPENSUSE_ICON $'\uE271' # 
LINUX_SABAYON_ICON 'Sab' LINUX_SABAYON_ICON $'\uE271' # 
LINUX_SLACKWARE_ICON 'Sla' LINUX_SLACKWARE_ICON $'\uE271' # 
SUNOS_ICON $'\U1F31E ' # 🌞 SUNOS_ICON $'\U1F31E ' # 🌞
HOME_ICON $'\uE12C' #  HOME_ICON $'\uE12C' # 
HOME_SUB_ICON $'\uE18D' #  HOME_SUB_ICON $'\uE18D' # 
@ -148,24 +148,24 @@ case $POWERLEVEL9K_MODE in
FREEBSD_ICON $'\U1F608 ' # 😈 FREEBSD_ICON $'\U1F608 ' # 😈
ANDROID_ICON $'\uE17B' #  ANDROID_ICON $'\uE17B' # 
LINUX_ICON $'\uF17C' #  LINUX_ICON $'\uF17C' # 
LINUX_ARCH_ICON 'Arc' LINUX_ARCH_ICON $'\uF17C' # 
LINUX_DEBIAN_ICON 'Deb' LINUX_DEBIAN_ICON $'\uF17C' # 
LINUX_UBUNTU_ICON 'Ubu' LINUX_UBUNTU_ICON $'\uF17C' # 
LINUX_CENTOS_ICON 'Cen' LINUX_CENTOS_ICON $'\uF17C' # 
LINUX_COREOS_ICON 'Cor' LINUX_COREOS_ICON $'\uF17C' # 
LINUX_ELEMENTARY_ICON 'Elm' LINUX_ELEMENTARY_ICON $'\uF17C' # 
LINUX_MINT_ICON 'LMi' LINUX_MINT_ICON $'\uF17C' # 
LINUX_FEDORA_ICON 'Fed' LINUX_FEDORA_ICON $'\uF17C' # 
LINUX_GENTOO_ICON 'Gen' LINUX_GENTOO_ICON $'\uF17C' # 
LINUX_MAGEIA_ICON 'Mag' LINUX_MAGEIA_ICON $'\uF17C' # 
LINUX_NIXOS_ICON 'Nix' LINUX_NIXOS_ICON $'\uF17C' # 
LINUX_MANJARO_ICON 'Man' LINUX_MANJARO_ICON $'\uF17C' # 
LINUX_DEVUAN_ICON 'Dev' LINUX_DEVUAN_ICON $'\uF17C' # 
LINUX_ALPINE_ICON 'Alp' LINUX_ALPINE_ICON $'\uF17C' # 
LINUX_AOSC_ICON 'Aos' LINUX_AOSC_ICON $'\uF17C' # 
LINUX_OPENSUSE_ICON 'OSu' LINUX_OPENSUSE_ICON $'\uF17C' # 
LINUX_SABAYON_ICON 'Sab' LINUX_SABAYON_ICON $'\uF17C' # 
LINUX_SLACKWARE_ICON 'Sla' LINUX_SLACKWARE_ICON $'\uF17C' # 
SUNOS_ICON $'\uF185 ' #  SUNOS_ICON $'\uF185 ' # 
HOME_ICON $'\uF015' #  HOME_ICON $'\uF015' # 
HOME_SUB_ICON $'\uF07C' #  HOME_SUB_ICON $'\uF07C' # 
@ -250,24 +250,24 @@ case $POWERLEVEL9K_MODE in
APPLE_ICON '\u'$CODEPOINT_OF_AWESOME_APPLE #  APPLE_ICON '\u'$CODEPOINT_OF_AWESOME_APPLE # 
FREEBSD_ICON $'\U1F608 ' # 😈 FREEBSD_ICON $'\U1F608 ' # 😈
LINUX_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX #  LINUX_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_ARCH_ICON 'Arc' LINUX_ARCH_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_DEBIAN_ICON 'Deb' LINUX_DEBIAN_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_UBUNTU_ICON 'Ubu' LINUX_UBUNTU_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_CENTOS_ICON 'Cen' LINUX_CENTOS_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_COREOS_ICON 'Cor' LINUX_COREOS_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_ELEMENTARY_ICON 'Elm' LINUX_ELEMENTARY_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_MINT_ICON 'LMi' LINUX_MINT_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_FEDORA_ICON 'Fed' LINUX_FEDORA_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_GENTOO_ICON 'Gen' LINUX_GENTOO_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_MAGEIA_ICON 'Mag' LINUX_MAGEIA_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_NIXOS_ICON 'Nix' LINUX_NIXOS_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_MANJARO_ICON 'Man' LINUX_MANJARO_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_DEVUAN_ICON 'Dev' LINUX_DEVUAN_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_ALPINE_ICON 'Alp' LINUX_ALPINE_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_AOSC_ICON 'Aos' LINUX_AOSC_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_OPENSUSE_ICON 'OSu' LINUX_OPENSUSE_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_SABAYON_ICON 'Sab' LINUX_SABAYON_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
LINUX_SLACKWARE_ICON 'Sla' LINUX_SLACKWARE_ICON '\u'$CODEPOINT_OF_AWESOME_LINUX # 
SUNOS_ICON '\u'$CODEPOINT_OF_AWESOME_SUN_O' ' #  SUNOS_ICON '\u'$CODEPOINT_OF_AWESOME_SUN_O' ' # 
HOME_ICON '\u'$CODEPOINT_OF_AWESOME_HOME #  HOME_ICON '\u'$CODEPOINT_OF_AWESOME_HOME # 
HOME_SUB_ICON '\u'$CODEPOINT_OF_AWESOME_FOLDER_OPEN #  HOME_SUB_ICON '\u'$CODEPOINT_OF_AWESOME_FOLDER_OPEN # 

@ -111,45 +111,54 @@ CURRENT_BG='NONE'
set_default last_left_element_index 1 set_default last_left_element_index 1
set_default POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS " " set_default POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS " "
left_prompt_segment() { left_prompt_segment() {
local segment_name="${1}"
local current_index=$2 local current_index=$2
# Check if the segment should be joined with the previous one # Check if the segment should be joined with the previous one
local joined local joined
segmentShouldBeJoined $current_index $last_left_element_index "$POWERLEVEL9K_LEFT_PROMPT_ELEMENTS" && joined=true || joined=false segmentShouldBeJoined $current_index $last_left_element_index "$POWERLEVEL9K_LEFT_PROMPT_ELEMENTS" && joined=true || joined=false
# Colors
local backgroundColor="${3}"
local foregroundColor="${4}"
# Overwrite given background-color by user defined variable for this segment. # Overwrite given background-color by user defined variable for this segment.
local BACKGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)1#prompt_}_BACKGROUND local BACKGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)${segment_name}#prompt_}_BACKGROUND
local BG_COLOR_MODIFIER=${(P)BACKGROUND_USER_VARIABLE} local BG_COLOR_MODIFIER=${(P)BACKGROUND_USER_VARIABLE}
[[ -n $BG_COLOR_MODIFIER ]] && 3="$BG_COLOR_MODIFIER" [[ -n $BG_COLOR_MODIFIER ]] && backgroundColor="$BG_COLOR_MODIFIER"
# Overwrite given foreground-color by user defined variable for this segment. # Overwrite given foreground-color by user defined variable for this segment.
local FOREGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)1#prompt_}_FOREGROUND local FOREGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)${segment_name}#prompt_}_FOREGROUND
local FG_COLOR_MODIFIER=${(P)FOREGROUND_USER_VARIABLE} local FG_COLOR_MODIFIER=${(P)FOREGROUND_USER_VARIABLE}
[[ -n $FG_COLOR_MODIFIER ]] && 4="$FG_COLOR_MODIFIER" [[ -n $FG_COLOR_MODIFIER ]] && foregroundColor="$FG_COLOR_MODIFIER"
# Get color codes here to save some calls later on
backgroundColor="$(getColorCode ${backgroundColor})"
foregroundColor="$(getColorCode ${foregroundColor})"
local bg fg local background foreground
[[ -n "$3" ]] && bg="$(backgroundColor $3)" || bg="$(backgroundColor)" [[ -n "${backgroundColor}" ]] && background="$(backgroundColor ${backgroundColor})" || background="%k"
[[ -n "$4" ]] && fg="$(foregroundColor $4)" || fg="$(foregroundColor)" [[ -n "${foregroundColor}" ]] && foreground="$(foregroundColor ${foregroundColor})" || foreground="%f"
if [[ $CURRENT_BG != 'NONE' ]] && ! isSameColor "$3" "$CURRENT_BG"; then if [[ $CURRENT_BG != 'NONE' ]] && ! isSameColor "${backgroundColor}" "$CURRENT_BG"; then
echo -n "$bg%F{$CURRENT_BG}" echo -n "${background}%F{$CURRENT_BG}"
if [[ $joined == false ]]; then if [[ $joined == false ]]; then
# Middle segment # Middle segment
echo -n "$(print_icon 'LEFT_SEGMENT_SEPARATOR')$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS" echo -n "$(print_icon 'LEFT_SEGMENT_SEPARATOR')$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS"
fi fi
elif isSameColor "$CURRENT_BG" "$3"; then elif isSameColor "$CURRENT_BG" "${backgroundColor}"; then
# Middle segment with same color as previous segment # Middle segment with same color as previous segment
# We take the current foreground color as color for our # We take the current foreground color as color for our
# subsegment (or the default color). This should have # subsegment (or the default color). This should have
# enough contrast. # enough contrast.
local complement local complement
[[ -n "$4" ]] && complement="$fg" || complement="$(foregroundColor $DEFAULT_COLOR)" [[ -n "${foregroundColor}" ]] && complement="${foreground}" || complement="$(foregroundColor $DEFAULT_COLOR)"
echo -n "${bg}${complement}" echo -n "${background}${complement}"
if [[ $joined == false ]]; then if [[ $joined == false ]]; then
echo -n "$(print_icon 'LEFT_SUBSEGMENT_SEPARATOR')$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS" echo -n "$(print_icon 'LEFT_SUBSEGMENT_SEPARATOR')$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS"
fi fi
else else
# First segment # First segment
echo -n "${bg}$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS" echo -n "${background}$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS"
fi fi
local visual_identifier local visual_identifier
@ -161,26 +170,26 @@ left_prompt_segment() {
# we need to color both the visual identifier and the whitespace. # we need to color both the visual identifier and the whitespace.
[[ -n "$5" ]] && visual_identifier="$visual_identifier " [[ -n "$5" ]] && visual_identifier="$visual_identifier "
# Allow users to overwrite the color for the visual identifier only. # Allow users to overwrite the color for the visual identifier only.
local visual_identifier_color_variable=POWERLEVEL9K_${(U)1#prompt_}_VISUAL_IDENTIFIER_COLOR local visual_identifier_color_variable=POWERLEVEL9K_${(U)${segment_name}#prompt_}_VISUAL_IDENTIFIER_COLOR
set_default $visual_identifier_color_variable $4 set_default $visual_identifier_color_variable "${foregroundColor}"
visual_identifier="%F{${(P)visual_identifier_color_variable}%}$visual_identifier%f" visual_identifier="$(foregroundColor ${(P)visual_identifier_color_variable})${visual_identifier}%f"
fi fi
fi fi
# Print the visual identifier # Print the visual identifier
echo -n "${visual_identifier}" echo -n "${visual_identifier}"
# Print the content of the segment, if there is any # Print the content of the segment, if there is any
[[ -n "$5" ]] && echo -n "${fg}${5}" [[ -n "$5" ]] && echo -n "${foreground}${5}"
echo -n "${POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS}" echo -n "${POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS}"
CURRENT_BG=$3 CURRENT_BG="${backgroundColor}"
last_left_element_index=$current_index last_left_element_index=$current_index
} }
# End the left prompt, closes the final segment. # End the left prompt, closes the final segment.
left_prompt_end() { left_prompt_end() {
if [[ -n $CURRENT_BG ]]; then if [[ -n $CURRENT_BG ]]; then
echo -n "%k%F{$CURRENT_BG}$(print_icon 'LEFT_SEGMENT_SEPARATOR')" echo -n "%k$(foregroundColor ${CURRENT_BG})$(print_icon 'LEFT_SEGMENT_SEPARATOR')"
else else
echo -n "%k" echo -n "%k"
fi fi
@ -203,25 +212,34 @@ CURRENT_RIGHT_BG='NONE'
set_default last_right_element_index 1 set_default last_right_element_index 1
set_default POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS " " set_default POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS " "
right_prompt_segment() { right_prompt_segment() {
local segment_name="${1}"
local current_index=$2 local current_index=$2
# Check if the segment should be joined with the previous one # Check if the segment should be joined with the previous one
local joined local joined
segmentShouldBeJoined $current_index $last_right_element_index "$POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS" && joined=true || joined=false segmentShouldBeJoined $current_index $last_right_element_index "$POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS" && joined=true || joined=false
# Colors
local backgroundColor="${3}"
local foregroundColor="${4}"
# Overwrite given background-color by user defined variable for this segment. # Overwrite given background-color by user defined variable for this segment.
local BACKGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)1#prompt_}_BACKGROUND local BACKGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)${segment_name}#prompt_}_BACKGROUND
local BG_COLOR_MODIFIER=${(P)BACKGROUND_USER_VARIABLE} local BG_COLOR_MODIFIER=${(P)BACKGROUND_USER_VARIABLE}
[[ -n $BG_COLOR_MODIFIER ]] && 3="$BG_COLOR_MODIFIER" [[ -n $BG_COLOR_MODIFIER ]] && backgroundColor="$BG_COLOR_MODIFIER"
# Overwrite given foreground-color by user defined variable for this segment. # Overwrite given foreground-color by user defined variable for this segment.
local FOREGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)1#prompt_}_FOREGROUND local FOREGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)${segment_name}#prompt_}_FOREGROUND
local FG_COLOR_MODIFIER=${(P)FOREGROUND_USER_VARIABLE} local FG_COLOR_MODIFIER=${(P)FOREGROUND_USER_VARIABLE}
[[ -n $FG_COLOR_MODIFIER ]] && 4="$FG_COLOR_MODIFIER" [[ -n $FG_COLOR_MODIFIER ]] && foregroundColor="$FG_COLOR_MODIFIER"
# Get color codes here to save some calls later on
backgroundColor="$(getColorCode ${backgroundColor})"
foregroundColor="$(getColorCode ${foregroundColor})"
local bg fg local background foreground
[[ -n "$3" ]] && bg="$(backgroundColor $3)" || bg="$(backgroundColor)" [[ -n "${backgroundColor}" ]] && background="$(backgroundColor ${backgroundColor})" || background="%k"
[[ -n "$4" ]] && fg="$(foregroundColor $4)" || fg="$(foregroundColor)" [[ -n "${foregroundColor}" ]] && foreground="$(foregroundColor ${foregroundColor})" || foreground="%f"
# If CURRENT_RIGHT_BG is "NONE", we are the first right segment. # If CURRENT_RIGHT_BG is "NONE", we are the first right segment.
@ -231,17 +249,17 @@ right_prompt_segment() {
fi fi
if [[ $joined == false ]] || [[ "$CURRENT_RIGHT_BG" == "NONE" ]]; then if [[ $joined == false ]] || [[ "$CURRENT_RIGHT_BG" == "NONE" ]]; then
if isSameColor "$CURRENT_RIGHT_BG" "$3"; then if isSameColor "$CURRENT_RIGHT_BG" "${backgroundColor}"; then
# Middle segment with same color as previous segment # Middle segment with same color as previous segment
# We take the current foreground color as color for our # We take the current foreground color as color for our
# subsegment (or the default color). This should have # subsegment (or the default color). This should have
# enough contrast. # enough contrast.
local complement local complement
[[ -n "$4" ]] && complement="$fg" || complement="$(foregroundColor $DEFAULT_COLOR)" [[ -n "${foregroundColor}" ]] && complement="${foreground}" || complement="$(foregroundColor $DEFAULT_COLOR)"
echo -n "$complement$(print_icon 'RIGHT_SUBSEGMENT_SEPARATOR')%f" echo -n "$complement$(print_icon 'RIGHT_SUBSEGMENT_SEPARATOR')%f"
else else
# Use the new BG color for the foreground with separator # Use the new Background Color as the foreground of the segment separator
echo -n "$(foregroundColor $3)$(print_icon 'RIGHT_SEGMENT_SEPARATOR')%f" echo -n "$(foregroundColor ${backgroundColor})$(print_icon 'RIGHT_SEGMENT_SEPARATOR')%f"
fi fi
fi fi
@ -254,13 +272,13 @@ right_prompt_segment() {
# we need to color both the visual identifier and the whitespace. # we need to color both the visual identifier and the whitespace.
[[ -n "$5" ]] && visual_identifier=" $visual_identifier" [[ -n "$5" ]] && visual_identifier=" $visual_identifier"
# Allow users to overwrite the color for the visual identifier only. # Allow users to overwrite the color for the visual identifier only.
local visual_identifier_color_variable=POWERLEVEL9K_${(U)1#prompt_}_VISUAL_IDENTIFIER_COLOR local visual_identifier_color_variable=POWERLEVEL9K_${(U)${segment_name}#prompt_}_VISUAL_IDENTIFIER_COLOR
set_default $visual_identifier_color_variable $4 set_default $visual_identifier_color_variable "${foregroundColor}"
visual_identifier="%F{${(P)visual_identifier_color_variable}%}$visual_identifier%f" visual_identifier="$(foregroundColor ${(P)visual_identifier_color_variable})${visual_identifier}%f"
fi fi
fi fi
echo -n "${bg}${fg}" echo -n "${background}${foreground}"
# Print whitespace only if segment is not joined or first right segment # Print whitespace only if segment is not joined or first right segment
[[ $joined == false ]] || [[ "$CURRENT_RIGHT_BG" == "NONE" ]] && echo -n "${POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS}" [[ $joined == false ]] || [[ "$CURRENT_RIGHT_BG" == "NONE" ]] && echo -n "${POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS}"
@ -270,7 +288,7 @@ right_prompt_segment() {
# Print the visual identifier # Print the visual identifier
echo -n "${visual_identifier}" echo -n "${visual_identifier}"
CURRENT_RIGHT_BG=$3 CURRENT_RIGHT_BG="${backgroundColor}"
last_right_element_index=$current_index last_right_element_index=$current_index
} }
@ -278,11 +296,6 @@ right_prompt_segment() {
# Prompt Segment Definitions # Prompt Segment Definitions
################################################################ ################################################################
# The `CURRENT_BG` variable is used to remember what the last BG color used was
# when building the left-hand prompt. Because the RPROMPT is created from
# right-left but reads the opposite, this isn't necessary for the other side.
CURRENT_BG='NONE'
################################################################ ################################################################
# Anaconda Environment # Anaconda Environment
prompt_anaconda() { prompt_anaconda() {
@ -409,12 +422,13 @@ prompt_battery() {
'charged' 'green' 'charged' 'green'
'disconnected' "$DEFAULT_COLOR_INVERTED" 'disconnected' "$DEFAULT_COLOR_INVERTED"
) )
local ROOT_PREFIX="${4}"
# Set default values if the user did not configure them # Set default values if the user did not configure them
set_default POWERLEVEL9K_BATTERY_LOW_THRESHOLD 10 set_default POWERLEVEL9K_BATTERY_LOW_THRESHOLD 10
if [[ $OS =~ OSX && -f /usr/bin/pmset && -x /usr/bin/pmset ]]; then if [[ $OS =~ OSX && -f "${ROOT_PREFIX}"/usr/bin/pmset && -x "${ROOT_PREFIX}"/usr/bin/pmset ]]; then
# obtain battery information from system # obtain battery information from system
local raw_data="$(pmset -g batt | awk 'FNR==2{print}')" local raw_data="$(${ROOT_PREFIX}/usr/bin/pmset -g batt | awk 'FNR==2{print}')"
# return if there is no battery on system # return if there is no battery on system
[[ -z $(echo $raw_data | grep "InternalBattery") ]] && return [[ -z $(echo $raw_data | grep "InternalBattery") ]] && return
@ -446,7 +460,7 @@ prompt_battery() {
fi fi
if [[ "$OS" == 'Linux' ]] || [[ "$OS" == 'Android' ]]; then if [[ "$OS" == 'Linux' ]] || [[ "$OS" == 'Android' ]]; then
local sysp="/sys/class/power_supply" local sysp="${ROOT_PREFIX}/sys/class/power_supply"
# Reported BAT0 or BAT1 depending on kernel version # Reported BAT0 or BAT1 depending on kernel version
[[ -a $sysp/BAT0 ]] && local bat=$sysp/BAT0 [[ -a $sysp/BAT0 ]] && local bat=$sysp/BAT0
@ -468,8 +482,8 @@ prompt_battery() {
[[ $bat_percent =~ 100 ]] && current_state="charged" [[ $bat_percent =~ 100 ]] && current_state="charged"
[[ $bat_percent -lt 100 ]] && current_state="charging" [[ $bat_percent -lt 100 ]] && current_state="charging"
fi fi
if [[ -f /usr/bin/acpi ]]; then if [[ -f ${ROOT_PREFIX}/usr/bin/acpi ]]; then
local time_remaining=$(acpi | awk '{ print $5 }') local time_remaining=$(${ROOT_PREFIX}/usr/bin/acpi | awk '{ print $5 }')
if [[ $time_remaining =~ rate ]]; then if [[ $time_remaining =~ rate ]]; then
local tstring="..." local tstring="..."
elif [[ $time_remaining =~ "[[:digit:]]+" ]]; then elif [[ $time_remaining =~ "[[:digit:]]+" ]]; then
@ -623,12 +637,12 @@ prompt_context() {
if [[ $(print -P "%#") == '#' ]]; then if [[ $(print -P "%#") == '#' ]]; then
current_state="ROOT" current_state="ROOT"
elif [[ -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then elif [[ -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then
if sudo -n true 2>/dev/null; then if [[ -n "$SUDO_COMMAND" ]]; then
current_state="REMOTE_SUDO" current_state="REMOTE_SUDO"
else else
current_state="REMOTE" current_state="REMOTE"
fi fi
elif sudo -n true 2>/dev/null; then elif [[ -n "$SUDO_COMMAND" ]]; then
current_state="SUDO" current_state="SUDO"
fi fi
@ -651,7 +665,7 @@ prompt_user() {
"FOREGROUND_COLOR" "yellow" "FOREGROUND_COLOR" "yellow"
"VISUAL_IDENTIFIER" "ROOT_ICON" "VISUAL_IDENTIFIER" "ROOT_ICON"
) )
elif sudo -n true 2>/dev/null; then elif [[ -n "$SUDO_COMMAND" ]]; then
user_state=( user_state=(
"STATE" "SUDO" "STATE" "SUDO"
"CONTENT" "${POWERLEVEL9K_USER_TEMPLATE}" "CONTENT" "${POWERLEVEL9K_USER_TEMPLATE}"
@ -702,11 +716,13 @@ prompt_host() {
# The 'custom` prompt provides a way for users to invoke commands and display # The 'custom` prompt provides a way for users to invoke commands and display
# the output in a segment. # the output in a segment.
prompt_custom() { prompt_custom() {
local command=POWERLEVEL9K_CUSTOM_$3:u local segment_name="${3:u}"
# Get content of custom segment
local command="POWERLEVEL9K_CUSTOM_${segment_name}"
local segment_content="$(eval ${(P)command})" local segment_content="$(eval ${(P)command})"
if [[ -n $segment_content ]]; then if [[ -n $segment_content ]]; then
"$1_prompt_segment" "${0}_${3:u}" "$2" $DEFAULT_COLOR_INVERTED $DEFAULT_COLOR "$segment_content" "$1_prompt_segment" "${0}_${3:u}" "$2" $DEFAULT_COLOR_INVERTED $DEFAULT_COLOR "$segment_content" "CUSTOM_${segment_name}_ICON"
fi fi
} }
@ -1055,18 +1071,14 @@ prompt_history() {
################################################################ ################################################################
# Detection for virtualization (systemd based systems only) # Detection for virtualization (systemd based systems only)
prompt_detect_virt() { prompt_detect_virt() {
if ! command -v systemd-detect-virt > /dev/null; then local virt=$(systemd-detect-virt 2> /dev/null)
return
fi
local virt=$(systemd-detect-virt)
if [[ "$virt" == "none" ]]; then if [[ "$virt" == "none" ]]; then
if [[ "$(ls -di / | grep -o 2)" != "2" ]]; then if [[ "$(ls -di / | grep -o 2)" != "2" ]]; then
virt="chroot" virt="chroot"
"$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR" "yellow" "$virt"
else
;
fi fi
else fi
if [[ -n "${virt}" ]]; then
"$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR" "yellow" "$virt" "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR" "yellow" "$virt"
fi fi
} }
@ -1101,18 +1113,20 @@ prompt_ip() {
else else
if defined POWERLEVEL9K_IP_INTERFACE; then if defined POWERLEVEL9K_IP_INTERFACE; then
# Get the IP address of the specified interface. # Get the IP address of the specified interface.
ip=$(ip -4 a show "$POWERLEVEL9K_IP_INTERFACE" | grep -o "inet\s*[0-9.]*" | grep -o "[0-9.]*") ip=$(ip -4 a show "$POWERLEVEL9K_IP_INTERFACE" | grep -o "inet\s*[0-9.]*" | grep -o -E "[0-9.]+")
else else
local interfaces callback local interfaces callback
# Get all network interface names that are up # Get all network interface names that are up
interfaces=$(ip link ls up | grep -o -E ":\s+[a-z0-9]+:" | grep -v "lo" | grep -o "[a-z0-9]*") interfaces=$(ip link ls up | grep -o -E ":\s+[a-z0-9]+:" | grep -v "lo" | grep -o -E "[a-z0-9]+")
callback='ip -4 a show $item | grep -o "inet\s*[0-9.]*" | grep -o "[0-9.]*"' callback='ip -4 a show $item | grep -o "inet\s*[0-9.]*" | grep -o -E "[0-9.]+"'
ip=$(getRelevantItem "$interfaces" "$callback") ip=$(getRelevantItem "$interfaces" "$callback")
fi fi
fi fi
"$1_prompt_segment" "$0" "$2" "cyan" "$DEFAULT_COLOR" "$ip" 'NETWORK_ICON' if [[ -n "$ip" ]]; then
"$1_prompt_segment" "$0" "$2" "cyan" "$DEFAULT_COLOR" "$ip" 'NETWORK_ICON'
fi
} }
################################################################ ################################################################
@ -1142,6 +1156,7 @@ prompt_laravel_version() {
# Segment to display load # Segment to display load
set_default POWERLEVEL9K_LOAD_WHICH 5 set_default POWERLEVEL9K_LOAD_WHICH 5
prompt_load() { prompt_load() {
local ROOT_PREFIX="${4}"
# The load segment can have three different states # The load segment can have three different states
local current_state="unknown" local current_state="unknown"
local load_select=2 local load_select=2
@ -1177,7 +1192,7 @@ prompt_load() {
fi fi
;; ;;
*) *)
load_avg=$(cut -d" " -f${load_select} /proc/loadavg) load_avg=$(cut -d" " -f${load_select} ${ROOT_PREFIX}/proc/loadavg)
cores=$(nproc) cores=$(nproc)
esac esac
@ -1250,6 +1265,7 @@ prompt_php_version() {
################################################################ ################################################################
# Segment to display free RAM and used Swap # Segment to display free RAM and used Swap
prompt_ram() { prompt_ram() {
local ROOT_PREFIX="${4}"
local base='' local base=''
local ramfree=0 local ramfree=0
if [[ "$OS" == "OSX" ]]; then if [[ "$OS" == "OSX" ]]; then
@ -1261,9 +1277,9 @@ prompt_ram() {
ramfree=$(( ramfree * 4096 )) ramfree=$(( ramfree * 4096 ))
else else
if [[ "$OS" == "BSD" ]]; then if [[ "$OS" == "BSD" ]]; then
ramfree=$(grep 'avail memory' /var/run/dmesg.boot | awk '{print $4}') ramfree=$(grep 'avail memory' ${ROOT_PREFIX}/var/run/dmesg.boot | awk '{print $4}')
else else
ramfree=$(grep -o -E "MemAvailable:\s+[0-9]+" /proc/meminfo | grep -o "[0-9]*") ramfree=$(grep -o -E "MemAvailable:\s+[0-9]+" ${ROOT_PREFIX}/proc/meminfo | grep -o -E "[0-9]+")
base='K' base='K'
fi fi
fi fi
@ -1428,6 +1444,7 @@ prompt_status() {
################################################################ ################################################################
# Segment to display Swap information # Segment to display Swap information
prompt_swap() { prompt_swap() {
local ROOT_PREFIX="${4}"
local swap_used=0 local swap_used=0
local base='' local base=''
@ -1442,8 +1459,8 @@ prompt_swap() {
base=$(echo "$raw_swap_used" | grep -o "[A-Z]*$") base=$(echo "$raw_swap_used" | grep -o "[A-Z]*$")
else else
swap_total=$(grep -o -E "SwapTotal:\s+[0-9]+" /proc/meminfo | grep -o "[0-9]*") swap_total=$(grep -o -E "SwapTotal:\s+[0-9]+" ${ROOT_PREFIX}/proc/meminfo | grep -o -E "[0-9]+")
swap_free=$(grep -o -E "SwapFree:\s+[0-9]+" /proc/meminfo | grep -o "[0-9]*") swap_free=$(grep -o -E "SwapFree:\s+[0-9]+" ${ROOT_PREFIX}/proc/meminfo | grep -o -E "[0-9]+")
swap_used=$(( swap_total - swap_free )) swap_used=$(( swap_total - swap_free ))
base='K' base='K'
fi fi
@ -1616,7 +1633,7 @@ set_default POWERLEVEL9K_VI_COMMAND_MODE_STRING "NORMAL"
prompt_vi_mode() { prompt_vi_mode() {
case ${KEYMAP} in case ${KEYMAP} in
vicmd) vicmd)
"$1_prompt_segment" "$0_NORMAL" "$2" "$DEFAULT_COLOR" "default" "$POWERLEVEL9K_VI_COMMAND_MODE_STRING" "$1_prompt_segment" "$0_NORMAL" "$2" "$DEFAULT_COLOR" "white" "$POWERLEVEL9K_VI_COMMAND_MODE_STRING"
;; ;;
main|viins|*) main|viins|*)
if [[ -z $POWERLEVEL9K_VI_INSERT_MODE_STRING ]]; then return; fi if [[ -z $POWERLEVEL9K_VI_INSERT_MODE_STRING ]]; then return; fi

@ -1 +1 @@
Subproject commit 60dd60bcd1573befe38465010263ab242e55811d Subproject commit 07bb3292048a4982aad7247bdd7890f2bf532ece

@ -2,10 +2,12 @@
set -eu set -eu
# The default ZSH to use. # The default ZSH to use; it can just be the first few characters.
default_version='4.3.11' # This should be the oldest version we support.
default_version='4.'
setopt extended_glob glob_subst numeric_glob_sort setopt extended_glob glob_subst numeric_glob_sort
setopt warn_create_global warn_nested_var 2> /dev/null
cd "${${(%):-%x}:A:h}" cd "${${(%):-%x}:A:h}"
# TODO: Crazy Logic to munge TERM to something supported in Ubuntu 14.04 # TODO: Crazy Logic to munge TERM to something supported in Ubuntu 14.04
@ -15,13 +17,18 @@ term=screen-256color
# ...see Modifiers in zshexpn(1) for details. # ...see Modifiers in zshexpn(1) for details.
# List of ZSH versions # List of ZSH versions
typeset -a versions typeset -aU versions
versions=( docker/base-*/Dockerfile(N.on:h:t:s/base-//) ) versions=( docker/base-*/Dockerfile(N.on:h:t:s/base-//) )
typeset -r versions
# List of frameworks # List of frameworks
typeset -a frameworks typeset -aU frameworks
frameworks=( docker/*/Dockerfile(N.on:h:t) ) frameworks=( docker/*/Dockerfile(N.on:h:t) )
frameworks=${(@)frameworks:#base-*} for i in {$#frameworks..1}; do
# Remove all base entries
[[ "${frameworks[$i]}" == base-* ]] && frameworks[$i]=()
done
typeset -r frameworks
# Known Issues # Known Issues
typeset -A known_issues typeset -A known_issues
@ -30,6 +37,7 @@ known_issues["4.3.11-zim"]="BROKEN: Zim wants ZSH 5.2 or newer."
known_issues["5.0.3-zim"]="DEPRECATED: Zim wants ZSH 5.2 or newer." known_issues["5.0.3-zim"]="DEPRECATED: Zim wants ZSH 5.2 or newer."
known_issues["5.1.1-zim"]="DEPRECATED: Zim wants ZSH 5.2 or newer." known_issues["5.1.1-zim"]="DEPRECATED: Zim wants ZSH 5.2 or newer."
known_issues["4.3.11-zulu"]="Zulu doesn't work; it needs a newer version of git." known_issues["4.3.11-zulu"]="Zulu doesn't work; it needs a newer version of git."
typeset -r known_issues
err() err()
{ {
@ -65,6 +73,14 @@ check_for_known_issues() {
fi fi
} }
cmd() {
if (( dry_run )); then
echo "${(@q)*}" 1>&2
else
"${(@)*}"
fi
}
build_and_run() { build_and_run() {
local version="$1" local version="$1"
local framework="$2" local framework="$2"
@ -75,14 +91,14 @@ build_and_run() {
print -P "%F{green}Preparing containers...%f" print -P "%F{green}Preparing containers...%f"
echo -n "p9k:base-${version}: " echo -n "p9k:base-${version}: "
docker build \ cmd docker build \
--quiet \ --quiet \
--tag "p9k:base-${version}" \ --tag "p9k:base-${version}" \
--file "docker/base-${version}/Dockerfile" \ --file "docker/base-${version}/Dockerfile" \
. .
echo -n "p9k:${version}-${framework}: " echo -n "p9k:${version}-${framework}: "
docker build \ cmd docker build \
--quiet \ --quiet \
--build-arg="base=base-${version}" \ --build-arg="base=base-${version}" \
--tag "p9k:${version}-${framework}" \ --tag "p9k:${version}-${framework}" \
@ -90,7 +106,7 @@ build_and_run() {
. .
print -P "%F{green}Starting ${name} container...%f" print -P "%F{green}Starting ${name} container...%f"
exec docker run \ cmd docker run \
--rm \ --rm \
--interactive \ --interactive \
--tty \ --tty \
@ -105,9 +121,10 @@ show_help() {
echo echo
echo "Loads up a docker image with powershell9k configured in <framework>" echo "Loads up a docker image with powershell9k configured in <framework>"
echo echo
echo " --frameworks Lists all available frameworks, newline separated." echo " -f --frameworks Lists all available frameworks, newline separated."
echo " --versions Lists all available ZSH versions, newline separated." echo " -v --versions Lists all available ZSH versions, newline separated."
echo " --zsh VER Uses ZSH with version VER." echo " -z --zsh VER Uses ZSH with version VER."
echo " -n --dry-run Just prints the docker commands that would be run."
echo " --help You're soaking in it." echo " --help You're soaking in it."
echo echo
echo "ZSH versions:" echo "ZSH versions:"
@ -128,8 +145,9 @@ if (( $# == 0 )); then
fi fi
# Parse flags and such. # Parse flags and such.
use_version=$default_version asked_for_version=$default_version
use_framework= asked_for_framework=
dry_run=0
while (( $# > 0 )); do while (( $# > 0 )); do
case "$1" in case "$1" in
-f | --frameworks ) -f | --frameworks )
@ -142,13 +160,9 @@ while (( $# > 0 )); do
;; ;;
-z | --zsh ) -z | --zsh )
shift shift
local v="$(resolve_version "$1")" asked_for_version=$1
if [[ -n "$v" ]]; then
use_version=$v
else
err "No such ZSH version '${1}'"
fi
;; ;;
-n | --dry-run ) dry_run=1 ;;
-h | --help ) -h | --help )
show_help show_help
exit exit
@ -159,21 +173,28 @@ while (( $# > 0 )); do
exit 1 exit 1
;; ;;
* ) * )
if [[ -z "$use_framework" ]]; then if [[ -z "$asked_for_framework" ]]; then
local f="$(resolve_framework "$1")" asked_for_framework=$1
if [[ -n "$f" ]]; then
use_framework=$f
else
err "No such framework '${1}'"
fi
else else
err "You can only specify one framework at a time; you already specified '${use_framework}'" err "You can only specify one framework at a time; you already specified '${asked_for_framework}'"
fi fi
;; ;;
esac esac
shift shift
done done
typeset -r asked_for_version asked_for_framework
typeset -r use_version="$(resolve_version "${asked_for_version}")"
if [[ -z "$use_version" ]]; then
err "No such ZSH version '${asked_for_version}'"
fi
typeset -r use_framework="$(resolve_framework "${asked_for_framework}")"
if [[ -z "$use_framework" ]]; then
err "No such framework '${asked_for_framework}'"
fi
build_and_run "$use_version" "$use_framework" build_and_run "$use_version" "$use_framework"
# EOF # EOF

@ -0,0 +1,62 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
}
function testDynamicColoringOfSegmentsWork() {
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(date)
local POWERLEVEL9K_DATE_ICON="date-icon"
local POWERLEVEL9K_DATE_BACKGROUND='red'
assertEquals "%K{009} %F{000}date-icon %f%F{000}%D{%d.%m.%y} %k%F{009}%f " "$(build_left_prompt)"
}
function testDynamicColoringOfVisualIdentifiersWork() {
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(date)
local POWERLEVEL9K_DATE_ICON="date-icon"
local POWERLEVEL9K_DATE_VISUAL_IDENTIFIER_COLOR='green'
assertEquals "%K{015} %F{002}date-icon %f%F{000}%D{%d.%m.%y} %k%F{015}%f " "$(build_left_prompt)"
}
function testColoringOfVisualIdentifiersDoesNotOverwriteColoringOfSegment() {
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(date)
local POWERLEVEL9K_DATE_ICON="date-icon"
local POWERLEVEL9K_DATE_VISUAL_IDENTIFIER_COLOR='green'
local POWERLEVEL9K_DATE_FOREGROUND='red'
local POWERLEVEL9K_DATE_BACKGROUND='yellow'
assertEquals "%K{011} %F{002}date-icon %f%F{009}%D{%d.%m.%y} %k%F{011}%f " "$(build_left_prompt)"
}
function testColorOverridingOfStatefulSegment() {
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(host)
local POWERLEVEL9K_SSH_ICON="ssh-icon"
local POWERLEVEL9K_HOST_REMOTE_BACKGROUND='red'
local POWERLEVEL9K_HOST_REMOTE_FOREGROUND='green'
# Provoke state
local SSH_CLIENT="x"
assertEquals "%K{009} %F{002}ssh-icon %f%F{002}%m %k%F{009}%f " "$(build_left_prompt)"
}
function testColorOverridingOfCustomSegment() {
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
local POWERLEVEL9K_CUSTOM_WORLD_ICON='CW'
local POWERLEVEL9K_CUSTOM_WORLD_VISUAL_IDENTIFIER_COLOR='green'
local POWERLEVEL9K_CUSTOM_WORLD_FOREGROUND='red'
local POWERLEVEL9K_CUSTOM_WORLD_BACKGROUND='red'
assertEquals "%K{009} %F{002}CW %f%F{009}world %k%F{009}%f " "$(build_left_prompt)"
}
source shunit2/shunit2

@ -0,0 +1,187 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
}
function testLeftNormalSegmentsShouldNotBeJoined() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3 custom_world4_joined custom_world5 custom_world6)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo world2"
local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD4="echo world4"
local POWERLEVEL9K_CUSTOM_WORLD5="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD6="echo world6"
assertEquals "%K{015} %F{000}world1 %K{015}%F{000} %F{000}world2 %K{015}%F{000} %F{000}world4 %K{015}%F{000} %F{000}world6 %k%F{015}%f " "$(build_left_prompt)"
}
function testLeftJoinedSegments() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2_joined)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo world2"
assertEquals "%K{015} %F{000}world1 %K{015}%F{000}%F{000}world2 %k%F{015}%f " "$(build_left_prompt)"
}
function testLeftTransitiveJoinedSegments() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2_joined custom_world3_joined)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo world2"
local POWERLEVEL9K_CUSTOM_WORLD3="echo world3"
assertEquals "%K{015} %F{000}world1 %K{015}%F{000}%F{000}world2 %K{015}%F{000}%F{000}world3 %k%F{015}%f " "$(build_left_prompt)"
}
function testLeftTransitiveJoiningWithConditionalJoinedSegment() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2_joined custom_world3_joined custom_world4_joined)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo world2"
local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD4="echo world4"
assertEquals "%K{015} %F{000}world1 %K{015}%F{000}%F{000}world2 %K{015}%F{000}%F{000}world4 %k%F{015}%f " "$(build_left_prompt)"
}
function testLeftPromotingSegmentWithConditionalPredecessor() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3_joined)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD3="echo world3"
assertEquals "%K{015} %F{000}world1 %K{015}%F{000} %F{000}world3 %k%F{015}%f " "$(build_left_prompt)"
}
function testLeftPromotingSegmentWithJoinedConditionalPredecessor() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3_joined custom_world4_joined)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD4="echo world4"
assertEquals "%K{015} %F{000}world1 %K{015}%F{000} %F{000}world4 %k%F{015}%f " "$(build_left_prompt)"
}
function testLeftPromotingSegmentWithDeepJoinedConditionalPredecessor() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3_joined custom_world4_joined custom_world5_joined custom_world6_joined)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD4="echo world4"
local POWERLEVEL9K_CUSTOM_WORLD5="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD6="echo world6"
assertEquals "%K{015} %F{000}world1 %K{015}%F{000} %F{000}world4 %K{015}%F{000}%F{000}world6 %k%F{015}%f " "$(build_left_prompt)"
}
function testLeftJoiningBuiltinSegmentWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(php_version php_version_joined)
alias php="echo PHP 1.2.3"
assertEquals "%K{013} %F{255}PHP 1.2.3 %K{013}%F{255}%F{255}PHP 1.2.3 %k%F{013}%f " "$(build_left_prompt)"
unalias php
}
function testRightNormalSegmentsShouldNotBeJoined() {
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3 custom_world4 custom_world5_joined custom_world6)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo world2"
local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD4="echo world4"
local POWERLEVEL9K_CUSTOM_WORLD5="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD6="echo world6"
assertEquals "%F{015}%f%K{015}%F{000} world1 %f%F{000}%f%K{015}%F{000} world2 %f%F{000}%f%K{015}%F{000} world4 %f%F{000}%f%K{015}%F{000} world6%E" "$(build_right_prompt)"
}
function testRightJoinedSegments() {
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2_joined)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo world2"
assertEquals "%F{015}%f%K{015}%F{000} world1 %f%K{015}%F{000}world2%E" "$(build_right_prompt)"
}
function testRightTransitiveJoinedSegments() {
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2_joined custom_world3_joined)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo world2"
local POWERLEVEL9K_CUSTOM_WORLD3="echo world3"
assertEquals "%F{015}%f%K{015}%F{000} world1 %f%K{015}%F{000}world2 %f%K{015}%F{000}world3%E" "$(build_right_prompt)"
}
function testRightTransitiveJoiningWithConditionalJoinedSegment() {
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2_joined custom_world3_joined custom_world4_joined)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo world2"
local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD4="echo world4"
assertEquals "%F{015}%f%K{015}%F{000} world1 %f%K{015}%F{000}world2 %f%K{015}%F{000}world4%E" "$(build_right_prompt)"
}
function testRightPromotingSegmentWithConditionalPredecessor() {
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3_joined)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD3="echo world3"
assertEquals "%F{015}%f%K{015}%F{000} world1 %f%F{000}%f%K{015}%F{000} world3%E" "$(build_right_prompt)"
}
function testRightPromotingSegmentWithJoinedConditionalPredecessor() {
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3_joined custom_world4_joined)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD4="echo world4"
assertEquals "%F{015}%f%K{015}%F{000} world1 %f%F{000}%f%K{015}%F{000} world4%E" "$(build_right_prompt)"
}
function testRightPromotingSegmentWithDeepJoinedConditionalPredecessor() {
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3_joined custom_world4_joined custom_world5_joined custom_world6_joined)
local POWERLEVEL9K_CUSTOM_WORLD1="echo world1"
local POWERLEVEL9K_CUSTOM_WORLD2="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD4="echo world4"
local POWERLEVEL9K_CUSTOM_WORLD5="echo " # Print nothing to simulate unmet conditions
local POWERLEVEL9K_CUSTOM_WORLD6="echo world6"
assertEquals "%F{015}%f%K{015}%F{000} world1 %f%F{000}%f%K{015}%F{000} world4 %f%K{015}%F{000}world6%E" "$(build_right_prompt)"
}
function testRightJoiningBuiltinSegmentWorks() {
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(php_version php_version_joined)
alias php="echo PHP 1.2.3"
assertEquals "%F{013}%f%K{013}%F{255} PHP 1.2.3 %f%K{013}%F{255}PHP 1.2.3%E" "$(build_right_prompt)"
unalias php
}
source shunit2/shunit2

@ -0,0 +1,104 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
}
function testSegmentOnRightSide() {
# Reset RPROMPT, so a running P9K does not interfere with the test
local RPROMPT=
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2)
local POWERLEVEL9K_CUSTOM_WORLD1='echo world1'
local POWERLEVEL9K_CUSTOM_WORLD2='echo world2'
powerlevel9k_prepare_prompts
local reset_attributes=$'\e[00m'
assertEquals "%f%b%k%F{015}%f%K{015}%F{000} world1 %f%F{000}%f%K{015}%F{000} world2%E%{${reset_attributes}%}" "${(e)RPROMPT}"
}
function testDisablingRightPrompt() {
# Reset RPROMPT, so a running P9K does not interfere with the test
local RPROMPT=
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2)
local POWERLEVEL9K_CUSTOM_WORLD1='echo world1'
local POWERLEVEL9K_CUSTOM_WORLD2='echo world2'
local POWERLEVEL9K_DISABLE_RPROMPT=true
powerlevel9k_prepare_prompts
assertEquals "" "${(e)RPROMPT}"
}
function testLeftMultilinePrompt() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1)
local POWERLEVEL9K_CUSTOM_WORLD1='echo world1'
local POWERLEVEL9K_PROMPT_ON_NEWLINE=true
powerlevel9k_prepare_prompts
local nl=$'\n'
assertEquals "╭─%f%b%k%K{015} %F{000}world1 %k%F{015}%f ${nl}╰─ " "${(e)PROMPT}"
}
function testRightPromptOnSameLine() {
# Reset RPROMPT, so a running P9K does not interfere with the test
local RPROMPT=
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1)
local POWERLEVEL9K_CUSTOM_WORLD1='echo world1'
local POWERLEVEL9K_PROMPT_ON_NEWLINE=true
local POWERLEVEL9K_RPROMPT_ON_NEWLINE=false # We want the RPROMPT on the same line as our left prompt
# Skip test, as this cannot be tested properly.
# The "go one line up" instruction does not get
# printed as real characters in RPROMPT.
# On command line the assert statement produces
# a visually identical output as we expect, but
# it fails anyway. :(
startSkipping
powerlevel9k_prepare_prompts
assertEquals "%{\e[1A%}%F{015}%f%K{015}%F{000} world1 %f%{\e[1B%}" "${(e)RPROMPT}"
}
function testPrefixingFirstLineOnLeftPrompt() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1)
local POWERLEVEL9K_CUSTOM_WORLD1='echo world1'
local POWERLEVEL9K_PROMPT_ON_NEWLINE=true
local POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='XXX'
powerlevel9k_prepare_prompts
local nl=$'\n'
assertEquals "XXX%f%b%k%K{015} %F{000}world1 %k%F{015}%f ${nl}╰─ " "${(e)PROMPT}"
}
function testPrefixingSecondLineOnLeftPrompt() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1)
local POWERLEVEL9K_CUSTOM_WORLD1='echo world1'
local POWERLEVEL9K_PROMPT_ON_NEWLINE=true
local POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX='XXX'
powerlevel9k_prepare_prompts
local nl=$'\n'
assertEquals "╭─%f%b%k%K{015} %F{000}world1 %k%F{015}%f ${nl}XXX" "${(e)PROMPT}"
}
source shunit2/shunit2

@ -0,0 +1,60 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
source functions/*
}
function testOverwritingIconsWork() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1)
local POWERLEVEL9K_CUSTOM_WORLD1='echo world1'
local POWERLEVEL9K_CUSTOM_WORLD1_ICON='icon-here'
assertEquals "%K{015} %F{000}icon-here %f%F{000}world1 %k%F{015}%f " "$(build_left_prompt)"
}
function testVisualIdentifierAppearsBeforeSegmentContentOnLeftSegments() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1)
local POWERLEVEL9K_CUSTOM_WORLD1='echo world1'
local POWERLEVEL9K_CUSTOM_WORLD1_ICON='icon-here'
assertEquals "%K{015} %F{000}icon-here %f%F{000}world1 %k%F{015}%f " "$(build_left_prompt)"
}
function testVisualIdentifierAppearsAfterSegmentContentOnRightSegments() {
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1)
local POWERLEVEL9K_CUSTOM_WORLD1='echo world1'
local POWERLEVEL9K_CUSTOM_WORLD1_ICON='icon-here'
assertEquals "%F{015}%f%K{015}%F{000} world1%F{000} icon-here%f%E" "$(build_right_prompt)"
}
function testVisualIdentifierPrintsNothingIfNotAvailable() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1)
local POWERLEVEL9K_CUSTOM_WORLD1='echo world1'
assertEquals "%K{015} %F{000}world1 %k%F{015}%f " "$(build_left_prompt)"
}
function testVisualIdentifierIsPrintedInNumericalColorCode() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1)
local POWERLEVEL9K_CUSTOM_WORLD1='echo world1'
local POWERLEVEL9K_CUSTOM_WORLD1_ICON="xxx"
local POWERLEVEL9K_CUSTOM_WORLD1_VISUAL_IDENTIFIER_COLOR="purple3"
assertEquals "%K{015} %F{056}xxx %f%F{000}world1 %k%F{015}%f " "$(build_left_prompt)"
}
source shunit2/shunit2

@ -22,6 +22,10 @@ function testGetColorCodeWithNumericalColor() {
assertEquals '002' "$(getColorCode '002')" assertEquals '002' "$(getColorCode '002')"
} }
function testGetColorCodeWithNoneColor() {
assertEquals 'none' "$(getColorCode 'NONE')"
}
function testIsSameColorComparesAnsiForegroundAndNumericalColorCorrectly() { function testIsSameColorComparesAnsiForegroundAndNumericalColorCorrectly() {
assertTrue "isSameColor 'green' '002'" assertTrue "isSameColor 'green' '002'"
} }
@ -30,13 +34,34 @@ function testIsSameColorComparesAnsiBackgroundAndNumericalColorCorrectly() {
assertTrue "isSameColor 'bg-green' '002'" assertTrue "isSameColor 'bg-green' '002'"
} }
function testIsSameColorComparesNumericalBackgroundAndNumericalColorCorrectly() { function testIsSameColorComparesShortCodesCorrectly() {
assertTrue "isSameColor '010' '2'" assertTrue "isSameColor '002' '2'"
} }
function testIsSameColorDoesNotYieldNotEqualColorsTruthy() { function testIsSameColorDoesNotYieldNotEqualColorsTruthy() {
assertFalse "isSameColor 'green' '003'" assertFalse "isSameColor 'green' '003'"
} }
function testIsSameColorHandlesNoneCorrectly() {
assertTrue "isSameColor 'none' 'NOnE'"
}
function testIsSameColorCompareTwoNoneColorsCorrectly() {
assertTrue "isSameColor 'none' 'none'"
}
function testIsSameColorComparesColorWithNoneCorrectly() {
assertFalse "isSameColor 'green' 'none'"
}
function testBrightColorsWork() {
# We had some code in the past that equalized bright colors
# with normal ones. This code is now gone, and this test should
# ensure that all input channels for bright colors are handled
# correctly.
assertTrue "isSameColor 'cyan' '014'"
assertEquals '014' "$(getColorCode 'cyan')"
assertEquals '014' "$(getColor 'cyan')"
}
source shunit2/source/2.1/src/shunit2 source shunit2/shunit2

@ -10,21 +10,15 @@ function setUp() {
_OLD_LC_CTYPE="${LC_CTYPE}" _OLD_LC_CTYPE="${LC_CTYPE}"
# Reset actual LC_CTYPE # Reset actual LC_CTYPE
unset LC_CTYPE unset LC_CTYPE
# Store old P9K mode
_OLD_P9K_MODE="${POWERLEVEL9K_MODE}"
} }
function tearDown() { function tearDown() {
# Restore LC_CTYPE # Restore LC_CTYPE
LC_CTYPE="${_OLD_LC_CTYPE}" LC_CTYPE="${_OLD_LC_CTYPE}"
# Restore old P9K mode
POWERLEVEL9K_MODE="${_OLD_P9K_MODE}"
} }
function testLcCtypeIsSetCorrectlyInDefaultMode() { function testLcCtypeIsSetCorrectlyInDefaultMode() {
POWERLEVEL9K_MODE="default" local POWERLEVEL9K_MODE="default"
# Load Powerlevel9k # Load Powerlevel9k
source functions/icons.zsh source functions/icons.zsh
@ -32,7 +26,7 @@ function testLcCtypeIsSetCorrectlyInDefaultMode() {
} }
function testLcCtypeIsSetCorrectlyInAwesomePatchedMode() { function testLcCtypeIsSetCorrectlyInAwesomePatchedMode() {
POWERLEVEL9K_MODE="awesome-patched" local POWERLEVEL9K_MODE="awesome-patched"
# Load Powerlevel9k # Load Powerlevel9k
source functions/icons.zsh source functions/icons.zsh
@ -40,7 +34,7 @@ function testLcCtypeIsSetCorrectlyInAwesomePatchedMode() {
} }
function testLcCtypeIsSetCorrectlyInAwesomeFontconfigMode() { function testLcCtypeIsSetCorrectlyInAwesomeFontconfigMode() {
POWERLEVEL9K_MODE="awesome-fontconfig" local POWERLEVEL9K_MODE="awesome-fontconfig"
# Load Powerlevel9k # Load Powerlevel9k
source functions/icons.zsh source functions/icons.zsh
@ -48,7 +42,7 @@ function testLcCtypeIsSetCorrectlyInAwesomeFontconfigMode() {
} }
function testLcCtypeIsSetCorrectlyInNerdfontFontconfigMode() { function testLcCtypeIsSetCorrectlyInNerdfontFontconfigMode() {
POWERLEVEL9K_MODE="nerdfont-fontconfig" local POWERLEVEL9K_MODE="nerdfont-fontconfig"
# Load Powerlevel9k # Load Powerlevel9k
source functions/icons.zsh source functions/icons.zsh
@ -56,7 +50,7 @@ function testLcCtypeIsSetCorrectlyInNerdfontFontconfigMode() {
} }
function testLcCtypeIsSetCorrectlyInFlatMode() { function testLcCtypeIsSetCorrectlyInFlatMode() {
POWERLEVEL9K_MODE="flat" local POWERLEVEL9K_MODE="flat"
# Load Powerlevel9k # Load Powerlevel9k
source functions/icons.zsh source functions/icons.zsh
@ -64,7 +58,7 @@ function testLcCtypeIsSetCorrectlyInFlatMode() {
} }
function testLcCtypeIsSetCorrectlyInCompatibleMode() { function testLcCtypeIsSetCorrectlyInCompatibleMode() {
POWERLEVEL9K_MODE="compatible" local POWERLEVEL9K_MODE="compatible"
# Load Powerlevel9k # Load Powerlevel9k
source functions/icons.zsh source functions/icons.zsh
@ -76,7 +70,7 @@ function testLcCtypeIsSetCorrectlyInCompatibleMode() {
function testAllIconsAreDefinedLikeInDefaultMode() { function testAllIconsAreDefinedLikeInDefaultMode() {
# Always compare against this mode # Always compare against this mode
local _P9K_TEST_MODE="default" local _P9K_TEST_MODE="default"
POWERLEVEL9K_MODE="${_P9K_TEST_MODE}" local POWERLEVEL9K_MODE="${_P9K_TEST_MODE}"
source functions/icons.zsh source functions/icons.zsh
# _ICONS_UNDER_TEST is an array of just the keys of $icons. # _ICONS_UNDER_TEST is an array of just the keys of $icons.
# We later check via (r) "subscript" flag that our key # We later check via (r) "subscript" flag that our key
@ -121,6 +115,15 @@ function testAllIconsAreDefinedLikeInDefaultMode() {
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done done
# Switch to "nerdfont-complete" mode
POWERLEVEL9K_MODE="nerdfont-complete"
source functions/icons.zsh
typeset -ah current_icons
current_icons=(${(k)icons[@]})
for key in ${_ICONS_UNDER_TEST}; do
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done
# Switch to "flat" mode # Switch to "flat" mode
POWERLEVEL9K_MODE="flat" POWERLEVEL9K_MODE="flat"
source functions/icons.zsh source functions/icons.zsh
@ -148,7 +151,7 @@ function testAllIconsAreDefinedLikeInDefaultMode() {
function testAllIconsAreDefinedLikeInAwesomePatchedMode() { function testAllIconsAreDefinedLikeInAwesomePatchedMode() {
# Always compare against this mode # Always compare against this mode
local _P9K_TEST_MODE="awesome-patched" local _P9K_TEST_MODE="awesome-patched"
POWERLEVEL9K_MODE="$_P9K_TEST_MODE" local POWERLEVEL9K_MODE="$_P9K_TEST_MODE"
source functions/icons.zsh source functions/icons.zsh
# _ICONS_UNDER_TEST is an array of just the keys of $icons. # _ICONS_UNDER_TEST is an array of just the keys of $icons.
# We later check via (r) "subscript" flag that our key # We later check via (r) "subscript" flag that our key
@ -193,6 +196,15 @@ function testAllIconsAreDefinedLikeInAwesomePatchedMode() {
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done done
# Switch to "nerdfont-complete" mode
POWERLEVEL9K_MODE="nerdfont-complete"
source functions/icons.zsh
typeset -ah current_icons
current_icons=(${(k)icons[@]})
for key in ${_ICONS_UNDER_TEST}; do
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done
# Switch to "flat" mode # Switch to "flat" mode
POWERLEVEL9K_MODE="flat" POWERLEVEL9K_MODE="flat"
source functions/icons.zsh source functions/icons.zsh
@ -220,7 +232,7 @@ function testAllIconsAreDefinedLikeInAwesomePatchedMode() {
function testAllIconsAreDefinedLikeInAwesomeFontconfigMode() { function testAllIconsAreDefinedLikeInAwesomeFontconfigMode() {
# Always compare against this mode # Always compare against this mode
local _P9K_TEST_MODE="awesome-fontconfig" local _P9K_TEST_MODE="awesome-fontconfig"
POWERLEVEL9K_MODE="$_P9K_TEST_MODE" local POWERLEVEL9K_MODE="$_P9K_TEST_MODE"
source functions/icons.zsh source functions/icons.zsh
# _ICONS_UNDER_TEST is an array of just the keys of $icons. # _ICONS_UNDER_TEST is an array of just the keys of $icons.
# We later check via (r) "subscript" flag that our key # We later check via (r) "subscript" flag that our key
@ -265,6 +277,15 @@ function testAllIconsAreDefinedLikeInAwesomeFontconfigMode() {
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done done
# Switch to "nerdfont-complete" mode
POWERLEVEL9K_MODE="nerdfont-complete"
source functions/icons.zsh
typeset -ah current_icons
current_icons=(${(k)icons[@]})
for key in ${_ICONS_UNDER_TEST}; do
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done
# Switch to "flat" mode # Switch to "flat" mode
POWERLEVEL9K_MODE="flat" POWERLEVEL9K_MODE="flat"
source functions/icons.zsh source functions/icons.zsh
@ -292,7 +313,7 @@ function testAllIconsAreDefinedLikeInAwesomeFontconfigMode() {
function testAllIconsAreDefinedLikeInNerdfontFontconfigMode() { function testAllIconsAreDefinedLikeInNerdfontFontconfigMode() {
# Always compare against this mode # Always compare against this mode
local _P9K_TEST_MODE="nerdfont-fontconfig" local _P9K_TEST_MODE="nerdfont-fontconfig"
POWERLEVEL9K_MODE="$_P9K_TEST_MODE" local POWERLEVEL9K_MODE="$_P9K_TEST_MODE"
source functions/icons.zsh source functions/icons.zsh
# _ICONS_UNDER_TEST is an array of just the keys of $icons. # _ICONS_UNDER_TEST is an array of just the keys of $icons.
# We later check via (r) "subscript" flag that our key # We later check via (r) "subscript" flag that our key
@ -337,6 +358,96 @@ function testAllIconsAreDefinedLikeInNerdfontFontconfigMode() {
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done done
# Switch to "nerdfont-complete" mode
POWERLEVEL9K_MODE="nerdfont-complete"
source functions/icons.zsh
typeset -ah current_icons
current_icons=(${(k)icons[@]})
for key in ${_ICONS_UNDER_TEST}; do
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done
# Switch to "flat" mode
POWERLEVEL9K_MODE="flat"
source functions/icons.zsh
typeset -ah current_icons
current_icons=(${(k)icons[@]})
for key in ${_ICONS_UNDER_TEST}; do
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done
# Switch to "compatible" mode
POWERLEVEL9K_MODE="compatible"
source functions/icons.zsh
typeset -ah current_icons
current_icons=(${(k)icons[@]})
for key in ${_ICONS_UNDER_TEST}; do
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done
unset current_icons
unset _ICONS_UNDER_TEST
}
# Go through all icons defined in nerdfont-complete mode, and
# check if all of them are defined in the other modes.
function testAllIconsAreDefinedLikeInNerdfontCompleteMode() {
# Always compare against this mode
local _P9K_TEST_MODE="nerdfont-complete"
local POWERLEVEL9K_MODE="$_P9K_TEST_MODE"
source functions/icons.zsh
# _ICONS_UNDER_TEST is an array of just the keys of $icons.
# We later check via (r) "subscript" flag that our key
# is in the values of our flat array.
typeset -ah _ICONS_UNDER_TEST
_ICONS_UNDER_TEST=(${(k)icons[@]})
# Switch to "default" mode
POWERLEVEL9K_MODE="default"
source functions/icons.zsh
typeset -ah current_icons
current_icons=(${(k)icons[@]})
for key in ${_ICONS_UNDER_TEST}; do
# Iterate over all keys found in the _ICONS_UNDER_TEST
# array and compare it with the icons array of the
# current POWERLEVEL9K_MODE.
# Use parameter expansion, to directly check if the
# key exists in the flat current array of keys. That
# is quite complicated, but there seems no easy way
# to check the mere existance of a key in an array.
# The usual way would always return the value, so that
# would do the wrong thing as we have some (on purpose)
# empty values.
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done
# Switch to "awesome-patched" mode
POWERLEVEL9K_MODE="awesome-patched"
source functions/icons.zsh
typeset -ah current_icons
current_icons=(${(k)icons[@]})
for key in ${_ICONS_UNDER_TEST}; do
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done
# Switch to "awesome-fontconfig" mode
POWERLEVEL9K_MODE="awesome-fontconfig"
source functions/icons.zsh
typeset -ah current_icons
current_icons=(${(k)icons[@]})
for key in ${_ICONS_UNDER_TEST}; do
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done
# Switch to "nerdfont-fontconfig" mode
POWERLEVEL9K_MODE="nerdfont-fontconfig"
source functions/icons.zsh
typeset -ah current_icons
current_icons=(${(k)icons[@]})
for key in ${_ICONS_UNDER_TEST}; do
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))"
done
# Switch to "flat" mode # Switch to "flat" mode
POWERLEVEL9K_MODE="flat" POWERLEVEL9K_MODE="flat"
source functions/icons.zsh source functions/icons.zsh
@ -359,4 +470,4 @@ function testAllIconsAreDefinedLikeInNerdfontFontconfigMode() {
unset _ICONS_UNDER_TEST unset _ICONS_UNDER_TEST
} }
source shunit2/source/2.1/src/shunit2 source shunit2/shunit2

@ -106,4 +106,4 @@ function testSegmentShouldNotBeJoinedIfPredecessingSegmentIsNotJoinedButConditio
unset segments unset segments
} }
source shunit2/source/2.1/src/shunit2 source shunit2/shunit2

@ -17,68 +17,66 @@ function setUp() {
} }
function testJoinedSegments() { function testJoinedSegments() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir dir_joined) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir dir_joined)
cd /tmp cd /tmp
assertEquals "%K{blue} %F{black}/tmp %K{blue}%F{black}%F{black}/tmp %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/tmp %K{012}%F{000}%F{000}/tmp %k%F{012}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
cd - cd -
} }
function testTransitiveJoinedSegments() { function testTransitiveJoinedSegments() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir root_indicator_joined dir_joined) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir root_indicator_joined dir_joined)
cd /tmp cd /tmp
assertEquals "%K{blue} %F{black}/tmp %K{blue}%F{black}%F{black}/tmp %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/tmp %K{012}%F{000}%F{000}/tmp %k%F{012}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
cd - cd -
} }
function testJoiningWithConditionalSegment() { function testJoiningWithConditionalSegment() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir background_jobs dir_joined) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir background_jobs dir_joined)
cd /tmp cd /tmp
assertEquals "%K{blue} %F{black}/tmp %K{blue}%F{black} %F{black}/tmp %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/tmp %K{012}%F{000} %F{000}/tmp %k%F{012}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
cd - cd -
} }
function testDynamicColoringOfSegmentsWork() { function testDynamicColoringOfSegmentsWork() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_DIR_DEFAULT_BACKGROUND='red' local POWERLEVEL9K_DIR_DEFAULT_BACKGROUND='red'
cd /tmp cd /tmp
assertEquals "%K{red} %F{black}/tmp %k%F{red}%f " "$(build_left_prompt)" assertEquals "%K{009} %F{000}/tmp %k%F{009}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_DIR_DEFAULT_BACKGROUND
cd - cd -
} }
function testDynamicColoringOfVisualIdentifiersWork() { function testDynamicColoringOfVisualIdentifiersWork() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_DIR_DEFAULT_VISUAL_IDENTIFIER_COLOR='green' local POWERLEVEL9K_DIR_DEFAULT_VISUAL_IDENTIFIER_COLOR='green'
POWERLEVEL9K_FOLDER_ICON="icon-here" local POWERLEVEL9K_FOLDER_ICON="icon-here"
cd /tmp cd /tmp
assertEquals "%K{blue} %F{green%}icon-here %f%F{black}/tmp %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{002}icon-here %f%F{000}/tmp %k%F{012}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_DIR_DEFAULT_VISUAL_IDENTIFIER_COLOR
unset POWERLEVEL9K_FOLDER_ICON
cd - cd -
} }
function testColoringOfVisualIdentifiersDoesNotOverwriteColoringOfSegment() { function testColoringOfVisualIdentifiersDoesNotOverwriteColoringOfSegment() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_DIR_DEFAULT_VISUAL_IDENTIFIER_COLOR='green' local POWERLEVEL9K_DIR_DEFAULT_VISUAL_IDENTIFIER_COLOR='green'
POWERLEVEL9K_DIR_DEFAULT_FOREGROUND='red' local POWERLEVEL9K_DIR_DEFAULT_FOREGROUND='red'
POWERLEVEL9K_DIR_DEFAULT_BACKGROUND='yellow' local POWERLEVEL9K_DIR_DEFAULT_BACKGROUND='yellow'
POWERLEVEL9K_FOLDER_ICON="icon-here" local POWERLEVEL9K_FOLDER_ICON="icon-here"
# Re-Source the icons, as the POWERLEVEL9K_MODE is directly # Re-Source the icons, as the POWERLEVEL9K_MODE is directly
# evaluated there. # evaluated there.
@ -86,19 +84,15 @@ function testColoringOfVisualIdentifiersDoesNotOverwriteColoringOfSegment() {
cd /tmp cd /tmp
assertEquals "%K{yellow} %F{green%}icon-here %f%F{red}/tmp %k%F{yellow}%f " "$(build_left_prompt)" assertEquals "%K{011} %F{002}icon-here %f%F{009}/tmp %k%F{011}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_DIR_DEFAULT_VISUAL_IDENTIFIER_COLOR
unset POWERLEVEL9K_DIR_DEFAULT_FOREGROUND
unset POWERLEVEL9K_DIR_DEFAULT_BACKGROUND
unset POWERLEVEL9K_FOLDER_ICON
cd - cd -
} }
function testOverwritingIconsWork() { function testOverwritingIconsWork() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_FOLDER_ICON='icon-here' local POWERLEVEL9K_FOLDER_ICON='icon-here'
#local testFolder=$(mktemp -d -p p9k) #local testFolder=$(mktemp -d -p p9k)
# Move testFolder under home folder # Move testFolder under home folder
#mv testFolder ~ #mv testFolder ~
@ -106,31 +100,24 @@ function testOverwritingIconsWork() {
#cd ~/$testFolder #cd ~/$testFolder
cd /tmp cd /tmp
assertEquals "%K{blue} %F{black%}icon-here %f%F{black}/tmp %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}icon-here %f%F{000}/tmp %k%F{012}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_DIR_FOLDER_ICON
cd - cd -
# rm -fr ~/$testFolder # rm -fr ~/$testFolder
} }
function testNewlineOnRpromptCanBeDisabled() { function testNewlineOnRpromptCanBeDisabled() {
POWERLEVEL9K_PROMPT_ON_NEWLINE=true local POWERLEVEL9K_PROMPT_ON_NEWLINE=true
POWERLEVEL9K_RPROMPT_ON_NEWLINE=false local POWERLEVEL9K_RPROMPT_ON_NEWLINE=false
POWERLEVEL9K_CUSTOM_WORLD='echo world' local POWERLEVEL9K_CUSTOM_WORLD='echo world'
POWERLEVEL9K_CUSTOM_RWORLD='echo rworld' local POWERLEVEL9K_CUSTOM_RWORLD='echo rworld'
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world)
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_rworld) POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_rworld)
powerlevel9k_prepare_prompts powerlevel9k_prepare_prompts
assertEquals '$(print_icon MULTILINE_FIRST_PROMPT_PREFIX) world  $(print_icon MULTILINE_LAST_PROMPT_PREFIX) rworld' "$(print -P ${PROMPT}${RPROMPT})" assertEquals '$(print_icon MULTILINE_FIRST_PROMPT_PREFIX) world  $(print_icon MULTILINE_LAST_PROMPT_PREFIX) rworld' "$(print -P ${PROMPT}${RPROMPT})"
unset POWERLEVEL9K_PROMPT_ON_NEWLINE
unset POWERLEVEL9K_RPROMPT_ON_NEWLINE
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
unset POWERLEVEL9K_CUSTOM_WORLD
unset POWERLEVEL9K_CUSTOM_RWORLD
} }
source shunit2/source/2.1/src/shunit2 source shunit2/shunit2

@ -0,0 +1,69 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
}
function testAnacondaSegmentPrintsNothingIfNoAnacondaPathIsSet() {
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(anaconda custom_world)
# Load Powerlevel9k
source powerlevel9k.zsh-theme
# Unset anacona variables
unset CONDA_ENV_PATH
unset CONDA_PREFIX
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
}
function testAnacondaSegmentWorksIfOnlyAnacondaPathIsSet() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(anaconda)
local POWERLEVEL9K_PYTHON_ICON="icon-here"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
CONDA_ENV_PATH=/tmp
unset CONDA_PREFIX
assertEquals "%K{012} %F{000}icon-here %f%F{000}(tmp) %k%F{012}%f " "$(build_left_prompt)"
}
function testAnacondaSegmentWorksIfOnlyAnacondaPrefixIsSet() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(anaconda)
local POWERLEVEL9K_PYTHON_ICON="icon-here"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
unset CONDA_ENV_PATH
local CONDA_PREFIX="test"
assertEquals "%K{012} %F{000}icon-here %f%F{000}(test) %k%F{012}%f " "$(build_left_prompt)"
}
function testAnacondaSegmentWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(anaconda)
local POWERLEVEL9K_PYTHON_ICON="icon-here"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
local CONDA_ENV_PATH=/tmp
local CONDA_PREFIX="test"
assertEquals "%K{012} %F{000}icon-here %f%F{000}(tmptest) %k%F{012}%f " "$(build_left_prompt)"
}
source shunit2/shunit2

@ -0,0 +1,61 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
}
function testAwsEbEnvSegmentPrintsNothingIfNoElasticBeanstalkEnvironmentIsSet() {
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(aws_eb_env custom_world)
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
}
function testAwsEbEnvSegmentWorksIfElasticBeanstalkEnvironmentIsSet() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(aws_eb_env)
# Load Powerlevel9k
source powerlevel9k.zsh-theme
mkdir -p /tmp/powerlevel9k-test/.elasticbeanstalk
echo "test:\n environment: test" > /tmp/powerlevel9k-test/.elasticbeanstalk/config.yml
cd /tmp/powerlevel9k-test
assertEquals "%K{000} %F{002}🌱 %f%F{002}test %k%F{000}%f " "$(build_left_prompt)"
rm -fr /tmp/powerlevel9k-test
cd -
}
function testAwsEbEnvSegmentWorksIfElasticBeanstalkEnvironmentIsSetInParentDirectory() {
# Skip test, because currently we cannot detect
# if the configuration is in a parent directory
startSkipping # Skip test
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(aws_eb_env)
# Load Powerlevel9k
source powerlevel9k.zsh-theme
mkdir -p /tmp/powerlevel9k-test/.elasticbeanstalk
mkdir -p /tmp/powerlevel9k-test/1/12/123/1234/12345
echo "test:\n environment: test" > /tmp/powerlevel9k-test/.elasticbeanstalk/config.yml
cd /tmp/powerlevel9k-test/1/12/123/1234/12345
assertEquals "%K{000} %F{002}🌱 %f%F{002}test %k%F{000}%f " "$(build_left_prompt)"
rm -fr /tmp/powerlevel9k-test
cd -
}
source shunit2/shunit2

@ -0,0 +1,78 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
}
function testBackgroundJobsSegmentPrintsNothingWithoutBackgroundJobs() {
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(background_jobs custom_world)
alias jobs="nojobs 2>/dev/null"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unalias jobs
}
function testBackgroundJobsSegmentWorksWithOneBackgroundJob() {
unset POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(background_jobs)
jobs() {
echo '[1] + 30444 suspended nvim xx'
}
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{014}⚙%f %k%F{000}%f " "$(build_left_prompt)"
unfunction jobs
}
function testBackgroundJobsSegmentWorksWithMultipleBackgroundJobs() {
local POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(background_jobs)
jobs() {
echo "[1] 31190 suspended nvim xx"
echo "[2] - 31194 suspended nvim xx2"
echo "[3] + 31206 suspended nvim xx3"
}
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{014}⚙%f %k%F{000}%f " "$(build_left_prompt)"
unfunction jobs
}
function testBackgroundJobsSegmentWithVerboseMode() {
local POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=true
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(background_jobs)
jobs() {
echo "[1] 31190 suspended nvim xx"
echo "[2] - 31194 suspended nvim xx2"
echo "[3] + 31206 suspended nvim xx3"
}
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{014}⚙ %f%F{014}3 %k%F{000}%f " "$(build_left_prompt)"
unfunction jobs
}
source shunit2/shunit2

@ -0,0 +1,177 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
P9K_HOME=$(pwd)
### Test specific
# Create default folder
FOLDER=/tmp/powerlevel9k-test
mkdir -p "${FOLDER}"
cd $FOLDER
# Prepare folder for pmset (OSX)
PMSET_PATH=$FOLDER/usr/bin
mkdir -p $PMSET_PATH
# Prepare folder for $BATTERY (Linux)
BATTERY_PATH=$FOLDER/sys/class/power_supply
mkdir -p $BATTERY_PATH
mkdir -p $BATTERY_PATH/BAT0
mkdir -p $BATTERY_PATH/BAT1
}
function tearDown() {
# Go back to powerlevel9k folder
cd "${P9K_HOME}"
# Remove eventually created test-specific folder
rm -fr "${FOLDER}" &>/dev/null
# At least remove test folder completely
rm -fr /tmp/powerlevel9k-test &>/dev/null
unset PMSET_PATH
unset BATTERY_PATH
unset FOLDER
unset P9K_HOME
}
# Mock Battery
# For mocking pmset on OSX this function takes one argument (the
# content that pmset should echo).
# For mocking the battery on Linux this function takes two
# arguments: $1 is the capacity; $2 the battery status.
function makeBatterySay() {
if [[ -z "${FOLDER}" ]]; then
echo "Fake root path is not correctly set!"
exit 1
fi
# OSX
echo "#!/bin/sh" > $PMSET_PATH/pmset
echo "echo \"$1\"" >> $PMSET_PATH/pmset
chmod +x $PMSET_PATH/pmset
# Linux
local capacity="$1"
echo "$capacity" > $BATTERY_PATH/BAT0/capacity
echo "$capacity" > $BATTERY_PATH/BAT1/capacity
local battery_status="$2"
echo "$battery_status" > $BATTERY_PATH/BAT0/status
echo "$battery_status" > $BATTERY_PATH/BAT1/status
}
function testBatterySegmentIfBatteryIsLowWhileDischargingOnOSX() {
local OS='OSX' # Fake OSX
makeBatterySay "Now drawing from 'Battery Power'
-InternalBattery-0 (id=1234567) 4%; discharging; 0:05 remaining present: true"
assertEquals "%K{000} %F{009}🔋 %f%F{009}4%% (0:05) " "$(prompt_battery left 1 false ${FOLDER})"
}
function testBatterySegmentIfBatteryIsLowWhileChargingOnOSX() {
local OS='OSX' # Fake OSX
makeBatterySay "Now drawing from 'Battery Power'
-InternalBattery-0 (id=1234567) 4%; charging; 0:05 remaining present: true"
assertEquals "%K{000} %F{011}🔋 %f%F{011}4%% (0:05) " "$(prompt_battery left 1 false ${FOLDER})"
}
function testBatterySegmentIfBatteryIsAlmostFullWhileDischargingOnOSX() {
local OS='OSX' # Fake OSX
makeBatterySay "Now drawing from 'Battery Power'
-InternalBattery-0 (id=1234567) 98%; discharging; 3:57 remaining present: true"
assertEquals "%K{000} %F{015}🔋 %f%F{015}98%% (3:57) " "$(prompt_battery left 1 false ${FOLDER})"
}
function testBatterySegmentIfBatteryIsAlmostFullWhileChargingOnOSX() {
local OS='OSX' # Fake OSX
makeBatterySay "Now drawing from 'Battery Power'
-InternalBattery-0 (id=1234567) 98%; charging; 3:57 remaining present: true"
assertEquals "%K{000} %F{011}🔋 %f%F{011}98%% (3:57) " "$(prompt_battery left 1 false ${FOLDER})"
}
function testBatterySegmentIfBatteryIsFullOnOSX() {
local OS='OSX' # Fake OSX
makeBatterySay "Now drawing from 'AC Power'
-InternalBattery-0 (id=1234567) 99%; charged; 0:00 remaining present: true"
assertEquals "%K{000} %F{002}🔋 %f%F{002}99%% " "$(prompt_battery left 1 false ${FOLDER})"
}
function testBatterySegmentIfBatteryIsCalculatingOnOSX() {
local OS='OSX' # Fake OSX
makeBatterySay "Now drawing from 'Battery Power'
-InternalBattery-0 (id=1234567) 99%; discharging; (no estimate) present: true"
assertEquals "%K{000} %F{015}🔋 %f%F{015}99%% (...) " "$(prompt_battery left 1 false ${FOLDER})"
}
function testBatterySegmentIfBatteryIsLowWhileDischargingOnLinux() {
local OS='Linux' # Fake Linux
makeBatterySay "4" "Discharging"
assertEquals "%K{000} %F{009}🔋 %f%F{009}4%% " "$(prompt_battery left 1 false ${FOLDER})"
}
function testBatterySegmentIfBatteryIsLowWhileChargingOnLinux() {
local OS='Linux' # Fake Linux
makeBatterySay "4" "Charging"
assertEquals "%K{000} %F{011}🔋 %f%F{011}4%% " "$(prompt_battery left 1 false ${FOLDER})"
}
function testBatterySegmentIfBatteryIsNormalWhileDischargingOnLinux() {
local OS='Linux' # Fake Linux
makeBatterySay "10" "Discharging"
assertEquals "%K{000} %F{015}🔋 %f%F{015}10%% " "$(prompt_battery left 1 false ${FOLDER})"
}
function testBatterySegmentIfBatteryIsNormalWhileChargingOnLinux() {
local OS='Linux' # Fake Linux
makeBatterySay "10" "Charging"
assertEquals "%K{000} %F{011}🔋 %f%F{011}10%% " "$(prompt_battery left 1 false ${FOLDER})"
}
function testBatterySegmentIfBatteryIsFullOnLinux() {
local OS='Linux' # Fake Linux
makeBatterySay "100" "Full"
assertEquals "%K{000} %F{002}🔋 %f%F{002}100%% " "$(prompt_battery left 1 false ${FOLDER})"
}
function testBatterySegmentIfBatteryIsNormalWithAcpiEnabledOnLinux() {
local OS='Linux' # Fake Linux
makeBatterySay "50" "Discharging"
echo "echo 'Batter 0: Discharging, 50%, 01:38:54 remaining'" > ${FOLDER}/usr/bin/acpi
chmod +x ${FOLDER}/usr/bin/acpi
# For running on Mac, we need to mock date :(
[[ -f /usr/local/bin/gdate ]] && alias date=gdate
assertEquals "%K{000} %F{015}🔋 %f%F{015}50%% (1:38) " "$(prompt_battery left 1 false ${FOLDER})"
unalias date &>/dev/null
# unaliasing date fails where it was never aliased (e.g. on Linux).
# This causes the whole test to fail, because the return code is
# non-zero.
return 0
}
function testBatterySegmentIfBatteryIsCalculatingWithAcpiEnabledOnLinux() {
local OS='Linux' # Fake Linux
makeBatterySay "50" "Discharging"
# Todo: Include real acpi output!
echo "echo 'Batter 0: Discharging, 50%, rate remaining'" > ${FOLDER}/usr/bin/acpi
chmod +x ${FOLDER}/usr/bin/acpi
assertEquals "%K{000} %F{015}🔋 %f%F{015}50%% (...) " "$(prompt_battery left 1 false ${FOLDER})"
}
source shunit2/shunit2

@ -7,90 +7,98 @@ SHUNIT_PARENT=$0
function setUp() { function setUp() {
export TERM="xterm-256color" export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
} }
function testCommandExecutionTimeIsNotShownIfTimeIsBelowThreshold() { function testCommandExecutionTimeIsNotShownIfTimeIsBelowThreshold() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world command_execution_time) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world command_execution_time)
POWERLEVEL9K_CUSTOM_WORLD='echo world' local POWERLEVEL9K_CUSTOM_WORLD='echo world'
_P9K_COMMAND_DURATION=2
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{white} %F{black}world %k%F{white}%f " "$(build_left_prompt)" # Override payload
local _P9K_COMMAND_DURATION=2
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_CUSTOM_WORLD
unset _P9K_COMMAND_DURATION
} }
function testCommandExecutionTimeThresholdCouldBeChanged() { function testCommandExecutionTimeThresholdCouldBeChanged() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time)
POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=1 local POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=1
_P9K_COMMAND_DURATION=2.03
assertEquals "%K{red} %F{yellow1%}Dur %f%F{yellow1}2.03 %k%F{red}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
# Override payload
local _P9K_COMMAND_DURATION=2.03
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS assertEquals "%K{009} %F{226}Dur %f%F{226}2.03 %k%F{009}%f " "$(build_left_prompt)"
unset _P9K_COMMAND_DURATION
unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD
} }
function testCommandExecutionTimeThresholdCouldBeSetToZero() { function testCommandExecutionTimeThresholdCouldBeSetToZero() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time)
POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=0 local POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=0
_P9K_COMMAND_DURATION=0.03 local _P9K_COMMAND_DURATION=0.03
assertEquals "%K{red} %F{yellow1%}Dur %f%F{yellow1}0.03 %k%F{red}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS assertEquals "%K{009} %F{226}Dur %f%F{226}0.03 %k%F{009}%f " "$(build_left_prompt)"
unset _P9K_COMMAND_DURATION
unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD
} }
function testCommandExecutionTimePrecisionCouldBeChanged() { function testCommandExecutionTimePrecisionCouldBeChanged() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time)
POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=0 local POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=0
POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=4 local POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=4
_P9K_COMMAND_DURATION=0.0001
assertEquals "%K{red} %F{yellow1%}Dur %f%F{yellow1}0.0001 %k%F{red}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS # Override payload
unset _P9K_COMMAND_DURATION local _P9K_COMMAND_DURATION=0.0001
unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION
unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD assertEquals "%K{009} %F{226}Dur %f%F{226}0.0001 %k%F{009}%f " "$(build_left_prompt)"
} }
function testCommandExecutionTimePrecisionCouldBeSetToZero() { function testCommandExecutionTimePrecisionCouldBeSetToZero() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time)
POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0 local POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0
_P9K_COMMAND_DURATION=23.5001
assertEquals "%K{red} %F{yellow1%}Dur %f%F{yellow1}23 %k%F{red}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS # Override payload
unset _P9K_COMMAND_DURATION local _P9K_COMMAND_DURATION=23.5001
unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION
assertEquals "%K{009} %F{226}Dur %f%F{226}23 %k%F{009}%f " "$(build_left_prompt)"
} }
function testCommandExecutionTimeIsFormattedHumandReadbleForMinuteLongCommand() { function testCommandExecutionTimeIsFormattedHumandReadbleForMinuteLongCommand() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time)
_P9K_COMMAND_DURATION=180
assertEquals "%K{red} %F{yellow1%}Dur %f%F{yellow1}03:00 %k%F{red}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
# Override payload
local _P9K_COMMAND_DURATION=180
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS assertEquals "%K{009} %F{226}Dur %f%F{226}03:00 %k%F{009}%f " "$(build_left_prompt)"
unset _P9K_COMMAND_DURATION
} }
function testCommandExecutionTimeIsFormattedHumandReadbleForHourLongCommand() { function testCommandExecutionTimeIsFormattedHumandReadbleForHourLongCommand() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time)
_P9K_COMMAND_DURATION=7200
assertEquals "%K{red} %F{yellow1%}Dur %f%F{yellow1}02:00:00 %k%F{red}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
# Override payload
local _P9K_COMMAND_DURATION=7200
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS assertEquals "%K{009} %F{226}Dur %f%F{226}02:00:00 %k%F{009}%f " "$(build_left_prompt)"
unset _P9K_COMMAND_DURATION
} }
source shunit2/source/2.1/src/shunit2 source shunit2/shunit2

@ -0,0 +1,113 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
# Test specific settings
OLD_DEFAULT_USER=$DEFAULT_USER
unset DEFAULT_USER
}
function tearDown() {
# Restore old variables
[[ -n "$OLD_DEFAULT_USER" ]] && DEFAULT_USER=$OLD_DEFAULT_USER
return 0
}
function testContextSegmentDoesNotGetRenderedWithDefaultUser() {
local DEFAULT_USER=$(whoami)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context custom_world)
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
}
function testContextSegmentDoesGetRenderedWhenSshConnectionIsOpen() {
function sudo() {
return 0
}
local SSH_CLIENT="putty"
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context)
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{011}%n@%m %k%F{000}%f " "$(build_left_prompt)"
unfunction sudo
}
function testContextSegmentWithForeignUser() {
function sudo() {
return 0
}
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context)
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{011}%n@%m %k%F{000}%f " "$(build_left_prompt)"
unfunction sudo
}
# TODO: How to test root?
function testContextSegmentWithRootUser() {
startSkipping # Skip test
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context)
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{011}%n@%m %k%F{000}%f " "$(build_left_prompt)"
}
function testOverridingContextTemplate() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context)
local POWERLEVEL9K_CONTEXT_TEMPLATE=xx
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{011}xx %k%F{000}%f " "$(build_left_prompt)"
}
function testContextSegmentIsShownIfDefaultUserIsSetWhenForced() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context)
local POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true
local DEFAULT_USER=$(whoami)
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{011}%n@%m %k%F{000}%f " "$(build_left_prompt)"
}
function testContextSegmentIsShownIfForced() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context)
local POWERLEVEL9K_ALWAYS_SHOW_USER=true
local DEFAULT_USER=$(whoami)
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{011}$(whoami) %k%F{000}%f " "$(build_left_prompt)"
}
source shunit2/shunit2

@ -0,0 +1,86 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
}
function testCustomDirectOutputSegment() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world)
local POWERLEVEL9K_CUSTOM_WORLD="echo world"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
}
function testCustomClosureSegment() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world)
function p9k_hello_world() {
echo "world"
}
local POWERLEVEL9K_CUSTOM_WORLD='p9k_hello_world'
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
}
function testSettingBackgroundForCustomSegment() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world)
local POWERLEVEL9K_CUSTOM_WORLD="echo world"
local POWERLEVEL9K_CUSTOM_WORLD_BACKGROUND="yellow"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{011} %F{000}world %k%F{011}%f " "$(build_left_prompt)"
}
function testSettingForegroundForCustomSegment() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world)
local POWERLEVEL9K_CUSTOM_WORLD="echo world"
local POWERLEVEL9K_CUSTOM_WORLD_FOREGROUND="red"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{009}world %k%F{015}%f " "$(build_left_prompt)"
}
function testSettingVisualIdentifierForCustomSegment() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world)
local POWERLEVEL9K_CUSTOM_WORLD="echo world"
local POWERLEVEL9K_CUSTOM_WORLD_ICON="hw"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}hw %f%F{000}world %k%F{015}%f " "$(build_left_prompt)"
}
function testSettingVisualIdentifierForegroundColorForCustomSegment() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world)
local POWERLEVEL9K_CUSTOM_WORLD="echo world"
local POWERLEVEL9K_CUSTOM_WORLD_ICON="hw"
local POWERLEVEL9K_CUSTOM_WORLD_VISUAL_IDENTIFIER_COLOR="red"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{009}hw %f%F{000}world %k%F{015}%f " "$(build_left_prompt)"
}
source shunit2/shunit2

@ -0,0 +1,83 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
}
function testDetectVirtSegmentPrintsNothingIfSystemdIsNotAvailable() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(detect_virt custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
alias systemd-detect-virt="novirt"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unalias systemd-detect-virt
}
function testDetectVirtSegmentIfSystemdReturnsPlainName() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(detect_virt)
alias systemd-detect-virt="echo 'xxx'"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{011}xxx %k%F{000}%f " "$(build_left_prompt)"
unalias systemd-detect-virt
}
function testDetectVirtSegmentIfRootFsIsOnExpectedInode() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(detect_virt)
# Well. This is a weak test, as it fixates the implementation,
# but it is necessary, as the implementation relys on the root
# directory having the inode number "2"..
alias systemd-detect-virt="echo 'none'"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
# The original command in the implementation is "ls -di / | grep -o 2",
# which translates to: Show the inode number of "/" and test if it is "2".
alias ls="echo '2'"
assertEquals "%K{000} %F{011}none %k%F{000}%f " "$(build_left_prompt)"
unalias ls
unalias systemd-detect-virt
}
function testDetectVirtSegmentIfRootFsIsNotOnExpectedInode() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(detect_virt)
# Well. This is a weak test, as it fixates the implementation,
# but it is necessary, as the implementation relys on the root
# directory having the inode number "2"..
alias systemd-detect-virt="echo 'none'"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
# The original command in the implementation is "ls -di / | grep -o 2",
# which translates to: Show the inode number of "/" and test if it is "2".
alias ls="echo '3'"
assertEquals "%K{000} %F{011}chroot %k%F{000}%f " "$(build_left_prompt)"
unalias ls
unalias systemd-detect-virt
}
source shunit2/shunit2

@ -7,179 +7,199 @@ SHUNIT_PARENT=$0
function setUp() { function setUp() {
export TERM="xterm-256color" export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
# Every test should at least use the dir segment P9K_HOME="${PWD}"
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
} }
function tearDown() { function tearDown() {
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS unset P9K_HOME
} }
function testDirPathAbsoluteWorks() { function testDirPathAbsoluteWorks() {
POWERLEVEL9K_DIR_PATH_ABSOLUTE=true local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_ABSOLUTE=true
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
cd ~ cd ~
assertEquals "%K{blue} %F{black}/home/travis %k%F{blue}%f " "$(build_left_prompt)"
# Unfortunately, we cannot fake Linux or OSX here, because
# of /home or /Users path.. That is why we change the test
# according to the OS of the host.
if [[ "${OS}" == 'Linux' ]]; then
assertEquals "%K{012} %F{000}/home/${USER} %k%F{012}%f " "$(build_left_prompt)"
elif [[ "${OS}" == 'OSX' ]]; then
assertEquals "%K{012} %F{000}/Users/${USER} %k%F{012}%f " "$(build_left_prompt)"
fi
cd - cd -
unset POWERLEVEL9K_DIR_PATH_ABSOLUTE
} }
function testTruncateFoldersWorks() { function testTruncateFoldersWorks() {
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_SHORTEN_STRATEGY='truncate_folders' POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_folders'
FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 # Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789
mkdir -p $FOLDER mkdir -p $FOLDER
cd $FOLDER cd $FOLDER
assertEquals "%K{blue} %F{black}…/12345678/123456789 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}…/12345678/123456789 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset FOLDER
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
unset POWERLEVEL9K_SHORTEN_STRATEGY
} }
function testTruncateFolderWithHomeDirWorks() { function testTruncateFolderWithHomeDirWorks() {
POWERLEVEL9K_SHORTEN_DIR_LENGTH=1 local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
CURRENT_DIR=$(pwd) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_SHORTEN_DIR_LENGTH=1
local CURRENT_DIR=$(pwd)
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
cd ~ cd ~
FOLDER="powerlevel9k-test-${RANDOM}" local FOLDER="powerlevel9k-test-${RANDOM}"
mkdir -p $FOLDER mkdir -p $FOLDER
cd $FOLDER cd $FOLDER
# Switch back to home folder as this causes the problem. # Switch back to home folder as this causes the problem.
cd .. cd ..
assertEquals "%K{blue} %F{black}~ %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}~ %k%F{012}%f " "$(build_left_prompt)"
rmdir $FOLDER rmdir $FOLDER
cd ${CURRENT_DIR} cd ${CURRENT_DIR}
unset CURRENT_DIR
unset FOLDER
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
} }
function testTruncateMiddleWorks() { function testTruncateMiddleWorks() {
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_SHORTEN_STRATEGY='truncate_middle' POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_middle'
FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 # Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789
mkdir -p $FOLDER mkdir -p $FOLDER
cd $FOLDER cd $FOLDER
assertEquals "%K{blue} %F{black}/tmp/po…st/1/12/123/1234/12…45/12…56/12…67/12…78/123456789 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/tmp/po…st/1/12/123/1234/12…45/12…56/12…67/12…78/123456789 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset FOLDER
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_SHORTEN_STRATEGY
} }
function testTruncationFromRightWorks() { function testTruncationFromRightWorks() {
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_SHORTEN_STRATEGY='truncate_from_right' POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_from_right'
FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 # Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789
mkdir -p $FOLDER mkdir -p $FOLDER
cd $FOLDER cd $FOLDER
assertEquals "%K{blue} %F{black}/tmp/po…/1/12/123/12…/12…/12…/12…/12…/123456789 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/tmp/po…/1/12/123/12…/12…/12…/12…/12…/123456789 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset FOLDER
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
unset POWERLEVEL9K_SHORTEN_STRATEGY
} }
function testTruncateToLastWorks() { function testTruncateToLastWorks() {
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_SHORTEN_STRATEGY="truncate_to_last" POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
local POWERLEVEL9K_SHORTEN_STRATEGY="truncate_to_last"
FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 # Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789
mkdir -p $FOLDER mkdir -p $FOLDER
cd $FOLDER cd $FOLDER
assertEquals "%K{blue} %F{black}123456789 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}123456789 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset FOLDER
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
unset POWERLEVEL9K_SHORTEN_STRATEGY
} }
function testTruncateToFirstAndLastWorks() { function testTruncateToFirstAndLastWorks() {
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_SHORTEN_STRATEGY="truncate_to_first_and_last" POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
local POWERLEVEL9K_SHORTEN_STRATEGY="truncate_to_first_and_last"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789
mkdir -p $FOLDER mkdir -p $FOLDER
cd $FOLDER cd $FOLDER
assertEquals "%K{blue} %F{black}/tmp/powerlevel9k-test/…/…/…/…/…/…/…/12345678/123456789 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/tmp/powerlevel9k-test/…/…/…/…/…/…/…/12345678/123456789 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset FOLDER
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
unset POWERLEVEL9K_SHORTEN_STRATEGY
} }
function testTruncateAbsoluteWorks() { function testTruncateAbsoluteWorks() {
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_SHORTEN_STRATEGY="truncate_absolute" POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
local POWERLEVEL9K_SHORTEN_STRATEGY="truncate_absolute"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789
mkdir -p $FOLDER mkdir -p $FOLDER
cd $FOLDER cd $FOLDER
assertEquals "%K{blue} %F{black}…89 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}…89 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset FOLDER
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
unset POWERLEVEL9K_SHORTEN_STRATEGY
} }
function testTruncationFromRightWithEmptyDelimiter() { function testTruncationFromRightWithEmptyDelimiter() {
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_SHORTEN_DELIMITER="" POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_SHORTEN_STRATEGY='truncate_from_right' local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
local POWERLEVEL9K_SHORTEN_DELIMITER=""
local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_from_right'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789
mkdir -p $FOLDER mkdir -p $FOLDER
cd $FOLDER cd $FOLDER
assertEquals "%K{blue} %F{black}/tmp/po/1/12/123/12/12/12/12/12/123456789 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/tmp/po/1/12/123/12/12/12/12/12/123456789 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset FOLDER
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
unset POWERLEVEL9K_SHORTEN_DELIMITER
unset POWERLEVEL9K_SHORTEN_STRATEGY
} }
function testTruncateWithFolderMarkerWorks() { function testTruncateWithFolderMarkerWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_SHORTEN_STRATEGY="truncate_with_folder_marker" local POWERLEVEL9K_SHORTEN_STRATEGY="truncate_with_folder_marker"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local BASEFOLDER=/tmp/powerlevel9k-test local BASEFOLDER=/tmp/powerlevel9k-test
local FOLDER=$BASEFOLDER/1/12/123/1234/12345/123456/1234567 local FOLDER=$BASEFOLDER/1/12/123/1234/12345/123456/1234567
@ -187,20 +207,20 @@ function testTruncateWithFolderMarkerWorks() {
# Setup folder marker # Setup folder marker
touch $BASEFOLDER/1/12/.shorten_folder_marker touch $BASEFOLDER/1/12/.shorten_folder_marker
cd $FOLDER cd $FOLDER
assertEquals "%K{blue} %F{black}/…/12/123/1234/12345/123456/1234567 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/…/12/123/1234/12345/123456/1234567 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr $BASEFOLDER rm -fr $BASEFOLDER
unset BASEFOLDER
unset FOLDER
unset POWERLEVEL9K_SHORTEN_STRATEGY
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
} }
function testTruncateWithFolderMarkerWithChangedFolderMarker() { function testTruncateWithFolderMarkerWithChangedFolderMarker() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_SHORTEN_STRATEGY="truncate_with_folder_marker" local POWERLEVEL9K_SHORTEN_STRATEGY="truncate_with_folder_marker"
POWERLEVEL9K_SHORTEN_FOLDER_MARKER='.xxx' local POWERLEVEL9K_SHORTEN_FOLDER_MARKER='.xxx'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local BASEFOLDER=/tmp/powerlevel9k-test local BASEFOLDER=/tmp/powerlevel9k-test
local FOLDER=$BASEFOLDER/1/12/123/1234/12345/123456/1234567 local FOLDER=$BASEFOLDER/1/12/123/1234/12345/123456/1234567
@ -208,15 +228,10 @@ function testTruncateWithFolderMarkerWithChangedFolderMarker() {
# Setup folder marker # Setup folder marker
touch $BASEFOLDER/1/12/.xxx touch $BASEFOLDER/1/12/.xxx
cd $FOLDER cd $FOLDER
assertEquals "%K{blue} %F{black}/…/12/123/1234/12345/123456/1234567 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/…/12/123/1234/12345/123456/1234567 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr $BASEFOLDER rm -fr $BASEFOLDER
unset BASEFOLDER
unset FOLDER
unset POWERLEVEL9K_SHORTEN_FOLDER_MARKER
unset POWERLEVEL9K_SHORTEN_STRATEGY
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
} }
function testTruncateWithPackageNameWorks() { function testTruncateWithPackageNameWorks() {
@ -237,18 +252,19 @@ function testTruncateWithPackageNameWorks() {
# Go back to deeper folder # Go back to deeper folder
cd "${FOLDER}" cd "${FOLDER}"
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
POWERLEVEL9K_SHORTEN_STRATEGY='truncate_with_package_name' local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_with_package_name'
assertEquals "%K{blue} %F{black}My_Package/1/12/123/12…/12…/12…/12…/12…/123456789 %k%F{blue}%f " "$(build_left_prompt)" # Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{012} %F{000}My_Package/1/12/123/12…/12…/12…/12…/12…/123456789 %k%F{012}%f " "$(build_left_prompt)"
# Go back # Go back
cd $p9kFolder cd $p9kFolder
rm -fr $BASEFOLDER rm -fr $BASEFOLDER
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_SHORTEN_STRATEGY
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
} }
function testTruncateWithPackageNameIfRepoIsSymlinkedInsideDeepFolder() { function testTruncateWithPackageNameIfRepoIsSymlinkedInsideDeepFolder() {
@ -276,18 +292,19 @@ function testTruncateWithPackageNameIfRepoIsSymlinkedInsideDeepFolder() {
# Go to deep folder inside linked repo # Go to deep folder inside linked repo
cd linked-repo/asdfasdf/qwerqwer cd linked-repo/asdfasdf/qwerqwer
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
POWERLEVEL9K_SHORTEN_STRATEGY='truncate_with_package_name' local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_with_package_name'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{blue} %F{black}My_Package/as…/qwerqwer %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}My_Package/as…/qwerqwer %k%F{012}%f " "$(build_left_prompt)"
# Go back # Go back
cd $p9kFolder cd $p9kFolder
rm -fr $BASEFOLDER rm -fr $BASEFOLDER
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_SHORTEN_STRATEGY
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
} }
function testTruncateWithPackageNameIfRepoIsSymlinkedInsideGitDir() { function testTruncateWithPackageNameIfRepoIsSymlinkedInsideGitDir() {
@ -311,123 +328,162 @@ function testTruncateWithPackageNameIfRepoIsSymlinkedInsideGitDir() {
cd linked-repo/.git/refs/heads cd linked-repo/.git/refs/heads
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
POWERLEVEL9K_SHORTEN_STRATEGY='truncate_with_package_name' local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_with_package_name'
assertEquals "%K{blue} %F{black}My_Package/.g…/re…/heads %k%F{blue}%f " "$(build_left_prompt)" # Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{012} %F{000}My_Package/.g…/re…/heads %k%F{012}%f " "$(build_left_prompt)"
# Go back # Go back
cd $p9kFolder cd $p9kFolder
rm -fr $BASEFOLDER rm -fr $BASEFOLDER
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_SHORTEN_STRATEGY
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
} }
function testHomeFolderDetectionWorks() { function testHomeFolderDetectionWorks() {
POWERLEVEL9K_HOME_ICON='home-icon' local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_HOME_ICON='home-icon'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
cd ~ cd ~
assertEquals "%K{blue} %F{black%}home-icon %f%F{black}~ %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}home-icon %f%F{000}~ %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
unset POWERLEVEL9K_HOME_ICON
} }
function testHomeSubfolderDetectionWorks() { function testHomeSubfolderDetectionWorks() {
POWERLEVEL9K_HOME_SUB_ICON='sub-icon' local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_HOME_SUB_ICON='sub-icon'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
FOLDER=~/powerlevel9k-test local FOLDER=~/powerlevel9k-test
mkdir $FOLDER mkdir $FOLDER
cd $FOLDER cd $FOLDER
assertEquals "%K{blue} %F{black%}sub-icon %f%F{black}~/powerlevel9k-test %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}sub-icon %f%F{000}~/powerlevel9k-test %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr $FOLDER rm -fr $FOLDER
unset FOLDER
unset POWERLEVEL9K_HOME_SUB_ICON
} }
function testOtherFolderDetectionWorks() { function testOtherFolderDetectionWorks() {
POWERLEVEL9K_FOLDER_ICON='folder-icon' local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_FOLDER_ICON='folder-icon'
FOLDER=/tmp/powerlevel9k-test # Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local FOLDER=/tmp/powerlevel9k-test
mkdir $FOLDER mkdir $FOLDER
cd $FOLDER cd $FOLDER
assertEquals "%K{blue} %F{black%}folder-icon %f%F{black}/tmp/powerlevel9k-test %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}folder-icon %f%F{000}/tmp/powerlevel9k-test %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr $FOLDER rm -fr $FOLDER
unset FOLDER
unset POWERLEVEL9K_FOLDER_ICON
} }
function testChangingDirPathSeparator() { function testChangingDirPathSeparator() {
POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx' local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local FOLDER="/tmp/powerlevel9k-test/1/2" local FOLDER="/tmp/powerlevel9k-test/1/2"
mkdir -p $FOLDER mkdir -p $FOLDER
cd $FOLDER cd $FOLDER
assertEquals "%K{blue} %F{black}xXxtmpxXxpowerlevel9k-testxXx1xXx2 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}xXxtmpxXxpowerlevel9k-testxXx1xXx2 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
unset FOLDER
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_DIR_PATH_SEPARATOR
} }
function testHomeFolderAbbreviation() { function testHomeFolderAbbreviation() {
local POWERLEVEL9K_HOME_FOLDER_ABBREVIATION local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local dir=$PWD local dir=$PWD
cd ~/ cd ~/
# default # default
POWERLEVEL9K_HOME_FOLDER_ABBREVIATION='~' local POWERLEVEL9K_HOME_FOLDER_ABBREVIATION='~'
assertEquals "%K{blue} %F{black}~ %k%F{blue}%f " "$(build_left_prompt)"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{012} %F{000}~ %k%F{012}%f " "$(build_left_prompt)"
# substituted # substituted
POWERLEVEL9K_HOME_FOLDER_ABBREVIATION='qQq' local POWERLEVEL9K_HOME_FOLDER_ABBREVIATION='qQq'
assertEquals "%K{blue} %F{black}qQq %k%F{blue}%f " "$(build_left_prompt)"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{012} %F{000}qQq %k%F{012}%f " "$(build_left_prompt)"
cd /tmp cd /tmp
# default # default
POWERLEVEL9K_HOME_FOLDER_ABBREVIATION='~' local POWERLEVEL9K_HOME_FOLDER_ABBREVIATION='~'
assertEquals "%K{blue} %F{black}/tmp %k%F{blue}%f " "$(build_left_prompt)"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{012} %F{000}/tmp %k%F{012}%f " "$(build_left_prompt)"
# substituted # substituted
POWERLEVEL9K_HOME_FOLDER_ABBREVIATION='qQq' local POWERLEVEL9K_HOME_FOLDER_ABBREVIATION='qQq'
assertEquals "%K{blue} %F{black}/tmp %k%F{blue}%f " "$(build_left_prompt)"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{012} %F{000}/tmp %k%F{012}%f " "$(build_left_prompt)"
cd "$dir" cd "$dir"
} }
function testOmittingFirstCharacterWorks() { function testOmittingFirstCharacterWorks() {
POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_FOLDER_ICON='folder-icon' POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true
local POWERLEVEL9K_FOLDER_ICON='folder-icon'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
cd /tmp cd /tmp
assertEquals "%K{blue} %F{black%}folder-icon %f%F{black}tmp %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}folder-icon %f%F{000}tmp %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
unset POWERLEVEL9K_FOLDER_ICON
unset POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER
} }
function testOmittingFirstCharacterWorksWithChangingPathSeparator() { function testOmittingFirstCharacterWorksWithChangingPathSeparator() {
POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx' POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_FOLDER_ICON='folder-icon' local POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true
local POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx'
local POWERLEVEL9K_FOLDER_ICON='folder-icon'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
mkdir -p /tmp/powerlevel9k-test/1/2 mkdir -p /tmp/powerlevel9k-test/1/2
cd /tmp/powerlevel9k-test/1/2 cd /tmp/powerlevel9k-test/1/2
assertEquals "%K{blue} %F{black%}folder-icon %f%F{black}tmpxXxpowerlevel9k-testxXx1xXx2 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}folder-icon %f%F{000}tmpxXxpowerlevel9k-testxXx1xXx2 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_FOLDER_ICON
unset POWERLEVEL9K_DIR_PATH_SEPARATOR
unset POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER
} }
# This test makes it obvious that combining a truncation strategy # This test makes it obvious that combining a truncation strategy
@ -438,210 +494,278 @@ function testOmittingFirstCharacterWorksWithChangingPathSeparator() {
# But it does more sense in combination with other truncation # But it does more sense in combination with other truncation
# strategies. # strategies.
function testOmittingFirstCharacterWorksWithChangingPathSeparatorAndDefaultTruncation() { function testOmittingFirstCharacterWorksWithChangingPathSeparatorAndDefaultTruncation() {
POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx' POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true
POWERLEVEL9K_SHORTEN_STRATEGY='truncate_folders' local POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx'
local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_folders'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
mkdir -p /tmp/powerlevel9k-test/1/2 mkdir -p /tmp/powerlevel9k-test/1/2
cd /tmp/powerlevel9k-test/1/2 cd /tmp/powerlevel9k-test/1/2
assertEquals "%K{blue} %F{black}xXx1xXx2 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}xXx1xXx2 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_DIR_PATH_SEPARATOR
unset POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
unset POWERLEVEL9K_SHORTEN_STRATEGY
} }
function testOmittingFirstCharacterWorksWithChangingPathSeparatorAndMiddleTruncation() { function testOmittingFirstCharacterWorksWithChangingPathSeparatorAndMiddleTruncation() {
POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx' POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true
POWERLEVEL9K_SHORTEN_STRATEGY='truncate_middle' local POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx'
local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_middle'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
mkdir -p /tmp/powerlevel9k-test/1/2 mkdir -p /tmp/powerlevel9k-test/1/2
cd /tmp/powerlevel9k-test/1/2 cd /tmp/powerlevel9k-test/1/2
assertEquals "%K{blue} %F{black}tmpxXxpo…stxXx1xXx2 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}tmpxXxpo…stxXx1xXx2 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_DIR_PATH_SEPARATOR
unset POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
unset POWERLEVEL9K_SHORTEN_STRATEGY
} }
function testOmittingFirstCharacterWorksWithChangingPathSeparatorAndRightTruncation() { function testOmittingFirstCharacterWorksWithChangingPathSeparatorAndRightTruncation() {
POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx' POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true
POWERLEVEL9K_SHORTEN_STRATEGY='truncate_from_right' local POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx'
local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_from_right'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
mkdir -p /tmp/powerlevel9k-test/1/2 mkdir -p /tmp/powerlevel9k-test/1/2
cd /tmp/powerlevel9k-test/1/2 cd /tmp/powerlevel9k-test/1/2
assertEquals "%K{blue} %F{black}tmpxXxpo…xXx1xXx2 %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}tmpxXxpo…xXx1xXx2 %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_DIR_PATH_SEPARATOR
unset POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
unset POWERLEVEL9K_SHORTEN_STRATEGY
} }
function testTruncateToUniqueWorks() { function testTruncateToUniqueWorks() {
POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx' POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 local POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true
POWERLEVEL9K_SHORTEN_STRATEGY='truncate_to_unique' local POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx'
local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_to_unique'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
mkdir -p /tmp/powerlevel9k-test/adam/devl mkdir -p /tmp/powerlevel9k-test/adam/devl
mkdir -p /tmp/powerlevel9k-test/alice/devl mkdir -p /tmp/powerlevel9k-test/alice/devl
mkdir -p /tmp/powerlevel9k-test/alice/docs mkdir -p /tmp/powerlevel9k-test/alice/docs
mkdir -p /tmp/powerlevel9k-test/bob/docs mkdir -p /tmp/powerlevel9k-test/bob/docs
cd /tmp/powerlevel9k-test/alice/devl cd /tmp/powerlevel9k-test/alice/devl
assertEquals "%K{blue} %F{black}txXxpxXxalxXxde %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}txXxpxXxalxXxde %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_DIR_PATH_SEPARATOR
unset POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER
unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
unset POWERLEVEL9K_SHORTEN_STRATEGY
} }
function testBoldHomeDirWorks() { function testBoldHomeDirWorks() {
POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
cd ~ cd ~
assertEquals "%K{blue} %F{black}%B~%b %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}%B~%b %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
unset POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD
} }
function testBoldHomeSubdirWorks() { function testBoldHomeSubdirWorks() {
POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
mkdir -p ~/powerlevel9k-test mkdir -p ~/powerlevel9k-test
cd ~/powerlevel9k-test cd ~/powerlevel9k-test
assertEquals "%K{blue} %F{black}~/%Bpowerlevel9k-test%b %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}~/%Bpowerlevel9k-test%b %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr ~/powerlevel9k-test rm -fr ~/powerlevel9k-test
unset POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD
} }
function testBoldRootDirWorks() { function testBoldRootDirWorks() {
POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
cd / cd /
assertEquals "%K{blue} %F{black}%B/%b %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}%B/%b %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
unset POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD
} }
function testBoldRootSubdirWorks() { function testBoldRootSubdirWorks() {
POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
cd /tmp cd /tmp
assertEquals "%K{blue} %F{black}/%Btmp%b %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/%Btmp%b %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
unset POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD
} }
function testBoldRootSubSubdirWorks() { function testBoldRootSubSubdirWorks() {
POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
mkdir -p /tmp/powerlevel9k-test mkdir -p /tmp/powerlevel9k-test
cd /tmp/powerlevel9k-test cd /tmp/powerlevel9k-test
assertEquals "%K{blue} %F{black}/tmp/%Bpowerlevel9k-test%b %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/tmp/%Bpowerlevel9k-test%b %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD
} }
function testHighlightHomeWorks() { function testHighlightHomeWorks() {
POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red' local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
cd ~ cd ~
assertEquals "%K{blue} %F{black}%F{red}~ %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}%F{red}~ %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
unset POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND
} }
function testHighlightHomeSubdirWorks() { function testHighlightHomeSubdirWorks() {
POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red' local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
mkdir -p ~/powerlevel9k-test mkdir -p ~/powerlevel9k-test
cd ~/powerlevel9k-test cd ~/powerlevel9k-test
assertEquals "%K{blue} %F{black}~/%F{red}powerlevel9k-test %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}~/%F{red}powerlevel9k-test %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr ~/powerlevel9k-test rm -fr ~/powerlevel9k-test
unset POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND
} }
function testHighlightRootWorks() { function testHighlightRootWorks() {
POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red' local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
cd / cd /
assertEquals "%K{blue} %F{black}%F{red}/ %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}%F{red}/ %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
unset POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND
} }
function testHighlightRootSubdirWorks() { function testHighlightRootSubdirWorks() {
POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red' local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
cd /tmp cd /tmp
assertEquals "%K{blue} %F{black}/%F{red}tmp %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/%F{red}tmp %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
unset POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND
} }
function testHighlightRootSubSubdirWorks() { function testHighlightRootSubSubdirWorks() {
POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red' local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
mkdir /tmp/powerlevel9k-test mkdir /tmp/powerlevel9k-test
cd /tmp/powerlevel9k-test cd /tmp/powerlevel9k-test
assertEquals "%K{blue} %F{black}/tmp/%F{red}powerlevel9k-test %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}/tmp/%F{red}powerlevel9k-test %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND
} }
function testDirSeparatorColorHomeSubdirWorks() { function testDirSeparatorColorHomeSubdirWorks() {
POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND='red' local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND='red'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
mkdir -p ~/powerlevel9k-test mkdir -p ~/powerlevel9k-test
cd ~/powerlevel9k-test cd ~/powerlevel9k-test
assertEquals "%K{blue} %F{black}~%F{red}/%F{black}powerlevel9k-test %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}~%F{red}/%F{black}powerlevel9k-test %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr ~/powerlevel9k-test rm -fr ~/powerlevel9k-test
unset POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND
} }
function testDirSeparatorColorRootSubSubdirWorks() { function testDirSeparatorColorRootSubSubdirWorks() {
POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND='red' local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
local POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND='red'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
mkdir -p /tmp/powerlevel9k-test mkdir -p /tmp/powerlevel9k-test
cd /tmp/powerlevel9k-test cd /tmp/powerlevel9k-test
assertEquals "%K{blue} %F{black}%F{red}/%F{black}tmp%F{red}/%F{black}powerlevel9k-test %k%F{blue}%f " "$(build_left_prompt)" assertEquals "%K{012} %F{000}%F{red}/%F{black}tmp%F{red}/%F{black}powerlevel9k-test %k%F{012}%f " "$(build_left_prompt)"
cd - cd -
rm -fr /tmp/powerlevel9k-test rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND
} }
source shunit2/source/2.1/src/shunit2 source shunit2/shunit2

@ -0,0 +1,131 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
# Test specific
P9K_HOME=$(pwd)
FOLDER=/tmp/powerlevel9k-test
mkdir -p $FOLDER
cd $FOLDER
}
function tearDown() {
# Go back to powerlevel9k folder
cd "${P9K_HOME}"
# Remove eventually created test-specific folder
rm -fr "${FOLDER}"
# At least remove test folder completely
rm -fr /tmp/powerlevel9k-test
unset FOLDER
unset P9K_HOME
# Remove IP cache file
rm -f ${POWERLEVEL9K_PUBLIC_IP_FILE}
}
function testDiskUsageSegmentWhenDiskIsAlmostFull() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(disk_usage)
df() {
echo "Filesystem 1K-blocks Used Available Use% Mounted on
/dev/disk1 487219288 471466944 15496344 97% /"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{009} %F{015}hdd %f%F{015}97%% %k%F{009}%f " "$(build_left_prompt)"
unfunction df
}
function testDiskUsageSegmentWhenDiskIsVeryFull() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(disk_usage)
df() {
echo "Filesystem 1K-blocks Used Available Use% Mounted on
/dev/disk1 487219288 471466944 15496344 94% /"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{011} %F{000}hdd %f%F{000}94%% %k%F{011}%f " "$(build_left_prompt)"
unfunction df
}
function testDiskUsageSegmentWhenDiskIsQuiteEmpty() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(disk_usage)
df() {
echo "Filesystem 1K-blocks Used Available Use% Mounted on
/dev/disk1 487219288 471466944 15496344 4% /"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{000} %F{011}hdd %f%F{011}4%% %k%F{000}%f " "$(build_left_prompt)"
unfunction df
}
function testDiskUsageSegmentPrintsNothingIfDiskIsQuiteEmptyAndOnlyWarningsShouldBeDisplayed() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(disk_usage custom_world)
df() {
echo "Filesystem 1K-blocks Used Available Use% Mounted on
/dev/disk1 487219288 471466944 15496344 4% /"
}
local POWERLEVEL9K_DISK_USAGE_ONLY_WARNING=true
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unfunction df
}
function testDiskUsageSegmentWarningLevelCouldBeAdjusted() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(disk_usage)
local POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL=10
df() {
echo "Filesystem 1K-blocks Used Available Use% Mounted on
/dev/disk1 487219288 471466944 15496344 11% /"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{011} %F{000}hdd %f%F{000}11%% %k%F{011}%f " "$(build_left_prompt)"
unfunction df
}
function testDiskUsageSegmentCriticalLevelCouldBeAdjusted() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(disk_usage)
local POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL=5
local POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL=10
df() {
echo "Filesystem 1K-blocks Used Available Use% Mounted on
/dev/disk1 487219288 471466944 15496344 11% /"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{009} %F{015}hdd %f%F{015}11%% %k%F{009}%f " "$(build_left_prompt)"
unfunction df
}
source shunit2/shunit2

@ -7,8 +7,6 @@ SHUNIT_PARENT=$0
function setUp() { function setUp() {
export TERM="xterm-256color" export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
} }
function mockGo() { function mockGo() {
@ -35,52 +33,56 @@ function mockGoEmptyGopath() {
function testGo() { function testGo() {
alias go=mockGo alias go=mockGo
POWERLEVEL9K_GO_ICON="" local POWERLEVEL9K_GO_ICON=""
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(go_version) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(go_version)
PWD="$HOME/go/src/github.com/bhilburn/powerlevel9k" # Load Powerlevel9k
source powerlevel9k.zsh-theme
local PWD="$HOME/go/src/github.com/bhilburn/powerlevel9k"
assertEquals "%K{green} %F{grey93%} %f%F{grey93}go1.5.3 %k%F{green}%f " "$(build_left_prompt)" assertEquals "%K{002} %F{255} %f%F{255}go1.5.3 %k%F{002}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_GO_ICON
unset PWD
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unalias go unalias go
} }
function testGoSegmentPrintsNothingIfEmptyGopath() { function testGoSegmentPrintsNothingIfEmptyGopath() {
alias go=mockGoEmptyGopath local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_CUSTOM_WORLD='echo world'
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world go_version) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world go_version)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
alias go=mockGoEmptyGopath
assertEquals "%K{white} %F{black}world %k%F{white}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_CUSTOM_WORLD
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
} }
function testGoSegmentPrintsNothingIfNotInGopath() { function testGoSegmentPrintsNothingIfNotInGopath() {
alias go=mockGo local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_CUSTOM_WORLD='echo world'
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world go_version) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world go_version)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
alias go=mockGo
assertEquals "%K{white} %F{black}world %k%F{white}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_CUSTOM_WORLD
} }
function testGoSegmentPrintsNothingIfGoIsNotAvailable() { function testGoSegmentPrintsNothingIfGoIsNotAvailable() {
alias go=noGo local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_CUSTOM_WORLD='echo world'
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world go_version) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world go_version)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
alias go=noGo
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{white} %F{black}world %k%F{white}%f " "$(build_left_prompt)" assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_CUSTOM_WORLD
unalias go unalias go
} }
source shunit2/source/2.1/src/shunit2 source shunit2/shunit2

@ -0,0 +1,231 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
}
function testIpSegmentPrintsNothingOnOsxIfNotConnected() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ip custom_world)
alias networksetup='echo "not connected"'
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
# Load Powerlevel9k
source powerlevel9k.zsh-theme
local OS="OSX" # Fake OSX
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unalias networksetup
}
function testIpSegmentPrintsNothingOnLinuxIfNotConnected() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ip custom_world)
alias ip='echo "not connected"'
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
# Load Powerlevel9k
source powerlevel9k.zsh-theme
local OS="Linux" # Fake Linux
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unalias ip
}
function testIpSegmentWorksOnOsxWithNoInterfaceSpecified() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ip)
alias networksetup="echo 'An asterisk (*) denotes that a network service is disabled.
(1) Ethernet
(Hardware Port: Ethernet, Device: en0)
(2) FireWire
(Hardware Port: FireWire, Device: fw0)
(3) Wi-Fi
(Hardware Port: Wi-Fi, Device: en1)
(4) Bluetooth PAN
(Hardware Port: Bluetooth PAN, Device: en3)
(5) Thunderbolt Bridge
(Hardware Port: Thunderbolt Bridge, Device: bridge0)
(6) Apple USB Ethernet Adapter
(Hardware Port: Apple USB Ethernet Adapter, Device: en4)
'"
alias ipconfig="_(){ echo '1.2.3.4'; };_"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
local OS='OSX' # Fake OSX
assertEquals "%K{014} %F{000}IP %f%F{000}1.2.3.4 %k%F{014}%f " "$(build_left_prompt)"
unalias ipconfig
unalias networksetup
}
# There could be more than one confiured network interfaces.
# `networksetup -listnetworkserviceorder` lists the interfaces
# in hierarchical order, but from outside this is not obvious
# (implementation detail). So we need a test for this case.
function testIpSegmentWorksOnOsxWithMultipleInterfacesSpecified() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ip)
alias networksetup="echo 'An asterisk (*) denotes that a network service is disabled.
(1) Ethernet
(Hardware Port: Ethernet, Device: en0)
(2) FireWire
(Hardware Port: FireWire, Device: fw0)
(3) Wi-Fi
(Hardware Port: Wi-Fi, Device: en1)
(4) Bluetooth PAN
(Hardware Port: Bluetooth PAN, Device: en3)
(5) Thunderbolt Bridge
(Hardware Port: Thunderbolt Bridge, Device: bridge0)
(6) Apple USB Ethernet Adapter
(Hardware Port: Apple USB Ethernet Adapter, Device: en4)
'"
# Return a unique IP address for every interface
ipconfig() {
case "${2}" {
en0)
echo 1.2.3.4
;;
fw0)
echo 2.3.4.5
;;
en1)
echo 3.4.5.6
;;
en3)
echo 4.5.6.7
;;
}
}
# Load Powerlevel9k
source powerlevel9k.zsh-theme
local OS='OSX' # Fake OSX
assertEquals "%K{014} %F{000}IP %f%F{000}1.2.3.4 %k%F{014}%f " "$(build_left_prompt)"
unfunction ipconfig
unalias networksetup
}
function testIpSegmentWorksOnOsxWithInterfaceSpecified() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ip)
local POWERLEVEL9K_IP_INTERFACE='xxx'
alias ipconfig="_(){ echo '1.2.3.4'; };_"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
local OS='OSX' # Fake OSX
assertEquals "%K{014} %F{000}IP %f%F{000}1.2.3.4 %k%F{014}%f " "$(build_left_prompt)"
unalias ipconfig
}
function testIpSegmentWorksOnLinuxWithNoInterfaceSpecified() {
setopt aliases
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ip)
# That command is harder to test, as it is used at first
# to get all relevant network interfaces and then for
# getting the configuration of that segment..
ip(){
if [[ "$*" == 'link ls up' ]]; then
echo "1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:7e:84:45 brd ff:ff:ff:ff:ff:ff";
fi
if [[ "$*" == '-4 a show eth0' ]]; then
echo '2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever';
fi
}
# Load Powerlevel9k
source powerlevel9k.zsh-theme
local OS='Linux' # Fake Linux
assertEquals "%K{014} %F{000}IP %f%F{000}10.0.2.15 %k%F{014}%f " "$(build_left_prompt)"
unfunction ip
}
function testIpSegmentWorksOnLinuxWithMultipleInterfacesSpecified() {
setopt aliases
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ip)
# That command is harder to test, as it is used at first
# to get all relevant network interfaces and then for
# getting the configuration of that segment..
ip(){
if [[ "$*" == 'link ls up' ]]; then
echo "1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:7e:84:45 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:7e:84:45 brd ff:ff:ff:ff:ff:ff
4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:7e:84:45 brd ff:ff:ff:ff:ff:ff";
fi
if [[ "$*" == '-4 a show eth1' ]]; then
echo '3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever';
fi
}
# Load Powerlevel9k
source powerlevel9k.zsh-theme
local OS='Linux' # Fake Linux
assertEquals "%K{014} %F{000}IP %f%F{000}10.0.2.15 %k%F{014}%f " "$(build_left_prompt)"
unfunction ip
}
function testIpSegmentWorksOnLinuxWithInterfaceSpecified() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ip)
local POWERLEVEL9K_IP_INTERFACE='xxx'
ip(){
echo '2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever';
}
# Load Powerlevel9k
source powerlevel9k.zsh-theme
local OS='Linux' # Fake Linux
assertEquals "%K{014} %F{000}IP %f%F{000}10.0.2.15 %k%F{014}%f " "$(build_left_prompt)"
unfunction ip
}
source shunit2/shunit2

@ -7,8 +7,6 @@ SHUNIT_PARENT=$0
function setUp() { function setUp() {
export TERM="xterm-256color" export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
} }
function mockKubectl() { function mockKubectl() {
@ -66,33 +64,41 @@ function mockKubectlOtherNamespace() {
} }
function testKubeContext() { function testKubeContext() {
alias kubectl=mockKubectl local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(kubecontext) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(kubecontext)
alias kubectl=mockKubectl
assertEquals "%K{magenta} %F{white%}⎈ %f%F{white}minikube/default %k%F{magenta}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{013} %F{015}⎈ %f%F{015}minikube/default %k%F{013}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unalias kubectl unalias kubectl
} }
function testKubeContextOtherNamespace() { function testKubeContextOtherNamespace() {
alias kubectl=mockKubectlOtherNamespace local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(kubecontext) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(kubecontext)
alias kubectl=mockKubectlOtherNamespace
assertEquals "%K{magenta} %F{white%}⎈ %f%F{white}minikube/kube-system %k%F{magenta}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{013} %F{015}⎈ %f%F{015}minikube/kube-system %k%F{013}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unalias kubectl unalias kubectl
} }
function testKubeContextPrintsNothingIfKubectlNotAvailable() { function testKubeContextPrintsNothingIfKubectlNotAvailable() {
alias kubectl=noKubectl local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_CUSTOM_WORLD='echo world'
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world kubecontext) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world kubecontext)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
alias kubectl=noKubectl
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{white} %F{black}world %k%F{white}%f " "$(build_left_prompt)" assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_CUSTOM_WORLD
unalias kubectl unalias kubectl
} }
source shunit2/source/2.1/src/shunit2 source shunit2/shunit2

@ -7,8 +7,6 @@ SHUNIT_PARENT=$0
function setUp() { function setUp() {
export TERM="xterm-256color" export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
} }
function mockLaravelVersion() { function mockLaravelVersion() {
@ -28,43 +26,47 @@ function mockNoLaravelVersion() {
} }
function testLaravelVersionSegment() { function testLaravelVersionSegment() {
alias php=mockLaravelVersion local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LARAVEL_ICON='x'
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(laravel_version) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(laravel_version)
local POWERLEVEL9K_LARAVEL_ICON='x'
alias php=mockLaravelVersion
assertEquals "%K{001} %F{white%}x %f%F{white}5.4.23 %k%F{maroon}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{001} %F{015}x %f%F{015}5.4.23 %k%F{001}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_LARAVEL_ICON
unalias php unalias php
} }
function testLaravelVersionSegmentIfArtisanIsNotAvailable() { function testLaravelVersionSegmentIfArtisanIsNotAvailable() {
alias php=mockNoLaravelVersion local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_CUSTOM_WORLD='echo world'
POWERLEVEL9K_LARAVEL_ICON='x'
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world laravel_version) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world laravel_version)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
local POWERLEVEL9K_LARAVEL_ICON='x'
alias php=mockNoLaravelVersion
assertEquals "%K{white} %F{black}world %k%F{white}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_LARAVEL_ICON
unset POWERLEVEL9K_CUSTOM_WORLD
unalias php unalias php
} }
function testLaravelVersionSegmentPrintsNothingIfPhpIsNotAvailable() { function testLaravelVersionSegmentPrintsNothingIfPhpIsNotAvailable() {
alias php=noPhp local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_CUSTOM_WORLD='echo world'
POWERLEVEL9K_LARAVEL_ICON='x'
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world laravel_version) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world laravel_version)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
local POWERLEVEL9K_LARAVEL_ICON='x'
alias php=noPhp
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{white} %F{black}world %k%F{white}%f " "$(build_left_prompt)" assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_LARAVEL_ICON
unset POWERLEVEL9K_CUSTOM_WORLD
unalias php unalias php
} }
source shunit2/source/2.1/src/shunit2 source shunit2/shunit2

@ -0,0 +1,149 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
P9K_HOME=$(pwd)
### Test specific
# Create default folder and git init it.
FOLDER=/tmp/powerlevel9k-test/load-test
mkdir -p "${FOLDER}"
cd $FOLDER
}
function tearDown() {
# Go back to powerlevel9k folder
cd "${P9K_HOME}"
# Remove eventually created test-specific folder
rm -fr "${FOLDER}"
# At least remove test folder completely
rm -fr /tmp/powerlevel9k-test
}
function testLoadSegmentWorksOnOsx() {
sysctl() {
if [[ "$*" == 'vm.loadavg' ]]; then
echo "vm.loadavg: { 1,38 1,45 2,16 }";
fi
if [[ "$*" == '-n hw.logicalcpu' ]]; then
echo "4";
fi
}
local POWERLEVEL9K_LOAD_WHICH=1
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local OS="OSX" # Fake OSX
assertEquals "%K{002} %F{000}L %f%F{000}1.38 " "$(prompt_load left 1 false ${FOLDER})"
unfunction sysctl
}
function testLoadSegmentWorksOnBsd() {
sysctl() {
if [[ "$*" == 'vm.loadavg' ]]; then
echo "vm.loadavg: { 1,38 1,45 2,16 }";
fi
if [[ "$*" == '-n hw.ncpu' ]]; then
echo "4";
fi
}
local POWERLEVEL9K_LOAD_WHICH=1
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local OS="BSD" # Fake BSD
assertEquals "%K{002} %F{000}L %f%F{000}1.38 " "$(prompt_load left 1 false ${FOLDER})"
unfunction sysctl
}
function testLoadSegmentWorksOnLinux() {
# Prepare loadavg
mkdir proc
echo "1.38 0.01 0.05 1/87 8641" > proc/loadavg
alias nproc="echo 4"
local POWERLEVEL9K_LOAD_WHICH=1
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local OS="Linux" # Fake Linux
assertEquals "%K{002} %F{000}L %f%F{000}1.38 " "$(prompt_load left 1 false ${FOLDER})"
unalias nproc
}
# Test normal state. This test is not OS specific.
# We test it as the Linux version, but that
# does not matter here.
function testLoadSegmentNormalState() {
# Prepare loadavg
mkdir proc
echo "1.00 0.01 0.05 1/87 8641" > proc/loadavg
alias nproc="echo 4"
local POWERLEVEL9K_LOAD_WHICH=1
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local OS="Linux" # Fake Linux
assertEquals "%K{002} %F{000}L %f%F{000}1.00 " "$(prompt_load left 1 false ${FOLDER})"
unalias nproc
}
# Test warning state. This test is not OS specific.
# We test it as the Linux version, but that
# does not matter here.
function testLoadSegmentWarningState() {
# Prepare loadavg
mkdir proc
echo "2.01 0.01 0.05 1/87 8641" > proc/loadavg
alias nproc="echo 4"
local POWERLEVEL9K_LOAD_WHICH=1
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local OS="Linux" # Fake Linux
assertEquals "%K{011} %F{000}L %f%F{000}2.01 " "$(prompt_load left 1 false ${FOLDER})"
unalias nproc
}
# Test critical state. This test is not OS specific.
# We test it as the Linux version, but that
# does not matter here.
function testLoadSegmentCriticalState() {
# Prepare loadavg
mkdir proc
echo "2.81 0.01 0.05 1/87 8641" > proc/loadavg
alias nproc="echo 4"
local POWERLEVEL9K_LOAD_WHICH=1
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local OS="Linux" # Fake Linux
assertEquals "%K{009} %F{000}L %f%F{000}2.81 " "$(prompt_load left 1 false ${FOLDER})"
unalias nproc
}
source shunit2/shunit2

@ -0,0 +1,41 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
}
function testNodeVersionSegmentPrintsNothingWithoutNode() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(node_version custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
alias node="nonode 2>/dev/null"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unalias node
}
function testNodeVersionSegmentWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(node_version)
node() {
echo "v1.2.3"
}
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{002} %F{015}⬢ %f%F{015}1.2.3 %k%F{002}%f " "$(build_left_prompt)"
unfunction node
}
source shunit2/shunit2

@ -0,0 +1,99 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
# Test specfic
# unset all possible user specified variables
unset NODE_VIRTUAL_ENV_DISABLE_PROMPT
unset NODE_VIRTUAL_ENV
}
function testNodeenvSegmentPrintsNothingWithoutNode() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nodeenv custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
alias node="nonode 2>/dev/null"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unalias node
}
function testNodeenvSegmentPrintsNothingIfNodeVirtualEnvIsNotSet() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nodeenv custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
node() {
echo "v1.2.3"
}
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unfunction node
}
function testNodeenvSegmentPrintsNothingIfNodeVirtualEnvDisablePromptIsSet() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nodeenv custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
node() {
echo "v1.2.3"
}
NODE_VIRTUAL_ENV="node-env"
NODE_VIRTUAL_ENV_DISABLE_PROMPT=true
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unset NODE_VIRTUAL_ENV_DISABLE_PROMPT
unset NODE_VIRTUAL_ENV
unfunction node
}
function testNodeenvSegmentPrintsAtLeastNodeEnvWithoutNode() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nodeenv)
alias node="nonode 2>/dev/null"
NODE_VIRTUAL_ENV="node-env"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{002}⬢ %f%F{002}[node-env] %k%F{000}%f " "$(build_left_prompt)"
unset NODE_VIRTUAL_ENV
unalias node
}
function testNodeenvSegmentWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nodeenv)
node() {
echo "v1.2.3"
}
NODE_VIRTUAL_ENV="node-env"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{002}⬢ %f%F{002}v1.2.3[node-env] %k%F{000}%f " "$(build_left_prompt)"
unfunction node
unset NODE_VIRTUAL_ENV
}
source shunit2/shunit2

@ -0,0 +1,72 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
P9K_HOME=$(pwd)
### Test specific
# Create default folder and git init it.
FOLDER=/tmp/powerlevel9k-test/nvm-test
mkdir -p "${FOLDER}/bin"
OLD_PATH=$PATH
PATH=${FOLDER}/bin:$PATH
cd $FOLDER
}
function tearDown() {
# Restore old path
PATH="${OLD_PATH}"
# Go back to powerlevel9k folder
cd "${P9K_HOME}"
# Remove eventually created test-specific folder
rm -fr "${FOLDER}"
# At least remove test folder completely
rm -fr /tmp/powerlevel9k-test
}
function testNvmSegmentPrintsNothingIfNvmIsNotAvailable() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nvm custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
}
function testNvmSegmentWorksWithoutHavingADefaultAlias() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nvm)
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
function nvm_version() {
[[ ${1} == 'current' ]] && echo 'v4.6.0' || echo 'v1.4.0'
}
assertEquals "%K{013} %F{000}⬢ %f%F{000}4.6.0 %k%F{013}%f " "$(build_left_prompt)"
}
function testNvmSegmentPrintsNothingWhenOnDefaultVersion() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nvm custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
function nvm_version() {
[[ ${1} == 'current' ]] && echo 'v4.6.0' || echo 'v4.6.0'
}
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
}
source shunit2/shunit2

@ -0,0 +1,42 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
}
function testPhpVersionSegmentPrintsNothingIfPhpIsNotAvailable() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(php_version custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
alias php="nophp"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unalias php
}
function testPhpVersionSegmentWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(php_version)
alias php="echo 'PHP 5.6.27 (cli) (built: Oct 23 2016 11:47:58)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
'"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{013} %F{255}PHP 5.6.27 %k%F{013}%f " "$(build_left_prompt)"
unalias php
}
source shunit2/shunit2

@ -0,0 +1,222 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
# Test specific
P9K_HOME=$(pwd)
FOLDER=/tmp/powerlevel9k-test
mkdir -p $FOLDER
cd $FOLDER
# Change cache file, so that the users environment don't
# interfere with the tests.
POWERLEVEL9K_PUBLIC_IP_FILE=$FOLDER/public_ip_file
}
function tearDown() {
# Go back to powerlevel9k folder
cd "${P9K_HOME}"
# Remove eventually created test-specific folder
rm -fr "${FOLDER}"
# At least remove test folder completely
rm -fr /tmp/powerlevel9k-test
unset FOLDER
unset P9K_HOME
# Unset cache file
unset POWERLEVEL9K_PUBLIC_IP_FILE
}
function testPublicIpSegmentPrintsNothingByDefaultIfHostIsNotAvailable() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip custom_world)
local POWERLEVEL9K_PUBLIC_IP_HOST='http://unknown.xyz'
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
# We need to overwrite dig, as this is a fallback method that
# uses an alternative host.
alias dig='nodig'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unalias dig
}
function testPublicIpSegmentPrintsNoticeIfNotConnected() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip)
local POWERLEVEL9K_PUBLIC_IP_HOST='http://unknown.xyz'
local POWERLEVEL9K_PUBLIC_IP_NONE="disconnected"
# We need to overwrite dig, as this is a fallback method that
# uses an alternative host.
alias dig='nodig'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{000} %F{015}disconnected %k%F{000}%f " "$(build_left_prompt)"
unalias dig
}
function testPublicIpSegmentWorksWithWget() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip)
alias dig='nodig'
alias curl='nocurl'
wget() {
echo "wget 1.2.3.4"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{000} %F{015}wget 1.2.3.4 %k%F{000}%f " "$(build_left_prompt)"
unfunction wget
unalias dig
unalias curl
}
function testPublicIpSegmentUsesCurlAsFallbackMethodIfWgetIsNotAvailable() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip)
alias dig='nodig'
alias wget='nowget'
curl() {
echo "curl 1.2.3.4"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{000} %F{015}curl 1.2.3.4 %k%F{000}%f " "$(build_left_prompt)"
unfunction curl
unalias dig
unalias wget
}
function testPublicIpSegmentUsesDigAsFallbackMethodIfWgetAndCurlAreNotAvailable() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip)
alias curl='nocurl'
alias wget='nowget'
dig() {
echo "dig 1.2.3.4"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{000} %F{015}dig 1.2.3.4 %k%F{000}%f " "$(build_left_prompt)"
unfunction dig
unalias curl
unalias wget
}
function testPublicIpSegmentCachesFile() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip)
dig() {
echo "first"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{000} %F{015}first %k%F{000}%f " "$(build_left_prompt)"
dig() {
echo "second"
}
# Segment should not have changed!
assertEquals "%K{000} %F{015}first %k%F{000}%f " "$(build_left_prompt)"
unfunction dig
}
function testPublicIpSegmentRefreshesCachesFileAfterTimeout() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip)
local POWERLEVEL9K_PUBLIC_IP_TIMEOUT=2
dig() {
echo "first"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{000} %F{015}first %k%F{000}%f " "$(build_left_prompt)"
sleep 3
dig() {
echo "second"
}
# Segment should not have changed!
assertEquals "%K{000} %F{015}second %k%F{000}%f " "$(build_left_prompt)"
unfunction dig
}
function testPublicIpSegmentRefreshesCachesFileIfEmpty() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip)
dig() {
echo "first"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{000} %F{015}first %k%F{000}%f " "$(build_left_prompt)"
# Truncate cache file
echo "" >! $POWERLEVEL9K_PUBLIC_IP_FILE
dig() {
echo "second"
}
# Segment should not have changed!
assertEquals "%K{000} %F{015}second %k%F{000}%f " "$(build_left_prompt)"
unfunction dig
}
function testPublicIpSegmentWhenGoingOnline() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip)
local POWERLEVEL9K_PUBLIC_IP_METHODS="dig"
local POWERLEVEL9K_PUBLIC_IP_NONE="disconnected"
alias dig="nodig"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{000} %F{015}disconnected %k%F{000}%f " "$(build_left_prompt)"
unalias dig
dig() {
echo "second"
}
# Segment should not have changed!
assertEquals "%K{000} %F{015}second %k%F{000}%f " "$(build_left_prompt)"
unfunction dig
}
source shunit2/shunit2

@ -0,0 +1,66 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
P9K_HOME=$(pwd)
### Test specific
# Create default folder and git init it.
FOLDER=/tmp/powerlevel9k-test/ram-test
mkdir -p "${FOLDER}"
cd $FOLDER
}
function tearDown() {
# Go back to powerlevel9k folder
cd "${P9K_HOME}"
# Remove eventually created test-specific folder
rm -fr "${FOLDER}"
# At least remove test folder completely
rm -fr /tmp/powerlevel9k-test
}
function testRamSegmentWorksOnOsx() {
alias vm_stat="echo 'Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free: 299687.
Pages active: 1623792.
Pages inactive: 1313411.
'"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local OS="OSX" # Fake OSX
assertEquals "%K{011} %F{000}RAM %f%F{000}6.15G " "$(prompt_ram left 1 false ${FOLDER})"
unalias vm_stat
}
function testRamSegmentWorksOnBsd() {
mkdir -p var/run
echo "avail memory 5678B 299687 4444G 299" > var/run/dmesg.boot
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local OS="BSD" # Fake BSD
assertEquals "%K{011} %F{000}RAM %f%F{000}0.29M " "$(prompt_ram left 1 false ${FOLDER})"
}
function testRamSegmentWorksOnLinux() {
mkdir proc
echo "MemAvailable: 299687" > proc/meminfo
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local OS="Linux" # Fake Linux
assertEquals "%K{011} %F{000}RAM %f%F{000}0.29G " "$(prompt_ram left 1 false ${FOLDER})"
}
source shunit2/shunit2

@ -14,8 +14,6 @@ function setUp() {
PATH="${RUST_TEST_FOLDER}:${PATH}" PATH="${RUST_TEST_FOLDER}:${PATH}"
export TERM="xterm-256color" export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
} }
function tearDown() { function tearDown() {
@ -29,22 +27,25 @@ function mockRust() {
} }
function testRust() { function testRust() {
mockRust local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(rust_version) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(rust_version)
mockRust
assertEquals "%K{208} %F{black%}Rust %f%F{black}0.4.1a-alpha %k%F{darkorange}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS assertEquals "%K{208} %F{000}Rust %f%F{000}0.4.1a-alpha %k%F{208}%f " "$(build_left_prompt)"
} }
function testRustPrintsNothingIfRustIsNotAvailable() { function testRustPrintsNothingIfRustIsNotAvailable() {
POWERLEVEL9K_CUSTOM_WORLD='echo world' local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world rust_version) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world rust_version)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
assertEquals "%K{white} %F{black}world %k%F{white}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_CUSTOM_WORLD
} }
source shunit2/source/2.1/src/shunit2 source shunit2/shunit2

@ -0,0 +1,80 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
}
function testSshSegmentPrintsNothingIfNoSshConnection() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ssh custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo "world"'
local POWERLEVEL9K_SSH_ICON="ssh-icon"
# Weak test: Emulate No SSH connection by unsetting
# $SSH_CLIENT and $SSH_TTY
unset SSH_CLIENT
unset SSH_TTY
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
}
function testSshSegmentWorksIfOnlySshClientIsSet() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ssh)
local POWERLEVEL9K_SSH_ICON="ssh-icon"
# Weak test: Emulate No SSH connection by unsetting
# $SSH_CLIENT and $SSH_TTY
SSH_CLIENT='ssh-client'
unset SSH_TTY
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{011}ssh-icon%f %k%F{000}%f " "$(build_left_prompt)"
unset SSH_CLIENT
}
function testSshSegmentWorksIfOnlySshTtyIsSet() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ssh)
local POWERLEVEL9K_SSH_ICON="ssh-icon"
# Weak test: Emulate No SSH connection by unsetting
# $SSH_CLIENT and $SSH_TTY
SSH_TTY='ssh-tty'
unset SSH_CLIENT
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{011}ssh-icon%f %k%F{000}%f " "$(build_left_prompt)"
unset SSH_TTY
}
function testSshSegmentWorksIfAllNecessaryVariablesAreSet() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ssh)
local POWERLEVEL9K_SSH_ICON="ssh-icon"
# Weak test: Emulate No SSH connection by unsetting
# $SSH_CLIENT and $SSH_TTY
SSH_CLIENT='ssh-client'
SSH_TTY='ssh-tty'
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{011}ssh-icon%f %k%F{000}%f " "$(build_left_prompt)"
unset SSH_TTY
unset SSH_CLIENT
}
source shunit2/shunit2

@ -7,8 +7,6 @@ SHUNIT_PARENT=$0
function setUp() { function setUp() {
export TERM="xterm-256color" export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
### Test specific ### Test specific
# Resets if someone has set these in his/hers env # Resets if someone has set these in his/hers env
@ -17,69 +15,99 @@ function setUp() {
} }
function testStatusPrintsNothingIfReturnCodeIsZeroAndVerboseIsUnset() { function testStatusPrintsNothingIfReturnCodeIsZeroAndVerboseIsUnset() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world' local POWERLEVEL9K_CUSTOM_WORLD='echo world'
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status custom_world)
local POWERLEVEL9K_STATUS_VERBOSE=false local POWERLEVEL9K_STATUS_VERBOSE=false
local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false
assertEquals "%K{white} %F{black}world %k%F{white}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
} }
function testStatusWorksAsExpectedIfReturnCodeIsZeroAndVerboseIsSet() { function testStatusWorksAsExpectedIfReturnCodeIsZeroAndVerboseIsSet() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status)
local POWERLEVEL9K_STATUS_VERBOSE=true local POWERLEVEL9K_STATUS_VERBOSE=true
local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false
local POWERLEVEL9K_STATUS_HIDE_SIGNAME=true local POWERLEVEL9K_STATUS_HIDE_SIGNAME=true
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status)
assertEquals "%K{black} %F{green%}✔%f %k%F{black}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{002}✔%f %k%F{000}%f " "$(build_left_prompt)"
} }
function testStatusInGeneralErrorCase() { function testStatusInGeneralErrorCase() {
local RETVAL=1 local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status)
local POWERLEVEL9K_STATUS_VERBOSE=true local POWERLEVEL9K_STATUS_VERBOSE=true
local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false
assertEquals "%K{red} %F{yellow1%}↵ %f%F{yellow1}1 %k%F{red}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
local RETVAL=1
assertEquals "%K{009} %F{226}↵ %f%F{226}1 %k%F{009}%f " "$(build_left_prompt)"
} }
function testPipestatusInErrorCase() { function testPipestatusInErrorCase() {
local -a RETVALS local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
RETVALS=(0 0 1 0) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status)
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status)
local POWERLEVEL9K_STATUS_VERBOSE=true local POWERLEVEL9K_STATUS_VERBOSE=true
local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=true local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=true
assertEquals "%K{red} %F{yellow1%}↵ %f%F{yellow1}0|0|1|0 %k%F{red}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
local -a RETVALS
RETVALS=(0 0 1 0)
assertEquals "%K{009} %F{226}↵ %f%F{226}0|0|1|0 %k%F{009}%f " "$(build_left_prompt)"
} }
function testStatusCrossWinsOverVerbose() { function testStatusCrossWinsOverVerbose() {
local RETVAL=1 local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status)
local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false
local POWERLEVEL9K_STATUS_VERBOSE=true local POWERLEVEL9K_STATUS_VERBOSE=true
local POWERLEVEL9K_STATUS_CROSS=true local POWERLEVEL9K_STATUS_CROSS=true
assertEquals "%K{black} %F{red%}✘%f %k%F{black}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
local RETVAL=1
assertEquals "%K{000} %F{009}✘%f %k%F{000}%f " "$(build_left_prompt)"
} }
function testStatusShowsSignalNameInErrorCase() { function testStatusShowsSignalNameInErrorCase() {
local RETVAL=132 local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status)
local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false
local POWERLEVEL9K_STATUS_VERBOSE=true local POWERLEVEL9K_STATUS_VERBOSE=true
local POWERLEVEL9K_STATUS_HIDE_SIGNAME=false local POWERLEVEL9K_STATUS_HIDE_SIGNAME=false
assertEquals "%K{red} %F{yellow1%}↵ %f%F{yellow1}SIGILL(4) %k%F{red}%f " "$(build_left_prompt)" # Load Powerlevel9k
source powerlevel9k.zsh-theme
local RETVAL=132
assertEquals "%K{009} %F{226}↵ %f%F{226}SIGILL(4) %k%F{009}%f " "$(build_left_prompt)"
} }
function testStatusSegmentIntegrated() { function testStatusSegmentIntegrated() {
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status) local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
local POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=() POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status)
local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=()
local POWERLEVEL9K_STATUS_CROSS=true
# Load Powerlevel9k
source powerlevel9k.zsh-theme
false; powerlevel9k_prepare_prompts false; powerlevel9k_prepare_prompts
assertEquals "%f%b%k%K{black} %F{red%}✘%f %k%F{black}%f " "${(e)PROMPT}" assertEquals "%f%b%k%K{000} %F{009}✘%f %k%F{000}%f " "${(e)PROMPT}"
} }
source shunit2/source/2.1/src/shunit2 source shunit2/shunit2

@ -0,0 +1,58 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
P9K_HOME=$(pwd)
### Test specific
# Create default folder and git init it.
FOLDER=/tmp/powerlevel9k-test/swap-test
mkdir -p "${FOLDER}"
cd $FOLDER
}
function tearDown() {
# Go back to powerlevel9k folder
cd "${P9K_HOME}"
# Remove eventually created test-specific folder
rm -fr "${FOLDER}"
# At least remove test folder completely
rm -fr /tmp/powerlevel9k-test
}
function testSwapSegmentWorksOnOsx() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(swap)
sysctl() {
echo "vm.swapusage: total = 3072,00M used = 1620,50M free = 1451,50M (encrypted)"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local OS="OSX" # Fake OSX
assertEquals "%K{011} %F{000}SWP %f%F{000}1.58G " "$(prompt_swap left 1 false ${FOLDER})"
unfunction sysctl
}
function testSwapSegmentWorksOnLinux() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(swap)
mkdir proc
echo "SwapTotal: 1000000" > proc/meminfo
echo "SwapFree: 1000" >> proc/meminfo
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
local OS="Linux" # Fake Linux
assertEquals "%K{011} %F{000}SWP %f%F{000}0.95G " "$(prompt_swap left 1 false ${FOLDER})"
}
source shunit2/shunit2

@ -0,0 +1,57 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
P9K_HOME=$(pwd)
### Test specific
# Create default folder and git init it.
FOLDER=/tmp/powerlevel9k-test
mkdir -p "${FOLDER}"
cd $FOLDER
}
function tearDown() {
# Go back to powerlevel9k folder
cd "${P9K_HOME}"
# Remove eventually created test-specific folder
rm -fr "${FOLDER}"
# At least remove test folder completely
rm -fr /tmp/powerlevel9k-test
}
function testSwiftSegmentPrintsNothingIfSwiftIsNotAvailable() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(swift_version custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
alias swift="noswift"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unalias swift
}
function testSwiftSegmentWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(swift_version)
function swift() {
echo "Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)\nTarget: x86_64-apple-macosx10.9"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{013} %F{015}Swift %f%F{015}3.0.1 %k%F{013}%f " "$(build_left_prompt)"
unfunction swift
}
source shunit2/shunit2

@ -0,0 +1,117 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
P9K_HOME=$(pwd)
### Test specific
# Create default folder and git init it.
FOLDER=/tmp/powerlevel9k-test
mkdir -p "${FOLDER}"
cd $FOLDER
}
function tearDown() {
# Go back to powerlevel9k folder
cd "${P9K_HOME}"
# Remove eventually created test-specific folder
rm -fr "${FOLDER}"
# At least remove test folder completely
rm -fr /tmp/powerlevel9k-test
}
function testSymfonyVersionSegmentPrintsNothingIfPhpIsNotAvailable() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(symfony2_version custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
alias php="nophp"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unalias php
}
function testSymfonyVersionSegmentPrintsNothingIfSymfonyIsNotAvailable() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(symfony2_version custom_world)
# "Symfony" is not a command, but rather a framework.
# To sucessfully execute this test, we just need to
# navigate into a folder that does not contain symfony.
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
}
function testSymfonyVersionPrintsNothingIfPhpThrowsAnError() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(symfony2_version custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
mkdir app
touch app/AppKernel.php
function php() {
echo "Warning: Unsupported declare strict_types in /Users/dr/Privat/vendor/ocramius/proxy-manager/src/ProxyManager/Configuration.php on line 19
Parse error: parse error, expecting `;´ or `{´ in /Users/dr/Privat/vendor/ocramius/proxy-manager/src/ProxyManager/Configuration.php on line 97"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
unfunction php
}
function testSymfonyVersionSegmentWorks() {
startSkipping # Skip test
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(symfony2_version)
mkdir app
touch app/AppKernel.php
function php() {
echo "Symfony version 3.1.4 - app/dev/debug"
}
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{240} %F{000}SF %f%F{000}3.1.4 %k%F{240}%f " "$(build_left_prompt)"
unfunction php
}
function testSymfonyVersionSegmentWorksInNestedFolder() {
startSkipping # Skip test
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(symfony2_version)
mkdir app
touch app/AppKernel.php
function php() {
echo "Symfony version 3.1.4 - app/dev/debug"
}
mkdir -p src/P9K/AppBundle
cd src/P9K/AppBundle
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{240} %F{000}SF %f%F{000}3.1.4 %k%F{240}%f " "$(build_left_prompt)"
unfunction php
}
source shunit2/shunit2

@ -0,0 +1,58 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
P9K_HOME=$(pwd)
### Test specific
# Create default folder and git init it.
FOLDER=/tmp/powerlevel9k-test
mkdir -p "${FOLDER}"
mkdir ${FOLDER}/bin
OLD_PATH=$PATH
PATH=${FOLDER}/bin:$PATH
cd $FOLDER
}
function tearDown() {
# Reset PATH
PATH=$OLD_PATH
# Go back to powerlevel9k folder
cd "${P9K_HOME}"
# Remove eventually created test-specific folder
rm -fr "${FOLDER}"
# At least remove test folder completely
rm -fr /tmp/powerlevel9k-test
}
function testTodoSegmentPrintsNothingIfTodoShIsNotInstalled() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(todo custom_world)
local POWERLEVEL9K_CUSTOM_WORLD='echo world'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{015} %F{000}world %k%F{015}%f " "$(build_left_prompt)"
}
function testTodoSegmentWorksAsExpected() {
# TODO: Skript in den PATH legen!
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(todo)
echo '#!/bin/sh' > ${FOLDER}/bin/todo.sh
echo 'echo "TODO: 34 of 100 tasks shown";' >> ${FOLDER}/bin/todo.sh
chmod +x ${FOLDER}/bin/todo.sh
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{244} %F{000}☑ %f%F{000}100 %k%F{244}%f " "$(build_left_prompt)"
}
source shunit2/shunit2

@ -0,0 +1,378 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
P9K_HOME=$(pwd)
### Test specific
# Create default folder and git init it.
FOLDER=/tmp/powerlevel9k-test/vcs-test
mkdir -p "${FOLDER}"
cd $FOLDER
# Set username and email
OLD_GIT_AUTHOR_NAME=$GIT_AUTHOR_NAME
GIT_AUTHOR_NAME="Testing Tester"
OLD_GIT_AUTHOR_EMAIL=$GIT_AUTHOR_EMAIL
GIT_AUTHOR_EMAIL="test@powerlevel9k.theme"
# Set default username if not already set!
if [[ -z $(git config user.name) ]]; then
GIT_AUTHOR_NAME_SET_BY_TEST=true
git config --global user.name "${GIT_AUTHOR_NAME}"
fi
# Set default email if not already set!
if [[ -z $(git config user.email) ]]; then
GIT_AUTHOR_EMAIL_SET_BY_TEST=true
git config --global user.email "${GIT_AUTHOR_EMAIL}"
fi
# Initialize FOLDER as git repository
git init 1>/dev/null
}
function tearDown() {
if [[ -n "${OLD_GIT_AUTHOR_NAME}" ]]; then
GIT_AUTHOR_NAME=$OLD_GIT_AUTHOR
unset OLD_GIT_AUTHOR_NAME
else
unset GIT_AUTHOR_NAME
fi
if [[ -n "${OLD_GIT_AUTHOR_EMAIL}" ]]; then
GIT_AUTHOR_EMAIL=$OLD_GIT_AUTHOR_EMAIL
unset OLD_GIT_AUTHOR_EMAIL
else
unset GIT_AUTHOR_EMAIL
fi
if [[ "${GIT_AUTHOR_NAME_SET_BY_TEST}" == "true" ]]; then
git config --global --unset user.name
fi
if [[ "${GIT_AUTHOR_EMAIL_SET_BY_TEST}" == "true" ]]; then
git config --global --unset user.email
fi
# Go back to powerlevel9k folder
cd "${P9K_HOME}"
# Remove eventually created test-specific folder
rm -fr "${FOLDER}"
# At least remove test folder completely
rm -fr /tmp/powerlevel9k-test
unset FOLDER
}
function testColorOverridingForCleanStateWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_CLEAN_FOREGROUND='cyan'
local POWERLEVEL9K_VCS_CLEAN_BACKGROUND='white'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{015} %F{014} master %k%F{015}%f " "$(build_left_prompt)"
}
function testColorOverridingForModifiedStateWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_MODIFIED_FOREGROUND='red'
local POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='yellow'
touch testfile
git add testfile
git commit -m "test" 1>/dev/null
echo "test" > testfile
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{011} %F{009} master ● %k%F{011}%f " "$(build_left_prompt)"
}
function testColorOverridingForUntrackedStateWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND='cyan'
local POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND='yellow'
touch testfile
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{011} %F{014} master ? %k%F{011}%f " "$(build_left_prompt)"
}
function testGitIconWorks() {
local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_GIT_ICON='Git-Icon'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000}Git-Icon %f%F{000} master %k%F{002}%f " "$(build_left_prompt)"
}
function testGitlabIconWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_GIT_GITLAB_ICON='GL-Icon'
# Add a GitLab project as remote origin. This is
# sufficient to show the GitLab-specific icon.
git remote add origin https://gitlab.com/dritter/gitlab-test-project.git
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000}GL-Icon %f%F{000} master %k%F{002}%f " "$(build_left_prompt)"
}
function testBitbucketIconWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_GIT_BITBUCKET_ICON='BB-Icon'
# Add a BitBucket project as remote origin. This is
# sufficient to show the BitBucket-specific icon.
git remote add origin https://dritter@bitbucket.org/dritter/dr-test.git
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000}BB-Icon %f%F{000} master %k%F{002}%f " "$(build_left_prompt)"
}
function testGitHubIconWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_GIT_GITHUB_ICON='GH-Icon'
# Add a GitHub project as remote origin. This is
# sufficient to show the GitHub-specific icon.
git remote add origin https://github.com/dritter/test.git
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000}GH-Icon %f%F{000} master %k%F{002}%f " "$(build_left_prompt)"
}
function testUntrackedFilesIconWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_UNTRACKED_ICON='?'
# Create untracked file
touch "i-am-untracked.txt"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000} master ? %k%F{002}%f " "$(build_left_prompt)"
}
function testStagedFilesIconWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_STAGED_ICON='+'
# Create staged file
touch "i-am-added.txt"
git add i-am-added.txt &>/dev/null
git commit -m "initial commit" &>/dev/null
echo "xx" >> i-am-added.txt
git add i-am-added.txt &>/dev/null
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{011} %F{000} master + %k%F{011}%f " "$(build_left_prompt)"
}
function testUnstagedFilesIconWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_UNSTAGED_ICON='M'
# Create unstaged (modified, but not added to index) file
touch "i-am-modified.txt"
git add i-am-modified.txt
git commit -m "Add File" 1>/dev/null
echo "xx" > i-am-modified.txt
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{011} %F{000} master M %k%F{011}%f " "$(build_left_prompt)"
}
function testStashIconWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_STASH_ICON='S'
# Create modified file
touch "i-am-modified.txt"
git add i-am-modified.txt
git commit -m "Add File" 1>/dev/null
echo "xx" > i-am-modified.txt
git stash 1>/dev/null
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000} master S1 %k%F{002}%f " "$(build_left_prompt)"
}
function testTagIconWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_TAG_ICON='T'
touch "file.txt"
git add file.txt
git commit -m "Add File" 1>/dev/null
git tag "v0.0.1"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000} master Tv0.0.1 %k%F{002}%f " "$(build_left_prompt)"
}
function testTagIconInDetachedHeadState() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_TAG_ICON='T'
touch "file.txt"
git add file.txt
git commit -m "Add File" &>/dev/null
git tag "v0.0.1"
touch "file2.txt"
git add file2.txt
git commit -m "Add File2" &>/dev/null
git checkout v0.0.1 &>/dev/null
local hash=$(git rev-list -n 1 --abbrev-commit --abbrev=8 HEAD)
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000} ${hash} Tv0.0.1 %k%F{002}%f " "$(build_left_prompt)"
}
function testActionHintWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
touch "i-am-modified.txt"
git add i-am-modified.txt
git commit -m "Add File" &>/dev/null
git clone . ../vcs-test2 &>/dev/null
echo "xx" >> i-am-modified.txt
git commit -a -m "Modified file" &>/dev/null
cd ../vcs-test2
echo "yy" >> i-am-modified.txt
git commit -a -m "Provoke conflict" &>/dev/null
git pull &>/dev/null
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{011} %F{000} master %F{red}| merge%f %k%F{011}%f " "$(build_left_prompt)"
}
function testIncomingHintWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON='I'
touch "i-am-modified.txt"
git add i-am-modified.txt
git commit -m "Add File" &>/dev/null
git clone . ../vcs-test2 &>/dev/null
echo "xx" >> i-am-modified.txt
git commit -a -m "Modified file" &>/dev/null
cd ../vcs-test2
git fetch &>/dev/null
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000} master I1 %k%F{002}%f " "$(build_left_prompt)"
}
function testOutgoingHintWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON='o'
touch "i-am-modified.txt"
git add i-am-modified.txt
git commit -m "Add File" &>/dev/null
git clone . ../vcs-test2 &>/dev/null
cd ../vcs-test2
echo "xx" >> i-am-modified.txt
git commit -a -m "Modified file" &>/dev/null
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000} master o1 %k%F{002}%f " "$(build_left_prompt)"
}
function testShorteningCommitHashWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_SHOW_CHANGESET=true
local POWERLEVEL9K_CHANGESET_HASH_LENGTH='4'
touch "file.txt"
git add file.txt
git commit -m "Add File" 1>/dev/null
local hash=$(git rev-list -n 1 --abbrev-commit --abbrev=3 HEAD)
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
# This test needs to call powerlevel9k_vcs_init, where
# the changeset is truncated.
powerlevel9k_vcs_init
assertEquals "%K{002} %F{000}${hash}  master %k%F{002}%f " "$(build_left_prompt)"
}
function testShorteningCommitHashIsNotShownIfShowChangesetIsFalse() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_SHOW_CHANGESET=false
local POWERLEVEL9K_CHANGESET_HASH_LENGTH='4'
touch "file.txt"
git add file.txt
git commit -m "Add File" 1>/dev/null
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
# This test needs to call powerlevel9k_vcs_init, where
# the changeset is truncated.
powerlevel9k_vcs_init
assertEquals "%K{002} %F{000} master %k%F{002}%f " "$(build_left_prompt)"
}
source shunit2/shunit2

@ -0,0 +1,207 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
P9K_HOME=$(pwd)
### Test specific
# Create default folder and hg init it.
FOLDER=/tmp/powerlevel9k-test/vcs-test
mkdir -p "${FOLDER}"
cd $FOLDER
export HGUSER="Test bot <bot@example.com>"
hg init 1>/dev/null
}
function tearDown() {
# Go back to powerlevel9k folder
cd "${P9K_HOME}"
# Remove eventually created test-specific folder
rm -fr "${FOLDER}" &>/dev/null
# At least remove test folder completely
rm -fr /tmp/powerlevel9k-test &>/dev/null
unset FOLDER
unset HGUSER
}
function testColorOverridingForCleanStateWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_CLEAN_FOREGROUND='cyan'
local POWERLEVEL9K_VCS_CLEAN_BACKGROUND='white'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{015} %F{014} default %k%F{015}%f " "$(build_left_prompt)"
}
function testColorOverridingForModifiedStateWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_MODIFIED_FOREGROUND='red'
local POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='yellow'
touch testfile
hg add testfile
hg commit -m "test" 1>/dev/null
echo "test" > testfile
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{011} %F{009} default ● %k%F{011}%f " "$(build_left_prompt)"
}
# There is no staging area in mercurial, therefore there are no "untracked"
# files.. In case there are added files, we show the VCS segment with a
# yellow background.
# This may be improved in future versions, to be a bit more consistent with
# the git part.
function testAddedFilesIconWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
touch "myfile.txt"
hg add myfile.txt
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{011} %F{000} default ● %k%F{011}%f " "$(build_left_prompt)"
}
# We don't support tagging in mercurial right now..
function testTagIconWorks() {
startSkipping # Skip test
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_TAG_ICON='T'
touch "file.txt"
hg add file.txt
hg commit -m "Add File" 1>/dev/null
hg tag "v0.0.1"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000} default Tv0.0.1 %k%F{002}%f " "$(build_left_prompt)"
}
function testTagIconInDetachedHeadState() {
startSkipping # Skip test
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_TAG_ICON='T'
touch "file.txt"
hg add file.txt
hg commit -m "Add File" &>/dev/null
hg tag "v0.0.1"
touch "file2.txt"
hg add file2.txt
hg commit -m "Add File2" &>/dev/null
hg checkout v0.0.1 &>/dev/null
local hash=$(hg id)
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000} ${hash} Tv0.0.1 %k%F{002}%f " "$(build_left_prompt)"
}
function testActionHintWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
touch "i-am-modified.txt"
hg add i-am-modified.txt
hg commit -m "Add File" &>/dev/null
hg clone . ../vcs-test2 &>/dev/null
echo "xx" >> i-am-modified.txt
hg commit -m "Modified file" &>/dev/null
cd ../vcs-test2
echo "yy" >> i-am-modified.txt
hg commit -m "Provoke conflict" 2>/dev/null
hg pull 1>/dev/null
hg merge --tool internal:merge >/dev/null 2>&1
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{011} %F{000} default %F{red}| merging%f %k%F{011}%f " "$(build_left_prompt)"
}
function testShorteningCommitHashWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_SHOW_CHANGESET=true
local POWERLEVEL9K_CHANGESET_HASH_LENGTH='4'
touch "file.txt"
hg add file.txt
hg commit -m "Add File" 1>/dev/null
local hash=$(hg id | head -c ${POWERLEVEL9K_CHANGESET_HASH_LENGTH})
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
# This test needs to call powerlevel9k_vcs_init, where
# the changeset is truncated.
powerlevel9k_vcs_init
assertEquals "%K{002} %F{000}${hash}  default %k%F{002}%f " "$(build_left_prompt)"
}
function testShorteningCommitHashIsNotShownIfShowChangesetIsFalse() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_SHOW_CHANGESET=false
local POWERLEVEL9K_CHANGESET_HASH_LENGTH='4'
touch "file.txt"
hg add file.txt
hg commit -m "Add File" 1>/dev/null
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
# This test needs to call powerlevel9k_vcs_init, where
# the changeset is truncated.
powerlevel9k_vcs_init
assertEquals "%K{002} %F{000} default %k%F{002}%f " "$(build_left_prompt)"
}
function testMercurialIconWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_HG_ICON='HG-Icon'
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000}HG-Icon %f%F{000} default %k%F{002}%f " "$(build_left_prompt)"
}
function testBookmarkIconWorks() {
local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
local POWERLEVEL9K_VCS_BOOKMARK_ICON='B'
hg bookmark "initial"
# Load Powerlevel9k
source ${P9K_HOME}/powerlevel9k.zsh-theme
assertEquals "%K{002} %F{000} default Binitial %k%F{002}%f " "$(build_left_prompt)"
}
source shunit2/shunit2

@ -1,161 +0,0 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
# Load Powerlevel9k
source powerlevel9k.zsh-theme
}
function testColorOverridingForCleanStateWorks() {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
POWERLEVEL9K_VCS_CLEAN_FOREGROUND='cyan'
POWERLEVEL9K_VCS_CLEAN_BACKGROUND='white'
FOLDER=/tmp/powerlevel9k-test/vcs-test
mkdir -p $FOLDER
cd $FOLDER
git init 1>/dev/null
assertEquals "%K{white} %F{cyan} master %k%F{white}%f " "$(build_left_prompt)"
cd -
rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_VCS_CLEAN_FOREGROUND
unset POWERLEVEL9K_VCS_CLEAN_BACKGROUND
}
function testColorOverridingForModifiedStateWorks() {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
POWERLEVEL9K_VCS_MODIFIED_FOREGROUND='red'
POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='yellow'
FOLDER=/tmp/powerlevel9k-test/vcs-test
mkdir -p $FOLDER
cd $FOLDER
git init 1>/dev/null
git config user.email "test@powerlevel9k.theme"
git config user.name "Testing Tester"
touch testfile
git add testfile
git commit -m "test" 1>/dev/null
echo "test" > testfile
assertEquals "%K{yellow} %F{red} master ● %k%F{yellow}%f " "$(build_left_prompt)"
cd -
rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_VCS_MODIFIED_FOREGROUND
unset POWERLEVEL9K_VCS_MODIFIED_BACKGROUND
}
function testColorOverridingForUntrackedStateWorks() {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND='cyan'
POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND='yellow'
FOLDER=/tmp/powerlevel9k-test/vcs-test
mkdir -p $FOLDER
cd $FOLDER
git init 1>/dev/null
touch testfile
assertEquals "%K{yellow} %F{cyan} master ? %k%F{yellow}%f " "$(build_left_prompt)"
cd -
rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND
unset POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND
}
function testBranchNameTruncatingShortenLength() {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
POWERLEVEL9K_VCS_SHORTEN_LENGTH=6
POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH=3
POWERLEVEL9K_VCS_SHORTEN_STRATEGY="truncate_from_right"
FOLDER=/tmp/powerlevel9k-test/vcs-test
mkdir -p $FOLDER
cd $FOLDER
git init 1>/dev/null
touch testfile
assertEquals "%K{green} %F{black} master ? %k%F{green}%f " "$(build_left_prompt)"
POWERLEVEL9K_VCS_SHORTEN_LENGTH=3
assertEquals "%K{green} %F{black} mas… ? %k%F{green}%f " "$(build_left_prompt)"
cd -
rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_VCS_SHORTEN_LENGTH
unset POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH
unset POWERLEVEL9K_VCS_SHORTEN_STRATEGY
}
function testBranchNameTruncatingMinLength() {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
POWERLEVEL9K_VCS_SHORTEN_LENGTH=3
POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH=6
POWERLEVEL9K_VCS_SHORTEN_STRATEGY="truncate_from_right"
FOLDER=/tmp/powerlevel9k-test/vcs-test
mkdir -p $FOLDER
cd $FOLDER
git init 1>/dev/null
touch testfile
assertEquals "%K{green} %F{black} master ? %k%F{green}%f " "$(build_left_prompt)"
POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH=7
assertEquals "%K{green} %F{black} master ? %k%F{green}%f " "$(build_left_prompt)"
cd -
rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_VCS_SHORTEN_LENGTH
unset POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH
unset POWERLEVEL9K_VCS_SHORTEN_STRATEGY
}
function testBranchNameTruncatingShortenStrategy() {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs)
POWERLEVEL9K_VCS_SHORTEN_LENGTH=3
POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH=3
POWERLEVEL9K_VCS_SHORTEN_STRATEGY="truncate_from_right"
FOLDER=/tmp/powerlevel9k-test/vcs-test
mkdir -p $FOLDER
cd $FOLDER
git init 1>/dev/null
touch testfile
assertEquals "%K{green} %F{black} mas… ? %k%F{green}%f " "$(build_left_prompt)"
POWERLEVEL9K_VCS_SHORTEN_STRATEGY="truncate_middle"
assertEquals "%K{green} %F{black} mas…ter ? %k%F{green}%f " "$(build_left_prompt)"
cd -
rm -fr /tmp/powerlevel9k-test
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset POWERLEVEL9K_VCS_SHORTEN_LENGTH
unset POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH
unset POWERLEVEL9K_VCS_SHORTEN_STRATEGY
}
source shunit2/source/2.1/src/shunit2

@ -0,0 +1,48 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
# Required for shunit2 to run correctly
setopt shwordsplit
SHUNIT_PARENT=$0
function setUp() {
export TERM="xterm-256color"
}
function testViInsertModeWorks() {
local KEYMAP='viins'
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{012}INSERT " "$(prompt_vi_mode left 1 false)"
}
function testViInsertModeWorksWhenLabeledAsMain() {
local KEYMAP='main'
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{012}INSERT " "$(prompt_vi_mode left 1 false)"
}
function testViCommandModeWorks() {
local KEYMAP='vicmd'
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{015}NORMAL " "$(prompt_vi_mode left 1 false)"
}
function testViInsertModeStringIsCustomizable() {
local KEYMAP='viins'
# Load Powerlevel9k
source powerlevel9k.zsh-theme
assertEquals "%K{000} %F{012}INSERT " "$(prompt_vi_mode left 1 false)"
}
source shunit2/shunit2

@ -0,0 +1,17 @@
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
local failed=false
for test in **/*.spec; do
echo
echo "Now executing ${test}"
if [[ "${test}" == "test/suite.spec" ]]; then
continue;
fi
./${test} || failed=true
done
if [[ "${failed}" == "true" ]]; then
exit 1
fi
Loading…
Cancel
Save