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 ViewPortWarnsIfLoadedMatchedWordValueDoesNotMatch() { // Arrange var data = new byte[0x200]; var model = new PokemonModel(data); var change = new ModelDelta(); ArrayRun.TryParse(model, "[a:]8", 0x10, null, out var table); model.ObserveAnchorWritten(change, "table", table); change.AddMatchedWord(model, 0, "table"); model.ObserveRunWritten(change, new WordRun(0, "table")); fileSystem.MetadataFor = name => model.ExportMetadata().Serialize(); fileSystem.OpenFile = (name, extensions) => new LoadedFile(name, data); var editor = new EditorViewModel(fileSystem); // change the data so that the viewPort will notice something weird change.ChangeData(model, 0, 4); // Act editor.Open.Execute("text.gba"); // Assert Assert.True(editor.ShowMessage); }
public void CanEditAsciiRun() { var buffer = new byte[0x200]; var model = new PokemonModel(buffer); model[0x10] = (byte)'a'; model[0x11] = (byte)'b'; model[0x12] = (byte)'c'; model[0x13] = (byte)'d'; model.ObserveRunWritten(new ModelDelta(), new AsciiRun(0x10, 4)); var viewPort = new ViewPort("file.txt", model) { Width = 0x10, Height = 0x10 }; viewPort.SelectionStart = new Point(1, 1); viewPort.Edit("3"); var format = (Ascii)viewPort[1, 1].Format; Assert.Equal('3', format.ThisCharacter); Assert.Equal(new Point(2, 1), viewPort.SelectionStart); }
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 GivenTwoPointersCanRemoveAndUndoTheFirstWithoutEffectingTheSecond() { var data = new byte[0x200]; var model = new PokemonModel(data); model.WritePointer(new ModelDelta(), 0x010, 0x100); model.ObserveRunWritten(new ModelDelta(), new PointerRun(0x010)); model.WritePointer(new ModelDelta(), 0x014, 0x120); model.ObserveRunWritten(new ModelDelta(), new PointerRun(0x014)); var viewPort = new ViewPort("file.txt", model) { Width = 0x8, Height = 0x8 }; viewPort.SelectionStart = new Point(0, 2); // 0x010 viewPort.Edit("00"); // this should remove the first pointer viewPort.Undo.Execute(); Assert.Equal(0x014, model.GetNextRun(0x014).Start); }
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 CanWriteNullPointer() { var buffer = new byte[0x200]; var model = new PokemonModel(buffer); var token = new ModelDelta(); model.ObserveRunWritten(token, new PointerRun(0x10)); var format = (Pointer)model.GetNextRun(0x10).CreateDataFormat(model, 0x10); Assert.Equal("null", format.DestinationName); }
public void WritingAnchorIntoAPointerRemovesThatPointer() { var buffer = new byte[0x100]; var model = new PokemonModel(buffer); var token = new ModelDelta(); model.WritePointer(token, 16, 12); model.ObserveRunWritten(token, new PointerRun(16)); model.ObserveAnchorWritten(token, "bob", new NoInfoRun(18)); Assert.Equal(18, model.GetNextRun(10).Start); }
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 CanRecognizeString() { var buffer = new byte[0x100]; var model = new PokemonModel(buffer); var token = new ModelDelta(); var data = PCSString.Convert("Hello World!").ToArray(); Array.Copy(data, 0, buffer, 0x10, data.Length); model.ObserveRunWritten(token, new PCSRun(model, 0x10, data.Length)); var run = (PCSRun)model.GetNextRun(0); Assert.Equal(data.Length, run.Length); }
public void SelectingAPointerAddressInStringToolDisablesTheTool() { var token = new ModelDelta(); var model = new PokemonModel(new byte[0x200]); model.WritePointer(token, 16, 100); model.ObserveRunWritten(token, new PointerRun(16)); var tool = new PCSTool( model, new Selection(new ScrollRegion { Width = 0x10, Height = 0x10 }, model), new ChangeHistory <ModelDelta>(dm => dm), null); tool.Address = 18; Assert.Equal(18, tool.Address); // address updated correctly Assert.False(tool.Enabled); // run is not one that this tool knows how to edit }