Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 157 additions & 0 deletions spec/formatinteger_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
local jsonata = require("jsonata")
local function run(src, input)
return jsonata.compile(src):evaluate(input)
end

describe("M8b: $formatInteger decimal-digit-pattern", function()
it("padding + mandatory/optional digits", function()
assert.are.equal("123", run("$formatInteger(123, '000')"))
assert.are.equal("0123", run("$formatInteger(123, '0000')"))
assert.are.equal("-0003", run("$formatInteger(-3, '0000')"))
assert.are.equal("1234", run("$formatInteger(1234, '###0')"))
assert.are.equal("12", run("$formatInteger(12, '###0')"))
assert.are.equal("12", run("$formatInteger(12.6, '###0')"))
end)
it("grouping regular + irregular", function()
assert.are.equal("12", run("$formatInteger(12, '#,##0')"))
assert.are.equal("1,200", run("$formatInteger(1200, '#,##0')"))
assert.are.equal("12,345,678", run("$formatInteger(12345678, '#,##0')"))
assert.are.equal("1234:567,890", run("$formatInteger(1234567890, '#:###,##0')"))
assert.are.equal("12345,67,890", run("$formatInteger(1234567890, '##,##,##0')"))
end)
it("large integers render without exponent", function()
assert.are.equal("1000000000000000", run("$formatInteger(1000000000000000, '0')"))
assert.are.equal("123,456,789,012,345", run("$formatInteger(123456789012345, '#,##0')"))
end)
it("ordinal suffix + teen exception", function()
assert.are.equal("1st", run("$formatInteger(1, '0;o')"))
assert.are.equal("123rd", run("$formatInteger(123, '000;o')"))
assert.are.equal("28th", run("$formatInteger(28, '#0;o')"))
assert.are.equal("12th", run("$formatInteger(12, '###0;o')"))
end)
it("unicode digit families", function()
assert.are.equal("١٢٣٤٠", run("$formatInteger(12340, '###١')"))
assert.are.equal("12340", run("$formatInteger(12340, '###0')"))
end)
it("D3131 mixed digit groups", function()
local ok, err = pcall(run, "$formatInteger(12340, '##00')")
assert.is_false(ok)
assert.are.equal("D3131", err.code)
end)
it("undefined -> undefined", function()
assert.is_nil(run("$formatInteger(blah, '0')", {}))
end)
end)

describe("M8b: $parseInteger decimal-digit-pattern", function()
it("digits + padding + grouping", function()
assert.are.equal(123, run("$parseInteger('123', '000')"))
assert.are.equal(123, run("$parseInteger('0123', '0000')"))
assert.are.equal(1234, run("$parseInteger('1234', '###0')"))
assert.are.equal(1200, run("$parseInteger('1,200', '#,##0')"))
assert.are.equal(12345678, run("$parseInteger('12,345,678', '#,##0')"))
assert.are.equal(1234567890, run("$parseInteger('1234:567,890', '#:###,##0')"))
assert.are.equal(1234567890, run("$parseInteger('12345,67,890', '##,##,##0')"))
end)
it("ordinal + families", function()
assert.are.equal(123, run("$parseInteger('123rd', '000;o')"))
assert.are.equal(28, run("$parseInteger('28th', '#0;o')"))
assert.are.equal(12340, run("$parseInteger('١٢٣٤٠', '###١')"))
assert.are.equal(12340, run("$parseInteger('12340', '###0')"))
end)
it("undefined -> undefined", function()
assert.is_nil(run("$parseInteger(blah, '0')", {}))
end)
end)

describe("M8b: roman + letters", function()
it("formatInteger roman", function()
assert.are.equal("", run("$formatInteger(0, 'I')"))
assert.are.equal("MCMLXXXIV", run("$formatInteger(1984, 'I')"))
assert.are.equal("xcix", run("$formatInteger(99, 'i')"))
end)
it("parseInteger roman", function()
assert.are.equal(0, run("$parseInteger('', 'I')"))
assert.are.equal(1984, run("$parseInteger('MCMLXXXIV', 'I')"))
assert.are.equal(99, run("$parseInteger('xcix', 'i')"))
end)
it("formatInteger letters", function()
assert.are.equal("A", run("$formatInteger(1, 'A')"))
assert.are.equal("l", run("$formatInteger(12, 'a')"))
assert.are.equal("z", run("$formatInteger(26, 'a')"))
assert.are.equal("aa", run("$formatInteger(27, 'a')"))
assert.are.equal("KN", run("$formatInteger(300, 'A')"))
assert.are.equal("FZPH", run("$formatInteger(123456, 'A')"))
end)
it("parseInteger letters", function()
assert.are.equal(1, run("$parseInteger('A', 'A')"))
assert.are.equal(12, run("$parseInteger('l', 'a')"))
assert.are.equal(26, run("$parseInteger('z', 'a')"))
assert.are.equal(27, run("$parseInteger('aa', 'a')"))
assert.are.equal(300, run("$parseInteger('KN', 'A')"))
assert.are.equal(123456, run("$parseInteger('FZPH', 'A')"))
end)
it("D3130 sequence", function()
local ok, err = pcall(run, "$formatInteger(123456, 'α')")
assert.is_false(ok)
assert.are.equal("D3130", err.code)
local ok2, err2 = pcall(run, "$parseInteger('50', '#')")
assert.is_false(ok2)
assert.are.equal("D3130", err2.code)
end)
end)

describe("M8b: words cardinal", function()
it("basic + decades + hundreds + magnitudes", function()
assert.are.equal("twelve", run("$formatInteger(12, 'w')"))
assert.are.equal("twenty", run("$formatInteger(20, 'w')"))
assert.are.equal("thirty-four", run("$formatInteger(34, 'w')"))
assert.are.equal("NINETY-NINE", run("$formatInteger(99, 'W')"))
assert.are.equal("one hundred", run("$formatInteger(100, 'w')"))
assert.are.equal("FIVE HUNDRED AND FIFTY-FIVE", run("$formatInteger(555, 'W')"))
assert.are.equal("Five Hundred and Fifty-Five", run("$formatInteger(555, 'Ww')"))
assert.are.equal("nine hundred and nineteen", run("$formatInteger(919, 'w')"))
assert.are.equal("one thousand", run("$formatInteger(1000, 'w')"))
assert.are.equal("three thousand, seven hundred and thirty", run("$formatInteger(3730, 'w')"))
assert.are.equal("four million, three hundred and twenty-seven thousand, seven hundred and thirty", run("$formatInteger(4327730, 'w')"))
assert.are.equal("one trillion and one", run("$formatInteger(1000000000001, 'w')"))
assert.are.equal("one thousand trillion", run("$formatInteger(1000000000000000, 'w')"))
assert.are.equal("ten billion trillion trillion trillion", run("$formatInteger(1e46, 'w')"))
end)
end)
describe("M8b: words ordinal", function()
it("ordinal forms", function()
assert.are.equal("twelfth", run("$formatInteger(12, 'w;o')"))
assert.are.equal("twentieth", run("$formatInteger(20, 'w;o')"))
assert.are.equal("thirty-fourth", run("$formatInteger(34, 'w;o')"))
assert.are.equal("NINETY-NINTH", run("$formatInteger(99, 'W;o')"))
assert.are.equal("one hundredth", run("$formatInteger(100, 'w;o')"))
assert.are.equal("seven hundred and thirtieth", run("$formatInteger(730, 'w;o')"))
assert.are.equal("one thousandth", run("$formatInteger(1000, 'w;o')"))
assert.are.equal("one trillion and first", run("$formatInteger(1000000000001, 'w;o')"))
end)
end)
describe("M8b: words parse", function()
it("cardinal + ordinal + title", function()
assert.are.equal(12, run("$parseInteger('twelve', 'w')"))
assert.are.equal(34, run("$parseInteger('thirty-four', 'w')"))
assert.are.equal(99, run("$parseInteger('NINETY-NINE', 'W')"))
assert.are.equal(555, run("$parseInteger('Five Hundred and Fifty-Five', 'Ww')"))
assert.are.equal(3730, run("$parseInteger('three thousand, seven hundred and thirty', 'w')"))
assert.are.equal(1000000000001, run("$parseInteger('one trillion and one', 'w')"))
assert.are.equal(1000000000000000, run("$parseInteger('one thousand trillion', 'w')"))
assert.are.equal(12, run("$parseInteger('twelfth', 'w;o')"))
assert.are.equal(20, run("$parseInteger('twentieth', 'w;o')"))
assert.are.equal(733, run("$parseInteger('Seven Hundred and Thirty-Third', 'Ww;o')"))
assert.are.equal(1000000000001, run("$parseInteger('one trillion and first', 'w;o')"))
end)

it("unrecognized words token -> NaN (not a crash), matching oracle", function()
local r = run("$parseInteger('foo', 'w')")
assert.is_true(type(r) == "number" and r ~= r) -- NaN
local r2 = run("$parseInteger('-twelve', 'w')")
assert.is_true(type(r2) == "number" and r2 ~= r2)
-- valid input still works
assert.are.equal(34, run("$parseInteger('thirty-four', 'w')"))
end)
end)
123 changes: 123 additions & 0 deletions spec/jsonata-suite/baseline.lua
Original file line number Diff line number Diff line change
Expand Up @@ -425,8 +425,71 @@ return {
["function-formatBase/case006"] = true,
["function-formatBase/case007"] = true,
["function-formatBase/case008"] = true,
["function-formatInteger/formatInteger/0"] = true,
["function-formatInteger/formatInteger/1"] = true,
["function-formatInteger/formatInteger/10"] = true,
["function-formatInteger/formatInteger/11"] = true,
["function-formatInteger/formatInteger/12"] = true,
["function-formatInteger/formatInteger/13"] = true,
["function-formatInteger/formatInteger/14"] = true,
["function-formatInteger/formatInteger/15"] = true,
["function-formatInteger/formatInteger/16"] = true,
["function-formatInteger/formatInteger/17"] = true,
["function-formatInteger/formatInteger/18"] = true,
["function-formatInteger/formatInteger/19"] = true,
["function-formatInteger/formatInteger/2"] = true,
["function-formatInteger/formatInteger/20"] = true,
["function-formatInteger/formatInteger/21"] = true,
["function-formatInteger/formatInteger/22"] = true,
["function-formatInteger/formatInteger/23"] = true,
["function-formatInteger/formatInteger/24"] = true,
["function-formatInteger/formatInteger/25"] = true,
["function-formatInteger/formatInteger/26"] = true,
["function-formatInteger/formatInteger/27"] = true,
["function-formatInteger/formatInteger/28"] = true,
["function-formatInteger/formatInteger/29"] = true,
["function-formatInteger/formatInteger/3"] = true,
["function-formatInteger/formatInteger/30"] = true,
["function-formatInteger/formatInteger/31"] = true,
["function-formatInteger/formatInteger/32"] = true,
["function-formatInteger/formatInteger/33"] = true,
["function-formatInteger/formatInteger/34"] = true,
["function-formatInteger/formatInteger/35"] = true,
["function-formatInteger/formatInteger/36"] = true,
["function-formatInteger/formatInteger/37"] = true,
["function-formatInteger/formatInteger/38"] = true,
["function-formatInteger/formatInteger/39"] = true,
["function-formatInteger/formatInteger/4"] = true,
["function-formatInteger/formatInteger/40"] = true,
["function-formatInteger/formatInteger/41"] = true,
["function-formatInteger/formatInteger/42"] = true,
["function-formatInteger/formatInteger/43"] = true,
["function-formatInteger/formatInteger/44"] = true,
["function-formatInteger/formatInteger/45"] = true,
["function-formatInteger/formatInteger/46"] = true,
["function-formatInteger/formatInteger/47"] = true,
["function-formatInteger/formatInteger/48"] = true,
["function-formatInteger/formatInteger/49"] = true,
["function-formatInteger/formatInteger/5"] = true,
["function-formatInteger/formatInteger/50"] = true,
["function-formatInteger/formatInteger/51"] = true,
["function-formatInteger/formatInteger/52"] = true,
["function-formatInteger/formatInteger/53"] = true,
["function-formatInteger/formatInteger/54"] = true,
["function-formatInteger/formatInteger/55"] = true,
["function-formatInteger/formatInteger/56"] = true,
["function-formatInteger/formatInteger/57"] = true,
["function-formatInteger/formatInteger/58"] = true,
["function-formatInteger/formatInteger/59"] = true,
["function-formatInteger/formatInteger/6"] = true,
["function-formatInteger/formatInteger/60"] = true,
["function-formatInteger/formatInteger/61"] = true,
["function-formatInteger/formatInteger/62"] = true,
["function-formatInteger/formatInteger/63"] = true,
["function-formatInteger/formatInteger/64"] = true,
["function-formatInteger/formatInteger/7"] = true,
["function-formatInteger/formatInteger/8"] = true,
["function-formatInteger/formatInteger/9"] = true,
["function-formatNumber/case000"] = true,
["function-formatNumber/case001"] = true,
["function-formatNumber/case002"] = true,
Expand Down Expand Up @@ -593,7 +656,67 @@ return {
["function-pad/case009"] = true,
["function-pad/case010"] = true,
["function-pad/case011"] = true,
["function-parseInteger/parseInteger/0"] = true,
["function-parseInteger/parseInteger/1"] = true,
["function-parseInteger/parseInteger/10"] = true,
["function-parseInteger/parseInteger/11"] = true,
["function-parseInteger/parseInteger/12"] = true,
["function-parseInteger/parseInteger/13"] = true,
["function-parseInteger/parseInteger/14"] = true,
["function-parseInteger/parseInteger/15"] = true,
["function-parseInteger/parseInteger/16"] = true,
["function-parseInteger/parseInteger/17"] = true,
["function-parseInteger/parseInteger/18"] = true,
["function-parseInteger/parseInteger/19"] = true,
["function-parseInteger/parseInteger/2"] = true,
["function-parseInteger/parseInteger/20"] = true,
["function-parseInteger/parseInteger/21"] = true,
["function-parseInteger/parseInteger/22"] = true,
["function-parseInteger/parseInteger/23"] = true,
["function-parseInteger/parseInteger/24"] = true,
["function-parseInteger/parseInteger/25"] = true,
["function-parseInteger/parseInteger/26"] = true,
["function-parseInteger/parseInteger/27"] = true,
["function-parseInteger/parseInteger/28"] = true,
["function-parseInteger/parseInteger/29"] = true,
["function-parseInteger/parseInteger/3"] = true,
["function-parseInteger/parseInteger/30"] = true,
["function-parseInteger/parseInteger/31"] = true,
["function-parseInteger/parseInteger/32"] = true,
["function-parseInteger/parseInteger/33"] = true,
["function-parseInteger/parseInteger/34"] = true,
["function-parseInteger/parseInteger/35"] = true,
["function-parseInteger/parseInteger/36"] = true,
["function-parseInteger/parseInteger/37"] = true,
["function-parseInteger/parseInteger/38"] = true,
["function-parseInteger/parseInteger/39"] = true,
["function-parseInteger/parseInteger/4"] = true,
["function-parseInteger/parseInteger/40"] = true,
["function-parseInteger/parseInteger/41"] = true,
["function-parseInteger/parseInteger/42"] = true,
["function-parseInteger/parseInteger/43"] = true,
["function-parseInteger/parseInteger/44"] = true,
["function-parseInteger/parseInteger/45"] = true,
["function-parseInteger/parseInteger/46"] = true,
["function-parseInteger/parseInteger/47"] = true,
["function-parseInteger/parseInteger/48"] = true,
["function-parseInteger/parseInteger/49"] = true,
["function-parseInteger/parseInteger/5"] = true,
["function-parseInteger/parseInteger/50"] = true,
["function-parseInteger/parseInteger/51"] = true,
["function-parseInteger/parseInteger/52"] = true,
["function-parseInteger/parseInteger/53"] = true,
["function-parseInteger/parseInteger/54"] = true,
["function-parseInteger/parseInteger/55"] = true,
["function-parseInteger/parseInteger/56"] = true,
["function-parseInteger/parseInteger/57"] = true,
["function-parseInteger/parseInteger/58"] = true,
["function-parseInteger/parseInteger/59"] = true,
["function-parseInteger/parseInteger/6"] = true,
["function-parseInteger/parseInteger/60"] = true,
["function-parseInteger/parseInteger/7"] = true,
["function-parseInteger/parseInteger/8"] = true,
["function-parseInteger/parseInteger/9"] = true,
["function-power/case000"] = true,
["function-power/case001"] = true,
["function-power/case002"] = true,
Expand Down
2 changes: 2 additions & 0 deletions src/jsonata/errors.lua
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ local MESSAGES = {
D3091 = "The fractional part of the sub-picture must not contain an instance of the 'optional digit character' that is followed by a member of the 'decimal digit family'",
D3092 = "A sub-picture that contains a 'percent' or 'per-mille' character must not contain a character treated as an 'exponent-separator'",
D3093 = "The exponent part of the sub-picture must comprise only of one or more characters that are members of the 'decimal digit family'",
D3130 = "Formatting or parsing an integer as a sequence starting with {{value}} is not supported by this implementation",
D3131 = "In a decimal digit pattern, all digits must be from the same decimal group",
D3137 = "$error() function evaluated",
D3138 = "The single() function expected exactly 1 matching result. Instead it matched more.",
D3139 = "The single() function expected exactly 1 matching result. Instead it matched 0.",
Expand Down
Loading
Loading