static void Test_LHI_Delete() { // TEST DATA: // -------------------- // "keep it as simple as possible\r\n (head: 0, len:31) // \n (head:32, len: 1) // but\n (head:33, len: 4) // \r (head:37, len: 1) // not simpler."\r (head:38, len:14) // \r (head:52, len: 1) // - Albert Einstein (head:53, len:18) // -------------------- const string TestData = "\"keep it as simple as possible\r\n\nbut\n\rnot simpler.\"\r\r - Albert Einstein"; TextBuffer text = new TextBuffer(1, 32); SplitArray <int> lhi = new SplitArray <int>(1, 8); SplitArray <LineDirtyState> lds = new SplitArray <LineDirtyState>(1, 8); lds.Add(LineDirtyState.Clean); // prepare lhi.Add(0); LineLogic.LHI_Insert(lhi, lds, text, TestData, 0); text.Add(TestData.ToCharArray()); TestUtl.AssertEquals("0 32 33 37 38 52 53", lhi.ToString()); TestUtl.AssertEquals("DDDDDDD", MakeLdsText(lds)); for (int i = 0; i < lds.Count; i++) { lds[i] = LineDirtyState.Clean; } //--- delete range in line --- // valid range LineLogic.LHI_Delete(lhi, lds, text, 2, 5); text.RemoveRange(2, 5); TestUtl.AssertEquals("0 29 30 34 35 49 50", lhi.ToString()); TestUtl.AssertEquals("DCCCCCC", MakeLdsText(lds)); // invalid range (before begin to middle) try{ LineLogic.LHI_Delete(lhi, lds, text, -1, 5); throw new ApplicationException(); } catch (Exception ex) { TestUtl.AssertType <AssertException>(ex); } //--- delete range between different lines --- text.Clear(); lhi.Clear(); lhi.Add(0); lds.Clear(); lds.Add(LineDirtyState.Clean); LineLogic.LHI_Insert(lhi, lds, text, TestData, 0); text.Add(TestData.ToCharArray()); // "keep it as simple as possible\r\n (head: 0, len:31) // \n (head:32, len: 1) // but\n (head:33, len: 4) // \r (head:37, len: 1) // not simpler."\r (head:38, len:14) // \r (head:52, len: 1) // - Albert Einstein[EOF] (head:53, len:18) // delete only one EOL code //---- // "keep it as simple as possible\r\n (head: 0, len:31) // but\n (head:32, len: 4) // \r (head:36, len: 1) // not simpler."\r (head:37, len:14) // \r (head:51, len: 1) // - Albert Einstein[EOF] (head:52, len:18) //---- for (int i = 0; i < lds.Count; i++) { lds[i] = LineDirtyState.Clean; } LineLogic.LHI_Delete(lhi, lds, text, 32, 33); text.RemoveAt(32); TestUtl.AssertEquals("0 32 36 37 51 52", lhi.ToString()); TestUtl.AssertEquals("CDCCCC", MakeLdsText(lds)); // delete middle of the first line to not EOF pos //---- // "keep it as simple as not simpler."\r (head: 0, len:35) // \r (head:36, len: 1) // - Albert Einstein[EOF] (head:37, len:18) //---- for (int i = 0; i < lds.Count; i++) { lds[i] = LineDirtyState.Clean; } LineLogic.LHI_Delete(lhi, lds, text, 22, 37); text.RemoveRange(22, 37); TestUtl.AssertEquals("0 36 37", lhi.ToString()); TestUtl.AssertEquals("DCC", MakeLdsText(lds)); // delete all //---- // [EOF] (head:0, len:0) //---- for (int i = 0; i < lds.Count; i++) { lds[i] = LineDirtyState.Clean; } LineLogic.LHI_Delete(lhi, lds, text, 0, 55); text.RemoveRange(0, 55); TestUtl.AssertEquals("0", lhi.ToString()); TestUtl.AssertEquals("D", MakeLdsText(lds)); //--- special care about CR+LF --- // (1) deletion creates a new CR+LF // (2) deletion breaks a CR+LF at the left side of the deletion range // (3) deletion breaks a CR+LF at the left side of the deletion range //-------------------------------- // (1) { text.Clear(); lhi.Clear(); lhi.Add(0); lds.Clear(); lds.Add(LineDirtyState.Clean); LineLogic.LHI_Insert(lhi, lds, text, "foo\rx\nbar", 0); text.Add("foo\rx\nbar".ToCharArray()); for (int i = 0; i < lds.Count; i++) { lds[i] = LineDirtyState.Clean; } LineLogic.LHI_Delete(lhi, lds, text, 4, 5); text.RemoveRange(4, 5); TestUtl.AssertEquals("0 5", lhi.ToString()); TestUtl.AssertEquals("DC", MakeLdsText(lds)); } // (2) { text.Clear(); lhi.Clear(); lhi.Add(0); lds.Clear(); lds.Add(LineDirtyState.Clean); LineLogic.LHI_Insert(lhi, lds, text, "foo\r\nbar", 0); text.Add("foo\r\nbar".ToCharArray()); for (int i = 0; i < lds.Count; i++) { lds[i] = LineDirtyState.Clean; } LineLogic.LHI_Delete(lhi, lds, text, 4, 6); text.RemoveRange(4, 6); TestUtl.AssertEquals("0 4", lhi.ToString()); TestUtl.AssertEquals("DD", MakeLdsText(lds)); } // (3) { text.Clear(); lhi.Clear(); lhi.Add(0); lds.Clear(); lds.Add(LineDirtyState.Clean); LineLogic.LHI_Insert(lhi, lds, text, "foo\r\nbar", 0); text.Add("foo\r\nbar".ToCharArray()); for (int i = 0; i < lds.Count; i++) { lds[i] = LineDirtyState.Clean; } LineLogic.LHI_Delete(lhi, lds, text, 2, 4); text.RemoveRange(2, 4); TestUtl.AssertEquals("0 3", lhi.ToString()); TestUtl.AssertEquals("DC", MakeLdsText(lds)); } // (1)+(2)+(3) { text.Clear(); lhi.Clear(); lhi.Add(0); lds.Clear(); lds.Add(LineDirtyState.Clean); LineLogic.LHI_Insert(lhi, lds, text, "\r\nfoo\r\n", 0); text.Add("\r\nfoo\r\n".ToCharArray()); for (int i = 0; i < lds.Count; i++) { lds[i] = LineDirtyState.Clean; } LineLogic.LHI_Delete(lhi, lds, text, 1, 6); text.RemoveRange(1, 6); TestUtl.AssertEquals("0 2", lhi.ToString()); TestUtl.AssertEquals("DC", MakeLdsText(lds)); } //--- misc --- // insert "\n" after '\r' at end of document (boundary check for LHI_Insert) { text.Clear(); lhi.Clear(); lhi.Add(0); lds.Clear(); lds.Add(LineDirtyState.Clean); LineLogic.LHI_Insert(lhi, lds, text, "\r", 0); text.Add("\r".ToCharArray()); for (int i = 0; i < lds.Count; i++) { lds[i] = LineDirtyState.Clean; } LineLogic.LHI_Insert(lhi, lds, text, "\n", 1); text.Add("\n".ToCharArray()); TestUtl.AssertEquals("0 2", lhi.ToString()); TestUtl.AssertEquals("CD", MakeLdsText(lds)); } // insert "\n" after '\r' at end of document (boundary check for LHI_Delete) { text.Clear(); lhi.Clear(); lhi.Add(0); lds.Clear(); lds.Add(LineDirtyState.Clean); LineLogic.LHI_Insert(lhi, lds, text, "\r\n", 0); text.Add("\r\n".ToCharArray()); for (int i = 0; i < lds.Count; i++) { lds[i] = LineDirtyState.Clean; } LineLogic.LHI_Delete(lhi, lds, text, 1, 2); text.RemoveRange(1, 2); TestUtl.AssertEquals("0 1", lhi.ToString()); TestUtl.AssertEquals("DD", MakeLdsText(lds)); } }