summaryrefslogtreecommitdiff
path: root/testes/strings.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/strings.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 '')
-rw-r--r--testes/strings.lua379
1 files changed, 379 insertions, 0 deletions
diff --git a/testes/strings.lua b/testes/strings.lua
new file mode 100644
index 00000000..c37a8e75
--- /dev/null
+++ b/testes/strings.lua
@@ -0,0 +1,379 @@
1-- $Id: strings.lua,v 1.87 2016/12/21 19:23:02 roberto Exp $
2-- See Copyright Notice in file all.lua
3
4print('testing strings and string library')
5
6local maxi, mini = math.maxinteger, math.mininteger
7
8
9local function checkerror (msg, f, ...)
10 local s, err = pcall(f, ...)
11 assert(not s and string.find(err, msg))
12end
13
14
15-- testing string comparisons
16assert('alo' < 'alo1')
17assert('' < 'a')
18assert('alo\0alo' < 'alo\0b')
19assert('alo\0alo\0\0' > 'alo\0alo\0')
20assert('alo' < 'alo\0')
21assert('alo\0' > 'alo')
22assert('\0' < '\1')
23assert('\0\0' < '\0\1')
24assert('\1\0a\0a' <= '\1\0a\0a')
25assert(not ('\1\0a\0b' <= '\1\0a\0a'))
26assert('\0\0\0' < '\0\0\0\0')
27assert(not('\0\0\0\0' < '\0\0\0'))
28assert('\0\0\0' <= '\0\0\0\0')
29assert(not('\0\0\0\0' <= '\0\0\0'))
30assert('\0\0\0' <= '\0\0\0')
31assert('\0\0\0' >= '\0\0\0')
32assert(not ('\0\0b' < '\0\0a\0'))
33
34-- testing string.sub
35assert(string.sub("123456789",2,4) == "234")
36assert(string.sub("123456789",7) == "789")
37assert(string.sub("123456789",7,6) == "")
38assert(string.sub("123456789",7,7) == "7")
39assert(string.sub("123456789",0,0) == "")
40assert(string.sub("123456789",-10,10) == "123456789")
41assert(string.sub("123456789",1,9) == "123456789")
42assert(string.sub("123456789",-10,-20) == "")
43assert(string.sub("123456789",-1) == "9")
44assert(string.sub("123456789",-4) == "6789")
45assert(string.sub("123456789",-6, -4) == "456")
46assert(string.sub("123456789", mini, -4) == "123456")
47assert(string.sub("123456789", mini, maxi) == "123456789")
48assert(string.sub("123456789", mini, mini) == "")
49assert(string.sub("\000123456789",3,5) == "234")
50assert(("\000123456789"):sub(8) == "789")
51
52-- testing string.find
53assert(string.find("123456789", "345") == 3)
54a,b = string.find("123456789", "345")
55assert(string.sub("123456789", a, b) == "345")
56assert(string.find("1234567890123456789", "345", 3) == 3)
57assert(string.find("1234567890123456789", "345", 4) == 13)
58assert(string.find("1234567890123456789", "346", 4) == nil)
59assert(string.find("1234567890123456789", ".45", -9) == 13)
60assert(string.find("abcdefg", "\0", 5, 1) == nil)
61assert(string.find("", "") == 1)
62assert(string.find("", "", 1) == 1)
63assert(not string.find("", "", 2))
64assert(string.find('', 'aaa', 1) == nil)
65assert(('alo(.)alo'):find('(.)', 1, 1) == 4)
66
67assert(string.len("") == 0)
68assert(string.len("\0\0\0") == 3)
69assert(string.len("1234567890") == 10)
70
71assert(#"" == 0)
72assert(#"\0\0\0" == 3)
73assert(#"1234567890" == 10)
74
75-- testing string.byte/string.char
76assert(string.byte("a") == 97)
77assert(string.byte("\xe4") > 127)
78assert(string.byte(string.char(255)) == 255)
79assert(string.byte(string.char(0)) == 0)
80assert(string.byte("\0") == 0)
81assert(string.byte("\0\0alo\0x", -1) == string.byte('x'))
82assert(string.byte("ba", 2) == 97)
83assert(string.byte("\n\n", 2, -1) == 10)
84assert(string.byte("\n\n", 2, 2) == 10)
85assert(string.byte("") == nil)
86assert(string.byte("hi", -3) == nil)
87assert(string.byte("hi", 3) == nil)
88assert(string.byte("hi", 9, 10) == nil)
89assert(string.byte("hi", 2, 1) == nil)
90assert(string.char() == "")
91assert(string.char(0, 255, 0) == "\0\255\0")
92assert(string.char(0, string.byte("\xe4"), 0) == "\0\xe4\0")
93assert(string.char(string.byte("\xe4l\0óu", 1, -1)) == "\xe4l\0óu")
94assert(string.char(string.byte("\xe4l\0óu", 1, 0)) == "")
95assert(string.char(string.byte("\xe4l\0óu", -10, 100)) == "\xe4l\0óu")
96
97assert(string.upper("ab\0c") == "AB\0C")
98assert(string.lower("\0ABCc%$") == "\0abcc%$")
99assert(string.rep('teste', 0) == '')
100assert(string.rep('tés\00tê', 2) == 'tés\0têtés\000tê')
101assert(string.rep('', 10) == '')
102
103if string.packsize("i") == 4 then
104 -- result length would be 2^31 (int overflow)
105 checkerror("too large", string.rep, 'aa', (1 << 30))
106 checkerror("too large", string.rep, 'a', (1 << 30), ',')
107end
108
109-- repetitions with separator
110assert(string.rep('teste', 0, 'xuxu') == '')
111assert(string.rep('teste', 1, 'xuxu') == 'teste')
112assert(string.rep('\1\0\1', 2, '\0\0') == '\1\0\1\0\0\1\0\1')
113assert(string.rep('', 10, '.') == string.rep('.', 9))
114assert(not pcall(string.rep, "aa", maxi // 2 + 10))
115assert(not pcall(string.rep, "", maxi // 2 + 10, "aa"))
116
117assert(string.reverse"" == "")
118assert(string.reverse"\0\1\2\3" == "\3\2\1\0")
119assert(string.reverse"\0001234" == "4321\0")
120
121for i=0,30 do assert(string.len(string.rep('a', i)) == i) end
122
123assert(type(tostring(nil)) == 'string')
124assert(type(tostring(12)) == 'string')
125assert(string.find(tostring{}, 'table:'))
126assert(string.find(tostring(print), 'function:'))
127assert(#tostring('\0') == 1)
128assert(tostring(true) == "true")
129assert(tostring(false) == "false")
130assert(tostring(-1203) == "-1203")
131assert(tostring(1203.125) == "1203.125")
132assert(tostring(-0.5) == "-0.5")
133assert(tostring(-32767) == "-32767")
134if math.tointeger(2147483647) then -- no overflow? (32 bits)
135 assert(tostring(-2147483647) == "-2147483647")
136end
137if math.tointeger(4611686018427387904) then -- no overflow? (64 bits)
138 assert(tostring(4611686018427387904) == "4611686018427387904")
139 assert(tostring(-4611686018427387904) == "-4611686018427387904")
140end
141
142if tostring(0.0) == "0.0" then -- "standard" coercion float->string
143 assert('' .. 12 == '12' and 12.0 .. '' == '12.0')
144 assert(tostring(-1203 + 0.0) == "-1203.0")
145else -- compatible coercion
146 assert(tostring(0.0) == "0")
147 assert('' .. 12 == '12' and 12.0 .. '' == '12')
148 assert(tostring(-1203 + 0.0) == "-1203")
149end
150
151
152x = '"ílo"\n\\'
153assert(string.format('%q%s', x, x) == '"\\"ílo\\"\\\n\\\\""ílo"\n\\')
154assert(string.format('%q', "\0") == [["\0"]])
155assert(load(string.format('return %q', x))() == x)
156x = "\0\1\0023\5\0009"
157assert(load(string.format('return %q', x))() == x)
158assert(string.format("\0%c\0%c%x\0", string.byte("\xe4"), string.byte("b"), 140) ==
159 "\0\xe4\0b8c\0")
160assert(string.format('') == "")
161assert(string.format("%c",34)..string.format("%c",48)..string.format("%c",90)..string.format("%c",100) ==
162 string.format("%c%c%c%c", 34, 48, 90, 100))
163assert(string.format("%s\0 is not \0%s", 'not be', 'be') == 'not be\0 is not \0be')
164assert(string.format("%%%d %010d", 10, 23) == "%10 0000000023")
165assert(tonumber(string.format("%f", 10.3)) == 10.3)
166x = string.format('"%-50s"', 'a')
167assert(#x == 52)
168assert(string.sub(x, 1, 4) == '"a ')
169
170assert(string.format("-%.20s.20s", string.rep("%", 2000)) ==
171 "-"..string.rep("%", 20)..".20s")
172assert(string.format('"-%20s.20s"', string.rep("%", 2000)) ==
173 string.format("%q", "-"..string.rep("%", 2000)..".20s"))
174
175do
176 local function checkQ (v)
177 local s = string.format("%q", v)
178 local nv = load("return " .. s)()
179 assert(v == nv and math.type(v) == math.type(nv))
180 end
181 checkQ("\0\0\1\255\u{234}")
182 checkQ(math.maxinteger)
183 checkQ(math.mininteger)
184 checkQ(math.pi)
185 checkQ(0.1)
186 checkQ(true)
187 checkQ(nil)
188 checkQ(false)
189 checkerror("no literal", string.format, "%q", {})
190end
191
192assert(string.format("\0%s\0", "\0\0\1") == "\0\0\0\1\0")
193checkerror("contains zeros", string.format, "%10s", "\0")
194
195-- format x tostring
196assert(string.format("%s %s", nil, true) == "nil true")
197assert(string.format("%s %.4s", false, true) == "false true")
198assert(string.format("%.3s %.3s", false, true) == "fal tru")
199local m = setmetatable({}, {__tostring = function () return "hello" end,
200 __name = "hi"})
201assert(string.format("%s %.10s", m, m) == "hello hello")
202getmetatable(m).__tostring = nil -- will use '__name' from now on
203assert(string.format("%.4s", m) == "hi: ")
204
205getmetatable(m).__tostring = function () return {} end
206checkerror("'__tostring' must return a string", tostring, m)
207
208
209assert(string.format("%x", 0.0) == "0")
210assert(string.format("%02x", 0.0) == "00")
211assert(string.format("%08X", 0xFFFFFFFF) == "FFFFFFFF")
212assert(string.format("%+08d", 31501) == "+0031501")
213assert(string.format("%+08d", -30927) == "-0030927")
214
215
216do -- longest number that can be formatted
217 local i = 1
218 local j = 10000
219 while i + 1 < j do -- binary search for maximum finite float
220 local m = (i + j) // 2
221 if 10^m < math.huge then i = m else j = m end
222 end
223 assert(10^i < math.huge and 10^j == math.huge)
224 local s = string.format('%.99f', -(10^i))
225 assert(string.len(s) >= i + 101)
226 assert(tonumber(s) == -(10^i))
227end
228
229
230-- testing large numbers for format
231do -- assume at least 32 bits
232 local max, min = 0x7fffffff, -0x80000000 -- "large" for 32 bits
233 assert(string.sub(string.format("%8x", -1), -8) == "ffffffff")
234 assert(string.format("%x", max) == "7fffffff")
235 assert(string.sub(string.format("%x", min), -8) == "80000000")
236 assert(string.format("%d", max) == "2147483647")
237 assert(string.format("%d", min) == "-2147483648")
238 assert(string.format("%u", 0xffffffff) == "4294967295")
239 assert(string.format("%o", 0xABCD) == "125715")
240
241 max, min = 0x7fffffffffffffff, -0x8000000000000000
242 if max > 2.0^53 then -- only for 64 bits
243 assert(string.format("%x", (2^52 | 0) - 1) == "fffffffffffff")
244 assert(string.format("0x%8X", 0x8f000003) == "0x8F000003")
245 assert(string.format("%d", 2^53) == "9007199254740992")
246 assert(string.format("%i", -2^53) == "-9007199254740992")
247 assert(string.format("%x", max) == "7fffffffffffffff")
248 assert(string.format("%x", min) == "8000000000000000")
249 assert(string.format("%d", max) == "9223372036854775807")
250 assert(string.format("%d", min) == "-9223372036854775808")
251 assert(string.format("%u", ~(-1 << 64)) == "18446744073709551615")
252 assert(tostring(1234567890123) == '1234567890123')
253 end
254end
255
256
257do print("testing 'format %a %A'")
258 local function matchhexa (n)
259 local s = string.format("%a", n)
260 -- result matches ISO C requirements
261 assert(string.find(s, "^%-?0x[1-9a-f]%.?[0-9a-f]*p[-+]?%d+$"))
262 assert(tonumber(s) == n) -- and has full precision
263 s = string.format("%A", n)
264 assert(string.find(s, "^%-?0X[1-9A-F]%.?[0-9A-F]*P[-+]?%d+$"))
265 assert(tonumber(s) == n)
266 end
267 for _, n in ipairs{0.1, -0.1, 1/3, -1/3, 1e30, -1e30,
268 -45/247, 1, -1, 2, -2, 3e-20, -3e-20} do
269 matchhexa(n)
270 end
271
272 assert(string.find(string.format("%A", 0.0), "^0X0%.?0?P%+?0$"))
273 assert(string.find(string.format("%a", -0.0), "^%-0x0%.?0?p%+?0$"))
274
275 if not _port then -- test inf, -inf, NaN, and -0.0
276 assert(string.find(string.format("%a", 1/0), "^inf"))
277 assert(string.find(string.format("%A", -1/0), "^%-INF"))
278 assert(string.find(string.format("%a", 0/0), "^%-?nan"))
279 assert(string.find(string.format("%a", -0.0), "^%-0x0"))
280 end
281
282 if not pcall(string.format, "%.3a", 0) then
283 (Message or print)("\n >>> modifiers for format '%a' not available <<<\n")
284 else
285 assert(string.find(string.format("%+.2A", 12), "^%+0X%x%.%x0P%+?%d$"))
286 assert(string.find(string.format("%.4A", -12), "^%-0X%x%.%x000P%+?%d$"))
287 end
288end
289
290
291-- errors in format
292
293local function check (fmt, msg)
294 checkerror(msg, string.format, fmt, 10)
295end
296
297local aux = string.rep('0', 600)
298check("%100.3d", "too long")
299check("%1"..aux..".3d", "too long")
300check("%1.100d", "too long")
301check("%10.1"..aux.."004d", "too long")
302check("%t", "invalid option")
303check("%"..aux.."d", "repeated flags")
304check("%d %d", "no value")
305
306
307assert(load("return 1\n--comment without ending EOL")() == 1)
308
309
310checkerror("table expected", table.concat, 3)
311assert(table.concat{} == "")
312assert(table.concat({}, 'x') == "")
313assert(table.concat({'\0', '\0\1', '\0\1\2'}, '.\0.') == "\0.\0.\0\1.\0.\0\1\2")
314local a = {}; for i=1,300 do a[i] = "xuxu" end
315assert(table.concat(a, "123").."123" == string.rep("xuxu123", 300))
316assert(table.concat(a, "b", 20, 20) == "xuxu")
317assert(table.concat(a, "", 20, 21) == "xuxuxuxu")
318assert(table.concat(a, "x", 22, 21) == "")
319assert(table.concat(a, "3", 299) == "xuxu3xuxu")
320assert(table.concat({}, "x", maxi, maxi - 1) == "")
321assert(table.concat({}, "x", mini + 1, mini) == "")
322assert(table.concat({}, "x", maxi, mini) == "")
323assert(table.concat({[maxi] = "alo"}, "x", maxi, maxi) == "alo")
324assert(table.concat({[maxi] = "alo", [maxi - 1] = "y"}, "-", maxi - 1, maxi)
325 == "y-alo")
326
327assert(not pcall(table.concat, {"a", "b", {}}))
328
329a = {"a","b","c"}
330assert(table.concat(a, ",", 1, 0) == "")
331assert(table.concat(a, ",", 1, 1) == "a")
332assert(table.concat(a, ",", 1, 2) == "a,b")
333assert(table.concat(a, ",", 2) == "b,c")
334assert(table.concat(a, ",", 3) == "c")
335assert(table.concat(a, ",", 4) == "")
336
337if not _port then
338
339 local locales = { "ptb", "pt_BR.iso88591", "ISO-8859-1" }
340 local function trylocale (w)
341 for i = 1, #locales do
342 if os.setlocale(locales[i], w) then
343 print(string.format("'%s' locale set to '%s'", w, locales[i]))
344 return locales[i]
345 end
346 end
347 print(string.format("'%s' locale not found", w))
348 return false
349 end
350
351 if trylocale("collate") then
352 assert("alo" < "álo" and "álo" < "amo")
353 end
354
355 if trylocale("ctype") then
356 assert(string.gsub("áéíóú", "%a", "x") == "xxxxx")
357 assert(string.gsub("áÁéÉ", "%l", "x") == "xÁxÉ")
358 assert(string.gsub("áÁéÉ", "%u", "x") == "áxéx")
359 assert(string.upper"áÁé{xuxu}ção" == "ÁÁÉ{XUXU}ÇÃO")
360 end
361
362 os.setlocale("C")
363 assert(os.setlocale() == 'C')
364 assert(os.setlocale(nil, "numeric") == 'C')
365
366end
367
368
369-- bug in Lua 5.3.2
370-- 'gmatch' iterator does not work across coroutines
371do
372 local f = string.gmatch("1 2 3 4 5", "%d+")
373 assert(f() == "1")
374 co = coroutine.wrap(f)
375 assert(co() == "2")
376end
377
378print('OK')
379