summaryrefslogtreecommitdiff
path: root/testes/pm.lua
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-12-17 14:46:37 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-12-17 14:46:37 -0200
commit063d4e4543088e7a21965bda8ee5a0f952a9029e (patch)
tree6c3f2f8e98c26f071a94a32f9f2754396a66a9de /testes/pm.lua
parente354c6355e7f48e087678ec49e340ca0696725b1 (diff)
downloadlua-5.3.5.tar.gz
lua-5.3.5.tar.bz2
lua-5.3.5.zip
Lua 5.3.5 ported to gitv5.3.5
This is the first commit for the branch Lua 5.3. All source files were copied from the official distribution of 5.3.5 in the Lua site. The test files are the same of 5.3.4. The manual came from the previous RCS repository, revision 1.167.1.2.
Diffstat (limited to 'testes/pm.lua')
-rw-r--r--testes/pm.lua374
1 files changed, 374 insertions, 0 deletions
diff --git a/testes/pm.lua b/testes/pm.lua
new file mode 100644
index 00000000..fde39ff0
--- /dev/null
+++ b/testes/pm.lua
@@ -0,0 +1,374 @@
1-- $Id: pm.lua,v 1.48 2016/11/07 13:11:28 roberto Exp $
2-- See Copyright Notice in file all.lua
3
4print('testing pattern matching')
5
6local function checkerror (msg, f, ...)
7 local s, err = pcall(f, ...)
8 assert(not s and string.find(err, msg))
9end
10
11
12function f(s, p)
13 local i,e = string.find(s, p)
14 if i then return string.sub(s, i, e) end
15end
16
17a,b = string.find('', '') -- empty patterns are tricky
18assert(a == 1 and b == 0);
19a,b = string.find('alo', '')
20assert(a == 1 and b == 0)
21a,b = string.find('a\0o a\0o a\0o', 'a', 1) -- first position
22assert(a == 1 and b == 1)
23a,b = string.find('a\0o a\0o a\0o', 'a\0o', 2) -- starts in the midle
24assert(a == 5 and b == 7)
25a,b = string.find('a\0o a\0o a\0o', 'a\0o', 9) -- starts in the midle
26assert(a == 9 and b == 11)
27a,b = string.find('a\0a\0a\0a\0\0ab', '\0ab', 2); -- finds at the end
28assert(a == 9 and b == 11);
29a,b = string.find('a\0a\0a\0a\0\0ab', 'b') -- last position
30assert(a == 11 and b == 11)
31assert(string.find('a\0a\0a\0a\0\0ab', 'b\0') == nil) -- check ending
32assert(string.find('', '\0') == nil)
33assert(string.find('alo123alo', '12') == 4)
34assert(string.find('alo123alo', '^12') == nil)
35
36assert(string.match("aaab", ".*b") == "aaab")
37assert(string.match("aaa", ".*a") == "aaa")
38assert(string.match("b", ".*b") == "b")
39
40assert(string.match("aaab", ".+b") == "aaab")
41assert(string.match("aaa", ".+a") == "aaa")
42assert(not string.match("b", ".+b"))
43
44assert(string.match("aaab", ".?b") == "ab")
45assert(string.match("aaa", ".?a") == "aa")
46assert(string.match("b", ".?b") == "b")
47
48assert(f('aloALO', '%l*') == 'alo')
49assert(f('aLo_ALO', '%a*') == 'aLo')
50
51assert(f(" \n\r*&\n\r xuxu \n\n", "%g%g%g+") == "xuxu")
52
53assert(f('aaab', 'a*') == 'aaa');
54assert(f('aaa', '^.*$') == 'aaa');
55assert(f('aaa', 'b*') == '');
56assert(f('aaa', 'ab*a') == 'aa')
57assert(f('aba', 'ab*a') == 'aba')
58assert(f('aaab', 'a+') == 'aaa')
59assert(f('aaa', '^.+$') == 'aaa')
60assert(f('aaa', 'b+') == nil)
61assert(f('aaa', 'ab+a') == nil)
62assert(f('aba', 'ab+a') == 'aba')
63assert(f('a$a', '.$') == 'a')
64assert(f('a$a', '.%$') == 'a$')
65assert(f('a$a', '.$.') == 'a$a')
66assert(f('a$a', '$$') == nil)
67assert(f('a$b', 'a$') == nil)
68assert(f('a$a', '$') == '')
69assert(f('', 'b*') == '')
70assert(f('aaa', 'bb*') == nil)
71assert(f('aaab', 'a-') == '')
72assert(f('aaa', '^.-$') == 'aaa')
73assert(f('aabaaabaaabaaaba', 'b.*b') == 'baaabaaabaaab')
74assert(f('aabaaabaaabaaaba', 'b.-b') == 'baaab')
75assert(f('alo xo', '.o$') == 'xo')
76assert(f(' \n isto é assim', '%S%S*') == 'isto')
77assert(f(' \n isto é assim', '%S*$') == 'assim')
78assert(f(' \n isto é assim', '[a-z]*$') == 'assim')
79assert(f('um caracter ? extra', '[^%sa-z]') == '?')
80assert(f('', 'a?') == '')
81assert(f('á', 'á?') == 'á')
82assert(f('ábl', 'á?b?l?') == 'ábl')
83assert(f(' ábl', 'á?b?l?') == '')
84assert(f('aa', '^aa?a?a') == 'aa')
85assert(f(']]]áb', '[^]]') == 'á')
86assert(f("0alo alo", "%x*") == "0a")
87assert(f("alo alo", "%C+") == "alo alo")
88print('+')
89
90
91function f1(s, p)
92 p = string.gsub(p, "%%([0-9])", function (s)
93 return "%" .. (tonumber(s)+1)
94 end)
95 p = string.gsub(p, "^(^?)", "%1()", 1)
96 p = string.gsub(p, "($?)$", "()%1", 1)
97 local t = {string.match(s, p)}
98 return string.sub(s, t[1], t[#t] - 1)
99end
100
101assert(f1('alo alx 123 b\0o b\0o', '(..*) %1') == "b\0o b\0o")
102assert(f1('axz123= 4= 4 34', '(.+)=(.*)=%2 %1') == '3= 4= 4 3')
103assert(f1('=======', '^(=*)=%1$') == '=======')
104assert(string.match('==========', '^([=]*)=%1$') == nil)
105
106local function range (i, j)
107 if i <= j then
108 return i, range(i+1, j)
109 end
110end
111
112local abc = string.char(range(0, 255));
113
114assert(string.len(abc) == 256)
115
116function strset (p)
117 local res = {s=''}
118 string.gsub(abc, p, function (c) res.s = res.s .. c end)
119 return res.s
120end;
121
122assert(string.len(strset('[\200-\210]')) == 11)
123
124assert(strset('[a-z]') == "abcdefghijklmnopqrstuvwxyz")
125assert(strset('[a-z%d]') == strset('[%da-uu-z]'))
126assert(strset('[a-]') == "-a")
127assert(strset('[^%W]') == strset('[%w]'))
128assert(strset('[]%%]') == '%]')
129assert(strset('[a%-z]') == '-az')
130assert(strset('[%^%[%-a%]%-b]') == '-[]^ab')
131assert(strset('%Z') == strset('[\1-\255]'))
132assert(strset('.') == strset('[\1-\255%z]'))
133print('+');
134
135assert(string.match("alo xyzK", "(%w+)K") == "xyz")
136assert(string.match("254 K", "(%d*)K") == "")
137assert(string.match("alo ", "(%w*)$") == "")
138assert(string.match("alo ", "(%w+)$") == nil)
139assert(string.find("(álo)", "%(á") == 1)
140local a, b, c, d, e = string.match("âlo alo", "^(((.).).* (%w*))$")
141assert(a == 'âlo alo' and b == 'âl' and c == 'â' and d == 'alo' and e == nil)
142a, b, c, d = string.match('0123456789', '(.+(.?)())')
143assert(a == '0123456789' and b == '' and c == 11 and d == nil)
144print('+')
145
146assert(string.gsub('ülo ülo', 'ü', 'x') == 'xlo xlo')
147assert(string.gsub('alo úlo ', ' +$', '') == 'alo úlo') -- trim
148assert(string.gsub(' alo alo ', '^%s*(.-)%s*$', '%1') == 'alo alo') -- double trim
149assert(string.gsub('alo alo \n 123\n ', '%s+', ' ') == 'alo alo 123 ')
150t = "abç d"
151a, b = string.gsub(t, '(.)', '%1@')
152assert('@'..a == string.gsub(t, '', '@') and b == 5)
153a, b = string.gsub('abçd', '(.)', '%0@', 2)
154assert(a == 'a@b@çd' and b == 2)
155assert(string.gsub('alo alo', '()[al]', '%1') == '12o 56o')
156assert(string.gsub("abc=xyz", "(%w*)(%p)(%w+)", "%3%2%1-%0") ==
157 "xyz=abc-abc=xyz")
158assert(string.gsub("abc", "%w", "%1%0") == "aabbcc")
159assert(string.gsub("abc", "%w+", "%0%1") == "abcabc")
160assert(string.gsub('áéí', '$', '\0óú') == 'áéí\0óú')
161assert(string.gsub('', '^', 'r') == 'r')
162assert(string.gsub('', '$', 'r') == 'r')
163print('+')
164
165
166do -- new (5.3.3) semantics for empty matches
167 assert(string.gsub("a b cd", " *", "-") == "-a-b-c-d-")
168
169 local res = ""
170 local sub = "a \nbc\t\td"
171 local i = 1
172 for p, e in string.gmatch(sub, "()%s*()") do
173 res = res .. string.sub(sub, i, p - 1) .. "-"
174 i = e
175 end
176 assert(res == "-a-b-c-d-")
177end
178
179
180assert(string.gsub("um (dois) tres (quatro)", "(%(%w+%))", string.upper) ==
181 "um (DOIS) tres (QUATRO)")
182
183do
184 local function setglobal (n,v) rawset(_G, n, v) end
185 string.gsub("a=roberto,roberto=a", "(%w+)=(%w%w*)", setglobal)
186 assert(_G.a=="roberto" and _G.roberto=="a")
187end
188
189function f(a,b) return string.gsub(a,'.',b) end
190assert(string.gsub("trocar tudo em |teste|b| é |beleza|al|", "|([^|]*)|([^|]*)|", f) ==
191 "trocar tudo em bbbbb é alalalalalal")
192
193local function dostring (s) return load(s, "")() or "" end
194assert(string.gsub("alo $a='x'$ novamente $return a$",
195 "$([^$]*)%$",
196 dostring) == "alo novamente x")
197
198x = string.gsub("$x=string.gsub('alo', '.', string.upper)$ assim vai para $return x$",
199 "$([^$]*)%$", dostring)
200assert(x == ' assim vai para ALO')
201
202t = {}
203s = 'a alo jose joao'
204r = string.gsub(s, '()(%w+)()', function (a,w,b)
205 assert(string.len(w) == b-a);
206 t[a] = b-a;
207 end)
208assert(s == r and t[1] == 1 and t[3] == 3 and t[7] == 4 and t[13] == 4)
209
210
211function isbalanced (s)
212 return string.find(string.gsub(s, "%b()", ""), "[()]") == nil
213end
214
215assert(isbalanced("(9 ((8))(\0) 7) \0\0 a b ()(c)() a"))
216assert(not isbalanced("(9 ((8) 7) a b (\0 c) a"))
217assert(string.gsub("alo 'oi' alo", "%b''", '"') == 'alo " alo')
218
219
220local t = {"apple", "orange", "lime"; n=0}
221assert(string.gsub("x and x and x", "x", function () t.n=t.n+1; return t[t.n] end)
222 == "apple and orange and lime")
223
224t = {n=0}
225string.gsub("first second word", "%w%w*", function (w) t.n=t.n+1; t[t.n] = w end)
226assert(t[1] == "first" and t[2] == "second" and t[3] == "word" and t.n == 3)
227
228t = {n=0}
229assert(string.gsub("first second word", "%w+",
230 function (w) t.n=t.n+1; t[t.n] = w end, 2) == "first second word")
231assert(t[1] == "first" and t[2] == "second" and t[3] == nil)
232
233checkerror("invalid replacement value %(a table%)",
234 string.gsub, "alo", ".", {a = {}})
235checkerror("invalid capture index %%2", string.gsub, "alo", ".", "%2")
236checkerror("invalid capture index %%0", string.gsub, "alo", "(%0)", "a")
237checkerror("invalid capture index %%1", string.gsub, "alo", "(%1)", "a")
238checkerror("invalid use of '%%'", string.gsub, "alo", ".", "%x")
239
240-- bug since 2.5 (C-stack overflow)
241do
242 local function f (size)
243 local s = string.rep("a", size)
244 local p = string.rep(".?", size)
245 return pcall(string.match, s, p)
246 end
247 local r, m = f(80)
248 assert(r and #m == 80)
249 r, m = f(200000)
250 assert(not r and string.find(m, "too complex"))
251end
252
253if not _soft then
254 print("big strings")
255 local a = string.rep('a', 300000)
256 assert(string.find(a, '^a*.?$'))
257 assert(not string.find(a, '^a*.?b$'))
258 assert(string.find(a, '^a-.?$'))
259
260 -- bug in 5.1.2
261 a = string.rep('a', 10000) .. string.rep('b', 10000)
262 assert(not pcall(string.gsub, a, 'b'))
263end
264
265-- recursive nest of gsubs
266function rev (s)
267 return string.gsub(s, "(.)(.+)", function (c,s1) return rev(s1)..c end)
268end
269
270local x = "abcdef"
271assert(rev(rev(x)) == x)
272
273
274-- gsub with tables
275assert(string.gsub("alo alo", ".", {}) == "alo alo")
276assert(string.gsub("alo alo", "(.)", {a="AA", l=""}) == "AAo AAo")
277assert(string.gsub("alo alo", "(.).", {a="AA", l="K"}) == "AAo AAo")
278assert(string.gsub("alo alo", "((.)(.?))", {al="AA", o=false}) == "AAo AAo")
279
280assert(string.gsub("alo alo", "().", {'x','yy','zzz'}) == "xyyzzz alo")
281
282t = {}; setmetatable(t, {__index = function (t,s) return string.upper(s) end})
283assert(string.gsub("a alo b hi", "%w%w+", t) == "a ALO b HI")
284
285
286-- tests for gmatch
287local a = 0
288for i in string.gmatch('abcde', '()') do assert(i == a+1); a=i end
289assert(a==6)
290
291t = {n=0}
292for w in string.gmatch("first second word", "%w+") do
293 t.n=t.n+1; t[t.n] = w
294end
295assert(t[1] == "first" and t[2] == "second" and t[3] == "word")
296
297t = {3, 6, 9}
298for i in string.gmatch ("xuxx uu ppar r", "()(.)%2") do
299 assert(i == table.remove(t, 1))
300end
301assert(#t == 0)
302
303t = {}
304for i,j in string.gmatch("13 14 10 = 11, 15= 16, 22=23", "(%d+)%s*=%s*(%d+)") do
305 t[tonumber(i)] = tonumber(j)
306end
307a = 0
308for k,v in pairs(t) do assert(k+1 == v+0); a=a+1 end
309assert(a == 3)
310
311
312-- tests for `%f' (`frontiers')
313
314assert(string.gsub("aaa aa a aaa a", "%f[%w]a", "x") == "xaa xa x xaa x")
315assert(string.gsub("[[]] [][] [[[[", "%f[[].", "x") == "x[]] x]x] x[[[")
316assert(string.gsub("01abc45de3", "%f[%d]", ".") == ".01abc.45de.3")
317assert(string.gsub("01abc45 de3x", "%f[%D]%w", ".") == "01.bc45 de3.")
318assert(string.gsub("function", "%f[\1-\255]%w", ".") == ".unction")
319assert(string.gsub("function", "%f[^\1-\255]", ".") == "function.")
320
321assert(string.find("a", "%f[a]") == 1)
322assert(string.find("a", "%f[^%z]") == 1)
323assert(string.find("a", "%f[^%l]") == 2)
324assert(string.find("aba", "%f[a%z]") == 3)
325assert(string.find("aba", "%f[%z]") == 4)
326assert(not string.find("aba", "%f[%l%z]"))
327assert(not string.find("aba", "%f[^%l%z]"))
328
329local i, e = string.find(" alo aalo allo", "%f[%S].-%f[%s].-%f[%S]")
330assert(i == 2 and e == 5)
331local k = string.match(" alo aalo allo", "%f[%S](.-%f[%s].-%f[%S])")
332assert(k == 'alo ')
333
334local a = {1, 5, 9, 14, 17,}
335for k in string.gmatch("alo alo th02 is 1hat", "()%f[%w%d]") do
336 assert(table.remove(a, 1) == k)
337end
338assert(#a == 0)
339
340
341-- malformed patterns
342local function malform (p, m)
343 m = m or "malformed"
344 local r, msg = pcall(string.find, "a", p)
345 assert(not r and string.find(msg, m))
346end
347
348malform("(.", "unfinished capture")
349malform(".)", "invalid pattern capture")
350malform("[a")
351malform("[]")
352malform("[^]")
353malform("[a%]")
354malform("[a%")
355malform("%b")
356malform("%ba")
357malform("%")
358malform("%f", "missing")
359
360-- \0 in patterns
361assert(string.match("ab\0\1\2c", "[\0-\2]+") == "\0\1\2")
362assert(string.match("ab\0\1\2c", "[\0-\0]+") == "\0")
363assert(string.find("b$a", "$\0?") == 2)
364assert(string.find("abc\0efg", "%\0") == 4)
365assert(string.match("abc\0efg\0\1e\1g", "%b\0\1") == "\0efg\0\1e\1")
366assert(string.match("abc\0\0\0", "%\0+") == "\0\0\0")
367assert(string.match("abc\0\0\0", "%\0%\0?") == "\0\0")
368
369-- magic char after \0
370assert(string.find("abc\0\0","\0.") == 4)
371assert(string.find("abcx\0\0abc\0abc","x\0\0abc\0a.") == 4)
372
373print('OK')
374