aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/lexTests.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/lexTests.py')
-rw-r--r--test/lexTests.py106
1 files changed, 106 insertions, 0 deletions
diff --git a/test/lexTests.py b/test/lexTests.py
new file mode 100644
index 000000000..b4caa95f6
--- /dev/null
+++ b/test/lexTests.py
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import with_statement
+
+import io
+import os
+import unittest
+
+import XiteWin
+
+keywordsHTML = [
+b"b body content head href html link meta "
+ b"name rel script strong title type xmlns",
+b"function",
+b"sub"
+]
+
+class TestLexers(unittest.TestCase):
+
+ def setUp(self):
+ self.xite = XiteWin.xiteFrame
+ self.ed = self.xite.ed
+ self.ed.ClearAll()
+ self.ed.EmptyUndoBuffer()
+
+ def AsStyled(self):
+ data = io.StringIO()
+ len = 0
+ prevStyle = -1
+ for o in range(self.ed.Length):
+ styleNow = self.ed.GetStyleAt(len)
+ if styleNow != prevStyle:
+ styleBuf = "{%0d}" % styleNow
+ data.write(styleBuf)
+ prevStyle = styleNow
+ data.write(chr(self.ed.GetCharAt(len)))
+ len += 1
+ return data.getvalue( )
+
+ def LexExample(self, name, lexerName, keywords=None):
+ if keywords is None:
+ keywords = []
+ self.ed.LexerLanguage = lexerName
+ bits = self.ed.StyleBitsNeeded
+ mask = 2 << bits - 1
+ self.ed.StyleBits = bits
+ for i in range(len(keywords)):
+ self.ed.SetKeyWords(i, keywords[i])
+
+ nameExample = os.path.join("examples", name)
+ namePrevious = nameExample +".styled"
+ nameNew = nameExample +".new"
+ with open(nameExample, "rb") as f:
+ prog = f.read()
+ lenDocument = len(prog)
+ self.ed.AddText(lenDocument, prog)
+ self.ed.Colourise(0, lenDocument)
+ self.assertEquals(self.ed.EndStyled, lenDocument)
+ with open(namePrevious, "rb") as f:
+ prevStyled = f.read()
+ progStyled = self.AsStyled().encode('utf-8')
+ if progStyled != prevStyled:
+ with open(nameNew, "wb") as f:
+ f.write(progStyled)
+ print(progStyled)
+ print(prevStyled)
+ self.assertEquals(progStyled, prevStyled)
+ # The whole file doesn't parse like it did before so don't try line by line
+ # as that is likely to fail many times.
+ return
+
+ # Try partial lexes from the start of every line which should all be identical.
+ for line in range(self.ed.LineCount):
+ lineStart = self.ed.PositionFromLine(line)
+ self.ed.StartStyling(lineStart, mask)
+ self.assertEquals(self.ed.EndStyled, lineStart)
+ self.ed.Colourise(0, lenDocument)
+ progStyled = self.AsStyled().encode('utf-8')
+ if progStyled != prevStyled:
+ with open(nameNew, "wb") as f:
+ f.write(progStyled)
+ assertEquals(progStyled, prevStyled)
+ # Give up after one failure
+ return
+
+ def testCXX(self):
+ self.LexExample("x.cxx", b"cpp", [b"int"])
+
+ def testPython(self):
+ self.LexExample("x.py", b"python",
+ [b"class def else for if import in print return while"])
+
+ def testHTML(self):
+ self.LexExample("x.html", b"hypertext", keywordsHTML)
+
+ def testASP(self):
+ self.LexExample("x.asp", b"hypertext", keywordsHTML)
+
+ def testPHP(self):
+ self.LexExample("x.php", b"hypertext", keywordsHTML)
+
+ def testVB(self):
+ self.LexExample("x.vb", b"vb", [b"as dim or string"])
+
+if __name__ == '__main__':
+ XiteWin.main("lexTests")