# proto-file: ../../../proto/cel/expr/conformance/test/simple.proto # proto-message: cel.expr.conformance.test.SimpleTestFile name: "lists" description: "Tests for list operations." section { name: "concatenation" description: "Tests for list concatenation." test { name: "list_append" expr: "[0, 1, 2] + [3, 4, 5] == [0, 1, 2, 3, 4, 5]" value: { bool_value: true } } test { name: "list_not_commutative" expr: "[0, 1, 2] + [3, 4, 5] == [3, 4, 5, 0, 1, 2]" value: { bool_value: false } } test { name: "list_repeat" expr: "[2] + [2]" value: { list_value { values: { int64_value: 2 } values: { int64_value: 2 } } } } test { name: "empty_empty" expr: "[] + []" value: { list_value { } } } test { name: "left_unit" expr: "[] + [3, 4]" value: { list_value { values { int64_value: 3 } values { int64_value: 4 } } } } test { name: "right_unit" expr: "[1, 2] + []" value { list_value { values { int64_value: 1 } values { int64_value: 2 } } } } } section { name: "index" description: "List indexing tests." test { name: "zero_based" expr: "[7, 8, 9][0]" value: { int64_value: 7 } } test { name: "zero_based_double" expr: "[7, 8, 9][dyn(0.0)]" value: { int64_value: 7 } } test { name: "zero_based_double_error" expr: "[7, 8, 9][dyn(0.1)]" eval_error { errors { message: "invalid_argument" } } } test { name: "zero_based_uint" expr: "[7, 8, 9][dyn(0u)]" value: { int64_value: 7 } } test { name: "singleton" expr: "['foo'][0]" value: { string_value: "foo" } } test { name: "middle" expr: "[0, 1, 1, 2, 3, 5, 8, 13][4]" value: { int64_value: 3 } } test { name: "last" expr: "['George', 'John', 'Paul', 'Ringo'][3]" value: { string_value: "Ringo" } } test { name: "index_out_of_bounds" expr: "[1, 2, 3][3]" eval_error { errors { message: "invalid_argument" } } } test { name: "index_out_of_bounds_or_false" expr: "dyn([1, 2, 3][3]) || false" eval_error { errors { message: "invalid_argument" } } } test { name: "index_out_of_bounds_or_true" expr: "dyn([1, 2, 3][3]) || true" value: { bool_value: true } } test { name: "index_out_of_bounds_and_false" expr: "dyn([1, 2, 3][3]) && false" value: { bool_value: false } } test { name: "index_out_of_bounds_and_true" expr: "dyn([1, 2, 3][3]) && true" eval_error { errors { message: "invalid_argument" } } } test { name: "bad_index_type" expr: "[1, 2, 3][dyn('')]" eval_error { errors { message: "invalid_argument" } } } test { name: "bad_index_type_or_false" expr: "dyn([1, 2, 3][dyn('')]) || false" eval_error { errors { message: "invalid_argument" } } } test { name: "bad_index_type_or_true" expr: "dyn([1, 2, 3][dyn('')]) || true" value: { bool_value: true } } test { name: "bad_index_type_and_false" expr: "dyn([1, 2, 3][dyn('')]) && false" value: { bool_value: false } } test { name: "bad_index_type_and_true" expr: "dyn([1, 2, 3][dyn('')]) && true" eval_error { errors { message: "invalid_argument" } } } } section { name: "in" description: "List membership tests." test { name: "empty" expr: "7 in []" value: { bool_value: false } } test { name: "singleton" expr: "4u in [4u]" value: { bool_value: true } } test { name: "first" expr: "'alpha' in ['alpha', 'beta', 'gamma']" value: { bool_value: true } } test { name: "middle" expr: "3 in [5, 4, 3, 2, 1]" value: { bool_value: true } } test { name: "last" expr: "20u in [4u, 6u, 8u, 12u, 20u]" value: { bool_value: true } } test { name: "double_in_ints" expr: "dyn(3.0) in [5, 4, 3, 2, 1]" value: { bool_value: true } } test { name: "uint_in_ints" expr: "dyn(3u) in [5, 4, 3, 2, 1]" value: { bool_value: true } } test { name: "int_in_doubles" expr: "dyn(3) in [5.0, 4.0, 3.0, 2.0, 1.0]" value: { bool_value: true } } test { name: "uint_in_doubles" expr: "dyn(3u) in [5.0, 4.0, 3.0, 2.0, 1.0]" value: { bool_value: true } } test { name: "int_in_uints" expr: "dyn(3) in [5u, 4u, 3u, 2u, 1u]" value: { bool_value: true } } test { name: "double_in_uints" expr: "dyn(3.0) in [5u, 4u, 3u, 2u, 1u]" value: { bool_value: true } } test { name: "missing" expr: "'hawaiian' in ['meat', 'veggie', 'margarita', 'cheese']" value: { bool_value: false } } } section { name: "size" description: "List and map size tests." test { name: "list_empty" expr: "size([])" value: { int64_value: 0 } } test { name: "list" expr: "size([1, 2, 3])" value: { int64_value: 3 } } test { name: "map_empty" expr: "size({})" value: { int64_value: 0 } } test { name: "map" expr: "size({1: 'one', 2: 'two', 3: 'three'})" value: { int64_value: 3 } } }