11import { describe , it , expect } from "vitest" ;
2- import { createRoot , createSignal } from "solid-js" ;
2+ import { createRoot , createSignal , batch , type Accessor } from "solid-js" ;
33import { createReorderHighlight } from "../../src/app/lib/reorderHighlight" ;
44
55describe ( "createReorderHighlight" , ( ) => {
66 it ( "returns an accessor that starts as empty set" , ( ) => {
77 createRoot ( ( dispose ) => {
88 const [ order ] = createSignal < string [ ] > ( [ "a" , "b" ] ) ;
99 const [ locked ] = createSignal < string [ ] > ( [ ] ) ;
10- const highlighted = createReorderHighlight ( order , locked ) ;
10+ const [ ignored ] = createSignal ( 0 ) ;
11+ const highlighted = createReorderHighlight ( order , locked , ignored ) ;
1112
1213 expect ( highlighted ( ) ) . toBeInstanceOf ( Set ) ;
1314 expect ( highlighted ( ) . size ) . toBe ( 0 ) ;
@@ -20,12 +21,136 @@ describe("createReorderHighlight", () => {
2021 createRoot ( ( dispose ) => {
2122 const [ order ] = createSignal < string [ ] > ( [ "a" , "b" , "c" ] ) ;
2223 const [ locked ] = createSignal < string [ ] > ( [ ] ) ;
23- const highlighted = createReorderHighlight ( order , locked ) ;
24+ const [ ignored ] = createSignal ( 0 ) ;
25+ const highlighted = createReorderHighlight ( order , locked , ignored ) ;
2426
2527 // First render seeds prevOrder — no detection
2628 expect ( highlighted ( ) . size ) . toBe ( 0 ) ;
2729 dispose ( ) ;
2830 } ) ;
2931 } ) ;
3032
33+ it ( "highlights reordered repos when ignored count is unchanged" , ( ) => {
34+ let highlighted ! : Accessor < ReadonlySet < string > > ;
35+ let setOrder ! : ( v : string [ ] ) => void ;
36+ let disposeRoot ! : ( ) => void ;
37+
38+ createRoot ( ( dispose ) => {
39+ const [ order , _setOrder ] = createSignal < string [ ] > ( [ "a" , "b" , "c" ] ) ;
40+ const [ locked ] = createSignal < string [ ] > ( [ ] ) ;
41+ const [ ignored ] = createSignal ( 0 ) ;
42+ setOrder = _setOrder ;
43+ highlighted = createReorderHighlight ( order , locked , ignored ) ;
44+ disposeRoot = dispose ;
45+ } ) ;
46+
47+ // Seed complete — reorder outside batch to trigger effect synchronously
48+ setOrder ( [ "c" , "a" , "b" ] ) ;
49+ expect ( highlighted ( ) . size ) . toBeGreaterThan ( 0 ) ;
50+
51+ disposeRoot ( ) ;
52+ } ) ;
53+
54+ it ( "suppresses highlight when ignored count changes simultaneously with reorder" , ( ) => {
55+ let highlighted ! : Accessor < ReadonlySet < string > > ;
56+ let setOrder ! : ( v : string [ ] ) => void ;
57+ let setIgnored ! : ( v : number ) => void ;
58+ let disposeRoot ! : ( ) => void ;
59+
60+ createRoot ( ( dispose ) => {
61+ const [ order , _setOrder ] = createSignal < string [ ] > ( [ "a" , "b" , "c" ] ) ;
62+ const [ locked ] = createSignal < string [ ] > ( [ ] ) ;
63+ const [ ignored , _setIgnored ] = createSignal ( 0 ) ;
64+ setOrder = _setOrder ;
65+ setIgnored = _setIgnored ;
66+ highlighted = createReorderHighlight ( order , locked , ignored ) ;
67+ disposeRoot = dispose ;
68+ } ) ;
69+
70+ // Reorder AND increment ignored count in single batch — should suppress
71+ batch ( ( ) => {
72+ setIgnored ( 1 ) ;
73+ setOrder ( [ "c" , "a" , "b" ] ) ;
74+ } ) ;
75+ expect ( highlighted ( ) . size ) . toBe ( 0 ) ;
76+
77+ disposeRoot ( ) ;
78+ } ) ;
79+
80+ it ( "resumes highlighting after an ignored-count-change cycle" , ( ) => {
81+ let highlighted ! : Accessor < ReadonlySet < string > > ;
82+ let setOrder ! : ( v : string [ ] ) => void ;
83+ let setIgnored ! : ( v : number ) => void ;
84+ let disposeRoot ! : ( ) => void ;
85+
86+ createRoot ( ( dispose ) => {
87+ const [ order , _setOrder ] = createSignal < string [ ] > ( [ "a" , "b" , "c" ] ) ;
88+ const [ locked ] = createSignal < string [ ] > ( [ ] ) ;
89+ const [ ignored , _setIgnored ] = createSignal ( 0 ) ;
90+ setOrder = _setOrder ;
91+ setIgnored = _setIgnored ;
92+ highlighted = createReorderHighlight ( order , locked , ignored ) ;
93+ disposeRoot = dispose ;
94+ } ) ;
95+
96+ // Suppress via batched ignored count change + reorder
97+ batch ( ( ) => {
98+ setIgnored ( 1 ) ;
99+ setOrder ( [ "c" , "a" , "b" ] ) ;
100+ } ) ;
101+ expect ( highlighted ( ) . size ) . toBe ( 0 ) ;
102+
103+ // Next reorder without ignore change — should highlight again
104+ setOrder ( [ "b" , "c" , "a" ] ) ;
105+ expect ( highlighted ( ) . size ) . toBeGreaterThan ( 0 ) ;
106+
107+ disposeRoot ( ) ;
108+ } ) ;
109+
110+ it ( "seeds prevIgnoredCount correctly with non-zero initial value" , ( ) => {
111+ let highlighted ! : Accessor < ReadonlySet < string > > ;
112+ let setOrder ! : ( v : string [ ] ) => void ;
113+ let disposeRoot ! : ( ) => void ;
114+
115+ createRoot ( ( dispose ) => {
116+ const [ order , _setOrder ] = createSignal < string [ ] > ( [ "a" , "b" , "c" ] ) ;
117+ const [ locked ] = createSignal < string [ ] > ( [ ] ) ;
118+ const [ ignored ] = createSignal ( 3 ) ;
119+ setOrder = _setOrder ;
120+ highlighted = createReorderHighlight ( order , locked , ignored ) ;
121+ disposeRoot = dispose ;
122+ } ) ;
123+
124+ // Reorder without changing ignored count (still 3) — should highlight
125+ setOrder ( [ "c" , "a" , "b" ] ) ;
126+ expect ( highlighted ( ) . size ) . toBeGreaterThan ( 0 ) ;
127+
128+ disposeRoot ( ) ;
129+ } ) ;
130+
131+ it ( "suppresses highlight when ignored count decrements (un-ignore)" , ( ) => {
132+ let highlighted ! : Accessor < ReadonlySet < string > > ;
133+ let setOrder ! : ( v : string [ ] ) => void ;
134+ let setIgnored ! : ( v : number ) => void ;
135+ let disposeRoot ! : ( ) => void ;
136+
137+ createRoot ( ( dispose ) => {
138+ const [ order , _setOrder ] = createSignal < string [ ] > ( [ "a" , "b" , "c" ] ) ;
139+ const [ locked ] = createSignal < string [ ] > ( [ ] ) ;
140+ const [ ignored , _setIgnored ] = createSignal ( 2 ) ;
141+ setOrder = _setOrder ;
142+ setIgnored = _setIgnored ;
143+ highlighted = createReorderHighlight ( order , locked , ignored ) ;
144+ disposeRoot = dispose ;
145+ } ) ;
146+
147+ // Reorder AND decrement ignored count in single batch — should suppress
148+ batch ( ( ) => {
149+ setIgnored ( 1 ) ;
150+ setOrder ( [ "c" , "a" , "b" ] ) ;
151+ } ) ;
152+ expect ( highlighted ( ) . size ) . toBe ( 0 ) ;
153+
154+ disposeRoot ( ) ;
155+ } ) ;
31156} ) ;
0 commit comments