codekingpro/portable-devtools
114k
1"Test replace, coverage 78%."2 3from idlelib.replace import ReplaceDialog4import unittest5from test.support import requires6requires('gui')7from tkinter import Tk, Text8 9from unittest.mock import Mock10from idlelib.idle_test.mock_tk import Mbox11import idlelib.searchengine as se12 13orig_mbox = se.messagebox14showerror = Mbox.showerror15 16 17class ReplaceDialogTest(unittest.TestCase):18 19 @classmethod20 def setUpClass(cls):21 cls.root = Tk()22 cls.root.withdraw()23 se.messagebox = Mbox24 cls.engine = se.SearchEngine(cls.root)25 cls.dialog = ReplaceDialog(cls.root, cls.engine)26 cls.dialog.bell = lambda: None27 cls.dialog.ok = Mock()28 cls.text = Text(cls.root)29 cls.text.undo_block_start = Mock()30 cls.text.undo_block_stop = Mock()31 cls.dialog.text = cls.text32 33 @classmethod34 def tearDownClass(cls):35 se.messagebox = orig_mbox36 del cls.text, cls.dialog, cls.engine37 cls.root.destroy()38 del cls.root39 40 def setUp(self):41 self.text.insert('insert', 'This is a sample sTring')42 43 def tearDown(self):44 self.engine.patvar.set('')45 self.dialog.replvar.set('')46 self.engine.wordvar.set(False)47 self.engine.casevar.set(False)48 self.engine.revar.set(False)49 self.engine.wrapvar.set(True)50 self.engine.backvar.set(False)51 showerror.title = ''52 showerror.message = ''53 self.text.delete('1.0', 'end')54 55 def test_replace_simple(self):56 # Test replace function with all options at default setting.57 # Wrap around - True58 # Regular Expression - False59 # Match case - False60 # Match word - False61 # Direction - Forwards62 text = self.text63 equal = self.assertEqual64 pv = self.engine.patvar65 rv = self.dialog.replvar66 replace = self.dialog.replace_it67 68 # test accessor method69 self.engine.setpat('asdf')70 equal(self.engine.getpat(), pv.get())71 72 # text found and replaced73 pv.set('a')74 rv.set('asdf')75 replace()76 equal(text.get('1.8', '1.12'), 'asdf')77 78 # don't "match word" case79 text.mark_set('insert', '1.0')80 pv.set('is')81 rv.set('hello')82 replace()83 equal(text.get('1.2', '1.7'), 'hello')84 85 # don't "match case" case86 pv.set('string')87 rv.set('world')88 replace()89 equal(text.get('1.23', '1.28'), 'world')90 91 # without "regular expression" case92 text.mark_set('insert', 'end')93 text.insert('insert', '\nline42:')94 before_text = text.get('1.0', 'end')95 pv.set(r'[a-z][\d]+')96 replace()97 after_text = text.get('1.0', 'end')98 equal(before_text, after_text)99 100 # test with wrap around selected and complete a cycle101 text.mark_set('insert', '1.9')102 pv.set('i')103 rv.set('j')104 replace()105 equal(text.get('1.8'), 'i')106 equal(text.get('2.1'), 'j')107 replace()108 equal(text.get('2.1'), 'j')109 equal(text.get('1.8'), 'j')110 before_text = text.get('1.0', 'end')111 replace()112 after_text = text.get('1.0', 'end')113 equal(before_text, after_text)114 115 # text not found116 before_text = text.get('1.0', 'end')117 pv.set('foobar')118 replace()119 after_text = text.get('1.0', 'end')120 equal(before_text, after_text)121 122 # test access method123 self.dialog.find_it(0)124 125 def test_replace_wrap_around(self):126 text = self.text127 equal = self.assertEqual128 pv = self.engine.patvar129 rv = self.dialog.replvar130 replace = self.dialog.replace_it131 self.engine.wrapvar.set(False)132 133 # replace candidate found both after and before 'insert'134 text.mark_set('insert', '1.4')135 pv.set('i')136 rv.set('j')137 replace()138 equal(text.get('1.2'), 'i')139 equal(text.get('1.5'), 'j')140 replace()141 equal(text.get('1.2'), 'i')142 equal(text.get('1.20'), 'j')143 replace()144 equal(text.get('1.2'), 'i')145 146 # replace candidate found only before 'insert'147 text.mark_set('insert', '1.8')148 pv.set('is')149 before_text = text.get('1.0', 'end')150 replace()151 after_text = text.get('1.0', 'end')152 equal(before_text, after_text)153 154 def test_replace_whole_word(self):155 text = self.text156 equal = self.assertEqual157 pv = self.engine.patvar158 rv = self.dialog.replvar159 replace = self.dialog.replace_it160 self.engine.wordvar.set(True)161 162 pv.set('is')163 rv.set('hello')164 replace()165 equal(text.get('1.0', '1.4'), 'This')166 equal(text.get('1.5', '1.10'), 'hello')167 168 def test_replace_match_case(self):169 equal = self.assertEqual170 text = self.text171 pv = self.engine.patvar172 rv = self.dialog.replvar173 replace = self.dialog.replace_it174 self.engine.casevar.set(True)175 176 before_text = self.text.get('1.0', 'end')177 pv.set('this')178 rv.set('that')179 replace()180 after_text = self.text.get('1.0', 'end')181 equal(before_text, after_text)182 183 pv.set('This')184 replace()185 equal(text.get('1.0', '1.4'), 'that')186 187 def test_replace_regex(self):188 equal = self.assertEqual189 text = self.text190 pv = self.engine.patvar191 rv = self.dialog.replvar192 replace = self.dialog.replace_it193 self.engine.revar.set(True)194 195 before_text = text.get('1.0', 'end')196 pv.set(r'[a-z][\d]+')197 rv.set('hello')198 replace()199 after_text = text.get('1.0', 'end')200 equal(before_text, after_text)201 202 text.insert('insert', '\nline42')203 replace()204 equal(text.get('2.0', '2.8'), 'linhello')205 206 pv.set('')207 replace()208 self.assertIn('error', showerror.title)209 self.assertIn('Empty', showerror.message)210 211 pv.set(r'[\d')212 replace()213 self.assertIn('error', showerror.title)214 self.assertIn('Pattern', showerror.message)215 216 showerror.title = ''217 showerror.message = ''218 pv.set('[a]')219 rv.set('test\\')220 replace()221 self.assertIn('error', showerror.title)222 self.assertIn('Invalid Replace Expression', showerror.message)223 224 # test access method225 self.engine.setcookedpat("?")226 equal(pv.get(), "\\?")227 228 def test_replace_backwards(self):229 equal = self.assertEqual230 text = self.text231 pv = self.engine.patvar232 rv = self.dialog.replvar233 replace = self.dialog.replace_it234 self.engine.backvar.set(True)235 236 text.insert('insert', '\nis as ')237 238 pv.set('is')239 rv.set('was')240 replace()241 equal(text.get('1.2', '1.4'), 'is')242 equal(text.get('2.0', '2.3'), 'was')243 replace()244 equal(text.get('1.5', '1.8'), 'was')245 replace()246 equal(text.get('1.2', '1.5'), 'was')247 248 def test_replace_all(self):249 text = self.text250 pv = self.engine.patvar251 rv = self.dialog.replvar252 replace_all = self.dialog.replace_all253 254 text.insert('insert', '\n')255 text.insert('insert', text.get('1.0', 'end')*100)256 pv.set('is')257 rv.set('was')258 replace_all()259 self.assertNotIn('is', text.get('1.0', 'end'))260 261 self.engine.revar.set(True)262 pv.set('')263 replace_all()264 self.assertIn('error', showerror.title)265 self.assertIn('Empty', showerror.message)266 267 pv.set('[s][T]')268 rv.set('\\')269 replace_all()270 271 self.engine.revar.set(False)272 pv.set('text which is not present')273 rv.set('foobar')274 replace_all()275 276 def test_default_command(self):277 text = self.text278 pv = self.engine.patvar279 rv = self.dialog.replvar280 replace_find = self.dialog.default_command281 equal = self.assertEqual282 283 pv.set('This')284 rv.set('was')285 replace_find()286 equal(text.get('sel.first', 'sel.last'), 'was')287 288 self.engine.revar.set(True)289 pv.set('')290 replace_find()291 292 293if __name__ == '__main__':294 unittest.main(verbosity=2)295 