@@ -43,7 +43,7 @@ describe('Overlay.refresh()', () => {
43
43
} ) ;
44
44
} ;
45
45
46
- describe ( 'slices' , ( ) => {
46
+ describe ( 'saved slices' , ( ) => {
47
47
describe ( 'updates hash' , ( ) => {
48
48
testRefresh ( 'when a slice is inserted' , ( kit , refresh ) => {
49
49
kit . peritext . editor . cursor . setAt ( 1 , 4 ) ;
@@ -141,6 +141,104 @@ describe('Overlay.refresh()', () => {
141
141
} ) ;
142
142
} ) ;
143
143
144
+ describe ( 'extra slices' , ( ) => {
145
+ describe ( 'updates hash' , ( ) => {
146
+ testRefresh ( 'when a slice is inserted' , ( kit , refresh ) => {
147
+ const range = kit . peritext . rangeAt ( 1 , 4 ) ;
148
+ refresh ( ) ;
149
+ kit . peritext . extraSlices . insOverwrite ( range , 'bold' ) ;
150
+ } ) ;
151
+
152
+ testRefresh ( 'when a collapsed slice is inserted' , ( kit , refresh ) => {
153
+ const range = kit . peritext . rangeAt ( 5 ) ;
154
+ refresh ( ) ;
155
+ kit . peritext . extraSlices . insStack ( range , '<flag>' ) ;
156
+ } ) ;
157
+
158
+ testRefresh ( 'when a marker is inserted' , ( kit , refresh ) => {
159
+ const range = kit . peritext . rangeAt ( 0 ) ;
160
+ refresh ( ) ;
161
+ kit . peritext . extraSlices . insMarker ( range , '<paragraph>' ) ;
162
+ } ) ;
163
+
164
+ testRefresh ( 'when a marker is inserted at the same position' , ( kit , refresh ) => {
165
+ const range = kit . peritext . rangeAt ( 0 ) ;
166
+ kit . peritext . extraSlices . insMarker ( range , '<paragraph>' ) ;
167
+ refresh ( ) ;
168
+ kit . peritext . extraSlices . insMarker ( range , '<paragraph>' ) ;
169
+ } ) ;
170
+
171
+ testRefresh ( 'when slice is deleted' , ( kit , refresh ) => {
172
+ const range = kit . peritext . rangeAt ( 0 , 1 ) ;
173
+ const slice = kit . peritext . extraSlices . insMarker ( range , '<b>' ) ;
174
+ refresh ( ) ;
175
+ kit . peritext . extraSlices . del ( slice . id ) ;
176
+ } ) ;
177
+
178
+ testRefresh ( 'when slice type is changed' , ( kit , refresh ) => {
179
+ const range = kit . peritext . rangeAt ( 0 , 1 ) ;
180
+ const slice = kit . peritext . extraSlices . insStack ( range , '<b>' ) ;
181
+ refresh ( ) ;
182
+ slice . update ( { type : '<i>' } ) ;
183
+ } ) ;
184
+
185
+ testRefresh ( 'when slice behavior is changed' , ( kit , refresh ) => {
186
+ const range = kit . peritext . rangeAt ( 2 , 7 ) ;
187
+ const slice = kit . peritext . extraSlices . insStack ( range , 123 ) ;
188
+ refresh ( ) ;
189
+ slice . update ( { behavior : SliceBehavior . Erase } ) ;
190
+ } ) ;
191
+
192
+ testRefresh ( 'when slice data is overwritten' , ( kit , refresh ) => {
193
+ const range = kit . peritext . rangeAt ( 2 , 7 ) ;
194
+ const slice = kit . peritext . extraSlices . insStack ( range , 123 , 'a' ) ;
195
+ refresh ( ) ;
196
+ slice . update ( { data : 'b' } ) ;
197
+ } ) ;
198
+
199
+ testRefresh ( 'when slice data is updated inline' , ( kit , refresh ) => {
200
+ const range = kit . peritext . rangeAt ( 1 , 1 ) ;
201
+ const slice = kit . peritext . extraSlices . insStack ( range , 123 , { foo : 'bar' } ) ;
202
+ refresh ( ) ;
203
+ const api = slice . dataNode ( ) ! as ObjApi ;
204
+ api . set ( { foo : 'baz' } ) ;
205
+ } ) ;
206
+
207
+ testRefresh ( 'when slice start point anchor is changed' , ( kit , refresh ) => {
208
+ const range = kit . peritext . rangeAt ( 0 , 1 ) ;
209
+ const slice = kit . peritext . extraSlices . insStack ( range , 123 , 456 ) ;
210
+ expect ( slice . start . anchor ) . toBe ( Anchor . Before ) ;
211
+ refresh ( ) ;
212
+ const range2 = slice . range ( ) ;
213
+ range2 . start . anchor = Anchor . After ;
214
+ slice . update ( { range : range2 } ) ;
215
+ } ) ;
216
+
217
+ testRefresh ( 'when slice end point anchor is changed' , ( kit , refresh ) => {
218
+ const range = kit . peritext . rangeAt ( 3 , 3 ) ;
219
+ const slice = kit . peritext . extraSlices . insStack ( range , 0 , 0 ) ;
220
+ expect ( slice . end . anchor ) . toBe ( Anchor . After ) ;
221
+ refresh ( ) ;
222
+ const range2 = slice . range ( ) ;
223
+ range2 . end . anchor = Anchor . Before ;
224
+ slice . update ( { range : range2 } ) ;
225
+ } ) ;
226
+
227
+ testRefresh ( 'when slice range changes' , ( kit , refresh ) => {
228
+ const range = kit . peritext . rangeAt ( 3 , 3 ) ;
229
+ kit . peritext . extraSlices . insStack ( range , 0 , 0 ) ;
230
+ kit . peritext . extraSlices . insStack ( range , 1 , 1 ) ;
231
+ kit . peritext . extraSlices . insStack ( range , 3 , 3 ) ;
232
+ const range1 = kit . peritext . rangeAt ( 1 , 2 ) ;
233
+ const slice = kit . peritext . extraSlices . insErase ( range1 , 'gg' ) ;
234
+ expect ( slice . end . anchor ) . toBe ( Anchor . After ) ;
235
+ refresh ( ) ;
236
+ const range2 = kit . peritext . rangeAt ( 2 , 2 ) ;
237
+ slice . update ( { range : range2 } ) ;
238
+ } ) ;
239
+ } ) ;
240
+ } ) ;
241
+
144
242
describe ( 'cursor' , ( ) => {
145
243
describe ( 'updates hash' , ( ) => {
146
244
testRefresh ( 'when cursor char ID changes' , ( kit , refresh ) => {
@@ -166,6 +264,15 @@ describe('Overlay.refresh()', () => {
166
264
end . anchor = Anchor . Before ;
167
265
kit . peritext . editor . cursor . setRange ( kit . peritext . range ( kit . peritext . editor . cursor . start , end ) ) ;
168
266
} ) ;
267
+
268
+ testRefresh ( 'when cursor data changes' , ( kit , refresh ) => {
269
+ kit . peritext . editor . cursor . setAt ( 3 , 3 ) ;
270
+ const slice = kit . peritext . editor . cursor ;
271
+ slice . update ( { data : { a : 'b' } } ) ;
272
+ refresh ( ) ;
273
+ const api = slice . dataNode ( ) ! as ObjApi ;
274
+ api . set ( { a : 'c' } ) ;
275
+ } ) ;
169
276
} ) ;
170
277
} ) ;
171
278
} ) ;
0 commit comments