diff --git a/src/LuaLib.ts b/src/LuaLib.ts index d051c60b4..6320bc99c 100644 --- a/src/LuaLib.ts +++ b/src/LuaLib.ts @@ -63,6 +63,7 @@ export enum LuaLibFeature { MathAtan2 = "MathAtan2", MathModf = "MathModf", MathSign = "MathSign", + MathTrunc = "MathTrunc", New = "New", Number = "Number", NumberIsFinite = "NumberIsFinite", diff --git a/src/lualib/MathSign.ts b/src/lualib/MathSign.ts index f3be69e8d..629895a11 100644 --- a/src/lualib/MathSign.ts +++ b/src/lualib/MathSign.ts @@ -1,9 +1,15 @@ +// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-math.sign + +import { __TS__NumberIsNaN } from "./NumberIsNaN"; + export function __TS__MathSign(this: void, val: number) { - if (val > 0) { - return 1; - } else if (val < 0) { + if (__TS__NumberIsNaN(val) || val === 0) { + return val; + } + + if (val < 0) { return -1; } - return 0; + return 1; } diff --git a/src/lualib/MathTrunc.ts b/src/lualib/MathTrunc.ts new file mode 100644 index 000000000..f244c2147 --- /dev/null +++ b/src/lualib/MathTrunc.ts @@ -0,0 +1,10 @@ +// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-math.trunc + +import { __TS__NumberIsFinite } from "./NumberIsFinite"; +export function __TS__MathTrunc(this: void, val: number) { + if (!__TS__NumberIsFinite(val) || val === 0) { + return val; + } + + return val > 0 ? math.floor(val) : math.ceil(val); +} diff --git a/src/transformation/builtins/math.ts b/src/transformation/builtins/math.ts index 4be4e77cb..ab831d52f 100644 --- a/src/transformation/builtins/math.ts +++ b/src/transformation/builtins/math.ts @@ -100,6 +100,10 @@ export function transformMathCall( return transformLuaLibFunction(context, LuaLibFeature.MathSign, node, ...params); } + case "trunc": { + return transformLuaLibFunction(context, LuaLibFeature.MathTrunc, node, ...params); + } + case "abs": case "acos": case "asin": diff --git a/test/unit/builtins/math.spec.ts b/test/unit/builtins/math.spec.ts index 3126a85ca..aebaead4c 100644 --- a/test/unit/builtins/math.spec.ts +++ b/test/unit/builtins/math.spec.ts @@ -51,6 +51,12 @@ test.each([ // sqrt "Math.sqrt(2)", "Math.sqrt(-2)", + // trunc + "Math.trunc(42.42)", + "Math.trunc(-42.42)", + "Math.trunc(0)", + "Math.trunc(Infinity)", + "Math.trunc(-Infinity)", ])("%s", code => { util.testExpression(code).expectToMatchJsResult(); }); @@ -65,7 +71,14 @@ test.each(["E", "LN10", "LN2", "LOG10E", "LOG2E", "SQRT1_2", "SQRT2"])("Math.%s" }); // LuaLib MathSign -test.each(["Math.sign(-42)", "Math.sign(42)", "Math.sign(-4.2)", "Math.sign(4.2)", "Math.sign(0)"])("%s", code => { +test.each([ + "Math.sign(-42)", + "Math.sign(42)", + "Math.sign(-4.2)", + "Math.sign(4.2)", + "Math.sign(0)", + "Math.sign(-Infinity)", +])("%s", code => { util.testExpression(code).expectToMatchJsResult(); });