diff options
Diffstat (limited to 'test/lexTests.py')
-rw-r--r-- | test/lexTests.py | 106 |
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") |