]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tests/zfs-tests/tests/functional/channel_program/lua_core/tst.lib_strings.lua
Vendor import of openzfs master @ 184df27eef0abdc7ab2105b21257f753834b936b
[FreeBSD/FreeBSD.git] / tests / zfs-tests / tests / functional / channel_program / lua_core / tst.lib_strings.lua
1 --[[
2 --*****************************************************************************
3 --* Copyright (C) 1994-2016 Lua.org, PUC-Rio.
4 --*
5 --* Permission is hereby granted, free of charge, to any person obtaining
6 --* a copy of this software and associated documentation files (the
7 --* "Software"), to deal in the Software without restriction, including
8 --* without limitation the rights to use, copy, modify, merge, publish,
9 --* distribute, sublicense, and/or sell copies of the Software, and to
10 --* permit persons to whom the Software is furnished to do so, subject to
11 --* the following conditions:
12 --*
13 --* The above copyright notice and this permission notice shall be
14 --* included in all copies or substantial portions of the Software.
15 --*
16 --* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 --* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 --* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 --* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20 --* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 --* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 --* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 --*****************************************************************************
24 --]]
25
26 -- testing string library
27
28 local maxi, mini = 0x7fffffffffffffff, 0x8000000000000000
29
30 -- testing string.sub
31 assert(string.sub("123456789",2,4) == "234")
32 assert(string.sub("123456789",7) == "789")
33 assert(string.sub("123456789",7,6) == "")
34 assert(string.sub("123456789",7,7) == "7")
35 assert(string.sub("123456789",0,0) == "")
36 assert(string.sub("123456789",-10,10) == "123456789")
37 assert(string.sub("123456789",1,9) == "123456789")
38 assert(string.sub("123456789",-10,-20) == "")
39 assert(string.sub("123456789",-1) == "9")
40 assert(string.sub("123456789",-4) == "6789")
41 assert(string.sub("123456789",-6, -4) == "456")
42 assert(string.sub("123456789", mini, -4) == "123456")
43 assert(string.sub("123456789", mini, maxi) == "123456789")
44 assert(string.sub("123456789", mini, mini) == "")
45 assert(string.sub("\000123456789",3,5) == "234")
46 assert(("\000123456789"):sub(8) == "789")
47
48 -- testing string.find
49 assert(string.find("123456789", "345") == 3)
50 a,b = string.find("123456789", "345")
51 assert(string.sub("123456789", a, b) == "345")
52 assert(string.find("1234567890123456789", "345", 3) == 3)
53 assert(string.find("1234567890123456789", "345", 4) == 13)
54 assert(string.find("1234567890123456789", "346", 4) == nil)
55 assert(string.find("1234567890123456789", ".45", -9) == 13)
56 assert(string.find("abcdefg", "\0", 5, 1) == nil)
57 assert(string.find("", "") == 1)
58 assert(string.find("", "", 1) == 1)
59 assert(not string.find("", "", 2))
60 assert(string.find('', 'aaa', 1) == nil)
61 assert(('alo(.)alo'):find('(.)', 1, 1) == 4)
62
63 assert(string.len("") == 0)
64 assert(string.len("\0\0\0") == 3)
65 assert(string.len("1234567890") == 10)
66
67 assert(#"" == 0)
68 assert(#"\0\0\0" == 3)
69 assert(#"1234567890" == 10)
70
71 -- testing string.byte/string.char
72 assert(string.byte("a") == 97)
73 assert(string.byte("\xe4") > 127)
74 assert(string.byte(string.char(255)) == 255)
75 assert(string.byte(string.char(0)) == 0)
76 assert(string.byte("\0") == 0)
77 assert(string.byte("\0\0alo\0x", -1) == string.byte('x'))
78 assert(string.byte("ba", 2) == 97)
79 assert(string.byte("\n\n", 2, -1) == 10)
80 assert(string.byte("\n\n", 2, 2) == 10)
81 assert(string.byte("") == nil)
82 assert(string.byte("hi", -3) == nil)
83 assert(string.byte("hi", 3) == nil)
84 assert(string.byte("hi", 9, 10) == nil)
85 assert(string.byte("hi", 2, 1) == nil)
86 assert(string.char() == "")
87 assert(string.char(0, 255, 0) == "\0\255\0")
88 assert(string.char(0, string.byte("\xe4"), 0) == "\0\xe4\0")
89 assert(string.char(string.byte("\xe4l\0\195\179u", 1, -1)) == "\xe4l\0\195\179u")
90 assert(string.char(string.byte("\xe4l\0\195\179u", 1, 0)) == "")
91 assert(string.char(string.byte("\xe4l\0\195\179u", -10, 100)) == "\xe4l\0\195\179u")
92
93 assert(string.upper("ab\0c") == "AB\0C")
94 assert(string.lower("\0ABCc%$") == "\0abcc%$")
95 assert(string.rep('teste', 0) == '')
96 assert(string.rep('t\195\169s\00t\195\170', 2) == 't\195\169s\0t\195\170t\195\169s\000t\195\170')
97 assert(string.rep('', 10) == '')
98
99 -- repetitions with separator
100 assert(string.rep('teste', 0, 'xuxu') == '')
101 assert(string.rep('teste', 1, 'xuxu') == 'teste')
102 assert(string.rep('\1\0\1', 2, '\0\0') == '\1\0\1\0\0\1\0\1')
103 assert(string.rep('', 10, '.') == string.rep('.', 9))
104
105 assert(string.reverse"" == "")
106 assert(string.reverse"\0\1\2\3" == "\3\2\1\0")
107 assert(string.reverse"\0001234" == "4321\0")
108
109 for i=0,30 do assert(string.len(string.rep('a', i)) == i) end
110
111
112 x = '"\195\174lo"\n\\'
113 assert(string.format('%q%s', x, x) == '"\\"\195\174lo\\"\\\n\\\\""\195\174lo"\n\\')
114 assert(string.format('%q', "\0") == [["\0"]])
115 x = "\0\1\0023\5\0009"
116 assert(string.format("\0%c\0%c%x\0", string.byte("\xe4"), string.byte("b"), 140) ==
117               "\0\xe4\0b8c\0")
118 assert(string.format('') == "")
119 assert(string.format("%c",34)..string.format("%c",48)..string.format("%c",90)..string.format("%c",100) ==
120        string.format("%c%c%c%c", 34, 48, 90, 100))
121 assert(string.format("%s\0 is not \0%s", 'not be', 'be') == 'not be\0 is not \0be')
122 assert(string.format("%%%d %010d", 10, 23) == "%10 0000000023")
123 x = string.format('"%-50s"', 'a')
124 assert(#x == 52)
125 assert(string.sub(x, 1, 4) == '"a  ')
126
127 assert(string.format("-%.20s.20s", string.rep("%", 2000)) ==
128                      "-"..string.rep("%", 20)..".20s")
129 assert(string.format('"-%20s.20s"', string.rep("%", 2000)) ==
130        string.format("%q", "-"..string.rep("%", 2000)..".20s"))
131
132 -- format x tostring
133 assert(string.format("%s %s", nil, true) == "nil true")
134 assert(string.format("%s %.4s", false, true) == "false true")
135 assert(string.format("%.3s %.3s", false, true) == "fal tru")
136
137
138 -- testing large numbers for format
139 do
140   local max, min = 0x7fffffff, -0x80000000    -- "large" for 32 bits
141   assert(string.sub(string.format("%8x", -1), -8) == "ffffffff")
142   assert(string.format("%x", max) == "7fffffff")
143   assert(string.sub(string.format("%x", min), -8) == "80000000")
144   assert(string.format("%d", max) ==  "2147483647")
145   assert(string.format("%d", min) == "-2147483648")
146   assert(string.format("%u", 0xffffffff) == "4294967295")
147   assert(string.format("%o", 0xABCD) == "125715")
148
149   max, min = 0x7fffffffffffffff, -0x8000000000000000
150   assert(string.format("0x%8X", 0x8f000003) == "0x8F000003")
151   assert(string.format("%d", 2^53) == "9007199254740992")
152   assert(string.format("%x", max) == "7fffffffffffffff")
153   assert(string.format("%x", min) == "8000000000000000")
154   assert(string.format("%d", max) ==  "9223372036854775807")
155   assert(string.format("%d", min) == "-9223372036854775808")
156 end
157
158
159 assert(table.concat{} == "")
160 assert(table.concat({}, 'x') == "")
161 assert(table.concat({'\0', '\0\1', '\0\1\2'}, '.\0.') == "\0.\0.\0\1.\0.\0\1\2")
162 local a = {}; for i=1,300 do a[i] = "xuxu" end
163 assert(table.concat(a, "123").."123" == string.rep("xuxu123", 300))
164 assert(table.concat(a, "b", 20, 20) == "xuxu")
165 assert(table.concat(a, "", 20, 21) == "xuxuxuxu")
166 assert(table.concat(a, "x", 22, 21) == "")
167 assert(table.concat(a, "3", 299) == "xuxu3xuxu")
168 assert(table.concat({}, "x", 2^31-1, 2^31-2) == "")
169 assert(table.concat({}, "x", -2^31+1, -2^31) == "")
170 assert(table.concat({}, "x", 2^31-1, -2^31) == "")
171 assert(table.concat({[2^31-1] = "alo"}, "x", 2^31-1, 2^31-1) == "alo")
172
173 a = {"a","b","c"}
174 assert(table.concat(a, ",", 1, 0) == "")
175 assert(table.concat(a, ",", 1, 1) == "a")
176 assert(table.concat(a, ",", 1, 2) == "a,b")
177 assert(table.concat(a, ",", 2) == "b,c")
178 assert(table.concat(a, ",", 3) == "c")
179 assert(table.concat(a, ",", 4) == "")
180
181
182 -- tests for gmatch
183 local a = 0
184 for i in string.gmatch('abcde', '()') do assert(i == a+1); a=i end
185 assert(a==6)
186
187 t = {n=0}
188 for w in string.gmatch("first second word", "%w+") do
189       t.n=t.n+1; t[t.n] = w
190 end
191 assert(t[1] == "first" and t[2] == "second" and t[3] == "word")
192
193 t = {3, 6, 9}
194 for i in string.gmatch ("xuxx uu ppar r", "()(.)%2") do
195   assert(i == table.remove(t, 1))
196 end
197 assert(#t == 0)
198
199 t = {}
200 for i,j in string.gmatch("13 14 10 = 11, 15= 16, 22=23", "(%d+)%s*=%s*(%d+)") do
201   t[i] = j
202 end
203 a = 0
204 for k,v in pairs(t) do assert(k+1 == v+0); a=a+1 end
205 assert(a == 3)
206
207
208 -- tests for gsub
209 function f1(s, p)
210   p = string.gsub(p, "%%([0-9])", function (s) return "%" .. (s+1) end)
211   p = string.gsub(p, "^(^?)", "%1()", 1)
212   p = string.gsub(p, "($?)$", "()%1", 1)
213   local t = {string.match(s, p)}
214   return string.sub(s, t[1], t[#t] - 1)
215 end
216
217 assert(f1('alo alx 123 b\0o b\0o', '(..*) %1') == "b\0o b\0o")
218 assert(f1('axz123= 4= 4 34', '(.+)=(.*)=%2 %1') == '3= 4= 4 3')
219 assert(f1('=======', '^(=*)=%1$') == '=======')
220
221 -- gsub with tables
222 assert(string.gsub("alo alo", ".", {}) == "alo alo")
223 assert(string.gsub("alo alo", "(.)", {a="AA", l=""}) == "AAo AAo")
224 assert(string.gsub("alo alo", "(.).", {a="AA", l="K"}) == "AAo AAo")
225 assert(string.gsub("alo alo", "((.)(.?))", {al="AA", o=false}) == "AAo AAo")
226
227 assert(string.gsub("alo alo", "().", {2,5,6}) == "256 alo")
228
229 t = {}; setmetatable(t, {__index = function (t,s) return string.upper(s) end})
230 assert(string.gsub("a alo b hi", "%w%w+", t) == "a ALO b HI")
231
232
233 -- tests for match
234 assert(string.match('==========', '^([=]*)=%1$') == nil)
235 assert(string.match("alo xyzK", "(%w+)K") == "xyz")
236 assert(string.match("254 K", "(%d*)K") == "")
237 assert(string.match("alo ", "(%w*)$") == "")
238 assert(string.match("alo ", "(%w+)$") == nil)
239 assert(string.match("ab\0\1\2c", "[\0-\2]+") == "\0\1\2")
240
241 return "OK"