summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package.json2
-rw-r--r--src/luaconf.js2
-rw-r--r--tests/single.lua79
3 files changed, 80 insertions, 3 deletions
diff --git a/package.json b/package.json
index c5c0cf4..d9527ab 100644
--- a/package.json
+++ b/package.json
@@ -34,6 +34,6 @@
},
"dependencies": {
"seedrandom": "^2.4.2",
- "sprintf-js": "alexei/sprintf.js"
+ "sprintf-js": "giann/sprintf.js"
}
}
diff --git a/src/luaconf.js b/src/luaconf.js
index 190893a..3314d5c 100644
--- a/src/luaconf.js
+++ b/src/luaconf.js
@@ -24,7 +24,7 @@ const LUA_INTEGER_FRMLEN = "";
const LUA_NUMBER_FRMLEN = "";
const LUA_INTEGER_FMT = `%${LUA_INTEGER_FRMLEN}d`;
-const LUA_NUMBER_FMT = "%.7g";
+const LUA_NUMBER_FMT = "%.14g";
const lua_getlocaledecpoint = function() {
return (1.1).toLocaleString().substring(1, 2);
diff --git a/tests/single.lua b/tests/single.lua
index 9e7d0cf..6fdce5c 100644
--- a/tests/single.lua
+++ b/tests/single.lua
@@ -1,4 +1,4 @@
--- $Id: strings.lua,v 1.86 2016/11/07 13:11:28 roberto Exp roberto $
+ -- $Id: strings.lua,v 1.86 2016/11/07 13:11:28 roberto Exp roberto $
-- See Copyright Notice in file all.lua
print('testing strings and string library')
@@ -209,3 +209,80 @@ assert(string.format("%02x", 0.0) == "00")
assert(string.format("%08X", 0xFFFFFFFF) == "FFFFFFFF")
assert(string.format("%+08d", 31501) == "+0031501")
assert(string.format("%+08d", -30927) == "-0030927")
+
+
+-- TODO: when figured out number limit stuff
+
+-- do -- longest number that can be formatted
+-- local i = 1
+-- local j = 10000
+-- while i + 1 < j do -- binary search for maximum finite float
+-- local m = (i + j) // 2
+-- if 10^m < math.huge then i = m else j = m end
+-- end
+-- assert(10^i < math.huge and 10^j == math.huge)
+-- local s = string.format('%.99f', -(10^i))
+-- assert(string.len(s) >= i + 101)
+-- assert(tonumber(s) == -(10^i))
+-- end
+
+
+-- -- testing large numbers for format
+-- do -- assume at least 32 bits
+-- local max, min = 0x7fffffff, -0x80000000 -- "large" for 32 bits
+-- assert(string.sub(string.format("%8x", -1), -8) == "ffffffff")
+-- assert(string.format("%x", max) == "7fffffff")
+-- assert(string.sub(string.format("%x", min), -8) == "80000000")
+-- assert(string.format("%d", max) == "2147483647")
+-- assert(string.format("%d", min) == "-2147483648")
+-- assert(string.format("%u", 0xffffffff) == "4294967295")
+-- assert(string.format("%o", 0xABCD) == "125715")
+
+-- max, min = 0x7fffffffffffffff, -0x8000000000000000
+-- if max > 2.0^53 then -- only for 64 bits
+-- assert(string.format("%x", (2^52 | 0) - 1) == "fffffffffffff")
+-- assert(string.format("0x%8X", 0x8f000003) == "0x8F000003")
+-- assert(string.format("%d", 2^53) == "9007199254740992")
+-- assert(string.format("%i", -2^53) == "-9007199254740992")
+-- assert(string.format("%x", max) == "7fffffffffffffff")
+-- assert(string.format("%x", min) == "8000000000000000")
+-- assert(string.format("%d", max) == "9223372036854775807")
+-- assert(string.format("%d", min) == "-9223372036854775808")
+-- assert(string.format("%u", ~(-1 << 64)) == "18446744073709551615")
+-- assert(tostring(1234567890123) == '1234567890123')
+-- end
+-- end
+
+do print("testing 'format %a %A'")
+ local function matchhexa (n)
+ local s = string.format("%a", n)
+ -- result matches ISO C requirements
+ assert(string.find(s, "^%-?0x[1-9a-f]%.?[0-9a-f]*p[-+]?%d+$"))
+ assert(tonumber(s) == n) -- and has full precision
+ s = string.format("%A", n)
+ assert(string.find(s, "^%-?0X[1-9A-F]%.?[0-9A-F]*P[-+]?%d+$"))
+ assert(tonumber(s) == n)
+ end
+ for _, n in ipairs{0.1, -0.1, 1/3, -1/3, 1e30, -1e30,
+ -45/247, 1, -1, 2, -2, 3e-20, -3e-20} do
+ matchhexa(n)
+ end
+
+ assert(string.find(string.format("%A", 0.0), "^0X0%.?0?P%+?0$"))
+ -- print(string.format("%a", -0.0))
+ -- assert(string.find(string.format("%a", -0.0), "^%-0x0%.?0?p%+?0$"))
+
+ -- if not _port then -- test inf, -inf, NaN, and -0.0
+ -- assert(string.find(string.format("%a", 1/0), "^inf"))
+ -- assert(string.find(string.format("%A", -1/0), "^%-INF"))
+ -- assert(string.find(string.format("%a", 0/0), "^%-?nan"))
+ -- assert(string.find(string.format("%a", -0.0), "^%-0x0"))
+ -- end
+
+ -- if not pcall(string.format, "%.3a", 0) then
+ -- (Message or print)("\n >>> modifiers for format '%a' not available <<<\n")
+ -- else
+ -- assert(string.find(string.format("%+.2A", 12), "^%+0X%x%.%x0P%+?%d$"))
+ -- assert(string.find(string.format("%.4A", -12), "^%-0X%x%.%x000P%+?%d$"))
+ -- end
+end