@@ -119,3 +119,116 @@ describe('layers', () => {
119119 expect ( point . layers . length ) . toBe ( 0 ) ;
120120 } ) ;
121121} ) ;
122+
123+ describe ( 'markers' , ( ) => {
124+ test ( 'can add a marker' , ( ) => {
125+ const { peritext, getPoint} = setupOverlayPoint ( ) ;
126+ const marker = peritext . slices . insSplit ( peritext . rangeAt ( 5 , 0 ) , '<p>' ) ;
127+ const point = getPoint ( marker . start ) ;
128+ expect ( point . markers . length ) . toBe ( 0 ) ;
129+ point . addMarker ( marker ) ;
130+ expect ( point . markers . length ) . toBe ( 1 ) ;
131+ expect ( point . markers [ 0 ] ) . toBe ( marker ) ;
132+ } ) ;
133+
134+ test ( 'inserting same marker twice is a no-op' , ( ) => {
135+ const { peritext, getPoint} = setupOverlayPoint ( ) ;
136+ const marker = peritext . slices . insSplit ( peritext . rangeAt ( 5 , 0 ) , '<p>' ) ;
137+ const point = getPoint ( marker . start ) ;
138+ expect ( point . markers . length ) . toBe ( 0 ) ;
139+ point . addMarker ( marker ) ;
140+ point . addMarker ( marker ) ;
141+ point . addMarker ( marker ) ;
142+ point . addMarker ( marker ) ;
143+ expect ( point . markers . length ) . toBe ( 1 ) ;
144+ expect ( point . markers [ 0 ] ) . toBe ( marker ) ;
145+ } ) ;
146+
147+ test ( 'can add two markers with the same start position' , ( ) => {
148+ const { peritext, getPoint} = setupOverlayPoint ( ) ;
149+ const marker1 = peritext . slices . insSplit ( peritext . rangeAt ( 5 , 0 ) , '<p>' ) ;
150+ const marker2 = peritext . slices . insSplit ( peritext . rangeAt ( 5 , 0 ) , '<p>' ) ;
151+ const point = getPoint ( marker1 . start ) ;
152+ expect ( point . markers . length ) . toBe ( 0 ) ;
153+ point . addMarker ( marker1 ) ;
154+ expect ( point . markers . length ) . toBe ( 1 ) ;
155+ point . addMarker ( marker2 ) ;
156+ point . addMarker ( marker2 ) ;
157+ expect ( point . markers . length ) . toBe ( 2 ) ;
158+ expect ( point . markers [ 0 ] ) . toBe ( marker1 ) ;
159+ expect ( point . markers [ 1 ] ) . toBe ( marker2 ) ;
160+ } ) ;
161+
162+ test ( 'orders markers by their ID' , ( ) => {
163+ const { peritext, getPoint} = setupOverlayPoint ( ) ;
164+ const marker1 = peritext . slices . insSplit ( peritext . rangeAt ( 5 , 0 ) , '<p>' ) ;
165+ const marker2 = peritext . slices . insSplit ( peritext . rangeAt ( 5 , 0 ) , '<p>' ) ;
166+ const point = getPoint ( marker1 . start ) ;
167+ point . addMarker ( marker2 ) ;
168+ point . addMarker ( marker1 ) ;
169+ point . addMarker ( marker2 ) ;
170+ point . addMarker ( marker1 ) ;
171+ point . addMarker ( marker2 ) ;
172+ point . addMarker ( marker1 ) ;
173+ expect ( point . markers [ 0 ] ) . toBe ( marker1 ) ;
174+ expect ( point . markers [ 1 ] ) . toBe ( marker2 ) ;
175+ } ) ;
176+
177+ test ( 'can add tree markers and sort them correctly' , ( ) => {
178+ const { peritext, getPoint} = setupOverlayPoint ( ) ;
179+ const marker1 = peritext . slices . insSplit ( peritext . rangeAt ( 5 , 0 ) , '<p>' ) ;
180+ const marker2 = peritext . slices . insSplit ( peritext . rangeAt ( 5 , 0 ) , '<p>' ) ;
181+ const marker3 = peritext . slices . insSplit ( peritext . rangeAt ( 5 , 0 ) , '<p>' ) ;
182+ const point = getPoint ( marker1 . start ) ;
183+ point . addMarker ( marker3 ) ;
184+ point . addMarker ( marker3 ) ;
185+ point . addMarker ( marker2 ) ;
186+ point . addMarker ( marker2 ) ;
187+ point . addMarker ( marker3 ) ;
188+ point . addMarker ( marker1 ) ;
189+ point . addMarker ( marker3 ) ;
190+ point . addMarker ( marker3 ) ;
191+ expect ( point . markers . length ) . toBe ( 3 ) ;
192+ expect ( point . markers [ 0 ] ) . toBe ( marker1 ) ;
193+ expect ( point . markers [ 1 ] ) . toBe ( marker2 ) ;
194+ expect ( point . markers [ 2 ] ) . toBe ( marker3 ) ;
195+ } ) ;
196+
197+ test ( 'can add tree markers by appending them' , ( ) => {
198+ const { peritext, getPoint} = setupOverlayPoint ( ) ;
199+ const marker1 = peritext . slices . insSplit ( peritext . rangeAt ( 6 , 0 ) , '<p>' ) ;
200+ const marker2 = peritext . slices . insSplit ( peritext . rangeAt ( 6 , 0 ) , '<p>' ) ;
201+ const marker3 = peritext . slices . insSplit ( peritext . rangeAt ( 6 , 0 ) , '<p>' ) ;
202+ const point = getPoint ( marker2 . start ) ;
203+ point . addMarker ( marker1 ) ;
204+ point . addMarker ( marker2 ) ;
205+ point . addMarker ( marker3 ) ;
206+ expect ( point . markers [ 0 ] ) . toBe ( marker1 ) ;
207+ expect ( point . markers [ 1 ] ) . toBe ( marker2 ) ;
208+ expect ( point . markers [ 2 ] ) . toBe ( marker3 ) ;
209+ } ) ;
210+
211+ test ( 'can remove markers' , ( ) => {
212+ const { peritext, getPoint} = setupOverlayPoint ( ) ;
213+ const marker1 = peritext . slices . insSplit ( peritext . rangeAt ( 6 , 0 ) , '<p>' ) ;
214+ const marker2 = peritext . slices . insSplit ( peritext . rangeAt ( 6 , 0 ) , '<p>' ) ;
215+ const marker3 = peritext . slices . insSplit ( peritext . rangeAt ( 6 , 0 ) , '<p>' ) ;
216+ const point = getPoint ( marker1 . start ) ;
217+ point . addMarker ( marker2 ) ;
218+ point . addMarker ( marker1 ) ;
219+ point . addMarker ( marker1 ) ;
220+ point . addMarker ( marker1 ) ;
221+ point . addMarker ( marker3 ) ;
222+ expect ( point . markers [ 0 ] ) . toBe ( marker1 ) ;
223+ expect ( point . markers [ 1 ] ) . toBe ( marker2 ) ;
224+ expect ( point . markers [ 2 ] ) . toBe ( marker3 ) ;
225+ point . removeMarker ( marker2 ) ;
226+ expect ( point . markers [ 0 ] ) . toBe ( marker1 ) ;
227+ expect ( point . markers [ 1 ] ) . toBe ( marker3 ) ;
228+ point . removeMarker ( marker1 ) ;
229+ expect ( point . markers [ 0 ] ) . toBe ( marker3 ) ;
230+ point . removeMarker ( marker1 ) ;
231+ point . removeMarker ( marker3 ) ;
232+ expect ( point . markers . length ) . toBe ( 0 ) ;
233+ } ) ;
234+ } ) ;
0 commit comments