diff --git a/conformance/expected-failures.yaml b/conformance/expected-failures.yaml index be9d4f74..622d9f62 100644 --- a/conformance/expected-failures.yaml +++ b/conformance/expected-failures.yaml @@ -107,723 +107,3 @@ custom_constraints: #ERROR: :1:1: expression of type 'int' cannot be range of a comprehension (must be list, map, or dynamic) # | this.all(e, e == 1) # | ^ -standard_constraints/ignore: - - proto/2023/map/ignore_always/invalid/populated - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMapIgnoreAlways]:{val:{key:1 value:1}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "map.min_pairs" - # message: "map must be at least 3 entries" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "map.min_pairs" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_pairs" field_type:TYPE_UINT64} - - proto/2023/map/ignore_always/valid/unpopulated - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMapIgnoreAlways]:{} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "map.min_pairs" - # message: "map must be at least 3 entries" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "map.min_pairs" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_pairs" field_type:TYPE_UINT64} - - proto/2023/map/keys/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMapKeyIgnoreAlways]:{val:{key:-42 value:-42}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[-42]" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE key_type:TYPE_INT32 value_type:TYPE_INT32 int_key:-42} - # for_key: true - # rule: "map.keys.int32.gt" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"keys" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/map/keys/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMapKeyIgnoreAlways]:{val:{key:0 value:0}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE key_type:TYPE_INT32 value_type:TYPE_INT32 int_key:0} - # for_key: true - # rule: "map.keys.int32.gt" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"keys" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/map/values/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMapValueIgnoreAlways]:{val:{key:-42 value:-42}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[-42]" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE key_type:TYPE_INT32 value_type:TYPE_INT32 int_key:-42} - # rule: "map.values.int32.gt" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:5 field_name:"values" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/map/values/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMapValueIgnoreAlways]:{val:{key:0 value:0}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE key_type:TYPE_INT32 value_type:TYPE_INT32 int_key:0} - # rule: "map.values.int32.gt" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:5 field_name:"values" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/message/explicit_presence/delimited/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMessageExplicitPresenceDelimitedIgnoreAlways]:{val:{}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto.editions.message.ignore.always" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_GROUP} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto/2023/message/explicit_presence/delimited/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMessageExplicitPresenceDelimitedIgnoreAlways]:{val:{val:"bar"}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto.editions.message.ignore.always" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_GROUP} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto/2023/message/explicit_presence/length_prefixed/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMessageExplicitPresenceIgnoreAlways]:{val:{}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto.editions.message.ignore.always" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto/2023/message/explicit_presence/length_prefixed/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMessageExplicitPresenceIgnoreAlways]:{val:{val:"bar"}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto.editions.message.ignore.always" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto/2023/message/legacy_required/delimited/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMessageLegacyRequiredDelimitedIgnoreAlways]:{val:{}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto.editions.message.ignore.empty" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_GROUP} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto/2023/message/legacy_required/delimited/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMessageLegacyRequiredDelimitedIgnoreAlways]:{val:{val:"bar"}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto.editions.message.ignore.empty" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_GROUP} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto/2023/message/legacy_required/length_prefixed/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMessageLegacyRequiredIgnoreAlways]:{val:{}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto.editions.message.ignore.empty" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto/2023/message/legacy_required/length_prefixed/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsMessageLegacyRequiredIgnoreAlways]:{val:{val:"bar"}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto.editions.message.ignore.empty" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto/2023/oneof/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsOneofIgnoreAlways]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/oneof/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsOneofIgnoreAlways]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/oneof_with_default/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsOneofIgnoreAlwaysWithDefault]:{val:-42} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/oneof_with_default/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsOneofIgnoreAlwaysWithDefault]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/oneof_with_default/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsOneofIgnoreAlwaysWithDefault]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/repeated/compact/ignore_always/valid/populated_valid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsRepeatedIgnoreAlways]:{val:1} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "repeated.min_items" - # message: "value must contain at least 3 item(s)" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "repeated.min_items" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_items" field_type:TYPE_UINT64} - - proto/2023/repeated/compact/ignore_always/valid/unpopulated - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsRepeatedIgnoreAlways]:{} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "repeated.min_items" - # message: "value must contain at least 3 item(s)" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "repeated.min_items" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_items" field_type:TYPE_UINT64} - - proto/2023/repeated/compact/items/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsRepeatedItemIgnoreAlways]:{val:-42} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32 index:0} - # rule: "repeated.items.int32.gt" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"items" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/repeated/compact/items/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsRepeatedItemIgnoreAlways]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32 index:0} - # rule: "repeated.items.int32.gt" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"items" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/repeated/expanded/ignore_always/valid/populated_valid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsRepeatedExpandedIgnoreAlways]:{val:1} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "repeated.min_items" - # message: "value must contain at least 3 item(s)" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "repeated.min_items" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_items" field_type:TYPE_UINT64} - - proto/2023/repeated/expanded/ignore_always/valid/unpopulated - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsRepeatedExpandedIgnoreAlways]:{} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "repeated.min_items" - # message: "value must contain at least 3 item(s)" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "repeated.min_items" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_items" field_type:TYPE_UINT64} - - proto/2023/repeated/expanded/items/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsRepeatedExpandedItemIgnoreAlways]:{val:-42} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32 index:0} - # rule: "repeated.items.int32.gt" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"items" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/repeated/expanded/items/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsRepeatedExpandedItemIgnoreAlways]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32 index:0} - # rule: "repeated.items.int32.gt" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"items" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/scalar/explicit_presence/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsScalarExplicitPresenceIgnoreAlways]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/scalar/explicit_presence/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsScalarExplicitPresenceIgnoreAlways]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/scalar/explicit_presence_with_default/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsScalarExplicitPresenceIgnoreAlwaysWithDefault]:{val:-42} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/scalar/explicit_presence_with_default/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsScalarExplicitPresenceIgnoreAlwaysWithDefault]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/scalar/explicit_presence_with_default/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsScalarExplicitPresenceIgnoreAlwaysWithDefault]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/scalar/implicit_presence/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsScalarImplicitPresenceIgnoreAlways]:{} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/scalar/implicit_presence/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsScalarImplicitPresenceIgnoreAlways]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/scalar/legacy_required/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsScalarLegacyRequiredIgnoreAlways]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/scalar/legacy_required/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsScalarLegacyRequiredIgnoreAlways]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/scalar/required_with_default/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsScalarLegacyRequiredIgnoreAlwaysWithDefault]:{val:-42} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/scalar/required_with_default/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsScalarLegacyRequiredIgnoreAlwaysWithDefault]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto/2023/scalar/required_with_default/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.EditionsScalarLegacyRequiredIgnoreAlwaysWithDefault]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/map/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2MapIgnoreAlways]:{val:{key:1 value:1}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "map.min_pairs" - # message: "map must be at least 3 entries" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "map.min_pairs" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_pairs" field_type:TYPE_UINT64} - - proto2/map/ignore_always/valid/unpopulated - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2MapIgnoreAlways]:{} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "map.min_pairs" - # message: "map must be at least 3 entries" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "map.min_pairs" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_pairs" field_type:TYPE_UINT64} - - proto2/map/keys/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2MapKeyIgnoreAlways]:{val:{key:-42 value:-42}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[-42]" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE key_type:TYPE_INT32 value_type:TYPE_INT32 int_key:-42} - # for_key: true - # rule: "map.keys.int32.gt" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"keys" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/map/keys/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2MapKeyIgnoreAlways]:{val:{key:0 value:0}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE key_type:TYPE_INT32 value_type:TYPE_INT32 int_key:0} - # for_key: true - # rule: "map.keys.int32.gt" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"keys" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/map/values/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2MapValueIgnoreAlways]:{val:{key:-42 value:-42}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[-42]" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE key_type:TYPE_INT32 value_type:TYPE_INT32 int_key:-42} - # rule: "map.values.int32.gt" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:5 field_name:"values" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/map/values/ignore_always/valid/zero_valid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2MapValueIgnoreAlways]:{val:{key:0 value:0}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE key_type:TYPE_INT32 value_type:TYPE_INT32 int_key:0} - # rule: "map.values.int32.gt" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:5 field_name:"values" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/message/optional/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2MessageOptionalIgnoreAlways]:{val:{}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto2.message.ignore.always" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto2/message/optional/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2MessageOptionalIgnoreAlways]:{val:{val:"bar"}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto2.message.ignore.always" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto2/message/required/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2MessageRequiredIgnoreAlways]:{val:{}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto2.message.ignore.always" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto2/message/required/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2MessageRequiredIgnoreAlways]:{val:{val:"bar"}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto2.message.ignore.always" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto2/oneof/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2OneofIgnoreAlways]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/oneof/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2OneofIgnoreAlways]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/oneof_with_default/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2OneofIgnoreAlwaysWithDefault]:{val:-42} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/oneof_with_default/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2OneofIgnoreAlwaysWithDefault]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/oneof_with_default/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2OneofIgnoreAlwaysWithDefault]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/repeated/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2RepeatedIgnoreAlways]:{val:1} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "repeated.min_items" - # message: "value must contain at least 3 item(s)" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "repeated.min_items" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_items" field_type:TYPE_UINT64} - - proto2/repeated/ignore_always/valid/unpopulated - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2RepeatedIgnoreAlways]:{} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "repeated.min_items" - # message: "value must contain at least 3 item(s)" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "repeated.min_items" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_items" field_type:TYPE_UINT64} - - proto2/repeated/items/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2RepeatedItemIgnoreAlways]:{val:-42} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32 index:0} - # rule: "repeated.items.int32.gt" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"items" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/repeated/items/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2RepeatedItemIgnoreAlways]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32 index:0} - # rule: "repeated.items.int32.gt" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"items" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/scalar/optional/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2ScalarOptionalIgnoreAlways]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/scalar/optional/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2ScalarOptionalIgnoreAlways]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/scalar/optional_with_default/ignore_always/invalid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2ScalarOptionalIgnoreAlwaysWithDefault]:{val:-42} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/scalar/optional_with_default/ignore_always/invalid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2ScalarOptionalIgnoreAlwaysWithDefault]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/scalar/optional_with_default/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2ScalarOptionalIgnoreAlwaysWithDefault]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/scalar/required/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2ScalarRequiredIgnoreAlways]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/scalar/required/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2ScalarRequiredIgnoreAlways]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/scalar/required_with_default/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2ScalarRequiredIgnoreAlwaysWithDefault]:{val:-42} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/scalar/required_with_default/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2ScalarRequiredIgnoreAlwaysWithDefault]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto2/scalar/required_with_default/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto2ScalarRequiredIgnoreAlwaysWithDefault]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto3/map/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3MapIgnoreAlways]:{val:{key:1 value:1}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "map.min_pairs" - # message: "map must be at least 3 entries" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "map.min_pairs" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_pairs" field_type:TYPE_UINT64} - - proto3/map/ignore_always/valid/unpopulated - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3MapIgnoreAlways]:{} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "map.min_pairs" - # message: "map must be at least 3 entries" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "map.min_pairs" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_pairs" field_type:TYPE_UINT64} - - proto3/map/keys/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3MapKeyIgnoreAlways]:{val:{key:-42 value:-42}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[-42]" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE key_type:TYPE_INT32 value_type:TYPE_INT32 int_key:-42} - # for_key: true - # rule: "map.keys.int32.gt" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"keys" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto3/map/keys/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3MapKeyIgnoreAlways]:{val:{key:0 value:0}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE key_type:TYPE_INT32 value_type:TYPE_INT32 int_key:0} - # for_key: true - # rule: "map.keys.int32.gt" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"keys" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto3/map/values/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3MapValueIgnoreAlways]:{val:{key:-42 value:-42}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[-42]" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE key_type:TYPE_INT32 value_type:TYPE_INT32 int_key:-42} - # rule: "map.values.int32.gt" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:5 field_name:"values" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto3/map/values/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3MapValueIgnoreAlways]:{val:{key:0 value:0}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE key_type:TYPE_INT32 value_type:TYPE_INT32 int_key:0} - # rule: "map.values.int32.gt" elements:{field_number:19 field_name:"map" field_type:TYPE_MESSAGE} elements:{field_number:5 field_name:"values" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto3/message/optional/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3MessageOptionalIgnoreAlways]:{val:{}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto3.message.ignore.always" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto3/message/optional/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3MessageOptionalIgnoreAlways]:{val:{val:"bar"}} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "proto3.message.ignore.always" - # message: "foobar" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_MESSAGE} - # rule: "cel[0]" elements:{field_number:23 field_name:"cel" field_type:TYPE_MESSAGE index:0} - - proto3/oneof/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3OneofIgnoreAlways]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto3/oneof/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3OneofIgnoreAlways]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto3/repeated/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3RepeatedIgnoreAlways]:{val:1} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "repeated.min_items" - # message: "value must contain at least 3 item(s)" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "repeated.min_items" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_items" field_type:TYPE_UINT64} - - proto3/repeated/ignore_always/valid/unpopulated - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3RepeatedIgnoreAlways]:{} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "repeated.min_items" - # message: "value must contain at least 3 item(s)" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "repeated.min_items" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:1 field_name:"min_items" field_type:TYPE_UINT64} - - proto3/repeated/items/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3RepeatedItemIgnoreAlways]:{val:-42} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32 index:0} - # rule: "repeated.items.int32.gt" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"items" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto3/repeated/items/ignore_always/valid/zero_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3RepeatedItemIgnoreAlways]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val[0]" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32 index:0} - # rule: "repeated.items.int32.gt" elements:{field_number:18 field_name:"repeated" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"items" field_type:TYPE_MESSAGE} elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto3/scalar/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3ScalarIgnoreAlways]:{} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto3/scalar/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3ScalarIgnoreAlways]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto3/scalar/optional/ignore_always/valid/default_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3ScalarOptionalIgnoreAlways]:{val:0} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} - - proto3/scalar/optional/ignore_always/valid/populated_invalid_value - # input: [type.googleapis.com/buf.validate.conformance.cases.Proto3ScalarOptionalIgnoreAlways]:{val:-123} - # want: valid - # got: validation error (1 violation) - # 1. constraint_id: "int32.gt" - # message: "value must be greater than 0" - # field: "val" elements:{field_number:1 field_name:"val" field_type:TYPE_INT32} - # rule: "int32.gt" elements:{field_number:3 field_name:"int32" field_type:TYPE_MESSAGE} elements:{field_number:4 field_name:"gt" field_type:TYPE_INT32} -standard_constraints/required: - - proto/2023/message/explicit_presence/delimited/unset/ignore_always - - proto2/scalar/optional/unset/ignore_always - - proto3/scalar/optional/unset/ignore_always - - proto/2023/map/empty/ignore_always - - proto/2023/scalar/explicit_presence_with_default/unset/ignore_always - - proto2/oneof/other_member/ignore_always - - proto2/oneof/unset/ignore_always - - proto3/oneof/other_member/ignore_always - - proto/2023/repeated/expanded/empty/ignore_always - - proto/2023/oneof/unset/ignore_always - - proto/2023/message/explicit_presence/length_prefixed/unset/ignore_always - - proto/2023/scalar/explicit_presence/unset/ignore_always - - proto2/message/unset/ignore_always - - proto3/repeated/empty/ignore_always - - proto3/map/empty/ignore_always - - proto3/scalar/zero/ignore_always - - proto3/oneof/unset/ignore_always - - proto/2023/repeated/compact/empty/ignore_always - - proto2/repeated/empty/ignore_always - - proto/2023/scalar/implicit_presence/zero/ignore_always - - proto2/scalar/optional_with_default/unset/ignore_always - - proto2/map/empty/ignore_always - - proto3/message/unset/ignore_always - - proto/2023/oneof/other_member/ignore_always diff --git a/src/main/java/build/buf/protovalidate/EvaluatorBuilder.java b/src/main/java/build/buf/protovalidate/EvaluatorBuilder.java index 538bf2bd..0d7040a8 100644 --- a/src/main/java/build/buf/protovalidate/EvaluatorBuilder.java +++ b/src/main/java/build/buf/protovalidate/EvaluatorBuilder.java @@ -225,17 +225,13 @@ private FieldEvaluator buildField( valueEvaluatorEval, fieldDescriptor, fieldConstraints.getRequired(), - fieldDescriptor.hasPresence() || shouldIgnoreEmpty(fieldConstraints), - fieldDescriptor.hasPresence() && shouldIgnoreDefault(fieldConstraints), + fieldDescriptor.hasPresence(), + fieldConstraints.getIgnore(), zero); buildValue(fieldDescriptor, fieldConstraints, fieldEvaluator.valueEvaluator); return fieldEvaluator; } - private boolean shouldSkip(FieldConstraints constraints) { - return constraints.getIgnore() == Ignore.IGNORE_ALWAYS; - } - private static boolean shouldIgnoreEmpty(FieldConstraints constraints) { return constraints.getIgnore() == Ignore.IGNORE_IF_UNPOPULATED || constraints.getIgnore() == Ignore.IGNORE_IF_DEFAULT_VALUE; @@ -250,6 +246,11 @@ private void buildValue( FieldConstraints fieldConstraints, ValueEvaluator valueEvaluator) throws CompilationException { + + if (fieldConstraints.getIgnore() == Ignore.IGNORE_ALWAYS) { + return; + } + processIgnoreEmpty(fieldDescriptor, fieldConstraints, valueEvaluator); processFieldExpressions(fieldDescriptor, fieldConstraints, valueEvaluator); processEmbeddedMessage(fieldDescriptor, fieldConstraints, valueEvaluator); @@ -371,7 +372,6 @@ private void processEmbeddedMessage( ValueEvaluator valueEvaluatorEval) throws CompilationException { if (fieldDescriptor.getJavaType() != FieldDescriptor.JavaType.MESSAGE - || shouldSkip(fieldConstraints) || fieldDescriptor.isMapField() || (fieldDescriptor.isRepeated() && !valueEvaluatorEval.hasNestedRule())) { return; @@ -388,7 +388,6 @@ private void processWrapperConstraints( ValueEvaluator valueEvaluatorEval) throws CompilationException { if (fieldDescriptor.getJavaType() != FieldDescriptor.JavaType.MESSAGE - || shouldSkip(fieldConstraints) || fieldDescriptor.isMapField() || (fieldDescriptor.isRepeated() && !valueEvaluatorEval.hasNestedRule())) { return; diff --git a/src/main/java/build/buf/protovalidate/FieldEvaluator.java b/src/main/java/build/buf/protovalidate/FieldEvaluator.java index 3d4e23b7..2f00ca7f 100644 --- a/src/main/java/build/buf/protovalidate/FieldEvaluator.java +++ b/src/main/java/build/buf/protovalidate/FieldEvaluator.java @@ -17,6 +17,7 @@ import build.buf.protovalidate.exceptions.ExecutionException; import build.buf.validate.FieldConstraints; import build.buf.validate.FieldPath; +import build.buf.validate.Ignore; import com.google.protobuf.Descriptors.FieldDescriptor; import com.google.protobuf.Message; import java.util.Collections; @@ -45,13 +46,11 @@ class FieldEvaluator implements Evaluator { /** Indicates that the field must have a set value. */ private final boolean required; - /** - * ignoreEmpty indicates if a field should skip validation on its zero value. This field is - * generally true for nullable fields or fields with the ignore_empty constraint explicitly set. - */ - private final boolean ignoreEmpty; + /** Whether validation should be ignored for certain conditions */ + private final Ignore ignore; - private final boolean ignoreDefault; + /** Whether the field distinguishes between unpopulated and default values. */ + private final boolean hasPresence; @Nullable private final Object zero; @@ -60,15 +59,15 @@ class FieldEvaluator implements Evaluator { ValueEvaluator valueEvaluator, FieldDescriptor descriptor, boolean required, - boolean ignoreEmpty, - boolean ignoreDefault, + boolean hasPresence, + Ignore ignore, @Nullable Object zero) { this.helper = new ConstraintViolationHelper(valueEvaluator); this.valueEvaluator = valueEvaluator; this.descriptor = descriptor; this.required = required; - this.ignoreEmpty = ignoreEmpty; - this.ignoreDefault = ignoreDefault; + this.hasPresence = hasPresence; + this.ignore = ignore; this.zero = zero; } @@ -77,9 +76,41 @@ public boolean tautology() { return !required && valueEvaluator.tautology(); } + /** + * Returns whether a field should always skip validation. + * + *
If true, this will take precedence and all checks are skipped. + */ + private boolean shouldIgnoreAlways() { + return this.ignore == Ignore.IGNORE_ALWAYS; + } + + /** + * Returns whether a field should skip validation on its zero value. + * + *
This is generally true for nullable fields or fields with the ignore_empty constraint
+ * explicitly set.
+ */
+ private boolean shouldIgnoreEmpty() {
+ return this.hasPresence
+ || this.ignore == Ignore.IGNORE_IF_UNPOPULATED
+ || this.ignore == Ignore.IGNORE_IF_DEFAULT_VALUE;
+ }
+
+ /**
+ * Returns whether a field should skip validation on its zero value, including for fields which
+ * have field presence and are set to the zero value.
+ */
+ private boolean shouldIgnoreDefault() {
+ return this.hasPresence && this.ignore == Ignore.IGNORE_IF_DEFAULT_VALUE;
+ }
+
@Override
public List