public void CanRemovePointerToWithinArray() { var data = new byte[0x200]; var changeToken = new ModelDelta(); // arrange: setup data with a bunch of pointers pointing into an array of strings var model = new PokemonModel(data); model.WritePointer(changeToken, 0x00, 0x80); model.ObserveRunWritten(changeToken, new PointerRun(0x00)); model.WritePointer(changeToken, 0x08, 0x84); model.ObserveRunWritten(changeToken, new PointerRun(0x08)); model.WritePointer(changeToken, 0x10, 0x88); model.ObserveRunWritten(changeToken, new PointerRun(0x10)); model.WritePointer(changeToken, 0x18, 0x8C); model.ObserveRunWritten(changeToken, new PointerRun(0x18)); // arrange: setup the array of strings WriteStrings(data, 0x80, "cat", "bat", "hat", "sat"); var existingAnchor = model.GetNextAnchor(0x80); ArrayRun.TryParse(model, "^[name\"\"4]4", 0x80, existingAnchor.PointerSources, out var arrayRun); model.ObserveAnchorWritten(changeToken, "sample", arrayRun); // act: clear the pointer model.ClearFormat(changeToken, 0x08, 4); // assert: array doesn't have pointer anymore var array = (ArrayRun)model.GetNextAnchor(0x80); Assert.Empty(array.PointerSourcesForInnerElements[1]); }
public void FormatClearDoesNotClearAnchorIfUnnamedAnchorIsAtStartOfClear() { var buffer = new byte[0x200]; var model = new PokemonModel(buffer); var token = new ModelDelta(); model.WritePointer(token, 0, 0x10); model.ObserveRunWritten(token, new PointerRun(0)); model.ClearFormat(token, 0x10, 1); Assert.Equal(0x10, model.GetNextRun(0x10).Start); }
public void ClearingAPointerAlsoRemovesItsAnchor() { var data = new byte[0x200]; var model = new PokemonModel(data); var viewPort = new ViewPort("file.txt", model) { Width = 0x10, Height = 0x10 }; viewPort.Edit("<000100>"); model.ClearFormat(new ModelDelta(), 0x00, 4); Assert.NotInRange(model.GetNextRun(0x00).Start, 0, data.Length); }
public void WritingOverAnAnchorDeletesThatAnchor() { var buffer = new byte[0x100]; var model = new PokemonModel(buffer); var token = new ModelDelta(); model.WritePointer(token, 16, 32); model.ObserveRunWritten(token, new PointerRun(16)); model.ClearFormat(token, 30, 4); // this format clear removes the anchor that was auto-generated from the pointer. Which means the data from before must not be a pointer. model.WritePointer(token, 30, 64); model.ObserveRunWritten(token, new PointerRun(30)); Assert.Equal(30, model.GetNextRun(10).Start); // original pointer at 16 is no longer there. The new first data is the anchor at 30 Assert.Equal(32, model.ReadPointer(16)); // but the data at 16 still looks like a pointer: only the format is gone Assert.Equal(64, model.GetNextRun(34).Start); // next data is the anchor from the pointer at 30 }
public void WritingAPointerOverlappingAPointerRemovesOriginalPointer() { var buffer = new byte[0x100]; var model = new PokemonModel(buffer); var token = new ModelDelta(); model.WritePointer(token, 16, 100); model.ObserveRunWritten(token, new PointerRun(16)); Assert.Equal(16, model.GetNextRun(10).Start); Assert.Equal(16, model.GetNextRun(17).Start); Assert.Equal(16, model.GetNextRun(19).Start); Assert.Equal(100, model.GetNextRun(20).Start); // the reference at 100 has been added model.ClearFormat(token, 14, 4); model.WritePointer(token, 14, 200); model.ObserveRunWritten(token, new PointerRun(14)); Assert.Equal(14, model.GetNextRun(10).Start); Assert.Equal(14, model.GetNextRun(15).Start); Assert.Equal(14, model.GetNextRun(16).Start); Assert.Equal(14, model.GetNextRun(17).Start); Assert.Equal(200, model.GetNextRun(18).Start); // the reference at 100 has been erased, and there's a new one at 200 }
public void PointerCanPointToNameAfterThatNameGetsDeleted() { var buffer = new byte[0x100]; var model = new PokemonModel(buffer); var viewPort = new ViewPort("file.txt", model) { Width = 0x10, Height = 0x10 }; var token = new ModelDelta(); viewPort.SelectionStart = new Point(0, 1); viewPort.Edit("^bob "); viewPort.SelectionStart = new Point(0, 2); viewPort.Edit("<bob>"); viewPort.SelectionStart = new Point(0, 1); // as an alternative to being able to delete an anchor from the viewPort, // just edit the model directly and then scroll to force the viewPort to refresh model.ClearFormat(token, 0x10, 1); viewPort.ScrollValue = 1; viewPort.ScrollValue = 0; Assert.Equal("bob", ((Pointer)viewPort[0, 2].Format).DestinationName); }