Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d619ff4

Browse files
committed
Merge with 3.5
2 parents 36c1895 + 092473e commit d619ff4

3 files changed

Lines changed: 145 additions & 26 deletions

File tree

Lib/idlelib/Percolator.py

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from idlelib.WidgetRedirector import WidgetRedirector
22
from idlelib.Delegator import Delegator
33

4+
45
class Percolator:
56

67
def __init__(self, text):
@@ -16,8 +17,10 @@ def close(self):
1617
while self.top is not self.bottom:
1718
self.removefilter(self.top)
1819
self.top = None
19-
self.bottom.setdelegate(None); self.bottom = None
20-
self.redir.close(); self.redir = None
20+
self.bottom.setdelegate(None)
21+
self.bottom = None
22+
self.redir.close()
23+
self.redir = None
2124
self.text = None
2225

2326
def insert(self, index, chars, tags=None):
@@ -51,54 +54,52 @@ def removefilter(self, filter):
5154
f.setdelegate(filter.delegate)
5255
filter.setdelegate(None)
5356

54-
def _percolator(parent):
57+
58+
def _percolator(parent): # htest #
5559
import tkinter as tk
5660
import re
61+
5762
class Tracer(Delegator):
5863
def __init__(self, name):
5964
self.name = name
6065
Delegator.__init__(self, None)
66+
6167
def insert(self, *args):
6268
print(self.name, ": insert", args)
6369
self.delegate.insert(*args)
70+
6471
def delete(self, *args):
6572
print(self.name, ": delete", args)
6673
self.delegate.delete(*args)
67-
root = tk.Tk()
68-
root.title("Test Percolator")
74+
75+
box = tk.Toplevel(parent)
76+
box.title("Test Percolator")
6977
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
70-
root.geometry("+%d+%d"%(x, y + 150))
71-
text = tk.Text(root)
78+
box.geometry("+%d+%d" % (x, y + 150))
79+
text = tk.Text(box)
7280
p = Percolator(text)
81+
pin = p.insertfilter
82+
pout = p.removefilter
7383
t1 = Tracer("t1")
7484
t2 = Tracer("t2")
7585

7686
def toggle1():
77-
if var1.get() == 0:
78-
var1.set(1)
79-
p.insertfilter(t1)
80-
elif var1.get() == 1:
81-
var1.set(0)
82-
p.removefilter(t1)
83-
87+
(pin if var1.get() else pout)(t1)
8488
def toggle2():
85-
if var2.get() == 0:
86-
var2.set(1)
87-
p.insertfilter(t2)
88-
elif var2.get() == 1:
89-
var2.set(0)
90-
p.removefilter(t2)
89+
(pin if var2.get() else pout)(t2)
9190

9291
text.pack()
9392
var1 = tk.IntVar()
94-
cb1 = tk.Checkbutton(root, text="Tracer1", command=toggle1, variable=var1)
93+
cb1 = tk.Checkbutton(box, text="Tracer1", command=toggle1, variable=var1)
9594
cb1.pack()
9695
var2 = tk.IntVar()
97-
cb2 = tk.Checkbutton(root, text="Tracer2", command=toggle2, variable=var2)
96+
cb2 = tk.Checkbutton(box, text="Tracer2", command=toggle2, variable=var2)
9897
cb2.pack()
9998

100-
root.mainloop()
101-
10299
if __name__ == "__main__":
100+
import unittest
101+
unittest.main('idlelib.idle_test.test_percolator', verbosity=2,
102+
exit=False)
103+
103104
from idlelib.idle_test.htest import run
104105
run(_percolator)

Lib/idlelib/idle_test/test_parenmatch.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
"""Test idlelib.ParenMatch."""
22
# This must currently be a gui test because ParenMatch methods use
33
# several text methods not defined on idlelib.idle_test.mock_tk.Text.
4+
from test.support import requires
5+
requires('gui')
46

57
import unittest
68
from unittest.mock import Mock
7-
from test.support import requires
89
from tkinter import Tk, Text
910
from idlelib.ParenMatch import ParenMatch
1011

@@ -20,7 +21,6 @@ class ParenMatchTest(unittest.TestCase):
2021

2122
@classmethod
2223
def setUpClass(cls):
23-
requires('gui')
2424
cls.root = Tk()
2525
cls.text = Text(cls.root)
2626
cls.editwin = DummyEditwin(cls.text)
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
'''Test Percolator'''
2+
from test.support import requires
3+
requires('gui')
4+
5+
import unittest
6+
from tkinter import Text, Tk, END
7+
from idlelib.Percolator import Percolator, Delegator
8+
9+
10+
class MyFilter(Delegator):
11+
def __init__(self):
12+
Delegator.__init__(self, None)
13+
14+
def insert(self, *args):
15+
self.insert_called_with = args
16+
self.delegate.insert(*args)
17+
18+
def delete(self, *args):
19+
self.delete_called_with = args
20+
self.delegate.delete(*args)
21+
22+
def uppercase_insert(self, index, chars, tags=None):
23+
chars = chars.upper()
24+
self.delegate.insert(index, chars)
25+
26+
def lowercase_insert(self, index, chars, tags=None):
27+
chars = chars.lower()
28+
self.delegate.insert(index, chars)
29+
30+
def dont_insert(self, index, chars, tags=None):
31+
pass
32+
33+
34+
class PercolatorTest(unittest.TestCase):
35+
36+
@classmethod
37+
def setUpClass(cls):
38+
cls.root = Tk()
39+
cls.text = Text(cls.root)
40+
41+
@classmethod
42+
def tearDownClass(cls):
43+
cls.text.destroy()
44+
cls.root.destroy()
45+
del cls.text, cls.root
46+
47+
def setUp(self):
48+
self.percolator = Percolator(self.text)
49+
self.filter_one = MyFilter()
50+
self.filter_two = MyFilter()
51+
self.percolator.insertfilter(self.filter_one)
52+
self.percolator.insertfilter(self.filter_two)
53+
54+
def tearDown(self):
55+
self.percolator.close()
56+
self.text.delete('1.0', END)
57+
58+
def test_insertfilter(self):
59+
self.assertIsNotNone(self.filter_one.delegate)
60+
self.assertEqual(self.percolator.top, self.filter_two)
61+
self.assertEqual(self.filter_two.delegate, self.filter_one)
62+
self.assertEqual(self.filter_one.delegate, self.percolator.bottom)
63+
64+
def test_removefilter(self):
65+
filter_three = MyFilter()
66+
self.percolator.removefilter(self.filter_two)
67+
self.assertEqual(self.percolator.top, self.filter_one)
68+
self.assertIsNone(self.filter_two.delegate)
69+
70+
filter_three = MyFilter()
71+
self.percolator.insertfilter(self.filter_two)
72+
self.percolator.insertfilter(filter_three)
73+
self.percolator.removefilter(self.filter_one)
74+
self.assertEqual(self.percolator.top, filter_three)
75+
self.assertEqual(filter_three.delegate, self.filter_two)
76+
self.assertEqual(self.filter_two.delegate, self.percolator.bottom)
77+
self.assertIsNone(self.filter_one.delegate)
78+
79+
def test_insert(self):
80+
self.text.insert('insert', 'foo')
81+
self.assertEqual(self.text.get('1.0', END), 'foo\n')
82+
self.assertTupleEqual(self.filter_one.insert_called_with,
83+
('insert', 'foo', None))
84+
85+
def test_modify_insert(self):
86+
self.filter_one.insert = self.filter_one.uppercase_insert
87+
self.text.insert('insert', 'bAr')
88+
self.assertEqual(self.text.get('1.0', END), 'BAR\n')
89+
90+
def test_modify_chain_insert(self):
91+
filter_three = MyFilter()
92+
self.percolator.insertfilter(filter_three)
93+
self.filter_two.insert = self.filter_two.uppercase_insert
94+
self.filter_one.insert = self.filter_one.lowercase_insert
95+
self.text.insert('insert', 'BaR')
96+
self.assertEqual(self.text.get('1.0', END), 'bar\n')
97+
98+
def test_dont_insert(self):
99+
self.filter_one.insert = self.filter_one.dont_insert
100+
self.text.insert('insert', 'foo bar')
101+
self.assertEqual(self.text.get('1.0', END), '\n')
102+
self.filter_one.insert = self.filter_one.dont_insert
103+
self.text.insert('insert', 'foo bar')
104+
self.assertEqual(self.text.get('1.0', END), '\n')
105+
106+
def test_without_filter(self):
107+
self.text.insert('insert', 'hello')
108+
self.assertEqual(self.text.get('1.0', 'end'), 'hello\n')
109+
110+
def test_delete(self):
111+
self.text.insert('insert', 'foo')
112+
self.text.delete('1.0', '1.2')
113+
self.assertEqual(self.text.get('1.0', END), 'o\n')
114+
self.assertTupleEqual(self.filter_one.delete_called_with,
115+
('1.0', '1.2'))
116+
117+
if __name__ == '__main__':
118+
unittest.main(verbosity=2)

0 commit comments

Comments
 (0)