Skip to content

Commit 938ba2f

Browse files
committed
Implement utf8 library
Run pattern-matching and UTF-8 tests from Lua test suite. Updates #74
1 parent 3b0061d commit 938ba2f

File tree

6 files changed

+856
-58
lines changed

6 files changed

+856
-58
lines changed

internal/lua/auxlib.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,9 +438,9 @@ func OpenLibraries(ctx context.Context, l *State) error {
438438
{TableLibraryName, OpenTable},
439439
{StringLibraryName, OpenString},
440440
{MathLibraryName, NewOpenMath(nil)},
441+
{UTF8LibraryName, OpenUTF8},
441442
// {IOLibraryName, NewIOLibrary().OpenLibrary},
442443
// {OSLibraryName, NewOSLibrary().OpenLibrary},
443-
// {UTF8LibraryName, OpenUTF8},
444444
// {DebugLibraryName, OpenDebug},
445445
// {PackageLibraryName, OpenPackage},
446446
}

internal/lua/lua_test.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1187,7 +1187,9 @@ func TestRotate(t *testing.T) {
11871187
func TestSuite(t *testing.T) {
11881188
names := []string{
11891189
"math",
1190+
"pm",
11901191
"strings",
1192+
"utf8",
11911193
}
11921194

11931195
for _, name := range names {
@@ -1207,6 +1209,13 @@ func TestSuite(t *testing.T) {
12071209
t.Fatal(err)
12081210
}
12091211

1212+
// Message handler.
1213+
l.PushClosure(0, func(ctx context.Context, l *State) (int, error) {
1214+
msg, _ := l.ToString(1)
1215+
l.PushStringContext(Traceback(l, msg, 1), l.StringContext(1))
1216+
return 1, nil
1217+
})
1218+
12101219
sourcePath := filepath.Join("testdata", "testsuite", name+".lua")
12111220
sourceData, err := os.ReadFile(sourcePath)
12121221
if err != nil {
@@ -1216,7 +1225,7 @@ func TestSuite(t *testing.T) {
12161225
if err != nil {
12171226
t.Fatal(err)
12181227
}
1219-
if err := l.Call(ctx, 0, 0); err != nil {
1228+
if err := l.PCall(ctx, 0, 0, -2); err != nil {
12201229
t.Fatal(err)
12211230
}
12221231
})

internal/lua/testdata/testsuite/pm.lua

Lines changed: 64 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,11 @@ local function f1 (s, p)
115115
return string.sub(s, t[1], t[#t] - 1)
116116
end
117117

118-
assert(f1('alo alx 123 b\0o b\0o', '(..*) %1') == "b\0o b\0o")
119-
assert(f1('axz123= 4= 4 34', '(.+)=(.*)=%2 %1') == '3= 4= 4 3')
120-
assert(f1('=======', '^(=*)=%1$') == '=======')
121-
assert(not string.match('==========', '^([=]*)=%1$'))
118+
-- XXX: Backreferences not supported.
119+
-- assert(f1('alo alx 123 b\0o b\0o', '(..*) %1') == "b\0o b\0o")
120+
-- assert(f1('axz123= 4= 4 34', '(.+)=(.*)=%2 %1') == '3= 4= 4 3')
121+
-- assert(f1('=======', '^(=*)=%1$') == '=======')
122+
-- assert(not string.match('==========', '^([=]*)=%1$'))
122123

123124
local function range (i, j)
124125
if i <= j then
@@ -145,8 +146,9 @@ assert(strset('[^%W]') == strset('[%w]'))
145146
assert(strset('[]%%]') == '%]')
146147
assert(strset('[a%-z]') == '-az')
147148
assert(strset('[%^%[%-a%]%-b]') == '-[]^ab')
148-
assert(strset('%Z') == strset('[\1-\255]'))
149-
assert(strset('.') == strset('[\1-\255%z]'))
149+
-- XXX: Undocumented %z not supported.
150+
-- assert(strset('%Z') == strset('[\1-\255]'))
151+
assert(strset('.') == strset('[\0-\255]'))
150152
print('+');
151153

152154
assert(string.match("alo xyzK", "(%w+)K") == "xyz")
@@ -227,13 +229,14 @@ local r = string.gsub(s, '()(%w+)()', function (a,w,b)
227229
assert(s == r and t[1] == 1 and t[3] == 3 and t[7] == 4 and t[13] == 4)
228230

229231

230-
local function isbalanced (s)
231-
return not string.find(string.gsub(s, "%b()", ""), "[()]")
232-
end
232+
-- XXX: Balances not supported.
233+
-- local function isbalanced (s)
234+
-- return not string.find(string.gsub(s, "%b()", ""), "[()]")
235+
-- end
233236

234-
assert(isbalanced("(9 ((8))(\0) 7) \0\0 a b ()(c)() a"))
235-
assert(not isbalanced("(9 ((8) 7) a b (\0 c) a"))
236-
assert(string.gsub("alo 'oi' alo", "%b''", '"') == 'alo " alo')
237+
-- assert(isbalanced("(9 ((8))(\0) 7) \0\0 a b ()(c)() a"))
238+
-- assert(not isbalanced("(9 ((8) 7) a b (\0 c) a"))
239+
-- assert(string.gsub("alo 'oi' alo", "%b''", '"') == 'alo " alo')
237240

238241

239242
local t = {"apple", "orange", "lime"; n=0}
@@ -252,8 +255,9 @@ assert(t[1] == "first" and t[2] == "second" and t[3] == undef)
252255
checkerror("invalid replacement value %(a table%)",
253256
string.gsub, "alo", ".", {a = {}})
254257
checkerror("invalid capture index %%2", string.gsub, "alo", ".", "%2")
255-
checkerror("invalid capture index %%0", string.gsub, "alo", "(%0)", "a")
256-
checkerror("invalid capture index %%1", string.gsub, "alo", "(%1)", "a")
258+
-- XXX: Backreferences not supported.
259+
-- checkerror("invalid capture index %%0", string.gsub, "alo", "(%0)", "a")
260+
-- checkerror("invalid capture index %%1", string.gsub, "alo", "(%1)", "a")
257261
checkerror("invalid use of '%%'", string.gsub, "alo", ".", "%x")
258262

259263

@@ -301,11 +305,12 @@ for w in string.gmatch("first second word", "%w+") do
301305
end
302306
assert(t[1] == "first" and t[2] == "second" and t[3] == "word")
303307

304-
t = {3, 6, 9}
305-
for i in string.gmatch ("xuxx uu ppar r", "()(.)%2") do
306-
assert(i == table.remove(t, 1))
307-
end
308-
assert(#t == 0)
308+
-- XXX: Backreferences not supported.
309+
-- t = {3, 6, 9}
310+
-- for i in string.gmatch ("xuxx uu ppar r", "()(.)%2") do
311+
-- assert(i == table.remove(t, 1))
312+
-- end
313+
-- assert(#t == 0)
309314

310315
t = {}
311316
for i,j in string.gmatch("13 14 10 = 11, 15= 16, 22=23", "(%d+)%s*=%s*(%d+)") do
@@ -355,12 +360,14 @@ assert(string.gsub("function", "%f[\1-\255]%w", ".") == ".unction")
355360
assert(string.gsub("function", "%f[^\1-\255]", ".") == "function.")
356361

357362
assert(string.find("a", "%f[a]") == 1)
358-
assert(string.find("a", "%f[^%z]") == 1)
363+
-- XXX: Undocumented %z not supported.
364+
assert(string.find("a", "%f[^\0]") == 1)
359365
assert(string.find("a", "%f[^%l]") == 2)
360-
assert(string.find("aba", "%f[a%z]") == 3)
361-
assert(string.find("aba", "%f[%z]") == 4)
362-
assert(not string.find("aba", "%f[%l%z]"))
363-
assert(not string.find("aba", "%f[^%l%z]"))
366+
-- XXX: Undocumented %z not supported.
367+
assert(string.find("aba", "%f[a\0]") == 3)
368+
assert(string.find("aba", "%f[\0]") == 4)
369+
assert(not string.find("aba", "%f[%l\0]"))
370+
assert(not string.find("aba", "%f[^%l\0]"))
364371

365372
local i, e = string.find(" alo aalo allo", "%f[%S].-%f[%s].-%f[%S]")
366373
assert(i == 2 and e == 5)
@@ -388,8 +395,8 @@ malform("[]")
388395
malform("[^]")
389396
malform("[a%]")
390397
malform("[a%")
391-
malform("%b")
392-
malform("%ba")
398+
malform("%b", "balances not supported")
399+
malform("%ba", "balances not supported")
393400
malform("%")
394401
malform("%f", "missing")
395402

@@ -398,7 +405,8 @@ assert(string.match("ab\0\1\2c", "[\0-\2]+") == "\0\1\2")
398405
assert(string.match("ab\0\1\2c", "[\0-\0]+") == "\0")
399406
assert(string.find("b$a", "$\0?") == 2)
400407
assert(string.find("abc\0efg", "%\0") == 4)
401-
assert(string.match("abc\0efg\0\1e\1g", "%b\0\1") == "\0efg\0\1e\1")
408+
-- XXX: Balances not supported.
409+
-- assert(string.match("abc\0efg\0\1e\1g", "%b\0\1") == "\0efg\0\1e\1")
402410
assert(string.match("abc\0\0\0", "%\0+") == "\0\0\0")
403411
assert(string.match("abc\0\0\0", "%\0%\0?") == "\0\0")
404412

@@ -407,34 +415,35 @@ assert(string.find("abc\0\0","\0.") == 4)
407415
assert(string.find("abcx\0\0abc\0abc","x\0\0abc\0a.") == 4)
408416

409417

410-
do -- test reuse of original string in gsub
411-
local s = string.rep("a", 100)
412-
local r = string.gsub(s, "b", "c") -- no match
413-
assert(string.format("%p", s) == string.format("%p", r))
414-
415-
r = string.gsub(s, ".", {x = "y"}) -- no substitutions
416-
assert(string.format("%p", s) == string.format("%p", r))
417-
418-
local count = 0
419-
r = string.gsub(s, ".", function (x)
420-
assert(x == "a")
421-
count = count + 1
422-
return nil -- no substitution
423-
end)
424-
r = string.gsub(r, ".", {b = 'x'}) -- "a" is not a key; no subst.
425-
assert(count == 100)
426-
assert(string.format("%p", s) == string.format("%p", r))
427-
428-
count = 0
429-
r = string.gsub(s, ".", function (x)
430-
assert(x == "a")
431-
count = count + 1
432-
return x -- substitution...
433-
end)
434-
assert(count == 100)
435-
-- no reuse in this case
436-
assert(r == s and string.format("%p", s) ~= string.format("%p", r))
437-
end
418+
-- XXX: Strings do not have a pointer address in our implementation.
419+
-- do -- test reuse of original string in gsub
420+
-- local s = string.rep("a", 100)
421+
-- local r = string.gsub(s, "b", "c") -- no match
422+
-- assert(string.format("%p", s) == string.format("%p", r))
423+
424+
-- r = string.gsub(s, ".", {x = "y"}) -- no substitutions
425+
-- assert(string.format("%p", s) == string.format("%p", r))
426+
427+
-- local count = 0
428+
-- r = string.gsub(s, ".", function (x)
429+
-- assert(x == "a")
430+
-- count = count + 1
431+
-- return nil -- no substitution
432+
-- end)
433+
-- r = string.gsub(r, ".", {b = 'x'}) -- "a" is not a key; no subst.
434+
-- assert(count == 100)
435+
-- assert(string.format("%p", s) == string.format("%p", r))
436+
437+
-- count = 0
438+
-- r = string.gsub(s, ".", function (x)
439+
-- assert(x == "a")
440+
-- count = count + 1
441+
-- return x -- substitution...
442+
-- end)
443+
-- assert(count == 100)
444+
-- -- no reuse in this case
445+
-- assert(r == s and string.format("%p", s) ~= string.format("%p", r))
446+
-- end
438447

439448
print('OK')
440449

internal/lua/testdata/testsuite/utf8.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55

66
print "testing UTF-8 library"
77

8-
local utf8 = require'utf8'
8+
-- XXX: utf8 library available as a global instead of being required.
9+
local utf8 = utf8
910

1011

1112
local function checkerror (msg, f, ...)

0 commit comments

Comments
 (0)