# proto-file: ../../../proto/cel/expr/conformance/test/simple.proto # proto-message: google.api.expr.test.v1.SimpleTestFile name: "string" description: "Tests for string and bytes operations." section { name: "size" description: "Tests for the size() function." test { name: "empty" expr: "size('')" value: { int64_value: 0 } } test { name: "one_ascii" expr: "size('A')" value: { int64_value: 1 } } test { name: "one_unicode" expr: "size('ÿ')" value: { int64_value: 1 } } test { name: "ascii" expr: "size('four')" value: { int64_value: 4 } } test { name: "unicode" expr: "size('πέντε')" value: { int64_value: 5 } } test { name: "bytes_empty" expr: "size(b'')" value: { int64_value: 0 } } test { name: "bytes" expr: "size(b'abc')" value: { int64_value: 3 } } } section { name: "starts_with" description: "Tests for the startsWith() function." test { name: "basic_true" expr: "'foobar'.startsWith('foo')" value: { bool_value: true } } test { name: "basic_false" expr: "'foobar'.startsWith('bar')" value: { bool_value: false } } test { name: "empty_target" expr: "''.startsWith('foo')" value: { bool_value: false } } test { name: "empty_arg" expr: "'foobar'.startsWith('')" value: { bool_value: true } } test { name: "empty_empty" expr: "''.startsWith('')" value: { bool_value: true } } test { name: "unicode" expr: "'завтра'.startsWith('за')" value: { bool_value: true } } test { name: "unicode_smp" expr: "'\U0001F431\U0001F600\U0001F61B'.startsWith('\U0001F431')" value: { bool_value: true } } } section { name: "ends_with" description: "Tests for the endsWith() function." test { name: "basic_true" expr: "'foobar'.endsWith('bar')" value: { bool_value: true } } test { name: "basic_false" expr: "'foobar'.endsWith('foo')" value: { bool_value: false } } test { name: "empty_target" expr: "''.endsWith('foo')" value: { bool_value: false } } test { name: "empty_arg" expr: "'foobar'.endsWith('')" value: { bool_value: true } } test { name: "empty_empty" expr: "''.endsWith('')" value: { bool_value: true } } test { name: "unicode" expr: "'forté'.endsWith('té')" value: { bool_value: true } } test { name: "unicode_smp" expr: "'\U0001F431\U0001F600\U0001F61B'.endsWith('\U0001F61B')" value: { bool_value: true } } } section { name: "matches" description: "Tests for regexp matching. For now, we will only test the subset of regular languages." test { name: "basic" expr: "'hubba'.matches('ubb')" value: { bool_value: true } } test { name: "empty_target" expr: "''.matches('foo|bar')" value: { bool_value: false } } test { name: "empty_arg" expr: "'cows'.matches('')" value: { bool_value: true } } test { name: "empty_empty" expr: "''.matches('')" value: { bool_value: true } } test { name: "re_concat" expr: "'abcd'.matches('bc')" value: { bool_value: true } } test { name: "re_alt" expr: "'grey'.matches('gr(a|e)y')" value: { bool_value: true } } test { name: "re_rep" expr: "'banana'.matches('ba(na)*')" value: { bool_value: true } } test { name: "unicode" expr: "'mañana'.matches('a+ñ+a+')" value: { bool_value: true } } test { name: "unicode_smp" expr: "'\U0001F431\U0001F600\U0001F600'.matches('(a|\U0001F600){2}')" value: { bool_value: true } } } section { name: "concatenation" description: "Tests for string concatenation." test { name: "concat_true" expr: "'he' + 'llo'" value: { string_value: "hello" } } test { name: "concat_with_spaces" expr: "'hello' + ' ' == 'hello'" value: { bool_value: false } } test { name: "concat_empty_string_beginning" expr: "'' + 'abc'" value: { string_value: "abc" } } test { name: "concat_empty_string_end" expr: "'abc' + ''" value: { string_value: "abc" } } test { name: "concat_empty_with_empty" expr: "'' + ''" value: { string_value: "" } } test { name: "unicode_unicode" expr: "'¢' + 'ÿ' + 'Ȁ'" value: { string_value: "¢ÿȀ" } } test { name: "ascii_unicode" expr: "'r' + 'ô' + 'le'" value: { string_value: "rôle" } } test { name: "ascii_unicode_unicode_smp" expr: "'a' + 'ÿ' + '\U0001F431'" value: { string_value: "aÿ\xf0\x9f\x90\xb1" } } test { name: "empty_unicode" expr: "'' + 'Ω' + ''" value: { string_value: "Ω" } } } section { name: "contains" description: "Tests for contains." test { name: "contains_true" expr: "'hello'.contains('he')" value: { bool_value: true } } test { name: "contains_empty" expr: "'hello'.contains('')" value: { bool_value: true } } test { name: "contains_false" expr: "'hello'.contains('ol')" value: { bool_value: false } } test { name: "contains_multiple" expr: "'abababc'.contains('ababc')" value: { bool_value: true } } test { name: "contains_unicode" expr: "'Straße'.contains('aß')" value: { bool_value: true } } test { name: "contains_unicode_smp" expr: "'\U0001F431\U0001F600\U0001F601'.contains('\U0001F600')" value: { bool_value: true } } test { name: "empty_contains" expr: "''.contains('something')" value: { bool_value: false } } test { name: "empty_empty" expr: "''.contains('')" value: { bool_value: true } } } section { name: "bytes_concat" description: "Tests for bytes concatenation." test { name: "concat" expr: "b'abc' + b'def'" value: { bytes_value: "abcdef" } } test { name: "left_unit" expr: "b'' + b'\\xffoo'" value: { bytes_value: "\377oo" } } test { name: "right_unit" expr: "b'zxy' + b''" value: { bytes_value: "zxy" } } test { name: "empty_empty" expr: "b'' + b''" value: { bytes_value: "" } } }