aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/simpleTests.py
diff options
context:
space:
mode:
authornyamatongwe <devnull@localhost>2013-01-19 12:34:07 +1100
committernyamatongwe <devnull@localhost>2013-01-19 12:34:07 +1100
commitb7591665bdf69d4a1693a734dc1d69a66b62e569 (patch)
tree308d64c1439f745955ff5f3e9a7d303e75ef77ef /test/simpleTests.py
parentce2de4557e269d91c3e9445713e6115e797e177a (diff)
downloadscintilla-mirror-b7591665bdf69d4a1693a734dc1d69a66b62e569.tar.gz
Implement Unicode line ends and substyles in C++ lexer.
Diffstat (limited to 'test/simpleTests.py')
-rw-r--r--test/simpleTests.py195
1 files changed, 195 insertions, 0 deletions
diff --git a/test/simpleTests.py b/test/simpleTests.py
index 9085bcf87..04c9ed145 100644
--- a/test/simpleTests.py
+++ b/test/simpleTests.py
@@ -282,6 +282,201 @@ class TestSimple(unittest.TestCase):
self.assertEquals(self.ed.Contents(), b"x" + lineEnds[lineEndType] + b"y")
self.assertEquals(self.ed.LineLength(0), 1 + len(lineEnds[lineEndType]))
+ # Several tests for unicode line ends U+2028 and U+2029
+
+ def testUnicodeLineEnds(self):
+ # Add two lines separated with U+2028 and ensure it is seen as two lines
+ # Then remove U+2028 and should be just 1 lines
+ self.ed.Lexer = self.ed.SCLEX_CPP
+ self.ed.SetCodePage(65001)
+ self.ed.SetLineEndTypesAllowed(1)
+ self.ed.AddText(5, b"x\xe2\x80\xa8y")
+ self.assertEquals(self.ed.LineCount, 2)
+ self.assertEquals(self.ed.GetLineEndPosition(0), 1)
+ self.assertEquals(self.ed.GetLineEndPosition(1), 5)
+ self.assertEquals(self.ed.LineLength(0), 4)
+ self.assertEquals(self.ed.LineLength(1), 1)
+ self.ed.TargetStart = 1
+ self.ed.TargetEnd = 4
+ self.ed.ReplaceTarget(0, b"")
+ self.assertEquals(self.ed.LineCount, 1)
+ self.assertEquals(self.ed.LineLength(0), 2)
+ self.assertEquals(self.ed.GetLineEndPosition(0), 2)
+
+ def testUnicodeLineEndsWithCodePage0(self):
+ # Try the Unicode line ends when not in Unicode mode -> should remain 1 line
+ self.ed.SetCodePage(0)
+ self.ed.AddText(5, b"x\xe2\x80\xa8y")
+ self.assertEquals(self.ed.LineCount, 1)
+ self.ed.AddText(4, b"x\xc2\x85y")
+ self.assertEquals(self.ed.LineCount, 1)
+
+ def testUnicodeLineEndsSwitchToUnicodeAndBack(self):
+ # Add the Unicode line ends when not in Unicode mode
+ self.ed.SetCodePage(0)
+ self.ed.AddText(5, b"x\xe2\x80\xa8y")
+ self.assertEquals(self.ed.LineCount, 1)
+ # Into UTF-8 mode - should now be interpreting as two lines
+ self.ed.Lexer = self.ed.SCLEX_CPP
+ self.ed.SetCodePage(65001)
+ self.ed.SetLineEndTypesAllowed(1)
+ self.assertEquals(self.ed.LineCount, 2)
+ # Back to code page 0 and 1 line
+ self.ed.SetCodePage(0)
+ self.assertEquals(self.ed.LineCount, 1)
+
+ def testUFragmentedEOLCompletion(self):
+ # Add 2 starting bytes of UTF-8 line end then complete it
+ self.ed.ClearAll()
+ self.ed.AddText(4, b"x\xe2\x80y")
+ self.assertEquals(self.ed.LineCount, 1)
+ self.assertEquals(self.ed.GetLineEndPosition(0), 4)
+ self.ed.SetSel(3,3)
+ self.ed.AddText(1, b"\xa8")
+ self.assertEquals(self.ed.Contents(), b"x\xe2\x80\xa8y")
+ self.assertEquals(self.ed.LineCount, 2)
+
+ # Add 1 starting bytes of UTF-8 line end then complete it
+ self.ed.ClearAll()
+ self.ed.AddText(3, b"x\xe2y")
+ self.assertEquals(self.ed.LineCount, 1)
+ self.assertEquals(self.ed.GetLineEndPosition(0), 3)
+ self.ed.SetSel(2,2)
+ self.ed.AddText(2, b"\x80\xa8")
+ self.assertEquals(self.ed.Contents(), b"x\xe2\x80\xa8y")
+ self.assertEquals(self.ed.LineCount, 2)
+
+ def testUFragmentedEOLStart(self):
+ # Add end of UTF-8 line end then insert start
+ self.ed.Lexer = self.ed.SCLEX_CPP
+ self.ed.SetCodePage(65001)
+ self.ed.SetLineEndTypesAllowed(1)
+ self.assertEquals(self.ed.LineCount, 1)
+ self.ed.AddText(4, b"x\x80\xa8y")
+ self.assertEquals(self.ed.LineCount, 1)
+ self.ed.SetSel(1,1)
+ self.ed.AddText(1, b"\xe2")
+ self.assertEquals(self.ed.LineCount, 2)
+
+ def testUBreakApartEOL(self):
+ # Add two lines separated by U+2029 then remove and add back each byte ensuring
+ # only one line after each removal of any byte in line end and 2 lines after reinsertion
+ self.ed.Lexer = self.ed.SCLEX_CPP
+ self.ed.SetCodePage(65001)
+ self.ed.SetLineEndTypesAllowed(1)
+ text = b"x\xe2\x80\xa9y";
+ self.ed.AddText(5, text)
+ self.assertEquals(self.ed.LineCount, 2)
+
+ for i in range(len(text)):
+ self.ed.TargetStart = i
+ self.ed.TargetEnd = i + 1
+ self.ed.ReplaceTarget(0, b"")
+ if i in [0, 4]:
+ # Removing text characters does not change number of lines
+ self.assertEquals(self.ed.LineCount, 2)
+ else:
+ # Removing byte from line end, removes 1 line
+ self.assertEquals(self.ed.LineCount, 1)
+
+ self.ed.TargetEnd = i
+ self.ed.ReplaceTarget(1, text[i:i+1])
+ self.assertEquals(self.ed.LineCount, 2)
+
+ def testURemoveEOLFragment(self):
+ # Add UTF-8 line end then delete each byte causing line end to disappear
+ self.ed.Lexer = self.ed.SCLEX_CPP
+ self.ed.SetCodePage(65001)
+ self.ed.SetLineEndTypesAllowed(1)
+ for i in range(3):
+ self.ed.ClearAll()
+ self.ed.AddText(5, b"x\xe2\x80\xa8y")
+ self.assertEquals(self.ed.LineCount, 2)
+ self.ed.TargetStart = i+1
+ self.ed.TargetEnd = i+2
+ self.ed.ReplaceTarget(0, b"")
+ self.assertEquals(self.ed.LineCount, 1)
+
+ # Several tests for unicode NEL line ends U+0085
+
+ def testNELLineEnds(self):
+ # Add two lines separated with U+0085 and ensure it is seen as two lines
+ # Then remove U+0085 and should be just 1 lines
+ self.ed.Lexer = self.ed.SCLEX_CPP
+ self.ed.SetCodePage(65001)
+ self.ed.SetLineEndTypesAllowed(1)
+ self.ed.AddText(4, b"x\xc2\x85y")
+ self.assertEquals(self.ed.LineCount, 2)
+ self.assertEquals(self.ed.GetLineEndPosition(0), 1)
+ self.assertEquals(self.ed.GetLineEndPosition(1), 4)
+ self.assertEquals(self.ed.LineLength(0), 3)
+ self.assertEquals(self.ed.LineLength(1), 1)
+ self.ed.TargetStart = 1
+ self.ed.TargetEnd = 3
+ self.ed.ReplaceTarget(0, b"")
+ self.assertEquals(self.ed.LineCount, 1)
+ self.assertEquals(self.ed.LineLength(0), 2)
+ self.assertEquals(self.ed.GetLineEndPosition(0), 2)
+
+ def testNELFragmentedEOLCompletion(self):
+ # Add starting byte of UTF-8 NEL then complete it
+ self.ed.AddText(3, b"x\xc2y")
+ self.assertEquals(self.ed.LineCount, 1)
+ self.assertEquals(self.ed.GetLineEndPosition(0), 3)
+ self.ed.SetSel(2,2)
+ self.ed.AddText(1, b"\x85")
+ self.assertEquals(self.ed.Contents(), b"x\xc2\x85y")
+ self.assertEquals(self.ed.LineCount, 2)
+
+ def testNELFragmentedEOLStart(self):
+ # Add end of UTF-8 NEL then insert start
+ self.ed.Lexer = self.ed.SCLEX_CPP
+ self.ed.SetCodePage(65001)
+ self.ed.SetLineEndTypesAllowed(1)
+ self.assertEquals(self.ed.LineCount, 1)
+ self.ed.AddText(4, b"x\x85y")
+ self.assertEquals(self.ed.LineCount, 1)
+ self.ed.SetSel(1,1)
+ self.ed.AddText(1, b"\xc2")
+ self.assertEquals(self.ed.LineCount, 2)
+
+ def testNELBreakApartEOL(self):
+ # Add two lines separated by U+0085 then remove and add back each byte ensuring
+ # only one line after each removal of any byte in line end and 2 lines after reinsertion
+ self.ed.Lexer = self.ed.SCLEX_CPP
+ self.ed.SetCodePage(65001)
+ self.ed.SetLineEndTypesAllowed(1)
+ text = b"x\xc2\x85y";
+ self.ed.AddText(4, text)
+ self.assertEquals(self.ed.LineCount, 2)
+
+ for i in range(len(text)):
+ self.ed.TargetStart = i
+ self.ed.TargetEnd = i + 1
+ self.ed.ReplaceTarget(0, b"")
+ if i in [0, 3]:
+ # Removing text characters does not change number of lines
+ self.assertEquals(self.ed.LineCount, 2)
+ else:
+ # Removing byte from line end, removes 1 line
+ self.assertEquals(self.ed.LineCount, 1)
+
+ self.ed.TargetEnd = i
+ self.ed.ReplaceTarget(1, text[i:i+1])
+ self.assertEquals(self.ed.LineCount, 2)
+
+ def testNELRemoveEOLFragment(self):
+ # Add UTF-8 NEL then delete each byte causing line end to disappear
+ self.ed.SetCodePage(65001)
+ for i in range(2):
+ self.ed.ClearAll()
+ self.ed.AddText(4, b"x\xc2\x85y")
+ self.assertEquals(self.ed.LineCount, 2)
+ self.ed.TargetStart = i+1
+ self.ed.TargetEnd = i+2
+ self.ed.ReplaceTarget(0, b"")
+ self.assertEquals(self.ed.LineCount, 1)
+
def testGoto(self):
self.ed.AddText(5, b"a\nb\nc")
self.assertEquals(self.ed.CurrentPos, 5)