1import { describe, expect, it, vi } from "vite-plus/test";
2
3import { createSwipeRowActivation } from "./swipe-row-activation";
4
5describe("createSwipeRowActivation", () => {
6 it("activates exactly the requested rows and notifies only on change", () => {
7 const activation = createSwipeRowActivation();
8 const listener = vi.fn();
9 activation.subscribe(listener);
10
11 activation.activate(["a", "b"]);
12 activation.activate(["b", "a"]);
13
14 expect(activation.isActive("a")).toBe(true);
15 expect(activation.isActive("c")).toBe(false);
16 expect(listener).toHaveBeenCalledTimes(1);
17
18 activation.activate(["c"]);
19 expect(activation.isActive("a")).toBe(false);
20 expect(activation.isActive("c")).toBe(true);
21 expect(listener).toHaveBeenCalledTimes(2);
22 });
23
24 it("defers changes while a finger is on the list so a press is never remounted", () => {
25 const activation = createSwipeRowActivation();
26 activation.activate(["a"]);
27
28 activation.trackTouches(["1"], ["1"]);
29 activation.activate(["b"]);
30 activation.activate(["c"]);
31 expect(activation.isActive("a")).toBe(true);
32 expect(activation.isActive("c")).toBe(false);
33
34 activation.trackTouches([], []);
35 expect(activation.isActive("a")).toBe(false);
36 expect(activation.isActive("b")).toBe(false);
37 expect(activation.isActive("c")).toBe(true);
38 });
39
40 it("ignores fingers that did not start on the list", () => {
41 const activation = createSwipeRowActivation();
42 activation.trackTouches(["1"], ["1", "2"]);
43 activation.activate(["a"]);
44
45 // The list finger lifts while finger 2 stays on another control.
46 activation.trackTouches([], ["2"]);
47 expect(activation.isActive("a")).toBe(true);
48 });
49
50 it("drops a list finger whose end event never arrived", () => {
51 const activation = createSwipeRowActivation();
52 activation.trackTouches(["1"], ["1"]);
53 activation.activate(["a"]);
54
55 activation.trackTouches(["2"], ["2"]);
56 activation.trackTouches([], []);
57 expect(activation.isActive("a")).toBe(true);
58 });
59
60 it("stops notifying after unsubscribe", () => {
61 const activation = createSwipeRowActivation();
62 const listener = vi.fn();
63 const unsubscribe = activation.subscribe(listener);
64 unsubscribe();
65 activation.activate(["a"]);
66 expect(listener).not.toHaveBeenCalled();
67 });
68});