diff options
| author | nyamatongwe <devnull@localhost> | 2009-05-12 23:39:51 +0000 | 
|---|---|---|
| committer | nyamatongwe <devnull@localhost> | 2009-05-12 23:39:51 +0000 | 
| commit | 2642c1da70d5f1e26fda2cfee0deb2fa88b43b71 (patch) | |
| tree | a554b9ac64e53a35379ae6e6a7d3160ac293a4de /test | |
| parent | b529c73475f04af4f687a0d9b1328581734728ae (diff) | |
| download | scintilla-mirror-2642c1da70d5f1e26fda2cfee0deb2fa88b43b71.tar.gz | |
Include tests in standard repository.
Diffstat (limited to 'test')
| -rw-r--r-- | test/MessageNumbers.py | 63 | ||||
| -rw-r--r-- | test/XiteMenu.py | 26 | ||||
| -rw-r--r-- | test/XiteWin.py | 650 | ||||
| -rw-r--r-- | test/examples/x.asp | 12 | ||||
| -rw-r--r-- | test/examples/x.asp.styled | 12 | ||||
| -rw-r--r-- | test/examples/x.cxx | 4 | ||||
| -rw-r--r-- | test/examples/x.cxx.styled | 4 | ||||
| -rw-r--r-- | test/examples/x.html | 7 | ||||
| -rw-r--r-- | test/examples/x.html.styled | 7 | ||||
| -rw-r--r-- | test/examples/x.php | 6 | ||||
| -rw-r--r-- | test/examples/x.php.styled | 6 | ||||
| -rw-r--r-- | test/examples/x.py | 11 | ||||
| -rw-r--r-- | test/examples/x.py.styled | 11 | ||||
| -rw-r--r-- | test/examples/x.vb | 9 | ||||
| -rw-r--r-- | test/examples/x.vb.styled | 9 | ||||
| -rw-r--r-- | test/lexTests.py | 106 | ||||
| -rw-r--r-- | test/performanceTests.py | 84 | ||||
| -rw-r--r-- | test/simpleTests.py | 897 | ||||
| -rw-r--r-- | test/xite.py | 6 | 
19 files changed, 1930 insertions, 0 deletions
| diff --git a/test/MessageNumbers.py b/test/MessageNumbers.py new file mode 100644 index 000000000..782027069 --- /dev/null +++ b/test/MessageNumbers.py @@ -0,0 +1,63 @@ +# List many windows message numbers + +msgs = { +"WM_ACTIVATE":6, +"WM_ACTIVATEAPP":28, +"WM_CAPTURECHANGED":533, +"WM_CHAR":258, +"WM_CLOSE":16, +"WM_CREATE":1, +"WM_COMMAND":273, +"WM_DESTROY":2, +"WM_ENTERSIZEMOVE":561, +"WM_ERASEBKGND":20, +"WM_EXITSIZEMOVE":562, +"WM_GETMINMAXINFO":36, +"WM_GETTEXT":13, +"WM_IME_SETCONTEXT":0x0281, +"WM_IME_NOTIFY":0x0282, +"WM_KEYDOWN":256, +"WM_KEYUP":257, +"WM_KILLFOCUS":8, +"WM_LBUTTONDOWN":513, +"WM_LBUTTONUP":514, +"WM_MBUTTONDOWN":519, +"WM_MBUTTONUP":520, +"WM_MBUTTONDBLCLK":521, +"WM_MOUSEACTIVATE":33, +"WM_MOUSEMOVE":512, +"WM_MOVE":3, +"WM_MOVING":534, +"WM_NCACTIVATE":134, +"WM_NCCALCSIZE":131, +"WM_NCCREATE":129, +"WM_NCDESTROY":130, +"WM_NCHITTEST":132, +"WM_NCLBUTTONDBLCLK":163, +"WM_NCLBUTTONDOWN":161, +"WM_NCLBUTTONUP":162, +"WM_NCMOUSEMOVE":160, +"WM_NCPAINT":133, +"WM_PAINT":15, +"WM_PARENTNOTIFY":528, +"WM_SETCURSOR":32, +"WM_SETFOCUS":7, +"WM_SETFONT":48, +"WM_SETTEXT":12, +"WM_SHOWWINDOW":24, +"WM_SIZE":5, +"WM_SIZING":532, +"WM_SYNCPAINT":136, +"WM_SYSCOMMAND":274, +"WM_SYSKEYDOWN":260, +"WM_TIMER":275, +"WM_USER":1024, +"WM_USER+1":1025, +"WM_WINDOWPOSCHANGED":71, +"WM_WINDOWPOSCHANGING":70, +} + +sgsm={} +for k,v in msgs.items(): +	sgsm[v] = k + diff --git a/test/XiteMenu.py b/test/XiteMenu.py new file mode 100644 index 000000000..f265387cb --- /dev/null +++ b/test/XiteMenu.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +""" Define the menu structure used by the Pentacle applications """ + +MenuStructure = [ +	["&File", [ +		["&New", "<control>N"], +		["&Open...", "<control>O"], +		["&Save", "<control>S"], +		["Save &As...", "<control><shift>S"], +		["Test", ""], +		["Exercised", ""], +		["Uncalled", ""], +		["-", ""], +		["&Exit", ""]]], +	[ "&Edit", [ +		["&Undo", "<control>Z"], +		["&Redo", "<control>Y"], +		["-", ""], +		["Cu&t", "<control>X"], +		["&Copy", "<control>C"], +		["&Paste", "<control>V"], +		["&Delete", "Del"], +		["Select &All", "<control>A"], +		]], +] diff --git a/test/XiteWin.py b/test/XiteWin.py new file mode 100644 index 000000000..71234cbd6 --- /dev/null +++ b/test/XiteWin.py @@ -0,0 +1,650 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import os, sys, unittest + +import ctypes +from ctypes import wintypes +from ctypes import c_int, c_ulong, c_char_p, c_wchar_p, c_ushort +user32=ctypes.windll.user32 +gdi32=ctypes.windll.gdi32 +kernel32=ctypes.windll.kernel32 +from MessageNumbers import msgs, sgsm + +import XiteMenu + +scintillaDirectory = ".." +scintillaIncludeDirectory = os.path.join(scintillaDirectory, "include") +sys.path.append(scintillaIncludeDirectory) +import Face + +scintillaBinDirectory = os.path.join(scintillaDirectory, "bin") +os.environ['PATH'] = os.environ['PATH']  + ";" + scintillaBinDirectory +#print(os.environ['PATH']) + +WFUNC = ctypes.WINFUNCTYPE(c_int, c_int, c_int, c_int, c_int) + +WS_CHILD = 0x40000000 +WS_CLIPCHILDREN = 0x2000000 +WS_OVERLAPPEDWINDOW = 0xcf0000 +WS_VISIBLE = 0x10000000 +WS_HSCROLL = 0x100000 +WS_VSCROLL = 0x200000 +WA_INACTIVE = 0 +MF_POPUP = 16 +MF_SEPARATOR = 0x800 +IDYES = 6 +OFN_HIDEREADONLY = 4 +MB_OK = 0 +MB_YESNOCANCEL = 3 +MF_CHECKED = 8 +MF_UNCHECKED = 0 +SW_SHOW = 5 +PM_REMOVE = 1 + +VK_SHIFT = 16 +VK_CONTROL = 17 +VK_MENU = 18 + +class OPENFILENAME(ctypes.Structure): +	_fields_ = (("lStructSize", c_int), +		("hwndOwner", c_int), +		("hInstance", c_int), +		("lpstrFilter", c_wchar_p), +		("lpstrCustomFilter", c_char_p), +		("nMaxCustFilter", c_int), +		("nFilterIndex", c_int), +		("lpstrFile", c_wchar_p), +		("nMaxFile", c_int), +		("lpstrFileTitle", c_wchar_p), +		("nMaxFileTitle", c_int), +		("lpstrInitialDir", c_wchar_p), +		("lpstrTitle", c_wchar_p), +		("flags", c_int), +		("nFileOffset", c_ushort), +		("nFileExtension", c_ushort), +		("lpstrDefExt", c_char_p), +		("lCustData", c_int), +		("lpfnHook", c_char_p), +		("lpTemplateName", c_char_p), +		("pvReserved", c_char_p), +		("dwReserved", c_int), +		("flagsEx", c_int)) + +	def __init__(self, win, title): +		ctypes.Structure.__init__(self) +		self.lStructSize = ctypes.sizeof(OPENFILENAME) +		self.nMaxFile = 1024 +		self.hwndOwner = win +		self.lpstrTitle = title +		self.Flags = OFN_HIDEREADONLY + +trace = False +#~ trace = True + +def WindowSize(w): +	rc = ctypes.wintypes.RECT() +	user32.GetClientRect(w, ctypes.byref(rc)) +	return rc.right - rc.left, rc.bottom - rc.top + +def IsKeyDown(key): +	return (user32.GetKeyState(key) & 0x8000) != 0 + +def KeyTranslate(w): +	tr = { 9: "Tab", 0xD:"Enter", 0x1B: "Esc" } +	if w in tr: +		return tr[w] +	elif ord("A") <= w <= ord("Z"): +		return chr(w) +	elif 0x70 <= w <= 0x7b: +		return "F" + str(w-0x70+1) +	else: +		return "Unknown_" + hex(w) + +class WNDCLASS(ctypes.Structure): +	_fields_= (\ +		('style', c_int), +		('lpfnWndProc', WFUNC), +		('cls_extra', c_int), +		('wnd_extra', c_int), +		('hInst', c_int), +		('hIcon', c_int), +		('hCursor', c_int), +		('hbrBackground', c_int), +		('menu_name', c_wchar_p), +		('lpzClassName', c_wchar_p), +	) + +class XTEXTRANGE(ctypes.Structure): +	_fields_= (\ +		('cpMin', c_int), +		('cpMax', c_int), +		('lpstrText', c_char_p), +	) + +class TEXTRANGE(ctypes.Structure): +	_fields_= (\ +		('cpMin', c_int), +		('cpMax', c_int), +		('lpstrText', ctypes.POINTER(ctypes.c_char)), +	) + +class FINDTEXT(ctypes.Structure): +	_fields_= (\ +		('cpMin', c_int), +		('cpMax', c_int), +		('lpstrText', c_char_p), +		('cpMinText', c_int), +		('cpMaxText', c_int), +	) + +hinst = ctypes.windll.kernel32.GetModuleHandleW(0) + +def RegisterClass(name, func, background = 0): +	# register a window class for toplevel windows. +	wc = WNDCLASS() +	wc.style = 0 +	wc.lpfnWndProc = func +	wc.cls_extra = 0 +	wc.wnd_extra = 0 +	wc.hInst = hinst +	wc.hIcon = 0 +	wc.hCursor = 0 +	wc.hbrBackground = background +	wc.menu_name = 0 +	wc.lpzClassName = name +	user32.RegisterClassW(ctypes.byref(wc)) + +class SciCall: +	def __init__(self, fn, ptr, msg): +		self._fn = fn +		self._ptr = ptr +		self._msg = msg +	def __call__(self, w=0, l=0): +		return self._fn(self._ptr, self._msg, w, l) + +class Scintilla: +	def __init__(self, face, hwndParent, hinstance): +		self.__dict__["face"] = face +		self.__dict__["used"] = set() +		self.__dict__["all"] = set() +		# The k member is for accessing constants as a dictionary +		self.__dict__["k"] = {} +		for f in face.features: +			self.all.add(f) +			if face.features[f]["FeatureType"] == "val": +				self.k[f] = int(self.face.features[f]["Value"], 0) +			elif face.features[f]["FeatureType"] == "evt": +				self.k["SCN_"+f] = int(self.face.features[f]["Value"], 0) +		# Get the function first as that also loads the DLL +		self.__dict__["_scifn"] = ctypes.windll.SciLexer.Scintilla_DirectFunction +		self.__dict__["_hwnd"] = user32.CreateWindowExW(0, +			"Scintilla", "Source", +			WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_CLIPCHILDREN, +			0, 0, 100, 100, hwndParent, 0, hinstance, 0) +		self.__dict__["_sciptr"] = user32.SendMessageW(self._hwnd, +			int(self.face.features["GetDirectPointer"]["Value"], 0), 0,0) +		user32.ShowWindow(self._hwnd, SW_SHOW) +	def __getattr__(self, name): +		if name in self.face.features: +			self.used.add(name) +			feature = self.face.features[name] +			value = int(feature["Value"], 0) +			#~ print("Feature", name, feature) +			if feature["FeatureType"] == "val": +				self.__dict__[name] = value +				return value +			else: +				return SciCall(self._scifn, self._sciptr, value) +		elif ("Get" + name) in self.face.features: +			self.used.add("Get" + name) +			feature = self.face.features["Get" + name] +			value = int(feature["Value"], 0) +			if feature["FeatureType"] == "get" and \ +				not name.startswith("Get") and \ +				not feature["Param1Type"] and \ +				not feature["Param2Type"] and \ +				feature["ReturnType"] in ["bool", "int", "position"]: +				#~ print("property", feature) +				return self._scifn(self._sciptr, value, 0, 0) +		elif name.startswith("SCN_") and name in self.k: +			self.used.add(name) +			feature = self.face.features[name[4:]] +			value = int(feature["Value"], 0) +			#~ print("Feature", name, feature) +			if feature["FeatureType"] == "val": +				return value +		raise AttributeError(name) +	def __setattr__(self, name, val): +		if ("Set" + name) in self.face.features: +			self.used.add("Set" + name) +			feature = self.face.features["Set" + name] +			value = int(feature["Value"], 0) +			#~ print("setproperty", feature) +			if feature["FeatureType"] == "set" and not name.startswith("Set"): +				if feature["Param1Type"] in ["bool", "int", "position"]: +					return self._scifn(self._sciptr, value, val, 0) +				elif feature["Param2Type"] in ["string"]: +					return self._scifn(self._sciptr, value, 0, val) +				raise AttributeError(name) +		raise AttributeError(name) +	def getvalue(self, name): +		if name in self.face.features: +			feature = self.face.features[name] +			if feature["FeatureType"] != "evt": +				try: +					return int(feature["Value"], 0) +				except ValueError: +					return -1 +		return -1 + + +	def ByteRange(self, start, end): +		tr = TEXTRANGE() +		tr.cpMin = start +		tr.cpMax = end +		length = end - start +		tr.lpstrText = ctypes.create_string_buffer(length + 1) +		self.GetTextRange(0, ctypes.byref(tr)) +		text = tr.lpstrText[:length] +		text += b"\0" * (length - len(text)) +		return text +	def StyledTextRange(self, start, end): +		tr = TEXTRANGE() +		tr.cpMin = start +		tr.cpMax = end +		length = 2 * (end - start) +		tr.lpstrText = ctypes.create_string_buffer(length + 2) +		self.GetStyledText(0, ctypes.byref(tr)) +		styledText = tr.lpstrText[:length] +		styledText += b"\0" * (length - len(styledText)) +		return styledText +	def FindBytes(self, start, end, s, flags): +		ft = FINDTEXT() +		ft.cpMin = start +		ft.cpMax = end +		ft.lpstrText = s +		ft.cpMinText = 0 +		ft.cpMaxText = 0 +		pos = self.FindText(flags, ctypes.byref(ft)) +		#~ print(start, end, ft.cpMinText, ft.cpMaxText) +		return pos + +	def Contents(self): +		return self.ByteRange(0, self.Length) +	def SizeTo(self, width, height): +		user32.SetWindowPos(self._hwnd, 0, 0, 0, width, height, 0) +	def FocusOn(self): +		user32.SetFocus(self._hwnd) + +class XiteWin(): +	def __init__(self, test=""): +		self.face = Face.Face() +		self.face.ReadFromFile(os.path.join(scintillaIncludeDirectory, "Scintilla.iface")) + +		self.titleDirty = True +		self.fullPath = "" +		self.test = test + +		self.appName = "xite" + +		self.cmds = {} +		self.windowName = "XiteWindow" +		self.wfunc = WFUNC(self.WndProc) +		RegisterClass(self.windowName, self.wfunc) +		user32.CreateWindowExW(0, self.windowName, self.appName, \ +			WS_VISIBLE | WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, \ +			0, 0, 500, 700, 0, 0, hinst, 0) + +		args = sys.argv[1:] +		self.SetMenus() +		if args: +			self.GrabFile(args[0]) +			self.ed.FocusOn() +			self.ed.GotoPos(self.ed.Length) + +		print(self.test) +		if self.test: +			for k in self.cmds: +				if self.cmds[k] == "Test": +					user32.PostMessageW(self.win, msgs["WM_COMMAND"], k, 0) + +	def OnSize(self): +		width, height = WindowSize(self.win) +		self.ed.SizeTo(width, height) +		user32.InvalidateRect(self.win, 0, 0) + +	def OnCreate(self, hwnd): +		self.win = hwnd +		self.ed = Scintilla(self.face, hwnd, hinst) +		self.ed.FocusOn() + + +	def Invalidate(self): +		user32.InvalidateRect(self.win, 0, 0) + +	def WndProc(self, h, m, w, l): +		ms = sgsm.get(m, "XXX") +		if trace: +			print("%s %s %s %s" % (hex(h)[2:],ms,w,l)) +		if ms == "WM_CLOSE": +			user32.PostQuitMessage(0) +		elif ms == "WM_CREATE": +			self.OnCreate(h) +			return 0 +		elif ms == "WM_SIZE": +			# Work out size +			if w != 1: +				self.OnSize() +			return 0 +		elif ms == "WM_COMMAND": +			cmdCode = w & 0xffff +			if cmdCode in self.cmds: +				self.Command(self.cmds[cmdCode]) +			return 0 +		elif ms == "WM_ACTIVATE": +			if w != WA_INACTIVE: +				self.ed.FocusOn() +			return 0 +		else: +			return user32.DefWindowProcW(h, m, w, l) +		return 0 + +	def Command(self, name): +		name = name.replace(" ", "") +		method = "Cmd" + name +		cmd = None +		try: +			cmd = getattr(self, method) +		except AttributeError: +			return +		if cmd: +			cmd() + +	def KeyDown(self, w, prefix = ""): +		keyName = prefix +		if IsKeyDown(VK_CONTROL): +			keyName += "<control>" +		if IsKeyDown(VK_SHIFT): +			keyName += "<shift>" +		keyName += KeyTranslate(w) +		if trace: +			print("Key:", keyName) +		if keyName in self.keys: +			method = "Cmd" + self.keys[keyName] +			getattr(self, method)() +			return True +		#~ print("UKey:", keyName) +		return False + +	def Accelerator(self, msg): +		ms = sgsm.get(msg.message, "XXX") +		if ms == "WM_KEYDOWN": +			return self.KeyDown(msg.wParam) +		elif ms == "WM_SYSKEYDOWN": +			return self.KeyDown(msg.wParam, "<alt>") +		return False + +	def AppLoop(self): +		msg = ctypes.wintypes.MSG() +		lpmsg = ctypes.byref(msg) +		while user32.GetMessageW(lpmsg, 0, 0, 0): +			if trace and msg.message != msgs["WM_TIMER"]: +				print('mm', hex(msg.hWnd)[2:],sgsm.get(msg.message, "XXX")) +			if not self.Accelerator(msg): +				user32.TranslateMessage(lpmsg) +				user32.DispatchMessageW(lpmsg) + +	def DoEvents(self): +		msg = ctypes.wintypes.MSG() +		lpmsg = ctypes.byref(msg) +		cont = True +		while cont: +			cont = user32.PeekMessageW(lpmsg, 0, 0, 0, PM_REMOVE) +			if cont: +				if not self.Accelerator(msg): +					user32.TranslateMessage(lpmsg) +					user32.DispatchMessageW(lpmsg) + +	def SetTitle(self, changePath): +		if changePath or self.titleDirty != self.ed.Modify: +			self.titleDirty = self.ed.Modify +			self.title = self.fullPath +			if self.titleDirty: +				self.title += " * " +			else: +				self.title += " - " +			self.title += self.appName +			if self.win: +				user32.SetWindowTextW(self.win, self.title) + +	def Open(self): +		ofx = OPENFILENAME(self.win, "Open File") +		opath = "\0" * 1024 +		ofx.lpstrFile = opath +		filters = ["Python (.py;.pyw)|*.py;*.pyw|All|*.*"] +		filterText = "\0".join([f.replace("|", "\0") for f in filters])+"\0\0" +		ofx.lpstrFilter = filterText +		if ctypes.windll.comdlg32.GetOpenFileNameW(ctypes.byref(ofx)): +			absPath = opath.replace("\0", "") +			self.GrabFile(absPath) +			self.ed.FocusOn() +			self.ed.LexerLanguage = "python" +			self.ed.Lexer = self.ed.SCLEX_PYTHON +			self.ed.SetKeyWords(0, "class def else for if import print return while") +			for style in [k for k in self.ed.k if k.startswith("SCE_P_")]: +				self.ed.StyleSetFont(self.ed.k[style], "Verdana") +				if "COMMENT" in style: +					self.ed.StyleSetFore(self.ed.k[style], 127 * 256) +					self.ed.StyleSetFont(self.ed.k[style], "Comic Sans MS") +				elif "OPERATOR" in style: +					print(style, self.ed.k[style]) +					self.ed.StyleSetBold(self.ed.k[style], 1) +					self.ed.StyleSetFore(self.ed.k[style], 127 * 256 * 256) +				elif "WORD" in style: +					print(style, self.ed.k[style]) +					self.ed.StyleSetItalic(self.ed.k[style], 255) +					self.ed.StyleSetFore(self.ed.k[style], 255 * 256 * 256) +				else: +					self.ed.StyleSetFore(self.ed.k[style], 0) + +	def SaveAs(self): +		ofx = OPENFILENAME(self.win, "Save File") +		opath = "\0" * 1024 +		ofx.lpstrFile = opath +		if ctypes.windll.comdlg32.GetSaveFileNameW(ctypes.byref(ofx)): +			self.fullPath = opath.replace("\0", "") +			self.Save() +			self.SetTitle(1) +			self.ed.FocusOn() + +	def SetMenus(self): +		ui = XiteMenu.MenuStructure +		self.cmds = {} +		self.keys = {} + +		cmdId = 0 +		self.menuBar = user32.CreateMenu() +		for name, contents in ui: +			cmdId += 1 +			menu = user32.CreateMenu() +			for item in contents: +				text, key = item +				cmdText = text.replace("&", "") +				cmdText = cmdText.replace("...", "") +				cmdText = cmdText.replace(" ", "") +				cmdId += 1 +				if key: +					keyText = key.replace("<control>", "Ctrl+") +					keyText = keyText.replace("<shift>", "Shift+") +					text += "\t" + keyText +				if text == "-": +					user32.AppendMenuW(menu, MF_SEPARATOR, cmdId, text) +				else: +					user32.AppendMenuW(menu, 0, cmdId, text) +				self.cmds[cmdId] = cmdText +				self.keys[key] = cmdText +				#~ print(cmdId, item) +			user32.AppendMenuW(self.menuBar, MF_POPUP, menu, name) +		user32.SetMenu(self.win, self.menuBar) +		self.CheckMenuItem("Wrap", True) +		user32.ShowWindow(self.win, SW_SHOW) + +	def CheckMenuItem(self, name, val): +		#~ print(name, val) +		if self.cmds: +			for k,v in self.cmds.items(): +				if v == name: +					#~ print(name, k) +					user32.CheckMenuItem(user32.GetMenu(self.win), \ +						k, [MF_UNCHECKED, MF_CHECKED][val]) + +	def Exit(self): +		sys.exit(0) + +	def DisplayMessage(self, msg, ask): +		return IDYES == user32.MessageBoxW(self.win, \ +			msg, self.appName, [MB_OK, MB_YESNOCANCEL][ask]) + +	def NewDocument(self): +		self.ed.ClearAll() +		self.ed.EmptyUndoBuffer() +		self.ed.SetSavePoint() + +	def SaveIfUnsure(self): +		if self.ed.Modify: +			msg = "Save changes to \"" + self.fullPath + "\"?" +			print(msg) +			decision = self.DisplayMessage(msg, True) +			if decision: +				self.CmdSave() +			return decision +		return True + +	def New(self): +		if self.SaveIfUnsure(): +			self.fullPath = "" +			self.overrideMode = None +			self.NewDocument() +			self.SetTitle(1) +		self.Invalidate() + +	def CheckMenus(self): +		pass + +	def MoveSelection(self, caret, anchor=-1): +		if anchor == -1: +			anchor = caret +		self.ed.SetSelectionStart(caret) +		self.ed.SetSelectionEnd(anchor) +		self.ed.ScrollCaret() +		self.Invalidate() + +	def GrabFile(self, name): +		self.fullPath = name +		self.overrideMode = None +		self.NewDocument() +		fsr = open(name, "rb") +		data = fsr.read() +		fsr.close() +		self.ed.AddText(len(data), data) +		self.ed.EmptyUndoBuffer() +		self.MoveSelection(0) +		self.SetTitle(1) + +	def Save(self): +		fos = open(self.fullPath, "wb") +		blockSize = 1024 +		length = self.ed.Length +		i = 0 +		while i < length: +			grabSize = length - i +			if grabSize > blockSize: +				grabSize = blockSize +			#~ print(i, grabSize, length) +			data = self.ed.ByteRange(i, i + grabSize) +			fos.write(data) +			i += grabSize +		fos.close() +		self.ed.SetSavePoint() +		self.SetTitle(0) + +	# Command handlers are called by menu actions + +	def CmdNew(self): +		self.New() + +	def CmdOpen(self): +		self.Open() + +	def CmdSave(self): +		if (self.fullPath == None) or (len(self.fullPath) == 0): +			self.SaveAs() +		else: +			self.Save() + +	def CmdSaveAs(self): +		self.SaveAs() + +	def CmdTest(self): +		runner = unittest.TextTestRunner() +		if self.test: +			tests = unittest.defaultTestLoader.loadTestsFromName(self.test) +		else: +			tests = unittest.defaultTestLoader.loadTestsFromName("simpleTests") +		results = runner.run(tests) +		#~ print(results) +		if self.test: +			user32.PostQuitMessage(0) + +	def CmdExercised(self): +		print() +		unused = sorted(self.ed.all.difference(self.ed.used)) +		print("Unused", len(unused)) +		print() +		print("\n".join(unused)) +		print() +		print("Used", len(self.ed.used)) +		print() +		print("\n".join(sorted(self.ed.used))) + +	def CmdUncalled(self): +		print() +		unused = sorted(self.ed.all.difference(self.ed.used)) +		uu = {} +		for u in unused: +			v = self.ed.getvalue(u) +			if v > 2000: +				uu[v] = u +		for x in sorted(uu.keys())[150:]: +			print(x, uu[x]) +		print() + +	def CmdExit(self): +		self.Exit() + +	def CmdUndo(self): +		self.ed.Undo() + +	def CmdRedo(self): +		self.ed.Redo() + +	def CmdCut(self): +		self.ed.Cut() + +	def CmdCopy(self): +		self.ed.Copy() + +	def CmdPaste(self): +		self.ed.Paste() + +	def CmdDelete(self): +		self.ed.Clear() + +xiteFrame = None + +def main(test): +	global xiteFrame +	xiteFrame = XiteWin(test) +	xiteFrame.AppLoop() diff --git a/test/examples/x.asp b/test/examples/x.asp new file mode 100644 index 000000000..a78acdc34 --- /dev/null +++ b/test/examples/x.asp @@ -0,0 +1,12 @@ +<%@language=javas%> +<%  +#include  +function x() { +} +%> +<%@language=vbscript%> +<%  +sub x 'comment  +%> +<head> +<body></body> diff --git a/test/examples/x.asp.styled b/test/examples/x.asp.styled new file mode 100644 index 000000000..920c6380d --- /dev/null +++ b/test/examples/x.asp.styled @@ -0,0 +1,12 @@ +{15}<%@{16}language=javas{15}%>{0} +{15}<%{56}  +#{61}include{56}  +{62}function{56} {61}x{65}(){56} {65}{{56} +{65}}{56} +{15}%>{0} +{15}<%@{16}language=vbscript{15}%>{0} +{15}<%{81}  +{84}sub{81} {86}x{81} {82}'comment {81} +{15}%>{0} +{1}<head>{0} +{1}<body></body>{0} diff --git a/test/examples/x.cxx b/test/examples/x.cxx new file mode 100644 index 000000000..255a70e7c --- /dev/null +++ b/test/examples/x.cxx @@ -0,0 +1,4 @@ +// A demonstration program +int main() { +	printf("hello world %d\n", 9); +} diff --git a/test/examples/x.cxx.styled b/test/examples/x.cxx.styled new file mode 100644 index 000000000..223ee0760 --- /dev/null +++ b/test/examples/x.cxx.styled @@ -0,0 +1,4 @@ +{2}// A demonstration program +{5}int{0} {11}main{10}(){0} {10}{{0} +	{11}printf{10}({6}"hello world %d\n"{10},{0} {4}9{10});{0} +{10}}{0} diff --git a/test/examples/x.html b/test/examples/x.html new file mode 100644 index 000000000..1d325dc76 --- /dev/null +++ b/test/examples/x.html @@ -0,0 +1,7 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +    <meta name="Date.Modified" content="20010515" /> +    <title>SinkWorld - Portability</title> +    <unknown>SinkWorld - Portability</unknown> +    <link rel="stylesheet" type="text/css" href="SW.css"> +</head> diff --git a/test/examples/x.html.styled b/test/examples/x.html.styled new file mode 100644 index 000000000..3bcb7bca1 --- /dev/null +++ b/test/examples/x.html.styled @@ -0,0 +1,7 @@ +{1}<html{8} {3}xmlns{8}={6}"http://www.w3.org/1999/xhtml"{1}>{0} +{1}<head>{0} +    {1}<meta{8} {3}name{8}={6}"Date.Modified"{8} {3}content{8}={6}"20010515"{8} {11}/>{0} +    {1}<title>{0}SinkWorld - Portability{1}</title>{0} +    {2}<unknown>{0}SinkWorld - Portability{2}</unknown>{0} +    {1}<link{8} {3}rel{8}={6}"stylesheet"{8} {3}type{8}={6}"text/css"{8} {3}href{8}={6}"SW.css"{1}>{0} +{1}</head>{0} diff --git a/test/examples/x.php b/test/examples/x.php new file mode 100644 index 000000000..bc7302d85 --- /dev/null +++ b/test/examples/x.php @@ -0,0 +1,6 @@ +<head> <!-- About to script --> +<?php +echo "<!-- -->\n"; +/* ?> */ +?> +<strong>for</strong><b>if</b> diff --git a/test/examples/x.php.styled b/test/examples/x.php.styled new file mode 100644 index 000000000..fb90ba06e --- /dev/null +++ b/test/examples/x.php.styled @@ -0,0 +1,6 @@ +{1}<head>{0} {9}<!-- About to script -->{0} +{18}<?php{118} +echo {119}"<!-- -->\n"{127};{118} +{124}/* ?> */{118} +{18}?>{0} +{1}<strong>{0}for{1}</strong><b>{0}if{1}</b>{0} diff --git a/test/examples/x.py b/test/examples/x.py new file mode 100644 index 000000000..12c4b71df --- /dev/null +++ b/test/examples/x.py @@ -0,0 +1,11 @@ +# Convert all punctuation characters except '_', '*', and '.' into spaces. +def depunctuate(s): +	'''A docstring''' +	"""Docstring 2""" +	d = "" +	for ch in s: +		if ch in 'abcde': +			d = d + ch +		else: +			d = d + " " +	return d diff --git a/test/examples/x.py.styled b/test/examples/x.py.styled new file mode 100644 index 000000000..02f94a923 --- /dev/null +++ b/test/examples/x.py.styled @@ -0,0 +1,11 @@ +{1}# Convert all punctuation characters except '_', '*', and '.' into spaces.{0} +{5}def{0} {9}depunctuate{10}({11}s{10}):{0} +	{6}'''A docstring'''{0} +	{7}"""Docstring 2"""{0} +	{11}d{0} {10}={0} {3}""{0} +	{5}for{0} {11}ch{0} {5}in{0} {11}s{10}:{0} +		{5}if{0} {11}ch{0} {5}in{0} {4}'abcde'{10}:{0} +			{11}d{0} {10}={0} {11}d{0} {10}+{0} {11}ch{0} +		{5}else{10}:{0} +			{11}d{0} {10}={0} {11}d{0} {10}+{0} {3}" "{0} +	{5}return{0} {11}d{0} diff --git a/test/examples/x.vb b/test/examples/x.vb new file mode 100644 index 000000000..a4503704b --- /dev/null +++ b/test/examples/x.vb @@ -0,0 +1,9 @@ +' String" +Dim a As String = "hello, world" +Dim b As String = "hello    world" +Dim c As String = "Joe said ""Hello"" to me" +Dim d As String = "\\\\server\\share\\file.txt" +' Character +""C "c"C "cc"C +' Date +d = #5/31/1993# or # 01/01/0001 12:00:00AM # diff --git a/test/examples/x.vb.styled b/test/examples/x.vb.styled new file mode 100644 index 000000000..e0c86f918 --- /dev/null +++ b/test/examples/x.vb.styled @@ -0,0 +1,9 @@ +{1}' String" +{3}Dim{0} {7}a{0} {3}As{0} {3}String{0} {6}={0} {4}"hello, world"{0} +{3}Dim{0} {7}b{0} {3}As{0} {3}String{0} {6}={0} {4}"hello    world"{0} +{3}Dim{0} {7}c{0} {3}As{0} {3}String{0} {6}={0} {4}"Joe said ""Hello"" to me"{0} +{3}Dim{0} {7}d{0} {3}As{0} {3}String{0} {6}={0} {4}"\\\\server\\share\\file.txt"{0} +{1}' Character +{4}""C{0} {4}"c"C{0} {4}"cc"C{0} +{1}' Date +{7}d{0} {6}={0} {8}#5/31/1993#{0} {3}or{0} {8}# 01/01/0001 12:00:00AM #{0} 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") diff --git a/test/performanceTests.py b/test/performanceTests.py new file mode 100644 index 000000000..ed0550558 --- /dev/null +++ b/test/performanceTests.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import os, string, time, unittest + +import XiteWin + +class TestPerformance(unittest.TestCase): + +	def setUp(self): +		self.xite = XiteWin.xiteFrame +		self.ed = self.xite.ed +		self.ed.ClearAll() +		self.ed.EmptyUndoBuffer() + +	def testAddLine(self): +		data = (string.ascii_letters + string.digits + "\n").encode('utf-8') +		start = time.time() +		for i in range(500): +			self.ed.AddText(len(data), data) +			self.assertEquals(self.ed.LineCount, i + 2) +		end = time.time() +		duration = end - start +		print("%6.3f testAddLine" % duration) +		self.xite.DoEvents() +		self.assert_(self.ed.Length > 0) + +	def testAddLineMiddle(self): +		data = (string.ascii_letters + string.digits + "\n").encode('utf-8') +		start = time.time() +		for i in range(500): +			self.ed.AddText(len(data), data) +			self.assertEquals(self.ed.LineCount, i + 2) +		end = time.time() +		duration = end - start +		print("%6.3f testAddLineMiddle" % duration) +		self.xite.DoEvents() +		self.assert_(self.ed.Length > 0) + +	def testHuge(self): +		data = (string.ascii_letters + string.digits + "\n").encode('utf-8') +		data = data * 100000 +		print("len is", len(data)) +		start = time.time() +		self.ed.AddText(len(data), data) +		end = time.time() +		duration = end - start +		print("%6.3f testHuge" % duration) +		self.xite.DoEvents() +		self.assert_(self.ed.Length > 0) + +	def testHugeInserts(self): +		data = (string.ascii_letters + string.digits + "\n").encode('utf-8') +		data = data * 100000 +		insert = (string.digits + "\n").encode('utf-8') +		self.ed.AddText(len(data), data) +		start = time.time() +		for i in range(500): +			self.ed.InsertText(0, insert) +		end = time.time() +		duration = end - start +		print("%6.3f testHugeInserts" % duration) +		self.xite.DoEvents() +		self.assert_(self.ed.Length > 0) + +	def testHugeReplace(self): +		oneLine = (string.ascii_letters + string.digits + "\n").encode('utf-8') +		data = oneLine * 100000 +		insert = (string.digits + "\n").encode('utf-8') +		self.ed.AddText(len(data), data) +		start = time.time() +		for i in range(500): +			self.ed.TargetStart = i * len(insert) +			self.ed.TargetEnd = self.ed.TargetStart + len(oneLine) +			self.ed.ReplaceTarget(len(insert), insert) +		end = time.time() +		duration = end - start +		print("%6.3f testHugeReplace" % duration) +		self.xite.DoEvents() +		self.assert_(self.ed.Length > 0) + +if __name__ == '__main__': +	XiteWin.main("performanceTests") diff --git a/test/simpleTests.py b/test/simpleTests.py new file mode 100644 index 000000000..3697e93f2 --- /dev/null +++ b/test/simpleTests.py @@ -0,0 +1,897 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import ctypes, os, unittest + +import XiteWin + +class TestSimple(unittest.TestCase): + +	def setUp(self): +		self.xite = XiteWin.xiteFrame +		self.ed = self.xite.ed +		self.ed.ClearAll() +		self.ed.EmptyUndoBuffer() + +	def testLength(self): +		self.assertEquals(self.ed.Length, 0) + +	def testAddText(self): +		self.ed.AddText(1, "x") +		self.assertEquals(self.ed.Length, 1) +		self.assertEquals(self.ed.GetCharAt(0), ord("x")) +		self.assertEquals(self.ed.GetStyleAt(0), 0) +		self.ed.ClearAll() +		self.assertEquals(self.ed.Length, 0) + +	def testAddStyledText(self): +		self.assertEquals(self.ed.EndStyled, 0) +		self.ed.AddStyledText(2, b"x\002") +		self.assertEquals(self.ed.Length, 1) +		self.assertEquals(self.ed.GetCharAt(0), ord("x")) +		self.assertEquals(self.ed.GetStyleAt(0), 2) +		self.assertEquals(self.ed.StyledTextRange(0, 1), b"x\002") +		self.ed.ClearDocumentStyle() +		self.assertEquals(self.ed.Length, 1) +		self.assertEquals(self.ed.GetCharAt(0), ord("x")) +		self.assertEquals(self.ed.GetStyleAt(0), 0) +		self.assertEquals(self.ed.StyledTextRange(0, 1), b"x\0") + +	def testStyling(self): +		self.assertEquals(self.ed.EndStyled, 0) +		self.ed.AddStyledText(4, b"x\002y\003") +		self.assertEquals(self.ed.StyledTextRange(0, 2), b"x\002y\003") +		self.ed.StartStyling(0,0xf) +		self.ed.SetStyling(1, 5) +		self.assertEquals(self.ed.StyledTextRange(0, 2), b"x\005y\003") +		# Set the mask so 0 bit changed but not 2 bit +		self.ed.StartStyling(0,0x1) +		self.ed.SetStyling(1, 0) +		self.assertEquals(self.ed.StyledTextRange(0, 2), b"x\004y\003") + +		self.ed.StartStyling(0,0xff) +		self.ed.SetStylingEx(2, b"\100\101") +		self.assertEquals(self.ed.StyledTextRange(0, 2), b"x\100y\101") + +	def testPosition(self): +		self.assertEquals(self.ed.CurrentPos, 0) +		self.assertEquals(self.ed.Anchor, 0) +		self.ed.AddText(1, "x") +		# Caret has automatically moved +		self.assertEquals(self.ed.CurrentPos, 1) +		self.assertEquals(self.ed.Anchor, 1) +		self.ed.SelectAll() +		self.assertEquals(self.ed.CurrentPos, 0) +		self.assertEquals(self.ed.Anchor, 1) +		self.ed.Anchor = 0 +		self.assertEquals(self.ed.Anchor, 0) +		# Check line positions +		self.assertEquals(self.ed.PositionFromLine(0), 0) +		self.assertEquals(self.ed.GetLineEndPosition(0), 1) +		self.assertEquals(self.ed.PositionFromLine(1), 1) + +		self.ed.CurrentPos = 1 +		self.assertEquals(self.ed.Anchor, 0) +		self.assertEquals(self.ed.CurrentPos, 1) + +	def testSelection(self): +		self.assertEquals(self.ed.CurrentPos, 0) +		self.assertEquals(self.ed.Anchor, 0) +		self.assertEquals(self.ed.SelectionStart, 0) +		self.assertEquals(self.ed.SelectionEnd, 0) +		self.ed.AddText(1, "x") +		self.ed.SelectionStart = 0 +		self.assertEquals(self.ed.CurrentPos, 1) +		self.assertEquals(self.ed.Anchor, 0) +		self.assertEquals(self.ed.SelectionStart, 0) +		self.assertEquals(self.ed.SelectionEnd, 1) +		self.ed.SelectionStart = 1 +		self.assertEquals(self.ed.CurrentPos, 1) +		self.assertEquals(self.ed.Anchor, 1) +		self.assertEquals(self.ed.SelectionStart, 1) +		self.assertEquals(self.ed.SelectionEnd, 1) + +		self.ed.SelectionEnd = 0 +		self.assertEquals(self.ed.CurrentPos, 0) +		self.assertEquals(self.ed.Anchor, 0) + +	def testSetSelection(self): +		self.ed.AddText(4, b"abcd") +		self.ed.SetSel(1, 3) +		self.assertEquals(self.ed.SelectionStart, 1) +		self.assertEquals(self.ed.SelectionEnd, 3) +		result = b"\0" * 5 +		length = self.ed.GetSelText(0, result) +		self.assertEquals(length, 3) +		self.assertEquals(result[:length], b"bc\0") +		self.ed.ReplaceSel(0, b"1234") +		self.assertEquals(self.ed.Length, 6) +		self.assertEquals(self.ed.Contents(), b"a1234d") + +	def testReadOnly(self): +		self.ed.AddText(1, b"x") +		self.assertEquals(self.ed.ReadOnly, 0) +		self.assertEquals(self.ed.Contents(), b"x") +		self.ed.ReadOnly = 1 +		self.assertEquals(self.ed.ReadOnly, 1) +		self.ed.AddText(1, b"x") +		self.assertEquals(self.ed.Contents(), b"x") +		self.ed.ReadOnly = 0 +		self.ed.AddText(1, b"x") +		self.assertEquals(self.ed.Contents(), b"xx") +		self.ed.Null() +		self.assertEquals(self.ed.Contents(), b"xx") + +	def testAddLine(self): +		data = b"x" * 70 + b"\n" +		for i in range(5): +			self.ed.AddText(len(data), data) +			self.xite.DoEvents() +			self.assertEquals(self.ed.LineCount, i + 2) +		self.assert_(self.ed.Length > 0) + +	def testInsertText(self): +		data = b"xy" +		self.ed.InsertText(0, data) +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(data, self.ed.ByteRange(0,2)) + +		self.ed.InsertText(1, data) +		# Should now be "xxyy" +		self.assertEquals(self.ed.Length, 4) +		self.assertEquals(b"xxyy", self.ed.ByteRange(0,4)) + +	def testInsertNul(self): +		data = b"\0" +		self.ed.AddText(1, data) +		self.assertEquals(self.ed.Length, 1) +		self.assertEquals(data, self.ed.ByteRange(0,1)) + +	def testUndoRedo(self): +		data = b"xy" +		self.assertEquals(self.ed.Modify, 0) +		self.assertEquals(self.ed.UndoCollection, 1) +		self.assertEquals(self.ed.CanRedo(), 0) +		self.assertEquals(self.ed.CanUndo(), 0) +		self.ed.InsertText(0, data) +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.ed.Modify, 1) +		self.assertEquals(self.ed.CanRedo(), 0) +		self.assertEquals(self.ed.CanUndo(), 1) +		self.ed.Undo() +		self.assertEquals(self.ed.Length, 0) +		self.assertEquals(self.ed.Modify, 0) +		self.assertEquals(self.ed.CanRedo(), 1) +		self.assertEquals(self.ed.CanUndo(), 0) +		self.ed.Redo() +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.ed.Modify, 1) +		self.assertEquals(data, self.ed.Contents()) +		self.assertEquals(self.ed.CanRedo(), 0) +		self.assertEquals(self.ed.CanUndo(), 1) + +	def testUndoSavePoint(self): +		data = b"xy" +		self.assertEquals(self.ed.Modify, 0) +		self.ed.InsertText(0, data) +		self.assertEquals(self.ed.Modify, 1) +		self.ed.SetSavePoint() +		self.assertEquals(self.ed.Modify, 0) +		self.ed.InsertText(0, data) +		self.assertEquals(self.ed.Modify, 1) + +	def testUndoCollection(self): +		data = b"xy" +		self.assertEquals(self.ed.UndoCollection, 1) +		self.ed.UndoCollection = 0 +		self.assertEquals(self.ed.UndoCollection, 0) +		self.ed.InsertText(0, data) +		self.assertEquals(self.ed.CanRedo(), 0) +		self.assertEquals(self.ed.CanUndo(), 0) +		self.ed.UndoCollection = 1 + +	def testGetColumn(self): +		self.ed.AddText(1, b"x") +		self.assertEquals(self.ed.GetColumn(0), 0) +		self.assertEquals(self.ed.GetColumn(1), 1) +		# Next line caused infinite loop in 1.71 +		self.assertEquals(self.ed.GetColumn(2), 1) +		self.assertEquals(self.ed.GetColumn(3), 1) + +	def testTabWidth(self): +		self.assertEquals(self.ed.TabWidth, 8) +		self.ed.AddText(3, b"x\tb") +		self.assertEquals(self.ed.GetColumn(0), 0) +		self.assertEquals(self.ed.GetColumn(1), 1) +		self.assertEquals(self.ed.GetColumn(2), 8) +		for col in range(10): +			if col == 0: +				self.assertEquals(self.ed.FindColumn(0, col), 0) +			elif col == 1: +				self.assertEquals(self.ed.FindColumn(0, col), 1) +			elif col == 9: +				self.assertEquals(self.ed.FindColumn(0, col), 3) +			else: +				self.assertEquals(self.ed.FindColumn(0, col), 2) +		self.ed.TabWidth = 4 +		self.assertEquals(self.ed.TabWidth, 4) +		self.assertEquals(self.ed.GetColumn(0), 0) +		self.assertEquals(self.ed.GetColumn(1), 1) +		self.assertEquals(self.ed.GetColumn(2), 4) + +	def testIndent(self): +		self.assertEquals(self.ed.Indent, 0) +		self.assertEquals(self.ed.UseTabs, 1) +		self.ed.Indent = 8 +		self.ed.UseTabs = 0 +		self.assertEquals(self.ed.Indent, 8) +		self.assertEquals(self.ed.UseTabs, 0) +		self.ed.AddText(3, b"x\tb") +		self.assertEquals(self.ed.GetLineIndentation(0), 0) +		self.ed.InsertText(0, b" ") +		self.assertEquals(self.ed.GetLineIndentation(0), 1) +		self.assertEquals(self.ed.GetLineIndentPosition(0), 1) +		self.assertEquals(self.ed.Contents(), b" x\tb") +		self.ed.SetLineIndentation(0,2) +		self.assertEquals(self.ed.Contents(), b"  x\tb") +		self.assertEquals(self.ed.GetLineIndentPosition(0), 2) +		self.ed.UseTabs = 1 +		self.ed.SetLineIndentation(0,8) +		self.assertEquals(self.ed.Contents(), b"\tx\tb") +		self.assertEquals(self.ed.GetLineIndentPosition(0), 1) + +	def testGetCurLine(self): +		self.ed.AddText(1, b"x") +		data = b"\0" * 100 +		caret = self.ed.GetCurLine(len(data), data) +		data = data.rstrip(b"\0") +		self.assertEquals(caret, 1) +		self.assertEquals(data, b"x") + +	def testGetLine(self): +		self.ed.AddText(1, b"x") +		data = b"\0" * 100 +		length = self.ed.GetLine(0, data) +		self.assertEquals(length, 1) +		data = data[:length] +		self.assertEquals(data, b"x") + +	def testLineEnds(self): +		self.ed.AddText(3, b"x\ny") +		self.assertEquals(self.ed.GetLineEndPosition(0), 1) +		self.assertEquals(self.ed.GetLineEndPosition(1), 3) +		self.assertEquals(self.ed.LineLength(0), 2) +		self.assertEquals(self.ed.LineLength(1), 1) +		self.assertEquals(self.ed.EOLMode, self.ed.SC_EOL_CRLF) +		lineEnds = [b"\r\n", b"\r", b"\n"] +		for lineEndType in [self.ed.SC_EOL_CR, self.ed.SC_EOL_LF, self.ed.SC_EOL_CRLF]: +			self.ed.EOLMode = lineEndType +			self.assertEquals(self.ed.EOLMode, lineEndType) +			self.ed.ConvertEOLs(lineEndType) +			self.assertEquals(self.ed.Contents(), b"x" + lineEnds[lineEndType] + b"y") +			self.assertEquals(self.ed.LineLength(0), 1 + len(lineEnds[lineEndType])) + +	def testGoto(self): +		self.ed.AddText(5, b"a\nb\nc") +		self.assertEquals(self.ed.CurrentPos, 5) +		self.ed.GotoLine(1) +		self.assertEquals(self.ed.CurrentPos, 2) +		self.ed.GotoPos(4) +		self.assertEquals(self.ed.CurrentPos, 4) + +	def testCutCopyPaste(self): +		self.ed.AddText(5, b"a1b2c") +		self.ed.SetSel(1,3) +		self.ed.Cut() +		self.assertEquals(self.ed.CanPaste(), 1) +		self.ed.SetSel(0, 0) +		self.ed.Paste() +		self.assertEquals(self.ed.Contents(), b"1ba2c") +		self.ed.SetSel(4,5) +		self.ed.Copy() +		self.ed.SetSel(1,3) +		self.ed.Paste() +		self.assertEquals(self.ed.Contents(), b"1c2c") +		self.ed.SetSel(2,4) +		self.ed.Clear() +		self.assertEquals(self.ed.Contents(), b"1c") + +	def testGetSet(self): +		self.ed.SetText(0, b"abc") +		self.assertEquals(self.ed.TextLength, 3) +		result = b"\0" * 5 +		length = self.ed.GetText(4, result) +		result = result[:length] +		self.assertEquals(result, b"abc") + +	def testAppend(self): +		self.ed.SetText(0, b"abc") +		self.assertEquals(self.ed.SelectionStart, 0) +		self.assertEquals(self.ed.SelectionEnd, 0) +		text = b"12" +		self.ed.AppendText(len(text), text) +		self.assertEquals(self.ed.SelectionStart, 0) +		self.assertEquals(self.ed.SelectionEnd, 0) +		self.assertEquals(self.ed.Contents(), b"abc12") + +	def testTarget(self): +		self.ed.SetText(0, b"abcd") +		self.ed.TargetStart = 1 +		self.ed.TargetEnd = 3 +		self.assertEquals(self.ed.TargetStart, 1) +		self.assertEquals(self.ed.TargetEnd, 3) +		rep = b"321" +		self.ed.ReplaceTarget(len(rep), rep) +		self.assertEquals(self.ed.Contents(), b"a321d") +		self.ed.SearchFlags = self.ed.SCFIND_REGEXP +		self.assertEquals(self.ed.SearchFlags, self.ed.SCFIND_REGEXP) +		searchString = b"\([1-9]+\)" +		pos = self.ed.SearchInTarget(len(searchString), searchString) +		self.assertEquals(1, pos) +		rep = b"\\1" +		self.ed.TargetStart = 0 +		self.ed.TargetEnd = 0 +		self.ed.ReplaceTargetRE(len(rep), rep) +		self.assertEquals(self.ed.Contents(), b"321a321d") +		self.ed.SetSel(4,5) +		self.ed.TargetFromSelection() +		self.assertEquals(self.ed.TargetStart, 4) +		self.assertEquals(self.ed.TargetEnd, 5) + +	def testPointsAndPositions(self): +		self.ed.AddText(1, b"x") +		# Start of text +		self.assertEquals(self.ed.PositionFromPoint(0,0), 0) +		# End of text +		self.assertEquals(self.ed.PositionFromPoint(0,100), 1) + +	def testLinePositions(self): +		text = b"ab\ncd\nef" +		self.ed.AddText(len(text), text) +		self.assertEquals(self.ed.LineFromPosition(-1), 0) +		line = 0 +		for pos in range(len(text)+1): +			self.assertEquals(self.ed.LineFromPosition(pos), line) +			if pos < len(text) and text[pos] == ord("\n"): +				line += 1 + +	def testWordPositions(self): +		text = b"ab cd\tef" +		self.ed.AddText(len(text), text) +		self.assertEquals(self.ed.WordStartPosition(3, 0), 2) +		self.assertEquals(self.ed.WordStartPosition(4, 0), 3) +		self.assertEquals(self.ed.WordStartPosition(5, 0), 3) +		self.assertEquals(self.ed.WordStartPosition(6, 0), 5) + +		self.assertEquals(self.ed.WordEndPosition(2, 0), 3) +		self.assertEquals(self.ed.WordEndPosition(3, 0), 5) +		self.assertEquals(self.ed.WordEndPosition(4, 0), 5) +		self.assertEquals(self.ed.WordEndPosition(5, 0), 6) +		self.assertEquals(self.ed.WordEndPosition(6, 0), 8) + +MODI = 1 +UNDO = 2 +REDO = 4 + +class TestContainerUndo(unittest.TestCase): + +	def setUp(self): +		self.xite = XiteWin.xiteFrame +		self.ed = self.xite.ed +		self.ed.ClearAll() +		self.ed.EmptyUndoBuffer() +		self.data = b"xy" + +	def UndoState(self): +		return (MODI if self.ed.Modify else 0) | \ +			(UNDO if self.ed.CanUndo() else 0) | \ +			(REDO if self.ed.CanRedo() else 0) + +	def testContainerActNoCoalesce(self): +		self.ed.InsertText(0, self.data) +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.AddUndoAction(5, 0) +		self.ed.Undo() +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO | REDO) +		self.ed.Redo() +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.Undo() +	 +	def testContainerActCoalesce(self): +		self.ed.InsertText(0, self.data) +		self.ed.AddUndoAction(5, 1) +		self.ed.Undo() +		self.assertEquals(self.ed.Length, 0) +		self.assertEquals(self.UndoState(), REDO) +		self.ed.Redo() +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) + +	def testContainerMultiStage(self): +		self.ed.InsertText(0, self.data) +		self.ed.AddUndoAction(5, 1) +		self.ed.AddUndoAction(5, 1) +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.Undo() +		self.assertEquals(self.ed.Length, 0) +		self.assertEquals(self.UndoState(), REDO) +		self.ed.Redo() +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.AddUndoAction(5, 1) +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.Undo() +		self.assertEquals(self.ed.Length, 0) +		self.assertEquals(self.UndoState(), REDO) + +	def testContainerMultiStageNoText(self): +		self.ed.AddUndoAction(5, 1) +		self.ed.AddUndoAction(5, 1) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.Undo() +		self.assertEquals(self.UndoState(), REDO) +		self.ed.Redo() +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.AddUndoAction(5, 1) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.Undo() +		self.assertEquals(self.UndoState(), REDO) + +	def testContainerActCoalesceEnd(self): +		self.ed.AddUndoAction(5, 1) +		self.assertEquals(self.ed.Length, 0) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.InsertText(0, self.data) +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.Undo() +		self.assertEquals(self.ed.Length, 0) +		self.assertEquals(self.UndoState(), REDO) +		self.ed.Redo() +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) + +	def testContainerBetweenInsertAndInsert(self): +		self.assertEquals(self.ed.Length, 0) +		self.ed.InsertText(0, self.data) +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.AddUndoAction(5, 1) +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.InsertText(2, self.data) +		self.assertEquals(self.ed.Length, 4) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		# Undoes both insertions and the containerAction in the middle +		self.ed.Undo() +		self.assertEquals(self.ed.Length, 0) +		self.assertEquals(self.UndoState(), REDO) + +	def testContainerNoCoalesceBetweenInsertAndInsert(self): +		self.assertEquals(self.ed.Length, 0) +		self.ed.InsertText(0, self.data) +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.AddUndoAction(5, 0) +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.InsertText(2, self.data) +		self.assertEquals(self.ed.Length, 4) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		# Undo last insertion +		self.ed.Undo() +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO | REDO) +		# Undo container +		self.ed.Undo() +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO | REDO) +		# Undo first insertion +		self.ed.Undo() +		self.assertEquals(self.ed.Length, 0) +		self.assertEquals(self.UndoState(), REDO) + +	def testContainerBetweenDeleteAndDelete(self): +		self.ed.InsertText(0, self.data) +		self.ed.EmptyUndoBuffer() +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), 0) +		self.ed.SetSel(2,2) +		self.ed.DeleteBack() +		self.assertEquals(self.ed.Length, 1) +		self.ed.AddUndoAction(5, 1) +		self.ed.DeleteBack() +		self.assertEquals(self.ed.Length, 0) +		# Undoes both deletions and the containerAction in the middle +		self.ed.Undo() +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), REDO) + +	def testContainerBetweenInsertAndDelete(self): +		self.assertEquals(self.ed.Length, 0) +		self.ed.InsertText(0, self.data) +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.AddUndoAction(5, 1) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.SetSel(0,1) +		self.ed.Cut() +		self.assertEquals(self.ed.Length, 1) +		self.assertEquals(self.UndoState(), MODI | UNDO) +		self.ed.Undo()	# Only undoes the deletion +		self.assertEquals(self.ed.Length, 2) +		self.assertEquals(self.UndoState(), MODI | UNDO | REDO) + +class TestKeyCommands(unittest.TestCase): +	""" These commands are normally assigned to keys and take no arguments """ + +	def setUp(self): +		self.xite = XiteWin.xiteFrame +		self.ed = self.xite.ed +		self.ed.ClearAll() +		self.ed.EmptyUndoBuffer() + +	def selRange(self): +		return self.ed.CurrentPos, self.ed.Anchor + +	def testLineMove(self): +		self.ed.AddText(8, b"x1\ny2\nz3") +		self.ed.SetSel(0,0) +		self.ed.ChooseCaretX() +		self.ed.LineDown() +		self.ed.LineDown() +		self.assertEquals(self.selRange(), (6, 6)) +		self.ed.LineUp() +		self.assertEquals(self.selRange(), (3, 3)) +		self.ed.LineDownExtend() +		self.assertEquals(self.selRange(), (6, 3)) +		self.ed.LineUpExtend() +		self.ed.LineUpExtend() +		self.assertEquals(self.selRange(), (0, 3)) + +	def testCharMove(self): +		self.ed.AddText(8, b"x1\ny2\nz3") +		self.ed.SetSel(0,0) +		self.ed.CharRight() +		self.ed.CharRight() +		self.assertEquals(self.selRange(), (2, 2)) +		self.ed.CharLeft() +		self.assertEquals(self.selRange(), (1, 1)) +		self.ed.CharRightExtend() +		self.assertEquals(self.selRange(), (2, 1)) +		self.ed.CharLeftExtend() +		self.ed.CharLeftExtend() +		self.assertEquals(self.selRange(), (0, 1)) + +	def testWordMove(self): +		self.ed.AddText(10, b"a big boat") +		self.ed.SetSel(3,3) +		self.ed.WordRight() +		self.ed.WordRight() +		self.assertEquals(self.selRange(), (10, 10)) +		self.ed.WordLeft() +		self.assertEquals(self.selRange(), (6, 6)) +		self.ed.WordRightExtend() +		self.assertEquals(self.selRange(), (10, 6)) +		self.ed.WordLeftExtend() +		self.ed.WordLeftExtend() +		self.assertEquals(self.selRange(), (2, 6)) + +	def testHomeEndMove(self): +		self.ed.AddText(10, b"a big boat") +		self.ed.SetSel(3,3) +		self.ed.Home() +		self.assertEquals(self.selRange(), (0, 0)) +		self.ed.LineEnd() +		self.assertEquals(self.selRange(), (10, 10)) +		self.ed.SetSel(3,3) +		self.ed.HomeExtend() +		self.assertEquals(self.selRange(), (0, 3)) +		self.ed.LineEndExtend() +		self.assertEquals(self.selRange(), (10, 3)) + +	def testStartEndMove(self): +		self.ed.AddText(10, b"a\nbig\nboat") +		self.ed.SetSel(3,3) +		self.ed.DocumentStart() +		self.assertEquals(self.selRange(), (0, 0)) +		self.ed.DocumentEnd() +		self.assertEquals(self.selRange(), (10, 10)) +		self.ed.SetSel(3,3) +		self.ed.DocumentStartExtend() +		self.assertEquals(self.selRange(), (0, 3)) +		self.ed.DocumentEndExtend() +		self.assertEquals(self.selRange(), (10, 3)) + + +class TestMarkers(unittest.TestCase): + +	def setUp(self): +		self.xite = XiteWin.xiteFrame +		self.ed = self.xite.ed +		self.ed.ClearAll() +		self.ed.EmptyUndoBuffer() +		self.ed.AddText(5, b"x\ny\nz") + +	def testMarker(self): +		handle = self.ed.MarkerAdd(1,1) +		self.assertEquals(self.ed.MarkerLineFromHandle(handle), 1) +		self.ed.MarkerDelete(1,1) +		self.assertEquals(self.ed.MarkerLineFromHandle(handle), -1) + +	def testMarkerDeleteAll(self): +		h1 = self.ed.MarkerAdd(0,1) +		h2 = self.ed.MarkerAdd(1,2) +		self.assertEquals(self.ed.MarkerLineFromHandle(h1), 0) +		self.assertEquals(self.ed.MarkerLineFromHandle(h2), 1) +		self.ed.MarkerDeleteAll(1) +		self.assertEquals(self.ed.MarkerLineFromHandle(h1), -1) +		self.assertEquals(self.ed.MarkerLineFromHandle(h2), 1) +		self.ed.MarkerDeleteAll(-1) +		self.assertEquals(self.ed.MarkerLineFromHandle(h1), -1) +		self.assertEquals(self.ed.MarkerLineFromHandle(h2), -1) + +	def testMarkerDeleteHandle(self): +		handle = self.ed.MarkerAdd(0,1) +		self.assertEquals(self.ed.MarkerLineFromHandle(handle), 0) +		self.ed.MarkerDeleteHandle(handle) +		self.assertEquals(self.ed.MarkerLineFromHandle(handle), -1) + +	def testMarkerBits(self): +		self.assertEquals(self.ed.MarkerGet(0), 0) +		self.ed.MarkerAdd(0,1) +		self.assertEquals(self.ed.MarkerGet(0), 2) +		self.ed.MarkerAdd(0,2) +		self.assertEquals(self.ed.MarkerGet(0), 6) + +	def testMarkerAddSet(self): +		self.assertEquals(self.ed.MarkerGet(0), 0) +		self.ed.MarkerAddSet(0,5) +		self.assertEquals(self.ed.MarkerGet(0), 5) +		self.ed.MarkerDeleteAll(-1) + +	def testMarkerNext(self): +		h1 = self.ed.MarkerAdd(0,1) +		h2 = self.ed.MarkerAdd(2,1) +		self.assertEquals(self.ed.MarkerNext(0, 2), 0) +		self.assertEquals(self.ed.MarkerNext(1, 2), 2) +		self.assertEquals(self.ed.MarkerNext(2, 2), 2) +		self.assertEquals(self.ed.MarkerPrevious(0, 2), 0) +		self.assertEquals(self.ed.MarkerPrevious(1, 2), 0) +		self.assertEquals(self.ed.MarkerPrevious(2, 2), 2) + +	def testLineState(self): +		self.assertEquals(self.ed.MaxLineState, 0) +		self.assertEquals(self.ed.GetLineState(0), 0) +		self.assertEquals(self.ed.GetLineState(1), 0) +		self.assertEquals(self.ed.GetLineState(2), 0) +		self.ed.SetLineState(1, 100) +		self.assertNotEquals(self.ed.MaxLineState, 0) +		self.assertEquals(self.ed.GetLineState(0), 0) +		self.assertEquals(self.ed.GetLineState(1), 100) +		self.assertEquals(self.ed.GetLineState(2), 0) +		 +	def testSymbolRetrieval(self): +		self.ed.MarkerDefine(1,3) +		self.assertEquals(self.ed.MarkerSymbolDefined(1), 3) + +class TestIndicators(unittest.TestCase): + +	def setUp(self): +		self.xite = XiteWin.xiteFrame +		self.ed = self.xite.ed +		self.ed.ClearAll() +		self.ed.EmptyUndoBuffer() + +	def testSetIndicator(self): +		self.assertEquals(self.ed.IndicGetStyle(0), 1) +		self.assertEquals(self.ed.IndicGetFore(0), 0x007f00) +		self.ed.IndicSetStyle(0, 2) +		self.ed.IndicSetFore(0, 0xff0080) +		self.assertEquals(self.ed.IndicGetStyle(0), 2) +		self.assertEquals(self.ed.IndicGetFore(0), 0xff0080) + +class TestSearch(unittest.TestCase): + +	def setUp(self): +		self.xite = XiteWin.xiteFrame +		self.ed = self.xite.ed +		self.ed.ClearAll() +		self.ed.EmptyUndoBuffer() +		self.ed.InsertText(0, b"a\tbig boat\t") + +	def testFind(self): +		pos = self.ed.FindBytes(0, self.ed.Length, b"zzz", 0) +		self.assertEquals(pos, -1) +		pos = self.ed.FindBytes(0, self.ed.Length, b"big", 0) +		self.assertEquals(pos, 2) + +	def testCaseFind(self): +		self.assertEquals(self.ed.FindBytes(0, self.ed.Length, b"big", 0), 2) +		self.assertEquals(self.ed.FindBytes(0, self.ed.Length, b"bIg", 0), 2) +		self.assertEquals(self.ed.FindBytes(0, self.ed.Length, b"bIg", +			self.ed.SCFIND_MATCHCASE), -1) + +	def testWordFind(self): +		self.assertEquals(self.ed.FindBytes(0, self.ed.Length, b"bi", 0), 2) +		self.assertEquals(self.ed.FindBytes(0, self.ed.Length, b"bi", +			self.ed.SCFIND_WHOLEWORD), -1) + +	def testWordStartFind(self): +		self.assertEquals(self.ed.FindBytes(0, self.ed.Length, b"bi", 0), 2) +		self.assertEquals(self.ed.FindBytes(0, self.ed.Length, b"bi", +			self.ed.SCFIND_WORDSTART), 2) +		self.assertEquals(self.ed.FindBytes(0, self.ed.Length, b"ig", 0), 3) +		self.assertEquals(self.ed.FindBytes(0, self.ed.Length, b"ig", +			self.ed.SCFIND_WORDSTART), -1) + +	def testREFind(self): +		flags = self.ed.SCFIND_REGEXP +		self.assertEquals(-1, self.ed.FindBytes(0, self.ed.Length, b"b.g", 0)) +		self.assertEquals(2, self.ed.FindBytes(0, self.ed.Length, b"b.g", flags)) +		self.assertEquals(2, self.ed.FindBytes(0, self.ed.Length, b"\<b.g\>", flags)) +		self.assertEquals(-1, self.ed.FindBytes(0, self.ed.Length, b"b[A-Z]g", +			flags | self.ed.SCFIND_MATCHCASE)) +		self.assertEquals(2, self.ed.FindBytes(0, self.ed.Length, b"b[a-z]g", flags)) +		self.assertEquals(6, self.ed.FindBytes(0, self.ed.Length, b"b[a-z]*t", flags)) +		self.assertEquals(0, self.ed.FindBytes(0, self.ed.Length, b"^a", flags)) +		self.assertEquals(10, self.ed.FindBytes(0, self.ed.Length, b"\t$", flags)) +		self.assertEquals(0, self.ed.FindBytes(0, self.ed.Length, b"\([a]\).*\0", flags)) + +	def testPosixREFind(self): +		flags = self.ed.SCFIND_REGEXP | self.ed.SCFIND_POSIX +		self.assertEquals(-1, self.ed.FindBytes(0, self.ed.Length, b"b.g", 0)) +		self.assertEquals(2, self.ed.FindBytes(0, self.ed.Length, b"b.g", flags)) +		self.assertEquals(2, self.ed.FindBytes(0, self.ed.Length, b"\<b.g\>", flags)) +		self.assertEquals(-1, self.ed.FindBytes(0, self.ed.Length, b"b[A-Z]g", +			flags | self.ed.SCFIND_MATCHCASE)) +		self.assertEquals(2, self.ed.FindBytes(0, self.ed.Length, b"b[a-z]g", flags)) +		self.assertEquals(6, self.ed.FindBytes(0, self.ed.Length, b"b[a-z]*t", flags)) +		self.assertEquals(0, self.ed.FindBytes(0, self.ed.Length, b"^a", flags)) +		self.assertEquals(10, self.ed.FindBytes(0, self.ed.Length, b"\t$", flags)) +		self.assertEquals(0, self.ed.FindBytes(0, self.ed.Length, b"([a]).*\0", flags)) + +	def testPhilippeREFind(self): +		# Requires 1.,72 +		flags = self.ed.SCFIND_REGEXP +		self.assertEquals(0, self.ed.FindBytes(0, self.ed.Length, "\w", flags)) +		self.assertEquals(1, self.ed.FindBytes(0, self.ed.Length, "\W", flags)) +		self.assertEquals(-1, self.ed.FindBytes(0, self.ed.Length, "\d", flags)) +		self.assertEquals(0, self.ed.FindBytes(0, self.ed.Length, "\D", flags)) +		self.assertEquals(1, self.ed.FindBytes(0, self.ed.Length, "\s", flags)) +		self.assertEquals(0, self.ed.FindBytes(0, self.ed.Length, "\S", flags)) +		self.assertEquals(2, self.ed.FindBytes(0, self.ed.Length, "\x62", flags)) + +class TestProperties(unittest.TestCase): + +	def setUp(self): +		self.xite = XiteWin.xiteFrame +		self.ed = self.xite.ed +		self.ed.ClearAll() +		self.ed.EmptyUndoBuffer() + +	def testSet(self): +		self.ed.SetProperty(b"test", b"12") +		self.assertEquals(self.ed.GetPropertyInt(b"test"), 12) +		result = b"\0" * 10 +		length = self.ed.GetProperty(b"test", result) +		result = result[:length] +		self.assertEquals(result, b"12") +		self.ed.SetProperty(b"test.plus", b"[$(test)]") +		result = b"\0" * 10 +		length = self.ed.GetPropertyExpanded(b"test.plus", result) +		result = result[:length] +		self.assertEquals(result, b"[12]") + +class TestTextMargin(unittest.TestCase): + +	def setUp(self): +		self.xite = XiteWin.xiteFrame +		self.ed = self.xite.ed +		self.ed.ClearAll() +		self.ed.EmptyUndoBuffer() +		self.txt = b"abcd" +		self.ed.AddText(1, b"x") + +	def testAscent(self): +		lineHeight = self.ed.TextHeight(0) +		self.ed.ExtraAscent +		self.assertEquals(self.ed.ExtraAscent, 0) +		self.assertEquals(self.ed.ExtraDescent, 0) +		self.ed.ExtraAscent = 1 +		self.assertEquals(self.ed.ExtraAscent, 1) +		self.ed.ExtraDescent = 2 +		self.assertEquals(self.ed.ExtraDescent, 2) +		# Allow line height to recalculate +		self.xite.DoEvents() +		lineHeightIncreased = self.ed.TextHeight(0) +		self.assertEquals(lineHeightIncreased, lineHeight + 2 + 1) +		 +	def testTextMargin(self): +		self.ed.MarginSetText(0, self.txt) +		result = b"\0" * 10 +		length = self.ed.MarginGetText(0, result) +		result = result[:length] +		self.assertEquals(result, self.txt) +		self.ed.MarginTextClearAll() + +	def testTextMarginStyle(self): +		self.ed.MarginSetText(0, self.txt) +		self.ed.MarginSetStyle(0, 33) +		self.assertEquals(self.ed.MarginGetStyle(0), 33) +		self.ed.MarginTextClearAll() + +	def testTextMarginStyles(self): +		styles = b"\001\002\003\004" +		self.ed.MarginSetText(0, self.txt) +		self.ed.MarginSetStyles(0, styles) +		result = b"\0" * 10 +		length = self.ed.MarginGetStyles(0, result) +		result = result[:length] +		self.assertEquals(result, styles) +		self.ed.MarginTextClearAll() + +	def testTextMarginStyleOffset(self): +		self.ed.MarginSetStyleOffset(300) +		self.assertEquals(self.ed.MarginGetStyleOffset(), 300) + +class TestAnnotation(unittest.TestCase): + +	def setUp(self): +		self.xite = XiteWin.xiteFrame +		self.ed = self.xite.ed +		self.ed.ClearAll() +		self.ed.EmptyUndoBuffer() +		self.txt = b"abcd" +		self.ed.AddText(1, b"x") + +	def testTextAnnotation(self): +		self.assertEquals(self.ed.AnnotationGetLines(), 0) +		self.ed.AnnotationSetText(0, self.txt) +		self.assertEquals(self.ed.AnnotationGetLines(), 1) +		result = b"\0" * 10 +		length = self.ed.AnnotationGetText(0, result) +		self.assertEquals(length, 4) +		result = result[:length] +		self.assertEquals(result, self.txt) +		self.ed.AnnotationClearAll() + +	def testTextAnnotationStyle(self): +		self.ed.AnnotationSetText(0, self.txt) +		self.ed.AnnotationSetStyle(0, 33) +		self.assertEquals(self.ed.AnnotationGetStyle(0), 33) +		self.ed.AnnotationClearAll() + +	def testTextAnnotationStyles(self): +		styles = b"\001\002\003\004" +		self.ed.AnnotationSetText(0, self.txt) +		self.ed.AnnotationSetStyles(0, styles) +		result = b"\0" * 10 +		length = self.ed.AnnotationGetStyles(0, result) +		result = result[:length] +		self.assertEquals(result, styles) +		self.ed.AnnotationClearAll() + +	def testTextAnnotationStyleOffset(self): +		self.ed.AnnotationSetStyleOffset(300) +		self.assertEquals(self.ed.AnnotationGetStyleOffset(), 300) + +	def testTextAnnotationVisible(self): +		self.assertEquals(self.ed.AnnotationGetVisible(), 0) +		self.ed.AnnotationSetVisible(2) +		self.assertEquals(self.ed.AnnotationGetVisible(), 2) +		self.ed.AnnotationSetVisible(0) + +#~ import os +#~ for x in os.getenv("PATH").split(";"): +	#~ n = "scilexer.dll" +	#~ nf = x + "\\" + n +	#~ print os.access(nf, os.R_OK), nf +if __name__ == '__main__': +	XiteWin.main("simpleTests") diff --git a/test/xite.py b/test/xite.py new file mode 100644 index 000000000..399c79544 --- /dev/null +++ b/test/xite.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- + +import XiteWin + +if __name__ == "__main__": +	XiteWin.main("") | 
