#!/bin/bash set -euo pipefail source "$(dirname "$0")/base-test.sh" tmp_dir=$(mktemp -d) trap 'rm -rf "$tmp_dir"' EXIT stub_bin="$tmp_dir/bin" mkdir -p "$stub_bin" cat >"$stub_bin/v4l2-ctl" <<'SH' #!/bin/bash [[ ${OMARCHY_TEST_NO_WEBCAM:-false} == "true" ]] && exit 0 printf '%s\n' "Built-in Webcam: Integrated Camera" printf '\t%s\n' "/dev/video0" printf '\t%s\n' "/dev/video1" printf '\n' printf '%s\n' "USB Capture Card: External Camera" printf '\t%s\n' "/dev/video2" SH cat >"$stub_bin/omarchy-menu-select" <<'SH' #!/bin/bash printf '%s\n' "$@" >"$OMARCHY_TEST_MENU_ARGS" printf '%s\n' "$3" SH cat >"$stub_bin/omarchy-capture-screenrecording" <<'SH' #!/bin/bash printf '%s\n' "$@" >"$OMARCHY_TEST_RECORDER_ARGS" SH cat >"$stub_bin/omarchy-notification-send" <<'SH' #!/bin/bash printf '%s\n' "$@" >"$OMARCHY_TEST_NOTIFICATION_ARGS" SH chmod +x "$stub_bin"/* export PATH="$stub_bin:$ROOT/bin:$PATH" # The resize helper anchors to a region file here, so keep it out of the real one export XDG_RUNTIME_DIR="$tmp_dir" export OMARCHY_TEST_MENU_ARGS="$tmp_dir/menu-args" export OMARCHY_TEST_RECORDER_ARGS="$tmp_dir/recorder-args" export OMARCHY_TEST_NOTIFICATION_ARGS="$tmp_dir/notification-args" if "$ROOT/bin/omarchy-hw-webcam"; then pass "webcam hardware detection succeeds when a video device is available" else fail "webcam hardware detection succeeds when a video device is available" fi if OMARCHY_TEST_NO_WEBCAM=true "$ROOT/bin/omarchy-hw-webcam"; then fail "webcam hardware detection fails when no video device is available" else pass "webcam hardware detection fails when no video device is available" fi "$ROOT/bin/omarchy-capture-screenrecording-with-webcam" expected_menu_args="$tmp_dir/expected-menu-args" printf '%s\n' \ "Select Webcam" \ "/dev/video0 Built-in Webcam: Integrated Camera" \ "/dev/video2 USB Capture Card: External Camera" \ "--" \ "--width" \ "520" \ "--maxheight" \ "520" >"$expected_menu_args" if ! cmp -s "$OMARCHY_TEST_MENU_ARGS" "$expected_menu_args"; then fail "screenrecording webcam picker passes each webcam as a menu option" "$(diff -u "$expected_menu_args" "$OMARCHY_TEST_MENU_ARGS")" fi pass "screenrecording webcam picker passes each webcam as a menu option" expected_recorder_args="$tmp_dir/expected-recorder-args" printf '%s\n' \ "--with-desktop-audio" \ "--with-microphone-audio" \ "--with-webcam" \ "--webcam-device=/dev/video2" >"$expected_recorder_args" if ! cmp -s "$OMARCHY_TEST_RECORDER_ARGS" "$expected_recorder_args"; then fail "screenrecording webcam picker starts recording with selected device" "$(diff -u "$expected_recorder_args" "$OMARCHY_TEST_RECORDER_ARGS")" fi pass "screenrecording webcam picker starts recording with selected device" cat >"$stub_bin/hyprctl" <<'SH' #!/bin/bash case $1 in clients) printf '[{"address":"0xabc","title":"%s","size":[%s,%s],"monitor":2}]\n' \ "${OMARCHY_TEST_CLIENT_TITLE:-WebcamOverlay}" \ "${OMARCHY_TEST_CLIENT_WIDTH:-178}" \ "${OMARCHY_TEST_CLIENT_HEIGHT:-200}" ;; monitors) printf '[{"id":2,"x":1280,"y":-100,"width":%s,"height":%s,"scale":%s}]\n' \ "${OMARCHY_TEST_MONITOR_WIDTH:-2560}" \ "${OMARCHY_TEST_MONITOR_HEIGHT:-1600}" \ "${OMARCHY_TEST_MONITOR_SCALE:-2}" ;; dispatch) printf '%s\n' "$*" >>"$OMARCHY_TEST_HYPRCTL_ARGS" ;; esac SH chmod +x "$stub_bin/hyprctl" export OMARCHY_TEST_HYPRCTL_ARGS="$tmp_dir/hyprctl-args" "$ROOT/bin/omarchy-capture-webcam-resize" smaller expected_hyprctl_args="$tmp_dir/expected-hyprctl-args" printf '%s\n' \ 'dispatch hl.dsp.window.resize({ window = "address:0xabc", x = 128, y = 144 })' \ 'dispatch hl.dsp.window.move({ window = "address:0xabc", x = 2392, y = 516 })' >"$expected_hyprctl_args" if ! cmp -s "$OMARCHY_TEST_HYPRCTL_ARGS" "$expected_hyprctl_args"; then fail "webcam resize preserves its aspect ratio and corner anchor" "$(diff -u "$expected_hyprctl_args" "$OMARCHY_TEST_HYPRCTL_ARGS")" fi pass "webcam resize preserves its aspect ratio and corner anchor" : >"$OMARCHY_TEST_HYPRCTL_ARGS" OMARCHY_TEST_MONITOR_WIDTH=1920 \ OMARCHY_TEST_MONITOR_HEIGHT=1080 \ OMARCHY_TEST_MONITOR_SCALE=1 \ OMARCHY_TEST_CLIENT_WIDTH=128 \ OMARCHY_TEST_CLIENT_HEIGHT=144 \ "$ROOT/bin/omarchy-capture-webcam-resize" reset printf '%s\n' \ 'dispatch hl.dsp.window.resize({ window = "address:0xabc", x = 240, y = 270 })' \ 'dispatch hl.dsp.window.move({ window = "address:0xabc", x = 2920, y = 670 })' >"$expected_hyprctl_args" if ! cmp -s "$OMARCHY_TEST_HYPRCTL_ARGS" "$expected_hyprctl_args"; then fail "webcam default size adapts to monitor resolution" "$(diff -u "$expected_hyprctl_args" "$OMARCHY_TEST_HYPRCTL_ARGS")" fi pass "webcam default size adapts to monitor resolution" : >"$OMARCHY_TEST_HYPRCTL_ARGS" OMARCHY_TEST_CLIENT_TITLE="Other Window" "$ROOT/bin/omarchy-capture-webcam-resize" larger if [[ -s $OMARCHY_TEST_HYPRCTL_ARGS ]]; then fail "webcam resize ignores other windows" "$(cat "$OMARCHY_TEST_HYPRCTL_ARGS")" fi pass "webcam resize ignores other windows" region_file="$XDG_RUNTIME_DIR/omarchy-screenrecord-region" : >"$OMARCHY_TEST_HYPRCTL_ARGS" echo "800x600+100+100" >"$region_file" "$ROOT/bin/omarchy-capture-webcam-resize" reset printf '%s\n' \ 'dispatch hl.dsp.window.resize({ window = "address:0xabc", x = 133, y = 150 })' \ 'dispatch hl.dsp.window.move({ window = "address:0xabc", x = 727, y = 510 })' >"$expected_hyprctl_args" if ! cmp -s "$OMARCHY_TEST_HYPRCTL_ARGS" "$expected_hyprctl_args"; then fail "webcam anchors to the recorded region" "$(diff -u "$expected_hyprctl_args" "$OMARCHY_TEST_HYPRCTL_ARGS")" fi pass "webcam anchors to the recorded region" printf '%s\n' \ 'dispatch hl.dsp.window.resize({ window = "address:0xabc", x = 178, y = 200 })' \ 'dispatch hl.dsp.window.move({ window = "address:0xabc", x = 2342, y = 460 })' >"$expected_hyprctl_args" for region in "not-a-region" ""; do : >"$OMARCHY_TEST_HYPRCTL_ARGS" printf '%s' "$region" >"$region_file" "$ROOT/bin/omarchy-capture-webcam-resize" reset if ! cmp -s "$OMARCHY_TEST_HYPRCTL_ARGS" "$expected_hyprctl_args"; then fail "webcam falls back to the monitor for an unusable region" "$(diff -u "$expected_hyprctl_args" "$OMARCHY_TEST_HYPRCTL_ARGS")" fi done pass "webcam falls back to the monitor for an unusable region" # A region too narrow for presets scaled from its height shrinks the whole # ladder, so the three sizes stay distinct and each one fits inside the margins : >"$OMARCHY_TEST_HYPRCTL_ARGS" echo "200x1200+0+0" >"$region_file" for size in small medium large; do "$ROOT/bin/omarchy-capture-webcam-resize" "$size" done printf '%s\n' \ 'dispatch hl.dsp.window.resize({ window = "address:0xabc", x = 64, y = 72 })' \ 'dispatch hl.dsp.window.move({ window = "address:0xabc", x = 96, y = 1088 })' \ 'dispatch hl.dsp.window.resize({ window = "address:0xabc", x = 89, y = 100 })' \ 'dispatch hl.dsp.window.move({ window = "address:0xabc", x = 71, y = 1060 })' \ 'dispatch hl.dsp.window.resize({ window = "address:0xabc", x = 120, y = 135 })' \ 'dispatch hl.dsp.window.move({ window = "address:0xabc", x = 40, y = 1025 })' >"$expected_hyprctl_args" if ! cmp -s "$OMARCHY_TEST_HYPRCTL_ARGS" "$expected_hyprctl_args"; then fail "webcam sizes stay distinct and inside a narrow region" "$(diff -u "$expected_hyprctl_args" "$OMARCHY_TEST_HYPRCTL_ARGS")" fi pass "webcam sizes stay distinct and inside a narrow region" rm -f "$region_file" grep -F 'o.bind("SUPER + ALT + code:34", "Make webcam overlay smaller", "omarchy-capture-webcam-resize smaller")' \ "$ROOT/default/hypr/bindings/utilities.lua" >/dev/null || fail "webcam smaller hotkey is configured" grep -F 'o.bind("SUPER + ALT + code:35", "Make webcam overlay larger", "omarchy-capture-webcam-resize larger")' \ "$ROOT/default/hypr/bindings/utilities.lua" >/dev/null || fail "webcam larger hotkey is configured" pass "webcam resize hotkeys are configured" grep -F -- '--wayland-app-id="WebcamOverlay-$WEBCAM_SIZE"' \ "$ROOT/bin/omarchy-capture-screenrecording" >/dev/null || fail "webcam uses a dedicated size-specific app id" webcam_rules="$ROOT/default/hypr/apps/webcam-overlay.lua" grep -F 'move = { "(monitor_w-monitor_h*4/25-40)", "(monitor_h-monitor_h*9/50-40)" }' "$webcam_rules" >/dev/null || \ fail "small webcam starts at its final corner position" grep -F 'move = { "(monitor_w-monitor_h*2/9-40)", "(monitor_h-monitor_h/4-40)" }' "$webcam_rules" >/dev/null || \ fail "medium webcam starts at its final corner position" grep -F 'move = { "(monitor_w-monitor_h*3/10-40)", "(monitor_h-monitor_h*27/80-40)" }' "$webcam_rules" >/dev/null || \ fail "large webcam starts at its final corner position" pass "webcam size rules place the initial window in its final corner"