Ejemplo n.º 1
0
        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]);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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
        }