# proto-file: ../../../proto/cel/expr/conformance/test/simple.proto # proto-message: google.api.expr.test.v1.SimpleTestFile name: "logic" description: "Tests for logical special operators." section { name: "conditional" description: "Tests for the conditional operator." test { name: "true_case" expr: "true ? 1 : 2" value: { int64_value: 1 } } test { name: "false_case" expr: "false ? 'foo' : 'bar'" value: { string_value: "bar" } } test { name: "error_case" expr: "2 / 0 > 4 ? 'baz' : 'quux'" eval_error: { errors: { message: "division by zero" } } } test { name: "mixed_type" expr: "true ? 'cows' : 17" disable_check: true value: { string_value: "cows" } } test { name: "bad_type" expr: "'cows' ? false : 17" disable_check: true eval_error: { errors: { message: "no matching overload" } } } } section { name: "AND" description: "Tests for logical AND." test { name: "all_true" expr: "true && true" value: { bool_value: true } } test { name: "all_false" expr: "false && false" value: { bool_value: false } } test { name: "false_left" expr: "false && true" value: { bool_value: false } } test { name: "false_right" expr: "true && false" value: { bool_value: false } } test { name: "short_circuit_type_left" expr: "false && 32" disable_check: true value: { bool_value: false } } test { name: "short_circuit_type_right" expr: "'horses' && false" disable_check: true value: { bool_value: false } } test { name: "short_circuit_error_left" expr: "false && (2 / 0 > 3 ? false : true)" value: { bool_value: false } } test { name: "short_circuit_error_right" expr: "(2 / 0 > 3 ? false : true) && false" value: { bool_value: false } } test { name: "error_right" expr: "true && 1/0 != 0" eval_error: { errors: { message: "no matching overload" } } } test { name: "error_left" expr: "1/0 != 0 && true" eval_error: { errors: { message: "no matching overload" } } } test { name: "no_overload" expr: "'less filling' && 'tastes great'" disable_check: true eval_error: { errors: { message: "no matching overload" } } } } section { name: "OR" description: "Tests for logical OR" test { name: "all_true" expr: "true || true" value: { bool_value: true } } test { name: "all_false" expr: "false || false" value: { bool_value: false } } test { name: "false_left" expr: "false || true" value: { bool_value: true } } test { name: "false_right" expr: "true || false" value: { bool_value: true } } test { name: "short_circuit_type_left" expr: "true || 32" disable_check: true value: { bool_value: true } } test { name: "short_circuit_type_right" expr: "'horses' || true" disable_check: true value: { bool_value: true } } test { name: "short_circuit_error_left" expr: "true || (2 / 0 > 3 ? false : true)" value: { bool_value: true } } test { name: "short_circuit_error_right" expr: "(2 / 0 > 3 ? false : true) || true" value: { bool_value: true } } test { name: "error_right" expr: "false || 1/0 != 0" eval_error: { errors: { message: "no matching overload" } } } test { name: "error_left" expr: "1/0 != 0 || false" eval_error: { errors: { message: "no matching overload" } } } test { name: "no_overload" expr: "'less filling' || 'tastes great'" disable_check: true eval_error: { errors: { message: "no matching overload" } } } } section { name: "NOT" description: "Tests for logical NOT." test { name: "not_true" expr: "!true" value: { bool_value: false } } test { name: "not_false" expr: "!false" value: { bool_value: true } } test { name: "no_overload" expr: "!0" disable_check: true eval_error: { errors: { message: "no matching overload" } } } }