@@ -43,7 +43,7 @@ describe('Overlay.refresh()', () => {
4343 } ) ;
4444 } ;
4545
46- describe ( 'slices' , ( ) => {
46+ describe ( 'saved slices' , ( ) => {
4747 describe ( 'updates hash' , ( ) => {
4848 testRefresh ( 'when a slice is inserted' , ( kit , refresh ) => {
4949 kit . peritext . editor . cursor . setAt ( 1 , 4 ) ;
@@ -141,6 +141,104 @@ describe('Overlay.refresh()', () => {
141141 } ) ;
142142 } ) ;
143143
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+
144242 describe ( 'cursor' , ( ) => {
145243 describe ( 'updates hash' , ( ) => {
146244 testRefresh ( 'when cursor char ID changes' , ( kit , refresh ) => {
@@ -166,6 +264,15 @@ describe('Overlay.refresh()', () => {
166264 end . anchor = Anchor . Before ;
167265 kit . peritext . editor . cursor . setRange ( kit . peritext . range ( kit . peritext . editor . cursor . start , end ) ) ;
168266 } ) ;
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+ } ) ;
169276 } ) ;
170277 } ) ;
171278} ) ;
0 commit comments