# proto-file: ../../../proto/cel/expr/conformance/test/simple.proto # proto-message: cel.expr.conformance.test.SimpleTestFile name: "parse" description: "End-to-end parsing tests." section { name: "nest" description: "Deep parse trees which all implementations must support." test { name: "list_index" description: "Member = Member '[' Expr ']'. Nested indices are supported up to 12 times." expr: "a[a[a[a[a[a[a[a[a[a[a[a[0]]]]]]]]]]]]" type_env { name: "a" ident { type { list_type { elem_type { primitive: INT64 } } } } } bindings { key: "a" value { value { list_value { values { int64_value: 0 } } } } } value { int64_value: 0 } } test { name: "message_literal" description: "Member = Member '{' [FieldInits] '}'. Nested messages supported up to 12 levels deep." container: "cel.expr.conformance.proto3" expr: "NestedTestAllTypes{child: NestedTestAllTypes{child: NestedTestAllTypes{child: NestedTestAllTypes{child: NestedTestAllTypes{child: NestedTestAllTypes{child: NestedTestAllTypes{child: NestedTestAllTypes{child: NestedTestAllTypes{child: NestedTestAllTypes{child: NestedTestAllTypes{payload: TestAllTypes{single_int64: 137}}}}}}}}}}}}.payload.single_int64" value { int64_value: 0 } } test { name: "funcall" description: "Primary = ['.'] IDENT ['(' [ExprList] ')']. Nested function calls supported up to 12 levels deep." expr: "int(uint(int(uint(int(uint(int(uint(int(uint(int(uint(7))))))))))))" value { int64_value: 7 } } test { name: "list_literal" description: "Primary = '[' [ExprList] ']'. Nested list literals up to 12 levels deep." expr: "size([[[[[[[[[[[[0]]]]]]]]]]]])" value { int64_value: 1 } } test { name: "map_literal" description: "Primary = '{' [MapInits] '}'. Nested map literals up to 12 levels deep." expr: "size({0: {0: {0: {0: {0: {0: {0: {0: {0: {0: {0: {0: 'foo'}}}}}}}}}}}})" value { int64_value: 1 } } test { name: "parens" description: "Primary = '(' Expr ')'" expr: "((((((((((((((((((((((((((((((((7))))))))))))))))))))))))))))))))" value { int64_value: 7 } } } section { name: "repeat" description: "Repetitive parse trees which all implementations must support." test { name: "conditional" description: "Expr = ConditionalOr ['?' ConditionalOr ':' Expr]. Chained ternary operators up to 24 levels." expr: "true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : true ? true : false" value { bool_value: true } } test { name: "or" description: "ConditionalOr = [ConditionalOr '||'] ConditionalAnd. Logical OR statements with 32 conditions." expr: "false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || false || true" value { bool_value: true } } test { name: "and" description: "ConditionalAnd = [ConditionalAnd '&&'] Relation. Logical AND statements with 32 conditions." expr: "true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && true && false" value { bool_value: false } } test { name: "add_sub" description: "Addition = [Addition ('+' | '-')] Multiplication. Addition operators are supported up to 24 times consecutively." expr: "3 - 3 + 3 - 3 + 3 - 3 + 3 - 3 + 3 - 3 + 3 - 3 + 3 - 3 + 3 - 3 + 3 - 3 + 3 - 3 + 3 - 3 + 3 - 3 + 3" value { int64_value: 3 } } test { name: "mul_div" description: "Multiplication = [Multiplication ('*' | '/' | '%')] Unary. Multiplication operators are supported up to 24 times consecutively." expr: "4 * 4 / 4 * 4 / 4 * 4 / 4 * 4 / 4 * 4 / 4 * 4 / 4 * 4 / 4 * 4 / 4 * 4 / 4 * 4 / 4 * 4 / 4 * 4 / 4" value { int64_value: 4 } } test { name: "not" description: "Unary = '!' {'!'} Member" expr: "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!true" value { bool_value: true } } test { name: "unary_neg" description: "Unary = '-' {'-'} Member" expr: "--------------------------------19" value { int64_value: 19 } } test { name: "select" description: "Member = Member '.' IDENT ['(' [ExprList] ')']. Selection is supported up to 12 times consecutively." container: "cel.expr.conformance.proto3" expr: "NestedTestAllTypes{}.child.child.child.child.child.child.child.child.child.child.payload.single_int32" value { int64_value: 0 } } test { name: "index" description: "Member = Member '[' Expr ']'. Indexing is supported up to 12 times consecutively." expr: "[[[[[[[[[[[['foo']]]]]]]]]]]][0][0][0][0][0][0][0][0][0][0][0][0]" value { string_value: "foo" } } test { name: "list_literal" description: "Primary = '[' [ExprList] ']'. List literals with up to 32 elements." expr: "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31][17]" value { int64_value: 17 } } test { name: "map_literal" description: "Primary = '{' [MapInits] '}'. Map literals with up to 32 entries." expr: "{0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven', 8: 'eight', 9: 'nine', 10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 16: 'sixteen', 17: 'seventeen', 18: 'eighteen', 19: 'nineteen', 20: 'twenty', 21: 'twenty-one', 22: 'twenty-two', 23: 'twenty-three', 24: 'twenty-four', 25: 'twenty-five', 26: 'twenty-six', 27: 'twenty-seven', 28: 'twenty-eight', 29: 'twenty-nine', 30: 'thirty', 31: 'thirty-one'}[17]" value { string_value: 'seventeen' } } test { name: "message_literal" description: "Member = Member '{' [FieldInits] '}'. Message literals with up to 32 fields." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{single_int32: 5, single_int64: 10, single_uint32: 15u, single_uint64: 20u, single_sint32: 25, single_sint64: 30, single_fixed32: 35u, single_fixed64: 40u, single_float: 45.0, single_double: 50.0, single_bool: true, single_string: 'sixty', single_bytes: b'sixty-five', single_value: 70.0, single_int64_wrapper: 75, single_int32_wrapper: 80, single_double_wrapper: 85.0, single_float_wrapper: 90.0, single_uint64_wrapper: 95u, single_uint32_wrapper: 100u, single_string_wrapper: 'one hundred five', single_bool_wrapper: true, repeated_int32: [115], repeated_int64: [120], repeated_uint32: [125u], repeated_uint64: [130u], repeated_sint32: [135], repeated_sint64: [140], repeated_fixed32: [145u], repeated_fixed64: [150u], repeated_sfixed32: [155], repeated_float: [160.0]}.single_sint64" value { int64_value: 30 } } } section { name: "string_literals" description: "Check that string literals are properly parsed" test { name: "single_quoted" expr: "'hello'" value: { string_value: "hello" } } test { name: "double_quoted" expr: '"hello"' value: { string_value: "hello" } } test { name: "triple_single_quoted" expr: "'''hello'''" value: { string_value: "hello" } } test { name: "triple_double_quoted" expr: '"""hello"""' value: { string_value: "hello" } } test { name: "single_quoted_escaped_punctuation" expr: "' \\\\ \\\? \\\" \\\' \\` '" value: { string_value: " \\ \? \" \' ` " } } test { name: "double_quoted_escaped_punctuation" expr: '" \\\\ \\\? \\\" \\\' \\` "' value: { string_value: " \\ \? \" \' ` " } } test { name: "triple_single_quoted_escaped_punctuation" expr: "''' \\\\ \\\? \\\" \\\' \\` '''" value: { string_value: " \\ \? \" \' ` " } } test { name: "triple_double_quoted_escaped_punctuation" expr: '""" \\\\ \\\? \\\" \\\' \\` """' value: { string_value: " \\ \? \" \' ` " } } test { name: "triple_single_quoted_unescaped_punctuation" expr: "''' ? \" \' ` '''" value: { string_value: " \? \" \' ` " } } test { name: "triple_double_quoted_unescaped_punctuation" expr: '""" ? \" \' ` """' value: { string_value: " \? \" \' ` " } } test { name: "single_quoted_escaped_special_control_characters" expr: "' \\a \\b \\f \\t \\v '" value: { string_value: " \a \b \f \t \v " } } test { name: "double_quoted_escaped_special_control_characters" expr: '" \\a \\b \\f \\t \\v "' value: { string_value: " \a \b \f \t \v " } } test { name: "single_quoted_unescaped_special_control_characters" expr: "' \a \b \f \t \v '" value: { string_value: " \a \b \f \t \v " } } test { name: "double_quoted_unescaped_special_control_characters" expr: '" \a \b \f \t \v "' value: { string_value: " \a \b \f \t \v " } } test { name: "triple_single_quoted_escaped_special_control_characters" expr: "''' \\a \\b \\f \\t \\v '''" value: { string_value: " \a \b \f \t \v " } } test { name: "triple_double_quoted_escaped_special_control_characters" expr: '""" \\a \\b \\f \\t \\v """' value: { string_value: " \a \b \f \t \v " } } test { name: "triple_single_quoted_unescaped_special_control_characters" expr: "''' \a \b \f \t \v '''" value: { string_value: " \a \b \f \t \v " } } test { name: "triple_double_quoted_unescaped_special_control_characters" expr: '""" \a \b \f \t \v """' value: { string_value: " \a \b \f \t \v " } } test { name: "single_quoted_escaped_line_feed" expr: "' \\n '" value: { string_value: " \n " } } test { name: "double_quoted_escaped_line_feed" expr: '" \\n "' value: { string_value: " \n " } } test { name: "triple_single_quoted_escaped_line_feed" expr: "''' \\n '''" value: { string_value: " \n " } } test { name: "triple_double_quoted_escaped_line_feed" expr: '""" \\n """' value: { string_value: " \n " } } test { name: "triple_single_quoted_unescaped_line_feed" expr: "''' \n '''" value: { string_value: " \n " } } test { name: "triple_double_quoted_unescaped_line_feed" expr: '""" \n """' value: { string_value: " \n " } } test { name: "single_quoted_escaped_carriage_return" expr: "' \\r '" value: { string_value: " \r " } } test { name: "double_quoted_escaped_carriage_return" expr: '" \\r "' value: { string_value: " \r " } } test { name: "triple_single_quoted_escaped_carriage_return" expr: "''' \\r '''" value: { string_value: " \r " } } test { name: "triple_double_quoted_escaped_carriage_return" expr: '""" \\r """' value: { string_value: " \r " } } # See https://github.com/google/cel-spec/issues/490 # test { # name: "triple_single_quoted_unescaped_carriage_return" # expr: "''' \r '''" # value: { string_value: " \r " } # } # test { # name: "triple_double_quoted_unescaped_carriage_return" # expr: '""" \r """' # value: { string_value: " \r " } # } test { name: "single_quoted_escaped_windows_line_end" expr: "' \\r\\n '" value: { string_value: " \r\n " } } test { name: "double_quoted_escaped_windows_line_end" expr: '" \\r\\n "' value: { string_value: " \r\n " } } test { name: "triple_single_quoted_escaped_windows_line_end" expr: "''' \\r\\n '''" value: { string_value: " \r\n " } } test { name: "triple_double_quoted_escaped_windows_line_end" expr: '""" \\r\\n """' value: { string_value: " \r\n " } } # See https://github.com/google/cel-spec/issues/490 # test { # name: "triple_single_quoted_unescaped_windows_line_end" # expr: "''' \r\n '''" # value: { string_value: " \r\n " } # } # test { # name: "triple_double_quoted_unescaped_windows_line_end" # expr: '""" \r\n """' # value: { string_value: " \r\n " } # } test { name: "single_quoted_escaped_all_control_characters" expr: "' \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0B \\x0C \\x0E \\x0F \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1A \\x1B \\x1C \\x1D \\x1E \\x1f \\x7F '" value: { string_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "double_quoted_escaped_all_control_characters" expr: '" \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0B \\x0C \\x0E \\x0F \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1A \\x1B \\x1C \\x1D \\x1E \\x1f \\x7F "' value: { string_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "single_quoted_unescaped_all_control_characters" expr: "' \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F '" value: { string_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "double_quoted_unescaped_all_control_characters" expr: '" \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F "' value: { string_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "triple_single_quoted_escaped_all_control_characters" expr: "''' \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0B \\x0C \\x0E \\x0F \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1A \\x1B \\x1C \\x1D \\x1E \\x1f \\x7F '''" value: { string_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "triple_double_quoted_escaped_all_control_characters" expr: '""" \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0B \\x0C \\x0E \\x0F \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1A \\x1B \\x1C \\x1D \\x1E \\x1f \\x7F """' value: { string_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "triple_single_quoted_unescaped_all_control_characters" expr: "''' \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F '''" value: { string_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "triple_double_quoted_unescaped_all_control_characters" expr: '""" \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F """' value: { string_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "single_quoted_octal_escapes" expr: "' \\000 \\012 \\177 '" value: { string_value: " \x00 \x0A \x7F " } } test { name: "double_quoted_octal_escapes" expr: '" \\000 \\012 \\177 "' value: { string_value: " \x00 \x0A \x7F " } } test { name: "triple_single_quoted_octal_escapes" expr: "''' \\000 \\012 \\177 '''" value: { string_value: " \x00 \x0A \x7F " } } test { name: "triple_double_quoted_octal_escapes" expr: '""" \\000 \\012 \\177 """' value: { string_value: " \x00 \x0A \x7F " } } test { name: "single_quoted_lower_x_escapes" expr: "' \\x00 \\x0A \\x7F '" value: { string_value: " \x00 \x0A \x7F " } } test { name: "double_quoted_lower_x_escapes" expr: '" \\x00 \\x0A \\x7F "' value: { string_value: " \x00 \x0A \x7F " } } test { name: "triple_single_quoted_lower_x_escapes" expr: "''' \\x00 \\x0A \\x7F '''" value: { string_value: " \x00 \x0A \x7F " } } test { name: "triple_double_quoted_lower_x_escapes" expr: '""" \\x00 \\x0A \\x7F """' value: { string_value: " \x00 \x0A \x7F " } } test { name: "single_quoted_upper_x_escapes" expr: "' \\X00 \\X0A \\X7F '" value: { string_value: " \x00 \x0A \x7F " } } test { name: "double_quoted_upper_x_escapes" expr: '" \\X00 \\X0A \\X7F "' value: { string_value: " \x00 \x0A \x7F " } } test { name: "triple_single_quoted_upper_x_escapes" expr: "''' \\X00 \\X0A \\X7F '''" value: { string_value: " \x00 \x0A \x7F " } } test { name: "triple_double_quoted_upper_x_escapes" expr: '""" \\X00 \\X0A \\X7F """' value: { string_value: " \x00 \x0A \x7F " } } test { name: "single_quoted_lower_u_escapes" expr: "' \\u0000 \\u000A \\u007F \\u0100 \\uFFFB '" value: { string_value: " \x00 \x0A \x7F \u0100 \uFFFB " } } test { name: "double_quoted_lower_u_escapes" expr: '" \\u0000 \\u000A \\u007F \\u0100 \\uFFFB "' value: { string_value: " \x00 \x0A \x7F \u0100 \uFFFB " } } test { name: "triple_single_quoted_lower_u_escapes" expr: "''' \\u0000 \\u000A \\u007F \\u0100 \\uFFFB '''" value: { string_value: " \x00 \x0A \x7F \u0100 \uFFFB " } } test { name: "triple_double_quoted_lower_u_escapes" expr: '""" \\u0000 \\u000A \\u007F \\u0100 \\uFFFB """' value: { string_value: " \x00 \x0A \x7F \u0100 \uFFFB " } } test { name: "single_quoted_upper_u_escapes" expr: "' \\U00000000 \\U0000000A \\U0000007F \\U00000100 \\U0000FFFB \\U00010000 \\U0001F62C '" value: { string_value: " \x00 \x0A \x7F \U00000100 \U0000FFFB \U00010000 \U0001F62C " } } test { name: "double_quoted_upper_u_escapes" expr: '" \\U00000000 \\U0000000A \\U0000007F \\U00000100 \\U0000FFFB \\U00010000 \\U0001F62C "' value: { string_value: " \x00 \x0A \x7F \U00000100 \U0000FFFB \U00010000 \U0001F62C " } } test { name: "triple_single_quoted_upper_u_escapes" expr: "''' \\U00000000 \\U0000000A \\U0000007F \\U00000100 \\U0000FFFB \\U00010000 \\U0001F62C '''" value: { string_value: " \x00 \x0A \x7F \U00000100 \U0000FFFB \U00010000 \U0001F62C " } } test { name: "triple_double_quoted_upper_u_escapes" expr: '""" \\U00000000 \\U0000000A \\U0000007F \\U00000100 \\U0000FFFB \\U00010000 \\U0001F62C """' value: { string_value: " \x00 \x0A \x7F \U00000100 \U0000FFFB \U00010000 \U0001F62C " } } test { name: "mixed_case_hex_single_quoted_escapes" expr: "' \\x4a \\x4B \\X4c \\X4D \\u01aB \\U000001aB '" value: { string_value: " \x4a \x4B \x4c \x4D \u01aB \U000001aB " } } test { name: "mixed_case_hex_double_quoted_escapes" expr: '" \\x4a \\x4B \\X4c \\X4D \\u01aB \\U000001aB "' value: { string_value: " \x4a \x4B \x4c \x4D \u01aB \U000001aB " } } test { name: "mixed_case_hex_triple_single_quoted_escapes" expr: "''' \\x4a \\x4B \\X4c \\X4D \\u01aB \\U000001aB '''" value: { string_value: " \x4a \x4B \x4c \x4D \u01aB \U000001aB " } } test { name: "mixed_case_hex_triple_double_quoted_escapes" expr: '""" \\x4a \\x4B \\X4c \\X4D \\u01aB \\U000001aB """' value: { string_value: " \x4a \x4B \x4c \x4D \u01aB \U000001aB " } } test { name: "unassigned_code_point_single_quoted_escapes" expr: "' \\U00088888 '" value: { string_value: " \U00088888 " } } test { name: "unassigned_code_point_double_quoted_escapes" expr: '" \\U00088888 "' value: { string_value: " \U00088888 " } } test { name: "unassigned_code_point_triple_single_quoted_escapes" expr: "''' \\U00088888 '''" value: { string_value: " \U00088888 " } } test { name: "unassigned_code_point_triple_double_quoted_escapes" expr: '""" \\U00088888 """' value: { string_value: " \U00088888 " } } test { name: "unassigned_code_point_single_quoted_unescaped" expr: "' \U00088888 '" value: { string_value: " \U00088888 " } } test { name: "unassigned_code_point_double_quoted_unescaped" expr: '" \U00088888 "' value: { string_value: " \U00088888 " } } test { name: "unassigned_code_point_triple_single_quoted_unescaped" expr: "''' \U00088888 '''" value: { string_value: " \U00088888 " } } test { name: "unassigned_code_point_triple_double_quoted_unescaped" expr: '""" \U00088888 """' value: { string_value: " \U00088888 " } } test { name: "raw_single_quoted_escapes" expr: "r' \\\\ \\\? \\\" \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 '" value: { string_value: " \\\\ \\\? \\\" \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "raw_double_quoted_escapes" expr: 'r" \\\\ \\\? \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 "' value: { string_value: " \\\\ \\\? \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "raw_triple_single_quoted_escapes" expr: "r''' \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 '''" value: { string_value: " \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "raw_triple_double_quoted_escapes" expr: 'r""" \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 """' value: { string_value: " \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "upper_raw_single_quoted_escapes" expr: "R' \\\\ \\\? \\\" \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 '" value: { string_value: " \\\\ \\\? \\\" \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "upper_raw_double_quoted_escapes" expr: 'R" \\\\ \\\? \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 "' value: { string_value: " \\\\ \\\? \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "upper_raw_triple_single_quoted_escapes" expr: "R''' \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 '''" value: { string_value: " \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "upper_raw_triple_double_quoted_escapes" expr: 'R""" \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 """' value: { string_value: " \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } } section { name: "bytes_literals" description: "Check that bytes literals are properly parsed" test { name: "single_quoted" expr: "b'hello'" value: { bytes_value: "hello" } } test { name: "double_quoted" expr: 'b"hello"' value: { bytes_value: "hello" } } test { name: "triple_single_quoted" expr: "b'''hello'''" value: { bytes_value: "hello" } } test { name: "triple_double_quoted" expr: 'b"""hello"""' value: { bytes_value: "hello" } } test { name: "single_quoted_escaped_punctuation" expr: "b' \\\\ \\\? \\\" \\\' \\` '" value: { bytes_value: " \\ \? \" \' ` " } } test { name: "double_quoted_escaped_punctuation" expr: 'b" \\\\ \\\? \\\" \\\' \\` "' value: { bytes_value: " \\ \? \" \' ` " } } test { name: "triple_single_quoted_escaped_punctuation" expr: "b''' \\\\ \\\? \\\" \\\' \\` '''" value: { bytes_value: " \\ \? \" \' ` " } } test { name: "triple_double_quoted_escaped_punctuation" expr: 'b""" \\\\ \\\? \\\" \\\' \\` """' value: { bytes_value: " \\ \? \" \' ` " } } test { name: "triple_single_quoted_unescaped_punctuation" expr: "b''' ? \" \' ` '''" value: { bytes_value: " \? \" \' ` " } } test { name: "triple_double_quoted_unescaped_punctuation" expr: 'b""" ? \" \' ` """' value: { bytes_value: " \? \" \' ` " } } test { name: "single_quoted_escaped_special_control_characters" expr: "b' \\a \\b \\f \\t \\v '" value: { bytes_value: " \a \b \f \t \v " } } test { name: "double_quoted_escaped_special_control_characters" expr: 'b" \\a \\b \\f \\t \\v "' value: { bytes_value: " \a \b \f \t \v " } } test { name: "single_quoted_unescaped_special_control_characters" expr: "b' \a \b \f \t \v '" value: { bytes_value: " \a \b \f \t \v " } } test { name: "double_quoted_unescaped_special_control_characters" expr: 'b" \a \b \f \t \v "' value: { bytes_value: " \a \b \f \t \v " } } test { name: "triple_single_quoted_escaped_special_control_characters" expr: "b''' \\a \\b \\f \\t \\v '''" value: { bytes_value: " \a \b \f \t \v " } } test { name: "triple_double_quoted_escaped_special_control_characters" expr: 'b""" \\a \\b \\f \\t \\v """' value: { bytes_value: " \a \b \f \t \v " } } test { name: "triple_single_quoted_unescaped_special_control_characters" expr: "b''' \a \b \f \t \v '''" value: { bytes_value: " \a \b \f \t \v " } } test { name: "triple_double_quoted_unescaped_special_control_characters" expr: 'b""" \a \b \f \t \v """' value: { bytes_value: " \a \b \f \t \v " } } test { name: "single_quoted_escaped_line_feed" expr: "b' \\n '" value: { bytes_value: " \n " } } test { name: "double_quoted_escaped_line_feed" expr: 'b" \\n "' value: { bytes_value: " \n " } } test { name: "triple_single_quoted_escaped_line_feed" expr: "b''' \\n '''" value: { bytes_value: " \n " } } test { name: "triple_double_quoted_escaped_line_feed" expr: 'b""" \\n """' value: { bytes_value: " \n " } } test { name: "triple_single_quoted_unescaped_line_feed" expr: "b''' \n '''" value: { bytes_value: " \n " } } test { name: "triple_double_quoted_unescaped_line_feed" expr: 'b""" \n """' value: { bytes_value: " \n " } } test { name: "single_quoted_escaped_carriage_return" expr: "b' \\r '" value: { bytes_value: " \r " } } test { name: "double_quoted_escaped_carriage_return" expr: 'b" \\r "' value: { bytes_value: " \r " } } test { name: "triple_single_quoted_escaped_carriage_return" expr: "b''' \\r '''" value: { bytes_value: " \r " } } test { name: "triple_double_quoted_escaped_carriage_return" expr: 'b""" \\r """' value: { bytes_value: " \r " } } # See https://github.com/google/cel-spec/issues/490 # test { # name: "triple_single_quoted_unescaped_carriage_return" # expr: "b''' \r '''" # value: { bytes_value: " \r " } # } # test { # name: "triple_double_quoted_unescaped_carriage_return" # expr: 'b""" \r """' # value: { bytes_value: " \r " } # } test { name: "single_quoted_escaped_windows_line_end" expr: "b' \\r\\n '" value: { bytes_value: " \r\n " } } test { name: "double_quoted_escaped_windows_line_end" expr: 'b" \\r\\n "' value: { bytes_value: " \r\n " } } test { name: "triple_single_quoted_escaped_windows_line_end" expr: "b''' \\r\\n '''" value: { bytes_value: " \r\n " } } test { name: "triple_double_quoted_escaped_windows_line_end" expr: 'b""" \\r\\n """' value: { bytes_value: " \r\n " } } # See https://github.com/google/cel-spec/issues/490 # test { # name: "triple_single_quoted_unescaped_windows_line_end" # expr: "b''' \r\n '''" # value: { bytes_value: " \r\n " } # } # test { # name: "triple_double_quoted_unescaped_windows_line_end" # expr: 'b""" \r\n """' # value: { bytes_value: " \r\n " } # } test { name: "single_quoted_escaped_all_control_characters" expr: "b' \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0B \\x0C \\x0E \\x0F \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1A \\x1B \\x1C \\x1D \\x1E \\x1f \\x7F '" value: { bytes_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "double_quoted_escaped_all_control_characters" expr: 'b" \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0B \\x0C \\x0E \\x0F \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1A \\x1B \\x1C \\x1D \\x1E \\x1f \\x7F "' value: { bytes_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "single_quoted_unescaped_all_control_characters" expr: "b' \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F '" value: { bytes_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "double_quoted_unescaped_all_control_characters" expr: 'b" \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F "' value: { bytes_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "triple_single_quoted_escaped_all_control_characters" expr: "b''' \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0B \\x0C \\x0E \\x0F \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1A \\x1B \\x1C \\x1D \\x1E \\x1f \\x7F '''" value: { bytes_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "triple_double_quoted_escaped_all_control_characters" expr: 'b""" \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0B \\x0C \\x0E \\x0F \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1A \\x1B \\x1C \\x1D \\x1E \\x1f \\x7F """' value: { bytes_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "triple_single_quoted_unescaped_all_control_characters" expr: "b''' \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F '''" value: { bytes_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "triple_double_quoted_unescaped_all_control_characters" expr: 'b""" \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F """' value: { bytes_value: " \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0B \x0C \x0E \x0F \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1f \x7F " } } test { name: "single_quoted_octal_escapes" expr: "b' \\000 \\012 \\177 \\377 '" value: { bytes_value: " \x00 \x0A \x7F \xFF " } } test { name: "double_quoted_octal_escapes" expr: 'b" \\000 \\012 \\177 \\377 "' value: { bytes_value: " \x00 \x0A \x7F \xFF " } } test { name: "triple_single_quoted_octal_escapes" expr: "b''' \\000 \\012 \\177 \\377 '''" value: { bytes_value: " \x00 \x0A \x7F \xFF " } } test { name: "triple_double_quoted_octal_escapes" expr: 'b""" \\000 \\012 \\177 \\377 """' value: { bytes_value: " \x00 \x0A \x7F \xFF " } } test { name: "single_quoted_lower_x_escapes" expr: "b' \\x00 \\x0A \\x7F \\xFF '" value: { bytes_value: " \x00 \x0A \x7F \xFF " } } test { name: "double_quoted_lower_x_escapes" expr: 'b" \\x00 \\x0A \\x7F \\xFF "' value: { bytes_value: " \x00 \x0A \x7F \xFF " } } test { name: "triple_single_quoted_lower_x_escapes" expr: "b''' \\x00 \\x0A \\x7F \\xFF '''" value: { bytes_value: " \x00 \x0A \x7F \xFF " } } test { name: "triple_double_quoted_lower_x_escapes" expr: 'b""" \\x00 \\x0A \\x7F \\xFF """' value: { bytes_value: " \x00 \x0A \x7F \xFF " } } test { name: "single_quoted_upper_x_escapes" expr: "b' \\X00 \\X0A \\X7F \\XFF '" value: { bytes_value: " \x00 \x0A \x7F \xFF " } } test { name: "double_quoted_upper_x_escapes" expr: 'b" \\X00 \\X0A \\X7F \\XFF "' value: { bytes_value: " \x00 \x0A \x7F \xFF " } } test { name: "triple_single_quoted_upper_x_escapes" expr: "b''' \\X00 \\X0A \\X7F \\XFF '''" value: { bytes_value: " \x00 \x0A \x7F \xFF " } } test { name: "triple_double_quoted_upper_x_escapes" expr: 'b""" \\X00 \\X0A \\X7F \\XFF """' value: { bytes_value: " \x00 \x0A \x7F \xFF " } } test { name: "mixed_case_hex_single_quoted_escapes" expr: "B' \\x4a \\x4B \\X4c \\X4D '" value: { bytes_value: " \x4a \x4B \x4c \x4D " } } test { name: "mixed_case_hex_double_quoted_escapes" expr: 'B" \\x4a \\x4B \\X4c \\X4D "' value: { bytes_value: " \x4a \x4B \x4c \x4D " } } test { name: "mixed_case_hex_triple_single_quoted_escapes" expr: "B''' \\x4a \\x4B \\X4c \\X4D '''" value: { bytes_value: " \x4a \x4B \x4c \x4D " } } test { name: "mixed_case_hex_triple_double_quoted_escapes" expr: 'B""" \\x4a \\x4B \\X4c \\X4D """' value: { bytes_value: " \x4a \x4B \x4c \x4D " } } test { name: "raw_single_quoted_escapes" expr: "br' \\\\ \\\? \\\" \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 '" value: { bytes_value: " \\\\ \\\? \\\" \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "raw_double_quoted_escapes" expr: 'br" \\\\ \\\? \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 "' value: { bytes_value: " \\\\ \\\? \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "raw_triple_single_quoted_escapes" expr: "br''' \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 '''" value: { bytes_value: " \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "raw_triple_double_quoted_escapes" expr: 'br""" \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 """' value: { bytes_value: " \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "upper_raw_single_quoted_escapes" expr: "bR' \\\\ \\\? \\\" \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 '" value: { bytes_value: " \\\\ \\\? \\\" \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "upper_raw_double_quoted_escapes" expr: 'bR" \\\\ \\\? \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 "' value: { bytes_value: " \\\\ \\\? \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "upper_raw_triple_single_quoted_escapes" expr: "bR''' \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 '''" value: { bytes_value: " \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } test { name: "upper_raw_triple_double_quoted_escapes" expr: 'bR""" \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 """' value: { bytes_value: " \\\\ \\\? \\\" \\\' \\` \\a \\b \\f \\t \\v \\n \\r \\000 \\x00 \\X00 \\u0000 \\U00000000 " } } } section { name: "whitespace" description: "Check that whitespace is ignored by the grammar." test { name: "spaces" description: "Check that spaces are ignored." expr: "[ . cel. expr .conformance. proto3. TestAllTypes { single_int64 : int ( 17 ) } . single_int64 ] [ 0 ] == ( 18 - 1 ) && ! false ? 1 : 2" value { int64_value: 1 } } test { name: "tabs" description: "Check that tabs (`\\t`) are ignored." expr: "[\t.\tcel.\texpr\t.conformance.\tproto3.\tTestAllTypes\t{\tsingle_int64\t:\tint\t(\t17\t)\t}\t.\tsingle_int64\t]\t[\t0\t]\t==\t(\t18\t-\t1\t)\t&&\t!\tfalse\t?\t1\t:\t2" value { int64_value: 1 } } test { name: "new_lines" description: "Check that new lines (`\\n`) are ignored." expr: "[\n.\ncel.\nexpr\n.conformance.\nproto3.\nTestAllTypes\n{\nsingle_int64\n:\nint\n(\n17\n)\n}\n.\nsingle_int64\n]\n[\n0\n]\n==\n(\n18\n-\n1\n)\n&&\n!\nfalse\n?\n1\n:\n2" value { int64_value: 1 } } test { name: "new_pages" description: "Check that new pages (`\\f`) are ignored." expr: "[\f.\fcel.\fexpr\f.conformance.\fproto3.\fTestAllTypes\f{\fsingle_int64\f:\fint\f(\f17\f)\f}\f.\fsingle_int64\f]\f[\f0\f]\f==\f(\f18\f-\f1\f)\f&&\f!\ffalse\f?\f1\f:\f2" value { int64_value: 1 } } test { name: "carriage_returns" description: "Check that carriage returns (`\\r`) are ignored." expr: "[\r.\rcel.\rexpr\r.conformance.\rproto3.\rTestAllTypes\r{\rsingle_int64\r:\rint\r(\r17\r)\r}\r.\rsingle_int64\r]\r[\r0\r]\r==\r(\r18\r-\r1\r)\r&&\r!\rfalse\r?\r1\r:\r2" value { int64_value: 1 } } } section { name: "comments" description: "Check that comments are ignored by the grammar. Note that carriage returns alone cannot terminate comments." test { name: "new_line_terminated" description: "Check that new-line-terminated comments are ignored." expr: "[// @\n.// @\ncel.// @\nexpr// @\n.conformance.// @\nproto3.// @\nTestAllTypes// @\n{// @\nsingle_int64// @\n:// @\nint// @\n(// @\n17// @\n)// @\n}// @\n.// @\nsingle_int64// @\n]// @\n[// @\n0// @\n]// @\n==// @\n(// @\n18// @\n-// @\n1// @\n)// @\n&&// @\n!// @\nfalse// @\n?// @\n1// @\n:// @\n2" value { int64_value: 1 } } } section { name: "selectors" description: "Check that reserved identifiers are permitted as selectors as long as they are not language keywords" test { name: "as" description: "Check that `as` can be used as a selector." expr: "{ 'as': 1 }.as" value { int64_value: 1 } } test { name: "break" description: "Check that `break` can be used as a selector." expr: "{ 'break': 1 }.break" value { int64_value: 1 } } test { name: "const" description: "Check that `const` can be used as a selector." expr: "{ 'const': 1 }.const" value { int64_value: 1 } } test { name: "continue" description: "Check that `continue` can be used as a selector." expr: "{ 'continue': 1 }.continue" value { int64_value: 1 } } test { name: "else" description: "Check that `else` can be used as a selector." expr: "{ 'else': 1 }.else" value { int64_value: 1 } } test { name: "for" description: "Check that `for` can be used as a selector." expr: "{ 'for': 1 }.for" value { int64_value: 1 } } test { name: "function" description: "Check that `function` can be used as a selector." expr: "{ 'function': 1 }.function" value { int64_value: 1 } } test { name: "if" description: "Check that `if` can be used as a selector." expr: "{ 'if': 1 }.if" value { int64_value: 1 } } test { name: "import" description: "Check that `import` can be used as a selector." expr: "{ 'import': 1 }.import" value { int64_value: 1 } } test { name: "let" description: "Check that `let` can be used as a selector." expr: "{ 'let': 1 }.let" value { int64_value: 1 } } test { name: "loop" description: "Check that `loop` can be used as a selector." expr: "{ 'loop': 1 }.loop" value { int64_value: 1 } } test { name: "package" description: "Check that `package` can be used as a selector." expr: "{ 'package': 1 }.package" value { int64_value: 1 } } test { name: "namespace" description: "Check that `namespace` can be used as a selector." expr: "{ 'namespace': 1 }.namespace" value { int64_value: 1 } } test { name: "return" description: "Check that `return` can be used as a selector." expr: "{ 'return': 1 }.return" value { int64_value: 1 } } test { name: "var" description: "Check that `var` can be used as a selector." expr: "{ 'var': 1 }.var" value { int64_value: 1 } } test { name: "void" description: "Check that `void` can be used as a selector." expr: "{ 'void': 1 }.void" value { int64_value: 1 } } test { name: "while" description: "Check that `while` can be used as a selector." expr: "{ 'while': 1 }.while" value { int64_value: 1 } } } section { name: "receiver_function_names" description: "Check that reserved identifiers are permitted as receiver function names as long as they are not language keywords" test { name: "as" description: "Check that `as` can be used as a receiver function." expr: "a.as() || true" disable_check: true value { bool_value: true } } test { name: "break" description: "Check that `break` can be used as a receiver function." expr: "a.break() || true" disable_check: true value { bool_value: true } } test { name: "const" description: "Check that `const` can be used as a receiver function." expr: "a.const() || true" disable_check: true value { bool_value: true } } test { name: "continue" description: "Check that `continue` can be used as a receiver function." expr: "a.continue() || true" disable_check: true value { bool_value: true } } test { name: "else" description: "Check that `else` can be used as a receiver function." expr: "a.else() || true" disable_check: true value { bool_value: true } } test { name: "for" description: "Check that `for` can be used as a receiver function." expr: "a.for() || true" disable_check: true value { bool_value: true } } test { name: "function" description: "Check that `function` can be used as a receiver function." expr: "a.function() || true" disable_check: true value { bool_value: true } } test { name: "if" description: "Check that `if` can be used as a receiver function." expr: "a.if() || true" disable_check: true value { bool_value: true } } test { name: "import" description: "Check that `import` can be used as a receiver function." expr: "a.import() || true" disable_check: true value { bool_value: true } } test { name: "let" description: "Check that `let` can be used as a receiver function." expr: "a.let() || true" disable_check: true value { bool_value: true } } test { name: "loop" description: "Check that `loop` can be used as a receiver function." expr: "a.loop() || true" disable_check: true value { bool_value: true } } test { name: "package" description: "Check that `package` can be used as a receiver function." expr: "a.package() || true" disable_check: true value { bool_value: true } } test { name: "namespace" description: "Check that `namespace` can be used as a receiver function." expr: "a.namespace() || true" disable_check: true value { bool_value: true } } test { name: "return" description: "Check that `return` can be used as a receiver function." expr: "a.return() || true" disable_check: true value { bool_value: true } } test { name: "var" description: "Check that `var` can be used as a receiver function." expr: "a.var() || true" disable_check: true value { bool_value: true } } test { name: "void" description: "Check that `void` can be used as a receiver function." expr: "a.void() || true" disable_check: true value { bool_value: true } } test { name: "while" description: "Check that `while` can be used as a receiver function." expr: "a.while() || true" disable_check: true value { bool_value: true } } } section { name: "struct_field_names" description: "Check that reserved identifiers are permitted as struct field names as long as they are not language keywords" test { name: "as" description: "Check that `as` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ as: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { as: true } } } } test { name: "break" description: "Check that `break` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ break: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { break: true } } } } test { name: "const" description: "Check that `const` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ const: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { const: true } } } } test { name: "continue" description: "Check that `continue` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ continue: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { continue: true } } } } test { name: "else" description: "Check that `else` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ else: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { else: true } } } } test { name: "for" description: "Check that `for` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ for: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { for: true } } } } test { name: "function" description: "Check that `function` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ function: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { function: true } } } } test { name: "if" description: "Check that `if` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ if: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { if: true } } } } test { name: "import" description: "Check that `import` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ import: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { import: true } } } } test { name: "let" description: "Check that `let` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ let: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { let: true } } } } test { name: "loop" description: "Check that `loop` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ loop: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { loop: true } } } } test { name: "package" description: "Check that `package` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ package: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { package: true } } } } test { name: "namespace" description: "Check that `namespace` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ namespace: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { namespace: true } } } } test { name: "return" description: "Check that `return` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ return: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { return: true } } } } test { name: "var" description: "Check that `var` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ var: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { var: true } } } } test { name: "void" description: "Check that `void` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ void: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { void: true } } } } test { name: "while" description: "Check that `while` can be used as a struct field name." container: "cel.expr.conformance.proto3" expr: "TestAllTypes{ while: true }" value { object_value { [type.googleapis.com/cel.expr.conformance.proto3.TestAllTypes] { while: true } } } } }