Lock down numbers

Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
Anand Krishnamoorthi
2023-02-18 01:13:25 -08:00
committed by Anand Krishnamoorthi
parent a8a1d4b820
commit 12c3d26476
10 changed files with 445 additions and 143 deletions
+221 -60
View File
@@ -7,10 +7,15 @@ cases:
modules:
- |
package test
x = abs(-9)
query: data.test.x
want_result: 9
x = [abs(-9), abs(9), abs(-9.1), abs(9.1)]
# Undefined
y { false }
z = abs(y)
query: data.test
want_result:
x: [9, 9, 9.1, 9.1]
- note: abs-extra-args
data: {}
modules:
@@ -19,7 +24,7 @@ cases:
x = abs(-9, 10)
query: data.test.x
error: "`abs` expects 1 argument"
- note: abs-invalid-type
data: {}
modules:
@@ -34,10 +39,14 @@ cases:
modules:
- |
package test
x = [ceil(9.1), ceil(-9.1)]
query: data.test.x
want_result: [10, -9]
x = [ceil(9.1), ceil(-9.1), ceil(9), ceil(-9)]
# Undefined
y { false }
z = ceil(y)
query: data.test
want_result:
x: [10, -9, 9, -9]
- note: ceil-extra-args
data: {}
modules:
@@ -46,7 +55,7 @@ cases:
x = ceil(-9, 10)
query: data.test.x
error: "`ceil` expects 1 argument"
- note: ceil-invalid-type
data: {}
modules:
@@ -55,16 +64,20 @@ cases:
x = ceil("-9")
query: data.test.x
error: "`ceil` expects numeric argument"
- note: floor
data: {}
modules:
- |
package test
x = [floor(9.1), floor(-9.1)]
query: data.test.x
want_result: [9, -10]
x = [floor(9.1), floor(-9.1), floor(9), floor(-9)]
# Undefined
y { false }
z = floor(y)
query: data.test
want_result:
x: [9, -10, 9, -9]
- note: floor-extra-args
data: {}
modules:
@@ -73,7 +86,7 @@ cases:
x = floor(-9, 10)
query: data.test.x
error: "`floor` expects 1 argument"
- note: floor-invalid-type
data: {}
modules:
@@ -82,7 +95,7 @@ cases:
x = floor("-9")
query: data.test.x
error: "`floor` expects numeric argument"
- note: numbers.range
data: {}
modules:
@@ -93,19 +106,24 @@ cases:
r3 = numbers.range(-1, -5)
r4 = numbers.range(-5, -1)
# Non-integer start and end result in Undefined.
r5 = numbers.range(1.01, 5)
r6 = numbers.range(1, 5.01)
# Single item range
r7 = numbers.range(8, 8)
r5 = numbers.range(8, 8)
# Non-integer start and end result in Undefined.
r6 = numbers.range(1.01, 5)
r7 = numbers.range(1, 5.01)
y { false }
r8 = numbers.range(y, 10)
r9 = numbers.range(10, y)
query: data.test
want_result:
r1: [1, 2, 3, 4, 5]
r2: [5, 4, 3, 2, 1]
r3: [-1, -2, -3, -4, -5]
r4: [-5, -4, -3, -2, -1]
r7: [8]
r5: [8]
- note: numbers.range-less-args
data: {}
@@ -115,7 +133,7 @@ cases:
x = numbers.range(1)
query: data.test.x
error: "`numbers.range` expects 2 arguments"
- note: numbers.range-more-args
data: {}
modules:
@@ -124,7 +142,7 @@ cases:
x = numbers.range(1, 2, 3)
query: data.test.x
error: "`numbers.range` expects 2 arguments"
- note: numbers.range-invalid-start
data: {}
modules:
@@ -133,7 +151,7 @@ cases:
x = numbers.range("1", 2)
query: data.test.x
error: "`numbers.range` expects numeric argument"
- note: numbers.range-invalid-end
data: {}
modules:
@@ -149,10 +167,15 @@ cases:
- |
package test
x = [round(-9.4), round(-9.5), round(-9.6),
round(9.4), round(9.5), round(9.6)]
round(9.4), round(9.5), round(9.6),
round(8), round(-8)]
# Undefined
y { false }
z = round(y)
query: data.test.x
want_result: [-9, -10, -10, 9, 10, 10]
want_result: [-9, -10, -10, 9, 10, 10, 8, -8]
- note: round-extra-args
data: {}
modules:
@@ -161,7 +184,7 @@ cases:
x = round(-9, 10)
query: data.test.x
error: "`round` expects 1 argument"
- note: round-invalid-type
data: {}
modules:
@@ -171,15 +194,96 @@ cases:
query: data.test.x
error: "`round` expects numeric argument"
- note: rand.intn
data: {}
modules:
- |
package test
x = rand.intn("x", 50000)
y = rand.intn("y", 50000)
z = [p |
p := rand.intn("x", 50000)
]
a = rand.intn("x", 25000)
results = [
x == z[0],
x != y,
x != a,
rand.intn("b", 0)
]
query: data.test.results
want_result: [true, true, true, 0]
- note: rand.intn-undefined
data: {}
modules:
- |
package test
y { false }
r1 = rand.intn(y, 10)
r2 = rand.intn(10, y)
r3 = rand.intn("a", 10.3)
query: data.test
want_result: {}
- note: rand.intn-extra-args
data: {}
modules:
- |
package test
x = rand.intn("abc", 10, 11)
query: data.test.x
error: "`rand.intn` expects 2 arguments"
- note: rand.intn-less-args
data: {}
modules:
- |
package test
x = rand.intn("abc")
query: data.test.x
error: "`rand.intn` expects 2 arguments"
- note: rand.intn-invalid-type-1
data: {}
modules:
- |
package test
x = rand.intn(1, 2)
query: data.test.x
error: "`rand.intn` expects string argument"
- note: rand.intn-invalid-type-2
data: {}
modules:
- |
package test
x = rand.intn("a", "b")
query: data.test.x
error: "`rand.intn` expects numeric argument"
- note: div
data: {}
modules:
- |
package test
import future.keywords.if
x = 1/3
query: data.test.x
want_result: 0.3333333333333333
# Undefined
y if false
a = 1 / 0
b = y / 1
c = 1 / y
d = 13.3 % 3
e = 13 % 3.1
query: data.test
want_result:
x: 0.3333333333333333
- note: div-non-numeric
data: {}
modules:
@@ -188,36 +292,23 @@ cases:
x = "1" / 9
query: data.test.x
error: "`div` expects numeric argument."
- note: div-undefined
data: {}
modules:
- |
package test
import future.keywords.if
a if false
x = a / 1
query: data.test
want_result: {}
- note: div-by-zero
data: {}
modules:
- |
package test
x = 1/0
query: data.test
want_result: {}
- note: mod
data: {}
modules:
- |
package test
x = 10%3
query: data.test.x
want_result: 1
# Undefined
y { false }
a = 1 % 0
b = y % 1
c = 1 % y
query: data.test
want_result:
x : 1
- note: mod-non-numeric
data: {}
modules:
@@ -226,14 +317,13 @@ cases:
x = "1" % 9
query: data.test.x
error: "`mod` expects numeric argument."
- note: mod-undefined
data: {}
modules:
- |
package test
import future.keywords.if
a if false
a { false }
x = a % 10
query: data.test
want_result: {}
@@ -246,7 +336,76 @@ cases:
x = 1%0
query: data.test
want_result: {}
- note: mul
data: {}
modules:
- |
package test
x = 3 * -1 * 4.5
# Undefined
y { false }
a = 1 * y
b = y * 1
query: data.test
want_result:
x: -13.5
- note: mul-non-numeric
data: {}
modules:
- |
package test
x = "1" * 9
query: data.test.x
error: "`mul` expects numeric argument."
- note: add
data: {}
modules:
- |
package test
x = 3 + -1 + 4.5
# Undefined
y { false }
a = 1 + y
b = y + 1
query: data.test
want_result:
x: 6.5
- note: add-non-numeric
data: {}
modules:
- |
package test
x = "1" + 9
query: data.test.x
error: "`add` expects numeric argument."
- note: sub
data: {}
modules:
- |
package test
x = 3 - -1 - 4.5
# Undefined
y { false }
a = 1 - y
b = y - 1
query: data.test
want_result:
x: -0.5
- note: sub-non-numeric
data: {}
modules:
- |
package test
x = "1" - 9
query: data.test.x
error: "`sub` expects numeric argument."
- note: all
data: {}
modules:
@@ -256,3 +415,5 @@ cases:
query: data.test
want_result:
x: 1.5
# TODO: Lockdown associativity and precedence of operators.