@@ -483,6 +483,254 @@ describe "TextBuffer", ->
483483 expect (undoCount).toBe 12
484484 expect (buffer .getText ()).toBe ' 0\n '
485485
486+ describe " ::createMarkerSnapshot" , ->
487+ markerLayers = null
488+
489+ beforeEach ->
490+ buffer = new TextBuffer
491+
492+ markerLayers = [
493+ buffer .addMarkerLayer (maintainHistory : true , role : " selections" )
494+ buffer .addMarkerLayer (maintainHistory : true )
495+ buffer .addMarkerLayer (maintainHistory : true , role : " selections" )
496+ buffer .addMarkerLayer (maintainHistory : true )
497+ ]
498+
499+ describe " when selectionsMarkerLayer is not passed" , ->
500+ it " takes a snapshot of all markerLayers" , ->
501+ snapshot = buffer .createMarkerSnapshot ()
502+ markerLayerIdsInSnapshot = Object .keys (snapshot)
503+ expect (markerLayerIdsInSnapshot .length ).toBe (4 )
504+ expect (markerLayers[0 ].id in markerLayerIdsInSnapshot).toBe (true )
505+ expect (markerLayers[1 ].id in markerLayerIdsInSnapshot).toBe (true )
506+ expect (markerLayers[2 ].id in markerLayerIdsInSnapshot).toBe (true )
507+ expect (markerLayers[3 ].id in markerLayerIdsInSnapshot).toBe (true )
508+
509+ describe " when selectionsMarkerLayer is passed" , ->
510+ it " skips snapshotting of other 'selection' role marker layers" , ->
511+ snapshot = buffer .createMarkerSnapshot (markerLayers[0 ])
512+ markerLayerIdsInSnapshot = Object .keys (snapshot)
513+ expect (markerLayerIdsInSnapshot .length ).toBe (3 )
514+ expect (markerLayers[0 ].id in markerLayerIdsInSnapshot).toBe (true )
515+ expect (markerLayers[1 ].id in markerLayerIdsInSnapshot).toBe (true )
516+ expect (markerLayers[2 ].id in markerLayerIdsInSnapshot).toBe (false )
517+ expect (markerLayers[3 ].id in markerLayerIdsInSnapshot).toBe (true )
518+
519+ snapshot = buffer .createMarkerSnapshot (markerLayers[2 ])
520+ markerLayerIdsInSnapshot = Object .keys (snapshot)
521+ expect (markerLayerIdsInSnapshot .length ).toBe (3 )
522+ expect (markerLayers[0 ].id in markerLayerIdsInSnapshot).toBe (false )
523+ expect (markerLayers[1 ].id in markerLayerIdsInSnapshot).toBe (true )
524+ expect (markerLayers[2 ].id in markerLayerIdsInSnapshot).toBe (true )
525+ expect (markerLayers[3 ].id in markerLayerIdsInSnapshot).toBe (true )
526+
527+ describe " selective snapshotting and restoration on transact/undo/redo for selections marker layer" , ->
528+ [markerLayers , marker0 , marker1 , marker2 , textUndo , textRedo , rangesBefore , rangesAfter ] = []
529+ ensureMarkerLayer = (markerLayer , range ) ->
530+ markers = markerLayer .findMarkers ({})
531+ expect (markers .length ).toBe (1 )
532+ expect (markers[0 ].getRange ()).toEqual (range)
533+
534+ getFirstMarker = (markerLayer ) ->
535+ markerLayer .findMarkers ({})[0 ]
536+
537+ beforeEach ->
538+ buffer = new TextBuffer (text : " 00000000\n 11111111\n 22222222\n 33333333\n " )
539+
540+ markerLayers = [
541+ buffer .addMarkerLayer (maintainHistory : true , role : " selections" )
542+ buffer .addMarkerLayer (maintainHistory : true , role : " selections" )
543+ buffer .addMarkerLayer (maintainHistory : true , role : " selections" )
544+ ]
545+
546+ textUndo = " 00000000\n 11111111\n 22222222\n 33333333\n "
547+ textRedo = " 00000000\n 11111111\n 22222222\n 33333333\n 44444444\n "
548+
549+ rangesBefore = [
550+ [[0 , 1 ], [0 , 1 ]]
551+ [[0 , 2 ], [0 , 2 ]]
552+ [[0 , 3 ], [0 , 3 ]]
553+ ]
554+ rangesAfter = [
555+ [[2 , 1 ], [2 , 1 ]]
556+ [[2 , 2 ], [2 , 2 ]]
557+ [[2 , 3 ], [2 , 3 ]]
558+ ]
559+
560+ marker0 = markerLayers[0 ].markRange (rangesBefore[0 ])
561+ marker1 = markerLayers[1 ].markRange (rangesBefore[1 ])
562+ marker2 = markerLayers[2 ].markRange (rangesBefore[2 ])
563+
564+ it " restores a snapshot from other selections marker layers on undo/redo" , ->
565+ # Snapshot is taken for markerLayers[0] only, markerLayer[1] and markerLayer[2] are skipped
566+ buffer .transact {selectionsMarkerLayer : markerLayers[0 ]}, ->
567+ buffer .append (" 44444444\n " )
568+ marker0 .setRange (rangesAfter[0 ])
569+ marker1 .setRange (rangesAfter[1 ])
570+ marker2 .setRange (rangesAfter[2 ])
571+
572+ buffer .undo ({selectionsMarkerLayer : markerLayers[0 ]})
573+ expect (buffer .getText ()).toBe (textUndo)
574+
575+ ensureMarkerLayer (markerLayers[0 ], rangesBefore[0 ])
576+ ensureMarkerLayer (markerLayers[1 ], rangesAfter[1 ])
577+ ensureMarkerLayer (markerLayers[2 ], rangesAfter[2 ])
578+ expect (getFirstMarker (markerLayers[0 ])).toBe (marker0)
579+ expect (getFirstMarker (markerLayers[1 ])).toBe (marker1)
580+ expect (getFirstMarker (markerLayers[2 ])).toBe (marker2)
581+
582+ buffer .redo ({selectionsMarkerLayer : markerLayers[0 ]})
583+ expect (buffer .getText ()).toBe (textRedo)
584+
585+ ensureMarkerLayer (markerLayers[0 ], rangesAfter[0 ])
586+ ensureMarkerLayer (markerLayers[1 ], rangesAfter[1 ])
587+ ensureMarkerLayer (markerLayers[2 ], rangesAfter[2 ])
588+ expect (getFirstMarker (markerLayers[0 ])).toBe (marker0)
589+ expect (getFirstMarker (markerLayers[1 ])).toBe (marker1)
590+ expect (getFirstMarker (markerLayers[2 ])).toBe (marker2)
591+
592+ buffer .undo ({selectionsMarkerLayer : markerLayers[1 ]})
593+ expect (buffer .getText ()).toBe (textUndo)
594+
595+ ensureMarkerLayer (markerLayers[0 ], rangesAfter[0 ])
596+ ensureMarkerLayer (markerLayers[1 ], rangesBefore[0 ])
597+ ensureMarkerLayer (markerLayers[2 ], rangesAfter[2 ])
598+ expect (getFirstMarker (markerLayers[0 ])).toBe (marker0)
599+ expect (getFirstMarker (markerLayers[1 ])).not .toBe (marker1)
600+ expect (getFirstMarker (markerLayers[2 ])).toBe (marker2)
601+ expect (marker1 .isDestroyed ()).toBe (true )
602+
603+ buffer .redo ({selectionsMarkerLayer : markerLayers[2 ]})
604+ expect (buffer .getText ()).toBe (textRedo)
605+
606+ ensureMarkerLayer (markerLayers[0 ], rangesAfter[0 ])
607+ ensureMarkerLayer (markerLayers[1 ], rangesBefore[0 ])
608+ ensureMarkerLayer (markerLayers[2 ], rangesAfter[0 ])
609+ expect (getFirstMarker (markerLayers[0 ])).toBe (marker0)
610+ expect (getFirstMarker (markerLayers[1 ])).not .toBe (marker1)
611+ expect (getFirstMarker (markerLayers[2 ])).not .toBe (marker2)
612+ expect (marker1 .isDestroyed ()).toBe (true )
613+ expect (marker2 .isDestroyed ()).toBe (true )
614+
615+ buffer .undo ({selectionsMarkerLayer : markerLayers[2 ]})
616+ expect (buffer .getText ()).toBe (textUndo)
617+
618+ ensureMarkerLayer (markerLayers[0 ], rangesAfter[0 ])
619+ ensureMarkerLayer (markerLayers[1 ], rangesBefore[0 ])
620+ ensureMarkerLayer (markerLayers[2 ], rangesBefore[0 ])
621+ expect (getFirstMarker (markerLayers[0 ])).toBe (marker0)
622+ expect (getFirstMarker (markerLayers[1 ])).not .toBe (marker1)
623+ expect (getFirstMarker (markerLayers[2 ])).not .toBe (marker2)
624+ expect (marker1 .isDestroyed ()).toBe (true )
625+ expect (marker2 .isDestroyed ()).toBe (true )
626+
627+ it " can restore a snapshot taken at a destroyed selections marker layer given selectionsMarkerLayer" , ->
628+ buffer .transact {selectionsMarkerLayer : markerLayers[1 ]}, ->
629+ buffer .append (" 44444444\n " )
630+ marker0 .setRange (rangesAfter[0 ])
631+ marker1 .setRange (rangesAfter[1 ])
632+ marker2 .setRange (rangesAfter[2 ])
633+
634+ markerLayers[1 ].destroy ()
635+ expect (buffer .getMarkerLayer (markerLayers[0 ].id )).toBeTruthy ()
636+ expect (buffer .getMarkerLayer (markerLayers[1 ].id )).toBeFalsy ()
637+ expect (buffer .getMarkerLayer (markerLayers[2 ].id )).toBeTruthy ()
638+ expect (marker0 .isDestroyed ()).toBe (false )
639+ expect (marker1 .isDestroyed ()).toBe (true )
640+ expect (marker2 .isDestroyed ()).toBe (false )
641+
642+ buffer .undo ({selectionsMarkerLayer : markerLayers[0 ]})
643+ expect (buffer .getText ()).toBe (textUndo)
644+
645+ ensureMarkerLayer (markerLayers[0 ], rangesBefore[1 ])
646+ ensureMarkerLayer (markerLayers[2 ], rangesAfter[2 ])
647+ expect (marker0 .isDestroyed ()).toBe (true )
648+ expect (marker2 .isDestroyed ()).toBe (false )
649+
650+ buffer .redo ({selectionsMarkerLayer : markerLayers[0 ]})
651+ expect (buffer .getText ()).toBe (textRedo)
652+ ensureMarkerLayer (markerLayers[0 ], rangesAfter[1 ])
653+ ensureMarkerLayer (markerLayers[2 ], rangesAfter[2 ])
654+
655+ markerLayers[3 ] = markerLayers[2 ].copy ()
656+ ensureMarkerLayer (markerLayers[3 ], rangesAfter[2 ])
657+ markerLayers[0 ].destroy ()
658+ markerLayers[2 ].destroy ()
659+ expect (buffer .getMarkerLayer (markerLayers[0 ].id )).toBeFalsy ()
660+ expect (buffer .getMarkerLayer (markerLayers[1 ].id )).toBeFalsy ()
661+ expect (buffer .getMarkerLayer (markerLayers[2 ].id )).toBeFalsy ()
662+ expect (buffer .getMarkerLayer (markerLayers[3 ].id )).toBeTruthy ()
663+
664+ buffer .undo ({selectionsMarkerLayer : markerLayers[3 ]})
665+ expect (buffer .getText ()).toBe (textUndo)
666+ ensureMarkerLayer (markerLayers[3 ], rangesBefore[1 ])
667+ buffer .redo ({selectionsMarkerLayer : markerLayers[3 ]})
668+ expect (buffer .getText ()).toBe (textRedo)
669+ ensureMarkerLayer (markerLayers[3 ], rangesAfter[1 ])
670+
671+ it " falls back to normal behavior when the snaphot includes multiple layerSnapshots of selections marker layers" , ->
672+ # Transact without selectionsMarkerLayer.
673+ # Taken snapshot includes layerSnapshot of markerLayer[0], markerLayer[1] and markerLayer[2]
674+ buffer .transact ->
675+ buffer .append (" 44444444\n " )
676+ marker0 .setRange (rangesAfter[0 ])
677+ marker1 .setRange (rangesAfter[1 ])
678+ marker2 .setRange (rangesAfter[2 ])
679+
680+ buffer .undo ({selectionsMarkerLayer : markerLayers[0 ]})
681+ expect (buffer .getText ()).toBe (textUndo)
682+
683+ ensureMarkerLayer (markerLayers[0 ], rangesBefore[0 ])
684+ ensureMarkerLayer (markerLayers[1 ], rangesBefore[1 ])
685+ ensureMarkerLayer (markerLayers[2 ], rangesBefore[2 ])
686+ expect (getFirstMarker (markerLayers[0 ])).toBe (marker0)
687+ expect (getFirstMarker (markerLayers[1 ])).toBe (marker1)
688+ expect (getFirstMarker (markerLayers[2 ])).toBe (marker2)
689+
690+ buffer .redo ({selectionsMarkerLayer : markerLayers[0 ]})
691+ expect (buffer .getText ()).toBe (textRedo)
692+
693+ ensureMarkerLayer (markerLayers[0 ], rangesAfter[0 ])
694+ ensureMarkerLayer (markerLayers[1 ], rangesAfter[1 ])
695+ ensureMarkerLayer (markerLayers[2 ], rangesAfter[2 ])
696+ expect (getFirstMarker (markerLayers[0 ])).toBe (marker0)
697+ expect (getFirstMarker (markerLayers[1 ])).toBe (marker1)
698+ expect (getFirstMarker (markerLayers[2 ])).toBe (marker2)
699+
700+ describe " selections marker layer's selective snapshotting on createCheckpoint, groupChangesSinceCheckpoint" , ->
701+ it " skips snapshotting of other marker layers with the same role as the selectionsMarkerLayer" , ->
702+ eventHandler = jasmine .createSpy (' eventHandler' )
703+
704+ args = []
705+ spyOn (buffer, ' createMarkerSnapshot' ).and .callFake (arg) -> args .push (arg)
706+
707+ checkpoint1 = buffer .createCheckpoint ({selectionsMarkerLayer : markerLayers[0 ]})
708+ checkpoint2 = buffer .createCheckpoint ()
709+ checkpoint3 = buffer .createCheckpoint ({selectionsMarkerLayer : markerLayers[2 ]})
710+ checkpoint4 = buffer .createCheckpoint ({selectionsMarkerLayer : markerLayers[1 ]})
711+ expect (args).toEqual ([
712+ markerLayers[0 ],
713+ undefined ,
714+ markerLayers[2 ],
715+ markerLayers[1 ],
716+ ])
717+
718+ buffer .groupChangesSinceCheckpoint (checkpoint4, {selectionsMarkerLayer : markerLayers[0 ]})
719+ buffer .groupChangesSinceCheckpoint (checkpoint3, {selectionsMarkerLayer : markerLayers[2 ]})
720+ buffer .groupChangesSinceCheckpoint (checkpoint2)
721+ buffer .groupChangesSinceCheckpoint (checkpoint1, {selectionsMarkerLayer : markerLayers[1 ]})
722+ expect (args).toEqual ([
723+ markerLayers[0 ],
724+ undefined ,
725+ markerLayers[2 ],
726+ markerLayers[1 ],
727+
728+ markerLayers[0 ],
729+ markerLayers[2 ],
730+ undefined ,
731+ markerLayers[1 ],
732+ ])
733+
486734 describe " transactions" , ->
487735 now = null
488736
@@ -1169,6 +1417,7 @@ describe "TextBuffer", ->
11691417 bufferA .transact -> bufferA .setTextInRange ([[1 , 0 ], [1 , 5 ]], " friend" )
11701418 layerA = bufferA .addMarkerLayer (maintainHistory : true , persistent : true )
11711419 layerA .markRange ([[0 , 6 ], [0 , 8 ]], reversed : true , foo : 1 )
1420+ layerB = bufferA .addMarkerLayer (maintainHistory : true , persistent : true , role : " selections" )
11721421 marker2A = bufferA .markPosition ([2 , 2 ], bar : 2 )
11731422 bufferA .transact ->
11741423 bufferA .setTextInRange ([[1 , 0 ], [1 , 0 ]], " good " )
@@ -1188,6 +1437,10 @@ describe "TextBuffer", ->
11881437 expect (displayLayer3B .id ).toBeGreaterThan (displayLayer1A .id )
11891438 expect (displayLayer3B .id ).toBeGreaterThan (displayLayer2A .id )
11901439
1440+ expect (bufferB .getMarkerLayer (layerB .id ).getRole ()).toBe " selections"
1441+ expect (bufferB .selectionsMarkerLayerIds .has (layerB .id )).toBe true
1442+ expect (bufferB .selectionsMarkerLayerIds .size ).toBe 1
1443+
11911444 bufferA .redo ()
11921445 bufferB .redo ()
11931446 expect (bufferB .getText ()).toBe " hellooo there\n good friend\r\n how are you doing??"
0 commit comments