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