91 lines
3.5 KiB
Bash
Executable File
91 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
harness="$repo_dir/config/dot/quickshell/home-brightness-slider-harness.qml"
|
|
state_home="$(mktemp -d /tmp/panama-home-brightness-slider.XXXXXX)"
|
|
shell_log="$state_home/quickshell.log"
|
|
|
|
fail() {
|
|
printf 'Home brightness slider contract: %s\n' "$1" >&2
|
|
exit 1
|
|
}
|
|
|
|
qs_for_harness() {
|
|
QS_DISABLE_CRASH_HANDLER=1 XDG_STATE_HOME="$state_home" \
|
|
qs -p "$harness" "$@"
|
|
}
|
|
|
|
cleanup() {
|
|
qs_for_harness kill >/dev/null 2>&1 || true
|
|
rm -rf "$state_home"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
start_harness() {
|
|
qs_for_harness --daemonize >"$shell_log" 2>&1
|
|
for _ in $(seq 1 50); do
|
|
if qs_for_harness ipc show 2>/dev/null \
|
|
| rg -q '^target home-brightness-slider-test$'; then
|
|
return
|
|
fi
|
|
sleep 0.1
|
|
done
|
|
sed -n '1,160p' "$shell_log" >&2
|
|
fail 'isolated slider harness did not start'
|
|
}
|
|
|
|
assert_status() {
|
|
local filter="$1"
|
|
local message="$2"
|
|
local status=""
|
|
|
|
status="$(qs_for_harness ipc call home-brightness-slider-test status)"
|
|
jq -e "$filter" <<<"$status" >/dev/null || {
|
|
printf 'Slider status: %s\n' "$status" >&2
|
|
fail "$message"
|
|
}
|
|
}
|
|
|
|
start_harness
|
|
|
|
qs_for_harness ipc call home-brightness-slider-test reset 30 >/dev/null
|
|
assert_status \
|
|
'.accessibleRoleIsSlider == true and .accessibleName == "Desk lamp brightness" and .accessibleDescription == "30 percent, range 0 to 100" and .accessibleFocusable == true' \
|
|
'slider accessibility metadata is incomplete or incorrect'
|
|
qs_for_harness ipc call home-brightness-slider-test press 140 >/dev/null
|
|
assert_status \
|
|
'.confirmedValue == 30 and .previewValue == 70 and .interactionActive == true and .commitCount == 0 and .accessibleDescription == "70 percent, range 0 to 100"' \
|
|
'pointer press did not remain a local preview'
|
|
qs_for_harness ipc call home-brightness-slider-test release >/dev/null
|
|
assert_status \
|
|
'.previewValue == 70 and .interactionActive == false and .commitCount == 1 and .lastCommit == 70' \
|
|
'one pointer release did not emit exactly one commit'
|
|
qs_for_harness ipc call home-brightness-slider-test release >/dev/null
|
|
assert_status '.commitCount == 1' 'release without an interaction emitted another commit'
|
|
|
|
qs_for_harness ipc call home-brightness-slider-test reset 30 >/dev/null
|
|
qs_for_harness ipc call home-brightness-slider-test wheel 120 >/dev/null
|
|
assert_status \
|
|
'.previewValue == 35 and .interactionActive == false and .commitCount == 1 and .lastCommit == 35' \
|
|
'one wheel event did not emit exactly one five-point commit'
|
|
|
|
qs_for_harness ipc call home-brightness-slider-test reset 30 >/dev/null
|
|
qs_for_harness ipc call home-brightness-slider-test press 160 >/dev/null
|
|
assert_status \
|
|
'.previewValue == 80 and .interactionActive == true and .commitCount == 0' \
|
|
'cancellation setup did not enter local preview state'
|
|
qs_for_harness ipc call home-brightness-slider-test external 45 >/dev/null
|
|
assert_status \
|
|
'.confirmedValue == 45 and .previewValue == 80 and .interactionActive == true and .commitCount == 0' \
|
|
'external confirmed or pending state replaced an active local preview'
|
|
qs_for_harness ipc call home-brightness-slider-test cancel >/dev/null
|
|
assert_status \
|
|
'.confirmedValue == 45 and .previewValue == 45 and .interactionActive == false and .commitCount == 0 and .lastCommit == -1' \
|
|
'canceled interaction committed or failed to restore the external value'
|
|
|
|
trap - EXIT
|
|
cleanup
|
|
printf 'Home brightness slider contract: PASS\n'
|