update
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
# Echte Eingaben in der headless Test-Shell (virtuelle Geräte, nur dort gefahrlos):
|
||||
# dev/input.sh click X Y Linksklick
|
||||
# dev/input.sh rclick X Y Rechtsklick
|
||||
# dev/input.sh mclick X Y Klick mit der mittleren Taste
|
||||
# dev/input.sh drag X1 Y1 X2 Y2 Linke Taste drücken, ziehen, loslassen
|
||||
# dev/input.sh move X Y Zeiger bewegen
|
||||
# dev/input.sh press X Y Linke Taste drücken (halten)
|
||||
@@ -21,6 +22,7 @@ const key = (k, s) => globalThis._vk.notify_keyval(t(), k, s ? Clutter.KeyState.
|
||||
case "$1" in
|
||||
click) CODE="move($2, $3); button(Clutter.BUTTON_PRIMARY, 1); button(Clutter.BUTTON_PRIMARY, 0);" ;;
|
||||
rclick) CODE="move($2, $3); button(Clutter.BUTTON_SECONDARY, 1); button(Clutter.BUTTON_SECONDARY, 0);" ;;
|
||||
mclick) CODE="move($2, $3); button(Clutter.BUTTON_MIDDLE, 1); button(Clutter.BUTTON_MIDDLE, 0);" ;;
|
||||
drag) "$0" press "$2" "$3"; sleep 0.15
|
||||
for i in 1 2 3 4; do "$0" move $(( $2 + ($4 - $2) * i / 4 )) $(( $3 + ($5 - $3) * i / 4 )); sleep 0.1; done
|
||||
"$0" release; exit ;;
|
||||
|
||||
@@ -36,6 +36,9 @@ xy() {
|
||||
}
|
||||
click() { $IN click $(xy "$1"); sleep 0.3; }
|
||||
rclick() { $IN rclick $(xy "$1"); sleep 0.3; }
|
||||
mclick() { $IN mclick $(xy "$1"); sleep 0.3; }
|
||||
# Popover liegt am Mauszeiger: rechts daneben auf Zeigerhöhe (oder links, wenn rechts kein Platz ist)
|
||||
atpointer() { val '(p => { const [px, py] = global.get_pointer(); const dx = p.x - px; return (dx > 0 && dx < 12 || p.x + p.width < px && px - (p.x + p.width) < 12) && Math.abs(p.y - py) < 12; })(grabbed())'; }
|
||||
rclickb() { $IN rclick $(val "bottom($1).join(' ')"); sleep 0.3; }
|
||||
type_() { $IN type "$1"; sleep 0.2; }
|
||||
key() { $IN key "$1"; sleep 0.3; }
|
||||
@@ -83,6 +86,7 @@ shot "02-week"
|
||||
echo "=== Woche: Termin bearbeiten, Escape, Löschen per Rechtsklick"
|
||||
click 'cal._blocks.find(b => b.event.title === "Sport").block'
|
||||
check "Bearbeiten-Popover zeigt Titel" "$(val 'entries(grabbed())[0]')" "Sport"
|
||||
check "Popover am Mauszeiger (Woche)" "$(atpointer)" "true"
|
||||
key Escape
|
||||
check "Escape schließt" "$(val 'grabbed() ? "grab" : "frei"')" "frei"
|
||||
rclick 'cal._blocks.find(b => b.event.title === "Sport").block'
|
||||
@@ -123,7 +127,12 @@ check "Todo gespeichert" "$(val 'JSON.stringify((({title, date, time, done}) =>
|
||||
'{"title":"Milch kaufen","date":"2026-09-20","time":"09:30","done":false}'
|
||||
click 'find(todos, "Milch kaufen")'
|
||||
check "Todo bearbeiten zeigt Text" "$(val 'entries(grabbed())[0]')" "Milch kaufen"
|
||||
check "Popover am Mauszeiger (Todo)" "$(atpointer)" "true"
|
||||
key Escape
|
||||
mclick 'find(todos, "Milch kaufen")'
|
||||
check "Mittlere Taste hakt ab" "$(val 'store.todos.find(t => t.title === "Milch kaufen").done + " " + (grabbed() ? "grab" : "frei")')" "true frei"
|
||||
mclick 'find(todos, "Milch kaufen")'
|
||||
check "Mittlere Taste hakt wieder ab" "$(val 'store.todos.find(t => t.title === "Milch kaufen").done')" "false"
|
||||
rclick 'find(todos, "Milch kaufen")'
|
||||
click 'find(grabbed(), "Löschen")'
|
||||
check "Todo gelöscht (Tombstone bleibt)" "$(val 'store.todos.filter(t => t.title === "Milch kaufen").map(t => t.deleted).join(",") + " " + store.sortedTodos().filter(t => t.title === "Milch kaufen").length')" "true 0"
|
||||
@@ -156,25 +165,32 @@ check "Klick in die Fläche startet den Editor" "$(val '[notes._editing, global.
|
||||
type_ " mehr"
|
||||
click 'find(notes, "Allgemein")'
|
||||
check "Wechsel speichert sofort" "$(val 'read(store.notesDir + "/Testnotiz.md").endsWith("**Notiz** mehr") + " " + notes._selected.name')" "true Allgemein"
|
||||
mclick 'find(notes, "Testnotiz")'
|
||||
check "Mittlere Taste öffnet Umbenennen am Zeiger" "$(val 'labels(grabbed())[0] + " " + entries(grabbed())[0]')" "Umbenennen Testnotiz"
|
||||
check "Popover am Mauszeiger (Notiz)" "$(atpointer)" "true"
|
||||
key Escape
|
||||
mclick 'find(notes, "Projekte")'
|
||||
check "Mittlere Taste auf Ordner öffnet Umbenennen" "$(val 'labels(grabbed())[0] + " " + entries(grabbed())[0]')" "Umbenennen Projekte"
|
||||
key Escape
|
||||
rclick 'find(notes, "Testnotiz")'
|
||||
check "Kontextmenü Notiz" "$(val 'labels(grabbed()).join("|")')" "Umbenennen|Löschen"
|
||||
click 'find(grabbed(), "Umbenennen")'
|
||||
type_ "Umbenannt"; key Return
|
||||
check "Notiz umbenannt" "$(val '[GLib.file_test(store.notesDir + "/Testnotiz.md", GLib.FileTest.EXISTS), GLib.file_test(store.notesDir + "/Umbenannt.md", GLib.FileTest.EXISTS)].join(" ")')" "false true"
|
||||
rclick 'find(notes, "▸ Projekte")'
|
||||
rclick 'find(notes, "Projekte")'
|
||||
check "Voller Ordner nicht löschbar" "$(val '(b => b ? String(b.reactive) : "fehlt")(find(grabbed(), "Löschen (Ordner ist nicht leer)"))')" "false"
|
||||
key Escape
|
||||
rclickb 'notes.get_child_at_index(0)'
|
||||
click 'find(grabbed(), "Ordner erstellen")'
|
||||
type_ "Leer"; key Return
|
||||
check "Ordner angelegt und gewählt" "$(val '[GLib.file_test(store.notesDir + "/Leer", GLib.FileTest.IS_DIR), notes._selected?.name].join(" ")')" "true Leer"
|
||||
rclick 'find(notes, "▾ Leer")'
|
||||
rclick 'find(notes, "Leer")'
|
||||
click 'find(grabbed(), "Löschen")'
|
||||
check "Leerer Ordner gelöscht" "$(val 'GLib.file_test(store.notesDir + "/Leer", GLib.FileTest.EXISTS)')" "false"
|
||||
rclick 'find(notes, "Umbenannt")'
|
||||
click 'find(grabbed(), "Löschen")'
|
||||
check "Notiz gelöscht" "$(val '[GLib.file_test(store.notesDir + "/Umbenannt.md", GLib.FileTest.EXISTS), JSON.stringify(notes._noteTitle.text)].join(" ")')" 'false ""'
|
||||
check "Trennlinie zwischen Ordnern und Notizen" "$(val 'notes._tree.get_children().map(c => c.style_class).join("|")')" "tree-row folder|tree-row folder|tree-separator|tree-row note"
|
||||
check "Baum ohne Pfeile und Trennlinie" "$(val 'notes._tree.get_children().map(c => c.style_class + ":" + (c.label_actor?.text ?? "")).join("|")')" "tree-row folder:Privat|tree-row folder:Projekte|tree-row note:Allgemein"
|
||||
|
||||
rclickb 'notes.get_child_at_index(0)'
|
||||
check "Rechtsklick Notiz-Fläche" "$(val 'labels(grabbed()).join("|")')" "Notiz erstellen|Ordner erstellen"
|
||||
@@ -185,16 +201,16 @@ click 'cal._viewButtons.month'
|
||||
rclickb 'notes'
|
||||
check "Rechtsklick im Inhaltsbereich" "$(val 'labels(grabbed()).join("|")')" "Notiz erstellen|Ordner erstellen"
|
||||
key Escape
|
||||
rclick 'find(notes, "▸ Privat")'
|
||||
rclick 'find(notes, "Privat")'
|
||||
check "Ordnermenü" "$(val 'labels(grabbed()).join("|")')" "Notiz erstellen|Ordner erstellen|Umbenennen|Löschen (Ordner ist nicht leer)"
|
||||
click 'find(grabbed(), "Ordner erstellen")'
|
||||
type_ "Sub"; key Return
|
||||
check "Unterordner im Ordner" "$(val '[GLib.file_test(store.notesDir + "/Privat/Sub", GLib.FileTest.IS_DIR), notes._selected?.name].join(" ")')" "true Sub"
|
||||
rclick 'find(notes, "▾ Privat")'
|
||||
rclick 'find(notes, "Privat")'
|
||||
click 'find(grabbed(), "Notiz erstellen")'
|
||||
type_ "InPrivat"; key Return
|
||||
check "Notiz im Ordner" "$(val 'GLib.file_test(store.notesDir + "/Privat/InPrivat.md", GLib.FileTest.EXISTS)')" "true"
|
||||
click 'find(notes, "▾ Privat")'
|
||||
click 'find(notes, "Privat")'
|
||||
check "Ordner gewählt zeigt nichts" "$(val '[notes._selected.type, JSON.stringify(notes._noteTitle.text), JSON.stringify(notes._content.text)].join(" ")')" 'folder "" ""'
|
||||
|
||||
echo "=== Woche: Rechtsklick, Termin ohne Ende, mehrtägig"
|
||||
@@ -247,6 +263,7 @@ key Escape
|
||||
click 'cal._viewButtons.month'
|
||||
click 'cal._body.get_child().get_child_at_index(1).get_child_at_index(17).get_child().get_child_at_index(2)'
|
||||
check "Monatseintrag öffnet Popover" "$(val 'entries(grabbed())[0]')" "Zahnarzt"
|
||||
check "Popover am Mauszeiger (Monat)" "$(atpointer)" "true"
|
||||
key Escape
|
||||
click 'cal._body.get_child().get_child_at_index(1).get_child_at_index(17).get_child().get_child_at_index(0)'
|
||||
check "Tagesansicht" "$(val 'cal._view + " " + cal._cursor')" "day 2026-09-17"
|
||||
|
||||
@@ -87,7 +87,7 @@ check "Nach 5 min Ruhe Takt 10 s" "$(val 'ext._sync.interval')" "10"
|
||||
sleep 2
|
||||
check "Todo vom Server im Panel" "$(val 'labels(todos).includes("Vom Handy")')" "true"
|
||||
check "Notiz vom Server als Datei" "$(val 'exists(store.notesDir + "/Remote/Idee.md") + " " + JSON.stringify(read(store.notesDir + "/Remote/Idee.md"))')" 'true "# Vom Server"'
|
||||
check "Notiz vom Server im Baum" "$(val 'labels(notes).includes("▸ Remote")')" "true"
|
||||
check "Notiz vom Server im Baum" "$(val 'labels(notes).includes("Remote")')" "true"
|
||||
check "Übernommene Notiz wird nicht zurückgeschickt" "$(val 'state().pushed.notes["Remote/Idee.md"]')" "2026-09-19T10:00:00.000Z"
|
||||
|
||||
echo "=== Konflikt: neuester gewinnt"
|
||||
@@ -142,7 +142,7 @@ sleep 3
|
||||
check "Leere Ordner auf dem Server" "$(folders)" "[('Leer', False), ('Leer/Tief', False), ('Remote', False)]"
|
||||
push '{"folders": [{"id": "Vom Server/Sub", "updated": "'$(now)'", "deleted": false}]}'
|
||||
sleep 3
|
||||
check "Ordner vom Server angelegt" "$(val 'GLib.file_test(store.notesDir + "/Vom Server/Sub", GLib.FileTest.IS_DIR) + " " + labels(notes).includes("▸ Vom Server")')" "true true"
|
||||
check "Ordner vom Server angelegt" "$(val 'GLib.file_test(store.notesDir + "/Vom Server/Sub", GLib.FileTest.IS_DIR) + " " + labels(notes).includes("Vom Server")')" "true true"
|
||||
"$E" "$PRE store.renameFolder(store.notesDir + '/Leer', 'Voll'); 'ok'" >/dev/null
|
||||
sleep 3
|
||||
check "Ordner umbenannt auf dem Server" "$(folders)" "[('Leer', True), ('Leer/Tief', True), ('Remote', False), ('Voll', False), ('Voll/Tief', False), ('Vom Server', False), ('Vom Server/Sub', False)]"
|
||||
|
||||
Reference in New Issue
Block a user