public void CanAutoDetectMultipleTextRunsAtOnce() { var test = new BaseViewModelTestClass(); var token = test.ViewPort.CurrentChange; // Arrange some undetected pointers to some undetected text test.Model.WritePointer(token, 0, 0x10); test.Model.WritePointer(token, 4, 0x15); int write = 0x10; test.Model[0xF] = 0xFF; PCSString.Convert("text").ForEach(b => test.Model[write++] = b); PCSString.Convert("more").ForEach(b => test.Model[write++] = b); // add some more text/pointers later on that *are* detected test.Model.WritePointer(token, 8, 0x40); test.Model[0x40] = 0xFF; test.ViewPort.Edit("@40 ^discovered\"\" Blob\" @00 "); // select from partway through the first text to partway through the second text and "Display as Text" test.ViewPort.SelectionStart = new Point(1, 1); test.ViewPort.SelectionEnd = new Point(7, 1); var group = (ContextItemGroup)test.ViewPort.GetContextMenuItems(new Point(4, 1)).Single(item => item.Text == "Display As..."); var button = group.Single(item => item.Text == "Text"); button.Command.Execute(); // Verify that we found both Assert.Equal(0, test.Model.GetNextRun(0).Start); // first pointer Assert.Equal(4, test.Model.GetNextRun(4).Start); // second pointer Assert.Equal(0x10, test.Model.GetNextRun(0x10).Start); // first text Assert.Equal(0x15, test.Model.GetNextRun(0x15).Start); // second text }
public void ViewPort_GotoWithOffset_Goto() { var test = new BaseViewModelTestClass(); test.ViewPort.Edit("@100+10 "); Assert.Equal(0x110, test.ViewPort.ConvertViewPointToAddress(test.ViewPort.SelectionStart)); }
public void CanFollowPointerInline() { var test = new BaseViewModelTestClass(); test.ViewPort.Edit("00 01 02 03 <000100> @04 @{ 80 @} "); Assert.Equal(0, test.ViewPort.DataOffset); Assert.Equal(new Point(8, 0), test.ViewPort.SelectionStart); Assert.Equal(0x80, test.Model[0x100]); }
public void SelectDataInBottomRow_MoveSelectionEndDown_DataScrolls() { var test = new BaseViewModelTestClass(); test.ViewPort.SelectionStart = new Point(0, 15); test.ViewPort.SelectionEnd = new Point(0, 16); Assert.Equal(0x10, test.ViewPort.DataOffset); }
public void FreeSpaceStart_GotoFreeSpaceStart() { var test = new BaseViewModelTestClass(); test.ViewPort.FreeSpaceStart = 0x100; test.ViewPort.GotoFreeSpaceStart.Execute(); Assert.Equal(0x100, test.ViewPort.DataOffset); }
public void SelectionLengthIsPositiveWhenSelectingLeft() { var test = new BaseViewModelTestClass(); test.ViewPort.SelectionStart = new Point(3, 0); test.ViewPort.SelectionEnd = new Point(0, 0); Assert.Contains("| 4 bytes selected", test.ViewPort.SelectedAddress); }
public void ViewPort_GotoNonExistingAnchorWithSizeSpecified_AnchorCreated() { var test = new BaseViewModelTestClass(); test.ViewPort.Edit("@newAnchor(10) "); var destination = test.Model.GetAddressFromAnchor(new ModelDelta(), -1, "newAnchor"); Assert.NotEqual(Pointer.NULL, destination); }
public void SearchFor6BytesAlsoFindsPointers() { var test = new BaseViewModelTestClass(0x1200); test.ViewPort.Edit("<001060>"); var results = test.ViewPort.Find("001060"); Assert.Single(results); }
public void TableToolContainsListOfAllTables() { var test = new BaseViewModelTestClass(); test.ViewPort.Edit("^table1[data\"\"6]4 @30 ^table2[data\"\"6]4 "); Assert.Equal(2, test.ViewPort.Tools.TableTool.TableSections.Count()); test.ViewPort.Tools.TableTool.SelectedTableSection = 1; Assert.Equal("000030", test.ViewPort.Headers[0]); }
public void CanCreatePointerInline() { var test = new BaseViewModelTestClass(); test.ViewPort.Edit("^table[content<\"\">]2 @{ Hello!\" @}"); var matches = test.ViewPort.Find("Hello!"); Assert.Equal(4, test.ViewPort.DataOffset); Assert.Equal(new Point(0, 0), test.ViewPort.SelectionStart); Assert.Single(matches); }
public void SelectDataInTopRow_MoveSelectionEndUp_DataScrolls() { var test = new BaseViewModelTestClass(); test.ViewPort.Goto.Execute(0x10); test.ViewPort.SelectionStart = new Point(0, 0); test.ViewPort.SelectionEnd = new Point(0, -1); Assert.Equal(0, test.ViewPort.DataOffset); }
public void CanGotoSecondNamedElementWithSameName() { var test = new BaseViewModelTestClass(); test.CreateTextTable("names", 0x100, "Adam Bob Carl Dave Eric Dave Fred Greg Hal Jim".Split(" ")); test.ViewPort.Edit("@00 ^table[content.]names "); test.ViewPort.Goto.Execute("table/Dav~2"); Assert.Equal(5, test.ViewPort.DataOffset); }
public void CanPrefixAddressWith0xDuringGoto() { var editor = new EditorViewModel(new StubFileSystem()); var test = new BaseViewModelTestClass(); editor.Add(test.ViewPort); editor.GotoViewModel.Goto.Execute("0x0030"); Assert.Equal(0x30, test.ViewPort.DataOffset); }
public void CursorAtEndOfFile_MakeFileSmaller_CursorMoves() { var test = new BaseViewModelTestClass(); test.ViewPort.Goto.Execute(test.Model.Count - 1); test.Model.ContractData(test.Token, 0x100); test.ViewPort.Refresh(); Assert.Equal(0x101, test.ViewPort.ConvertViewPointToAddress(test.ViewPort.SelectionStart)); }
public void NullPointer_MakeSmallTable_TableAdded() { var test = new BaseViewModelTestClass(); test.ViewPort.Edit("<null> @00 ^table[pointer<>]1 "); var table = test.Model.GetTable("table"); Assert.Equal(0, table.Start); Assert.Equal(4, table.Length); Assert.Single(table.ElementContent); }
public void CanExtendTableWithInnerPointers() { var test = new BaseViewModelTestClass(); test.ViewPort.Edit("^table^[data\"\"4]3 "); test.ViewPort.SelectionStart = new Point(0xC, 0); test.ViewPort.Edit("+"); Assert.Equal(0x10, test.Model.GetNextRun(0).Length); }
public void AutocompletePicksExpectedElementAndMovesToNextElement() { var test = new BaseViewModelTestClass(); test.CreateTextTable(HardcodeTablesModel.MoveNamesTable, 0x100, "Tackle", "Fire Punch", "Earthquake", "Psycho Boost"); test.CreateEnumTable("pokemoves", 0x00, HardcodeTablesModel.MoveNamesTable, 0, 1, 2, 3); test.ViewPort.Edit("@04 firepunch "); Assert.Equal(1, test.Model.ReadMultiByteValue(0x04, 2)); Assert.Equal(new Point(2, 0), test.ViewPort.SelectionStart); Assert.Equal($"pokemoves/3{Environment.NewLine}pokemoves/\"Psycho Boost\"", test.ViewPort.Tools.TableTool.CurrentElementName); }
public void NameListWithTwoOfSameElementWithSpace_EnterSecondOption_CompleteCorrect() { var test = new BaseViewModelTestClass(); test.CreateTextTable("names", 0x100, "default", "Some Element", "Some Element"); test.CreateEnumTable("enums", 0, "names", 0, 0); test.ViewPort.Goto.Execute(0); test.ViewPort.Edit("\"Some Element~2\""); Assert.Equal(2, test.Model[0]); }
public void AnchorWithData_SelectMiddleOfAnchor_CanSeeAnchorContents() { var test = new BaseViewModelTestClass(); test.SetFullModel(0xFF); test.ViewPort.Edit("^text\"\" \"Hello, World\""); test.ViewPort.Goto.Execute(5); Assert.True(test.ViewPort.AnchorTextVisible); Assert.Equal("^text\"\"", test.ViewPort.AnchorText); }
public void NameList_TypeNameWithSingleQuote_AutocompleteCorrect() { var test = new BaseViewModelTestClass(); test.CreateTextTable("names", 0x100, "Basic", "Quote'n'space Element"); test.CreateEnumTable("enums", 0, "names", 0, 0); test.ViewPort.Goto.Execute(0); test.ViewPort.Edit("\"Quote'\""); Assert.Equal(1, test.Model[0]); }
public void ToolSelectionDoesNotAutoChangeForCodeToolHexView() { var test = new BaseViewModelTestClass(); test.ViewPort.Edit("FF @00 ^text\"\" Hello World!"); test.ViewPort.Tools.CodeToolCommand.Execute(); test.ViewPort.Tools.CodeTool.Mode = CodeMode.Raw; test.ViewPort.SelectionStart = new Point(0, 1); test.ViewPort.SelectionStart = new Point(0, 0); Assert.Equal(test.ViewPort.Tools.CodeTool, test.ViewPort.Tools.SelectedTool); }
public void Text_TypeDot_DotAdded() { var test = new BaseViewModelTestClass(); Array.Copy(PCSString.Convert("Hello World").ToArray(), test.Model.RawData, 12); test.Model.ObserveRunWritten(test.ViewPort.CurrentChange, new PCSRun(test.Model, 0, 12)); test.ViewPort.Refresh(); test.ViewPort.Edit("@01 ."); Assert.Equal(2, test.ViewPort.ConvertViewPointToAddress(test.ViewPort.SelectionStart)); Assert.Equal("\"H.llo World\"", PCSString.Convert(test.Model, 0, 12)); }
public void TableWithTableStreamPointers_RepointToContainingAnotherRun_NoAssert() { var test = new BaseViewModelTestClass(); test.Model[5] = 5; test.ViewPort.Edit("@100 ^table[ptr<[a.]!05>]2 <002> "); test.ViewPort.Edit("<000> "); var streamRun = (TableStreamRun)test.Model.GetNextRun(0); Assert.Equal(0, streamRun.Start); Assert.Equal(6, streamRun.Length); }
public void AnchorWithNoFormatContextMenuContainsRemoveOption() { var test = new BaseViewModelTestClass(); test.ViewPort.Edit("<000020> @20 "); // add a pointer to 0x20 and go there test.ViewPort.SelectionStart = new Point(); var contextItems = test.ViewPort.GetContextMenuItems(new Point()); var clearFormatItem = contextItems.Single(item => item.Text == "Clear Format"); clearFormatItem.Command.Execute(); // verify that there is no longer a run starting at 0x20 Assert.NotEqual(0x20, test.Model.GetNextRun(0x20).Start); }
public void AnchorCanContaintDots() { var test = new BaseViewModelTestClass(); test.ViewPort.Edit("^This.name.Is.valid "); Assert.Empty(test.Errors); var address = test.Model.GetAddressFromAnchor(new NoDataChangeDeltaModel(), -1, "This.name.Is.valid"); Assert.Equal(0, address); test.ViewPort.AnchorText = "^This_name_is_Also_valid"; Assert.Empty(test.Errors); address = test.Model.GetAddressFromAnchor(new NoDataChangeDeltaModel(), -1, "This_name_is_Also_valid"); Assert.Equal(0, address); }
public void CanSearchForBranchLink() { var test = new BaseViewModelTestClass(); var command1 = test.ViewPort.Tools.CodeTool.Parser.Compile(test.Model, 0x0010, "bl <000060>").ToArray(); var command2 = test.ViewPort.Tools.CodeTool.Parser.Compile(test.Model, 0x0100, "bl <000060>").ToArray(); Array.Copy(command1, 0, test.Model.RawData, 0x0010, command1.Length); Array.Copy(command2, 0, test.Model.RawData, 0x0100, command2.Length); var results = test.ViewPort.Find("bl <000060>").ToList(); Assert.Equal(2, results.Count); Assert.Equal(0x010, results[0].start); Assert.Equal(0x100, results[1].start); }
public void CanGotoSingleOptionEvenWithoutPerfectMatch() { var test = new BaseViewModelTestClass(); test.ViewPort.Edit("^pizza @piza "); Assert.Empty(test.Errors); test.ViewPort.Edit("@20 ^candy "); var editor = new EditorViewModel(new StubFileSystem()); editor.Add(test.ViewPort); editor.GotoViewModel.Text = "cady"; editor.GotoViewModel.Goto.Execute(); Assert.Empty(test.Errors); }
public void ControlCode_Pause_OneByteIsEscaped() { var test = new BaseViewModelTestClass(); int i = 0; Write(test.Model, ref i, "ABC"); test.Model[i++] = PCSString.FunctionEscape; test.Model[i++] = 0x09; //pause: no variables Write(test.Model, ref i, "XYZ\""); test.ViewPort.Edit("^text\"\""); Assert.IsType <EscapedPCS>(test.ViewPort[4, 0].Format); Assert.IsNotType <EscapedPCS>(test.ViewPort[5, 0].Format); Assert.Equal("ABC\\CC09XYZ", ((PCSRun)test.Model.GetNextRun(0)).SerializeRun()); }
public void TextToolSearchTest() { var test = new BaseViewModelTestClass(); test.ViewPort.Edit("FF @00 ^text\"\" Hello World Worble!"); test.ViewPort.SelectionStart = new Point(); var tool = test.ViewPort.Tools.StringTool; tool.SearchText = "wor"; tool.Search.Execute(); Assert.Equal(6, tool.ContentIndex); Assert.Equal(3, tool.ContentSelectionLength); tool.Search.Execute(); Assert.Equal(12, tool.ContentIndex); Assert.Equal(3, tool.ContentSelectionLength); }
public void CanOpenSecondTabWithSameModel() { var test = new BaseViewModelTestClass(); editor.Add(test.ViewPort); test.ViewPort.Edit("<000100> @00 "); // create a pointer for us to follow var item = test.ViewPort.GetContextMenuItems(new Point()).Single(menuItem => menuItem.Text == "Open in New Tab"); item.Command.Execute(); var newTab = (ViewPort)editor[1]; Assert.Equal(test.ViewPort.CurrentChange, newTab.CurrentChange); // they have the same change history Assert.Equal(test.ViewPort.Model, newTab.Model); // they have the same model Assert.Equal(0x100, newTab.DataOffset); // the new tab is scrolled to the desired location }