@@ -34,12 +34,116 @@ def test_search(self):
3434
3535 # Invalid text index.
3636 self .assertRaises (tkinter .TclError , text .search , '' , 0 )
37+ self .assertRaises (tkinter .TclError , text .search , '' , '' )
38+ self .assertRaises (tkinter .TclError , text .search , '' , 'invalid' )
39+ self .assertRaises (tkinter .TclError , text .search , '' , '1.0' , 0 )
40+ self .assertRaises (tkinter .TclError , text .search , '' , '1.0' , '' )
41+ self .assertRaises (tkinter .TclError , text .search , '' , '1.0' , 'invalid' )
3742
38- # Check if we are getting the indices as strings -- you are likely
39- # to get Tcl_Obj under Tk 8.5 if Tkinter doesn't convert it.
40- text .insert ('1.0' , 'hi-test' )
41- self .assertEqual (text .search ('-test' , '1.0' , 'end' ), '1.2' )
42- self .assertEqual (text .search ('test' , '1.0' , 'end' ), '1.3' )
43+ text .insert ('1.0' ,
44+ 'This is a test. This is only a test.\n '
45+ 'Another line.\n '
46+ 'Yet another line.\n '
47+ '64-bit' )
48+
49+ self .assertEqual (text .search ('test' , '1.0' ), '1.10' )
50+ self .assertEqual (text .search ('test' , '1.0' , 'end' ), '1.10' )
51+ self .assertEqual (text .search ('test' , '1.0' , '1.10' ), '' )
52+ self .assertEqual (text .search ('test' , '1.11' ), '1.31' )
53+ self .assertEqual (text .search ('test' , '1.32' , 'end' ), '' )
54+ self .assertEqual (text .search ('test' , '1.32' ), '1.10' )
55+
56+ self .assertEqual (text .search ('' , '1.0' ), '1.0' ) # empty pattern
57+ self .assertEqual (text .search ('nonexistent' , '1.0' ), '' )
58+ self .assertEqual (text .search ('-bit' , '1.0' ), '4.2' ) # starts with a hyphen
59+
60+ self .assertEqual (text .search ('line' , '3.0' ), '3.12' )
61+ self .assertEqual (text .search ('line' , '3.0' , forwards = True ), '3.12' )
62+ self .assertEqual (text .search ('line' , '3.0' , backwards = True ), '2.8' )
63+ self .assertEqual (text .search ('line' , '3.0' , forwards = True , backwards = True ), '2.8' )
64+
65+ self .assertEqual (text .search ('t.' , '1.0' ), '1.13' )
66+ self .assertEqual (text .search ('t.' , '1.0' , exact = True ), '1.13' )
67+ self .assertEqual (text .search ('t.' , '1.0' , regexp = True ), '1.10' )
68+ self .assertEqual (text .search ('t.' , '1.0' , exact = True , regexp = True ), '1.10' )
69+
70+ self .assertEqual (text .search ('TEST' , '1.0' ), '' )
71+ self .assertEqual (text .search ('TEST' , '1.0' , nocase = True ), '1.10' )
72+
73+ self .assertEqual (text .search ('.*line' , '1.0' , regexp = True ), '2.0' )
74+ self .assertEqual (text .search ('.*line' , '1.0' , regexp = True , nolinestop = True ), '1.0' )
75+
76+ self .assertEqual (text .search ('test' , '1.0' , '1.13' ), '1.10' )
77+ self .assertEqual (text .search ('test' , '1.0' , '1.13' , strictlimits = True ), '' )
78+ self .assertEqual (text .search ('test' , '1.0' , '1.14' , strictlimits = True ), '1.10' )
79+
80+ var = tkinter .Variable (self .root )
81+ self .assertEqual (text .search ('test' , '1.0' , count = var ), '1.10' )
82+ self .assertEqual (var .get (), 4 if self .wantobjects else '4' )
83+
84+ # TODO: Add test for elide=True
85+
86+ def test_search_all (self ):
87+ text = self .text
88+
89+ # pattern and index are obligatory arguments.
90+ self .assertRaises (tkinter .TclError , text .search_all , None , '1.0' )
91+ self .assertRaises (tkinter .TclError , text .search_all , 'a' , None )
92+ self .assertRaises (tkinter .TclError , text .search_all , None , None )
93+
94+ # Keyword-only arguments
95+ self .assertRaises (TypeError , text .search_all , 'a' , '1.0' , 'end' , None )
96+
97+ # Invalid text index.
98+ self .assertRaises (tkinter .TclError , text .search_all , '' , 0 )
99+ self .assertRaises (tkinter .TclError , text .search_all , '' , '' )
100+ self .assertRaises (tkinter .TclError , text .search_all , '' , 'invalid' )
101+ self .assertRaises (tkinter .TclError , text .search_all , '' , '1.0' , 0 )
102+ self .assertRaises (tkinter .TclError , text .search_all , '' , '1.0' , '' )
103+ self .assertRaises (tkinter .TclError , text .search_all , '' , '1.0' , 'invalid' )
104+
105+ def eq (res , expected ):
106+ self .assertIsInstance (res , tuple )
107+ self .assertEqual ([str (i ) for i in res ], expected )
108+
109+ text .insert ('1.0' , 'ababa\n aba\n 64-bit' )
110+
111+ eq (text .search_all ('aba' , '1.0' ), ['1.0' , '2.0' ])
112+ eq (text .search_all ('aba' , '1.0' , 'end' ), ['1.0' , '2.0' ])
113+ eq (text .search_all ('aba' , '1.1' , 'end' ), ['1.2' , '2.0' ])
114+ eq (text .search_all ('aba' , '1.1' ), ['1.2' , '2.0' , '1.0' ])
115+
116+ res = text .search_all ('' , '1.0' ) # empty pattern
117+ eq (res [:5 ], ['1.0' , '1.1' , '1.2' , '1.3' , '1.4' ])
118+ eq (res [- 5 :], ['3.2' , '3.3' , '3.4' , '3.5' , '3.6' ])
119+ eq (text .search_all ('nonexistent' , '1.0' ), [])
120+ eq (text .search_all ('-bit' , '1.0' ), ['3.2' ]) # starts with a hyphen
121+
122+ eq (text .search_all ('aba' , '1.0' , 'end' , forwards = True ), ['1.0' , '2.0' ])
123+ eq (text .search_all ('aba' , 'end' , '1.0' , backwards = True ), ['2.0' , '1.2' ])
124+
125+ eq (text .search_all ('aba' , '1.0' , overlap = True ), ['1.0' , '1.2' , '2.0' ])
126+ eq (text .search_all ('aba' , 'end' , '1.0' , overlap = True , backwards = True ), ['2.0' , '1.2' , '1.0' ])
127+
128+ eq (text .search_all ('aba' , '1.0' , exact = True ), ['1.0' , '2.0' ])
129+ eq (text .search_all ('a.a' , '1.0' , exact = True ), [])
130+ eq (text .search_all ('a.a' , '1.0' , regexp = True ), ['1.0' , '2.0' ])
131+
132+ eq (text .search_all ('ABA' , '1.0' ), [])
133+ eq (text .search_all ('ABA' , '1.0' , nocase = True ), ['1.0' , '2.0' ])
134+
135+ eq (text .search_all ('a.a' , '1.0' , regexp = True ), ['1.0' , '2.0' ])
136+ eq (text .search_all ('a.a' , '1.0' , regexp = True , nolinestop = True ), ['1.0' , '1.4' ])
137+
138+ eq (text .search_all ('aba' , '1.0' , '2.2' ), ['1.0' , '2.0' ])
139+ eq (text .search_all ('aba' , '1.0' , '2.2' , strictlimits = True ), ['1.0' ])
140+ eq (text .search_all ('aba' , '1.0' , '2.3' , strictlimits = True ), ['1.0' , '2.0' ])
141+
142+ var = tkinter .Variable (self .root )
143+ eq (text .search_all ('aba' , '1.0' , count = var ), ['1.0' , '2.0' ])
144+ self .assertEqual (var .get (), (3 , 3 ) if self .wantobjects else '3 3' )
145+
146+ # TODO: Add test for elide=True
43147
44148 def test_count (self ):
45149 text = self .text
0 commit comments