# proto-file: ../../../proto/cel/expr/conformance/test/simple.proto # proto-message: google.api.expr.test.v1.SimpleTestFile name: "math_ext" description: "Tests for the math extension library." section: { name: "greatest_int_result" test: { name: "unary_negative" expr: "math.greatest(-5)" value: { int64_value: -5 } } test: { name: "unary_positive" expr: "math.greatest(5)" value: { int64_value: 5 } } test: { name: "binary_same_args" expr: "math.greatest(1, 1)" value: { int64_value: 1 } } test: { name: "binary_with_decimal" expr: "math.greatest(1, 1.0) == 1" } test: { name: "binary_with_uint" expr: "math.greatest(1, 1u) == 1" } test: { name: "binary_first_arg_greater" expr: "math.greatest(3, -3)" value: { int64_value: 3 } } test: { name: "binary_second_arg_greater" expr: "math.greatest(-7, 5)" value: { int64_value: 5 } } test: { name: "binary_first_arg_int_max" expr: "math.greatest(9223372036854775807, 1)" value: { int64_value: 9223372036854775807 } } test: { name: "binary_second_arg_int_max" expr: "math.greatest(1, 9223372036854775807)" value: { int64_value: 9223372036854775807 } } test: { name: "binary_first_arg_int_min" expr: "math.greatest(-9223372036854775808, 1)" value: { int64_value: 1 } } test: { name: "binary_second_arg_int_min" expr: "math.greatest(1, -9223372036854775808)" value: { int64_value: 1 } } test: { name: "ternary_same_args" expr: "math.greatest(1, 1, 1) == 1" } test: { name: "ternary_with_decimal" expr: "math.greatest(1, 1.0, 1.0) == 1" } test: { name: "ternary_with_uint" expr: "math.greatest(1, 1u, 1u) == 1" } test: { name: "ternary_first_arg_greatest" expr: "math.greatest(10, 1, 3) == 10" } test: { name: "ternary_third_arg_greatest" expr: "math.greatest(1, 3, 10) == 10" } test: { name: "ternary_with_negatives" expr: "math.greatest(-1, -2, -3) == -1" } test: { name: "ternary_int_max" expr: "math.greatest(9223372036854775807, 1, 5) == 9223372036854775807" } test: { name: "ternary_int_min" expr: "math.greatest(-9223372036854775807, -1, -5) == -1" } test: { name: "quaternary_mixed" expr: "math.greatest(5.4, 10, 3u, -5.0, 9223372036854775807) == 9223372036854775807" } test: { name: "quaternary_mixed_array" expr: "math.greatest([5.4, 10, 3u, -5.0, 3.5]) == 10" } test: { name: "quaternary_mixed_dyn_array" expr: "math.greatest([dyn(5.4), dyn(10), dyn(3u), dyn(-5.0), dyn(3.5)]) == 10" } } section: { name: "greatest_double_result" test: { name: "unary_negative" expr: "math.greatest(-5.0)" value: { double_value: -5.0 } } test: { name: "unary_positive" expr: "math.greatest(5.0)" value: { double_value: 5.0 } } test: { name: "binary_same_args" expr: "math.greatest(1.0, 1.0)" value: { double_value: 1.0 } } test: { name: "binary_with_int" expr: "math.greatest(1.0, 1) == 1.0" } test: { name: "binary_with_uint" expr: "math.greatest(1.0, 1u) == 1.0" } test: { name: "binary_first_arg_greater" expr: "math.greatest(5.0, -7.0)" value: { double_value: 5.0 } } test: { name: "binary_second_arg_greater" expr: "math.greatest(-3.0, 3.0)" value: { double_value: 3.0 } } test: { name: "binary_first_arg_double_max" expr: "math.greatest(1.797693e308, 1)" value: { double_value: 1.797693e308 } } test: { name: "binary_second_arg_double_max" expr: "math.greatest(1, 1.797693e308)" value: { double_value: 1.797693e308 } } test: { name: "binary_first_arg_double_min" expr: "math.greatest(-1.797693e308, 1.5)" value: { double_value: 1.5 } } test: { name: "binary_second_arg_double_min" expr: "math.greatest(1.5, -1.797693e308)" value: { double_value: 1.5 } } test: { name: "ternary_same_args" expr: "math.greatest(1.0, 1.0, 1.0) == 1.0" } test: { name: "ternary_with_int" expr: "math.greatest(1.0, 1, 1) == 1.0" } test: { name: "ternary_with_uint" expr: "math.greatest(1.0, 1u, 1u) == 1.0" } test: { name: "ternary_first_arg_greatest" expr: "math.greatest(10.5, 1.5, 3.5) == 10.5" } test: { name: "ternary_third_arg_greatest" expr: "math.greatest(1.5, 3.5, 10.5) == 10.5" } test: { name: "ternary_with_negatives" expr: "math.greatest(-1.5, -2.5, -3.5) == -1.5" } test: { name: "ternary_double_max" expr: "math.greatest(1.797693e308, 1, 5) == 1.797693e308" } test: { name: "ternary_double_min" expr: "math.greatest(-1.797693e308, -1, -5) == -1" } test: { name: "quaternary_mixed" expr: "math.greatest(5.4, 10, 3u, -5.0, 1.797693e308) == 1.797693e308" } test: { name: "quaternary_mixed_array" expr: "math.greatest([5.4, 10.5, 3u, -5.0, 3.5]) == 10.5" } test: { name: "quaternary_mixed_dyn_array" expr: "math.greatest([dyn(5.4), dyn(10.5), dyn(3u), dyn(-5.0), dyn(3.5)]) == 10.5" } } section: { name: "greatest_uint_result" test: { name: "unary" expr: "math.greatest(5u)" value: { uint64_value: 5 } } test: { name: "binary_same_args" expr: "math.greatest(1u, 1u)" value: { uint64_value: 1 } } test: { name: "binary_with_decimal" expr: "math.greatest(1u, 1.0) == 1" } test: { name: "binary_with_int" expr: "math.greatest(1u, 1) == 1u" } test: { name: "binary_first_arg_greater" expr: "math.greatest(5u, -7)" value: { uint64_value: 5 } } test: { name: "binary_second_arg_greater" expr: "math.greatest(-3, 3u)" value: { uint64_value: 3 } } test: { name: "binary_first_arg_uint_max" expr: "math.greatest(18446744073709551615u, 1u)" value: { uint64_value: 18446744073709551615 } } test: { name: "binary_second_arg_uint_max" expr: "math.greatest(1u, 18446744073709551615u)" value: { uint64_value: 18446744073709551615 } } test: { name: "ternary_same_args" expr: "math.greatest(1u, 1u, 1u) == 1u" } test: { name: "ternary_with_decimal" expr: "math.greatest(1u, 1.0, 1.0) == 1u" } test: { name: "ternary_with_int" expr: "math.greatest(1u, 1, 1) == 1u" } test: { name: "ternary_first_arg_greatest" expr: "math.greatest(10u, 1u, 3u) == 10u" } test: { name: "ternary_third_arg_greatest" expr: "math.greatest(1u, 3u, 10u) == 10u" } test: { name: "ternary_int_max" expr: "math.greatest(18446744073709551615u, 1u, 5u) == 18446744073709551615u" } test: { name: "quaternary_mixed" expr: "math.greatest(5.4, 10, 3u, -5.0, 18446744073709551615u) == 18446744073709551615u" } test: { name: "quaternary_mixed_array" expr: "math.greatest([5.4, 10u, 3u, -5.0, 3.5]) == 10u" } test: { name: "quaternary_mixed_dyn_array" expr: "math.greatest([dyn(5.4), dyn(10u), dyn(3u), dyn(-5.0), dyn(3.5)]) == 10u" } } section: { name: "least_int_result" test: { name: "unary_negative" expr: "math.least(-5)" value: { int64_value: -5 } } test: { name: "unary_positive" expr: "math.least(5)" value: { int64_value: 5 } } test: { name: "binary_same_args" expr: "math.least(1, 1)" value: { int64_value: 1 } } test: { name: "binary_with_decimal" expr: "math.least(1, 1.0) == 1" } test: { name: "binary_with_uint" expr: "math.least(1, 1u) == 1" } test: { name: "binary_first_arg_least" expr: "math.least(-3, 3)" value: { int64_value: -3 } } test: { name: "binary_second_arg_least" expr: "math.least(5, -7)" value: { int64_value: -7 } } test: { name: "binary_first_arg_int_max" expr: "math.least(9223372036854775807, 1)" value: { int64_value: 1 } } test: { name: "binary_second_arg_int_max" expr: "math.least(1, 9223372036854775807)" value: { int64_value: 1 } } test: { name: "binary_first_arg_int_min" expr: "math.least(-9223372036854775808, 1)" value: { int64_value: -9223372036854775808 } } test: { name: "binary_second_arg_int_min" expr: "math.least(1, -9223372036854775808)" value: { int64_value: -9223372036854775808 } } test: { name: "ternary_same_args" expr: "math.least(1, 1, 1) == 1" } test: { name: "ternary_with_decimal" expr: "math.least(1, 1.0, 1.0) == 1" } test: { name: "ternary_with_uint" expr: "math.least(1, 1u, 1u) == 1" } test: { name: "ternary_first_arg_least" expr: "math.least(0, 1, 3) == 0" } test: { name: "ternary_third_arg_least" expr: "math.least(1, 3, 0) == 0" } test: { name: "ternary_with_negatives" expr: "math.least(-1, -2, -3) == -3" } test: { name: "ternary_int_max" expr: "math.least(9223372036854775807, 1, 5) == 1" } test: { name: "ternary_int_min" expr: "math.least(-9223372036854775808, -1, -5) == -9223372036854775808" } test: { name: "quaternary_mixed" expr: "math.least(5.4, 10, 3u, -5.0, 9223372036854775807) == -5.0" } test: { name: "quaternary_mixed_array" expr: "math.least([5.4, 10, 3u, -5.0, 3.5]) == -5.0" } test: { name: "quaternary_mixed_dyn_array" expr: "math.least([dyn(5.4), dyn(10), dyn(3u), dyn(-5.0), dyn(3.5)]) == -5.0" } } section: { name: "least_double_result" test: { name: "unary_negative" expr: "math.least(-5.5)" value: { double_value: -5.5 } } test: { name: "unary_positive" expr: "math.least(5.5)" value: { double_value: 5.5 } } test: { name: "binary_same_args" expr: "math.least(1.5, 1.5)" value: { double_value: 1.5 } } test: { name: "binary_with_int" expr: "math.least(1.0, 1) == 1" } test: { name: "binary_with_uint" expr: "math.least(1, 1u) == 1" } test: { name: "binary_first_arg_least" expr: "math.least(-3.5, 3.5)" value: { double_value: -3.5 } } test: { name: "binary_second_arg_least" expr: "math.least(5.5, -7.5)" value: { double_value: -7.5 } } test: { name: "binary_first_arg_double_max" expr: "math.least(1.797693e308, 1.5)" value: { double_value: 1.5 } } test: { name: "binary_second_arg_double_max" expr: "math.least(1.5, 1.797693e308)" value: { double_value: 1.5 } } test: { name: "binary_first_arg_double_min" expr: "math.least(-1.797693e308, 1.5)" value: { double_value: -1.797693e308 } } test: { name: "binary_second_arg_double_min" expr: "math.least(1.5, -1.797693e308)" value: { double_value: -1.797693e308 } } test: { name: "ternary_same_args" expr: "math.least(1.5, 1.5, 1.5) == 1.5" } test: { name: "ternary_with_int" expr: "math.least(1.0, 1, 1) == 1.0" } test: { name: "ternary_with_uint" expr: "math.least(1.0, 1u, 1u) == 1" } test: { name: "ternary_first_arg_least" expr: "math.least(0.5, 1.5, 3.5) == 0.5" } test: { name: "ternary_third_arg_least" expr: "math.least(1.5, 3.5, 0.5) == 0.5" } test: { name: "ternary_with_negatives" expr: "math.least(-1.5, -2.5, -3.5) == -3.5" } test: { name: "ternary_double_max" expr: "math.least(1.797693e308, 1, 5) == 1" } test: { name: "ternary_double_min" expr: "math.least(-1.797693e308, -1, -5) == -1.797693e308" } test: { name: "quaternary_mixed" expr: "math.least(5.4, 10, 3u, -5.0, 1.797693e308) == -5.0" } test: { name: "quaternary_mixed_array" expr: "math.least([5.4, 10.5, 3u, -5.0, 3.5]) == -5.0" } test: { name: "quaternary_mixed_dyn_array" expr: "math.least([dyn(5.4), dyn(10.5), dyn(3u), dyn(-5.0), dyn(3.5)]) == -5.0" } } section: { name: "least_uint_result" test: { name: "unary" expr: "math.least(5u)" value: { uint64_value: 5 } } test: { name: "binary_same_args" expr: "math.least(1u, 1u)" value: { uint64_value: 1 } } test: { name: "binary_with_decimal" expr: "math.least(1u, 1.0) == 1u" } test: { name: "binary_with_int" expr: "math.least(1u, 1) == 1u" } test: { name: "binary_first_arg_least" expr: "math.least(1u, 3u)" value: { uint64_value: 1 } } test: { name: "binary_second_arg_least" expr: "math.least(5u, 2u)" value: { uint64_value: 2 } } test: { name: "binary_first_arg_uint_max" expr: "math.least(18446744073709551615u, 1u)" value: { uint64_value: 1 } } test: { name: "binary_second_arg_uint_max" expr: "math.least(1u, 18446744073709551615u)" value: { uint64_value: 1 } } test: { name: "ternary_same_args" expr: "math.least(1u, 1u, 1u) == 1u" } test: { name: "ternary_with_decimal" expr: "math.least(1u, 1.0, 1.0) == 1u" } test: { name: "ternary_with_int" expr: "math.least(1u, 1, 1) == 1u" } test: { name: "ternary_first_arg_least" expr: "math.least(1u, 10u, 3u) == 1u" } test: { name: "ternary_third_arg_least" expr: "math.least(10u, 3u, 1u) == 1u" } test: { name: "ternary_uint_max" expr: "math.least(18446744073709551615u, 1u, 5u) == 1u" } test: { name: "quaternary_mixed" expr: "math.least(5.4, 10, 3u, 1u, 18446744073709551615u) == 1u" } test: { name: "quaternary_mixed_array" expr: "math.least([5.4, 10u, 3u, 1u, 3.5]) == 1u" } test: { name: "quaternary_mixed_dyn_array" expr: "math.least([dyn(5.4), dyn(10u), dyn(3u), dyn(1u), dyn(3.5)]) == 1u" } } section: { name: "ceil" test: { name: "negative" expr: "math.ceil(-1.2)" value: { double_value: -1.0 } } test: { name: "positive" expr: "math.ceil(1.2)" value: { double_value: 2.0 } } test: { name: "dyn_error" expr: "math.ceil(dyn(1))" eval_error: { errors: { message: "no such overload" } } } } section: { name: "floor" test: { name: "negative" expr: "math.floor(-1.2)" value: { double_value: -2.0 } } test: { name: "positive" expr: "math.floor(1.2)" value: { double_value: 1.0 } } test: { name: "dyn_error" expr: "math.floor(dyn(1))" eval_error: { errors: { message: "no such overload" } } } } section: { name: "round" test: { name: "negative_down" expr: "math.round(-1.6)" value: { double_value: -2.0 } } test: { name: "negative_up" expr: "math.round(-1.4)" value: { double_value: -1.0 } } test: { name: "negative_mid" expr: "math.round(-1.5)" value: { double_value: -2.0 } } test: { name: "positive_down" expr: "math.round(1.2)" value: { double_value: 1.0 } } test: { name: "positive_up" expr: "math.round(1.5)" value: { double_value: 2.0 } } test: { name: "nan" expr: "math.isNaN(math.round(0.0/0.0))" } test: { name: "dyn_error" expr: "math.round(dyn(1))" eval_error: { errors: { message: "no such overload" } } } } section: { name: "trunc" test: { name: "negative" expr: "math.trunc(-1.2)" value: { double_value: -1.0 } } test: { name: "positive" expr: "math.trunc(1.2)" value: { double_value: 1.0 } } test: { name: "nan" expr: "math.isNaN(math.trunc(0.0/0.0))" } test: { name: "dyn_error" expr: "math.trunc(dyn(1))" eval_error: { errors: { message: "no such overload" } } } } section: { name: "abs" test: { name: "uint" expr: "math.abs(1u)" value: { uint64_value: 1 } } test: { name: "positive_int" expr: "math.abs(1)" value: { int64_value: 1 } } test: { name: "negative_int" expr: "math.abs(-11)" value: { int64_value: 11 } } test: { name: "positive_double" expr: "math.abs(1.5)" value: { double_value: 1.5 } } test: { name: "negative_double" expr: "math.abs(-11.5)" value: { double_value: 11.5 } } test: { name: "int_overflow" expr: "math.abs(-9223372036854775808)" eval_error: { errors: { message: "overflow" } } } } section: { name: "sign" test: { name: "positive_uint" expr: "math.sign(100u)" value: { uint64_value: 1 } } test: { name: "zero_uint" expr: "math.sign(0u)" value: { uint64_value: 0 } } test: { name: "positive_int" expr: "math.sign(100)" value: { int64_value: 1 } } test: { name: "negative_int" expr: "math.sign(-11)" value: { int64_value: -1 } } test: { name: "zero_int" expr: "math.sign(0)" value: { int64_value: 0 } } test: { name: "positive_double" expr: "math.sign(100.5)" value: { double_value: 1.0 } } test: { name: "negative_double" expr: "math.sign(-32.0)" value: { double_value: -1.0 } } test: { name: "zero_double" expr: "math.sign(0.0)" value: { double_value: 0.0 } } test: { name: "dyn_error" expr: "math.sign(dyn(true))" eval_error: { errors: { message: "no such overload" } } } } section: { name: "isNaN" test: { name: "true" expr: "math.isNaN(0.0/0.0)" } test: { name: "false" expr: "!math.isNaN(1.0/0.0)" } test: { name: "dyn_error" expr: "math.isNaN(dyn(true))" eval_error: { errors: { message: "no such overload" } } } } section: { name: "isInf" test: { name: "true" expr: "math.isInf(1.0/0.0)" } test: { name: "false" expr: "!math.isInf(0.0/0.0)" } test: { name: "dyn_error" expr: "math.isInf(dyn(true))" eval_error: { errors: { message: "no such overload" } } } } section: { name: "isFinite" test: { name: "true" expr: "math.isFinite(1.0/1.5)" } test: { name: "false_nan" expr: "!math.isFinite(0.0/0.0)" } test: { name: "false_inf" expr: "!math.isFinite(-1.0/0.0)" } test: { name: "dyn_error" expr: "math.isFinite(dyn(true))" eval_error: { errors: { message: "no such overload" } } } } section: { name: "bit_and" test: { name: "int_int_non_intersect" expr: "math.bitAnd(1, 2)" value: { int64_value: 0 } } test: { name: "int_int_intersect" expr: "math.bitAnd(1, 3)" value: { int64_value: 1 } } test: { name: "int_int_intersect_neg" expr: "math.bitAnd(1, -1)" value: { int64_value: 1 } } test: { name: "uint_uint_non_intersect" expr: "math.bitAnd(1u, 2u)" value: { uint64_value: 0 } } test: { name: "uint_uint_intersect" expr: "math.bitAnd(1u, 3u)" value: { uint64_value: 1 } } test: { name: "int_dyn_error" expr: "math.bitAnd(2u, dyn(''))" eval_error: { errors: { message: "no such overload" } } } } section: { name: "bit_or" test: { name: "int_int_positive" expr: "math.bitOr(1, 2)" value: { int64_value: 3 } } test: { name: "int_int_positive_negative" expr: "math.bitOr(4, -2)" value: { int64_value: -2 } } test: { name: "uint_uint" expr: "math.bitOr(1u, 4u)" value: { uint64_value: 5 } } test: { name: "dyn_int_error" expr: "math.bitOr(dyn(1.2), 1)" eval_error: { errors: { message: "no such overload" } } } } section: { name: "bit_xor" test: { name: "int_int_positive" expr: "math.bitXor(1, 3)" value: { int64_value: 2 } } test: { name: "int_int_positive_negative" expr: "math.bitXor(4, -2)" value: { int64_value: -6 } } test: { name: "uint_uint" expr: "math.bitXor(1u, 3u)" value: { uint64_value: 2 } } test: { name: "dyn_dyn_error" expr: "math.bitXor(dyn([]), dyn([1]))" eval_error: { errors: { message: "no such overload" } } } } section: { name: "bit_not" test: { name: "int_positive" expr: "math.bitNot(1)" value: { int64_value: -2 } } test: { name: "int_negative" expr: "math.bitNot(-1)" value: { int64_value: 0 } } test: { name: "int_zero" expr: "math.bitNot(0)" value: { int64_value: -1 } } test: { name: "uint_positive" expr: "math.bitNot(1u)" value: { uint64_value: 18446744073709551614 } } test: { name: "uint_zero" expr: "math.bitNot(0u)" value: { uint64_value: 18446744073709551615 } } test: { name: "dyn_error" expr: "math.bitNot(dyn(''))" eval_error: { errors: { message: "no such overload" } } } } section: { name: "bit_shift_left" test: { name: "int", expr: "math.bitShiftLeft(1, 2)" value: { int64_value: 4 } } test: { name: "int_large_shift", expr: "math.bitShiftLeft(1, 200)" value: { int64_value: 0 } } test: { name: "int_negative_large_shift", expr: "math.bitShiftLeft(-1, 200)" value: { int64_value: 0 } } test: { name: "uint", expr: "math.bitShiftLeft(1u, 2)" value: { uint64_value: 4 } } test: { name: "uint_large_shift", expr: "math.bitShiftLeft(1u, 200)" value: { uint64_value: 0 } } test: { name: "bad_shift", expr: "math.bitShiftLeft(1u, -1)" eval_error: { errors: { message: "negative offset" } } } test: { name: "dyn_int_error" expr: "math.bitShiftLeft(dyn(4.3), 1)" eval_error: { errors: { message: "no such overload" } } } } section: { name: "bit_shift_right" test: { name: "int", expr: "math.bitShiftRight(1024, 2)" value: { int64_value: 256 } } test: { name: "int_large_shift", expr: "math.bitShiftRight(1024, 64)" value: { int64_value: 0 } } test: { name: "int_negative", expr: "math.bitShiftRight(-1024, 3)" value: { int64_value: 2305843009213693824 } } test: { name: "int_negative_large_shift", expr: "math.bitShiftRight(-1024, 64)" value: { int64_value: 0 } } test: { name: "uint", expr: "math.bitShiftRight(1024u, 2)" value: { uint64_value: 256 } } test: { name: "uint_large_shift", expr: "math.bitShiftRight(1024u, 200)" value: { uint64_value: 0 } } test: { name: "bad_shift", expr: "math.bitShiftRight(1u, -1)" eval_error: { errors: { message: "negative offset" } } } test: { name: "dyn_int_error" expr: "math.bitShiftRight(dyn(b'123'), 1)" eval_error: { errors: { message: "no such overload" } } } }