Accumulate sub-threshold movement so slow motion with a flat acceleration profile updates selection. Sample pointer state on row entry and carry pointer intent through subordinate menus while preserving predictable keyboard selection.
76 lines
2.6 KiB
Bash
76 lines
2.6 KiB
Bash
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
|
|
|
run_node_test <<'JS'
|
|
const fs = require('fs')
|
|
const gateQml = fs.readFileSync(path.join(root, 'shell/Ui/PointerMoveGate.qml'), 'utf8')
|
|
const uiQmldir = fs.readFileSync(path.join(root, 'shell/Ui/qmldir'), 'utf8')
|
|
|
|
assert(
|
|
/PointerMoveGate 1\.0 PointerMoveGate\.qml/.test(uiQmldir),
|
|
'pointer movement gate is exported from qs.Ui'
|
|
)
|
|
assert(
|
|
/property Item referenceItem: null/.test(gateQml),
|
|
'pointer movement gate accepts a stable reference item'
|
|
)
|
|
assert(
|
|
/property real threshold: 1/.test(gateQml),
|
|
'pointer movement gate ignores single-pixel hover jitter'
|
|
)
|
|
assert(
|
|
/function reset\(\)[\s\S]*root\.primed = false/.test(gateQml),
|
|
'pointer movement gate can be disarmed after keyboard or list changes'
|
|
)
|
|
assert(
|
|
/function reset\(\)[\s\S]*root\.initialSampleAllowed = false/.test(gateQml),
|
|
'reset keeps the initial pointer sample ignored by default'
|
|
)
|
|
assert(
|
|
/function allowInitialSample\(\)[\s\S]*root\.reset\(\)[\s\S]*root\.initialSampleAllowed = true/.test(gateQml),
|
|
'pointer-initiated transitions can opt in to the initial pointer sample'
|
|
)
|
|
assert(
|
|
/item\.mapToItem\(target, mouse\.x, mouse\.y\)/.test(gateQml),
|
|
'pointer movement gate compares movement in stable target coordinates'
|
|
)
|
|
assert(
|
|
/var didMove = !firstSample[\s\S]*Math\.abs\(point\.x - root\.lastX\) > root\.threshold[\s\S]*Math\.abs\(point\.y - root\.lastY\) > root\.threshold[\s\S]*root\.initialSampleAllowed/.test(gateQml),
|
|
'pointer movement gate reports real movement or an explicitly allowed initial sample'
|
|
)
|
|
assert(
|
|
/if \(firstSample \|\| didMove\) \{\s*root\.lastX = point\.x\s*root\.lastY = point\.y\s*\}/.test(gateQml),
|
|
'sub-threshold pointer movement accumulates from the last accepted sample'
|
|
)
|
|
assert(
|
|
/root\.primed = true\s*root\.initialSampleAllowed = false/.test(gateQml),
|
|
'the initial pointer sample exception is consumed once'
|
|
)
|
|
JS
|
|
|
|
if ! command -v quickshell >/dev/null 2>&1; then
|
|
pass "quickshell not installed; skipping pointer movement gate runtime test"
|
|
exit 0
|
|
fi
|
|
|
|
test_tmp=$(mktemp -d)
|
|
trap 'rm -rf "$test_tmp"' EXIT
|
|
|
|
cp "$SHELL_TEST_DIR/fixtures/pointer-move-gate/shell.qml" "$test_tmp/shell.qml"
|
|
ln -s "$ROOT/shell/Ui" "$test_tmp/Ui"
|
|
|
|
output=$(timeout 15 quickshell -p "$test_tmp" --no-color 2>&1) || {
|
|
printf '%s\n' "$output" >&2
|
|
fail "pointer movement gate runtime fixture exits cleanly"
|
|
}
|
|
|
|
if ! grep -q "RESULT pass" <<<"$output"; then
|
|
printf '%s\n' "$output" >&2
|
|
fail "pointer movement gate runtime behavior is correct"
|
|
fi
|
|
|
|
pass "pointer movement gate runtime behavior is correct"
|