From 43cdcd1b2a46f75fd9028770bb07e8ea2247c7d3 Mon Sep 17 00:00:00 2001 From: Dmitry Kashcheiev Date: Tue, 4 Oct 2016 15:25:38 +0300 Subject: [PATCH 1/3] Add Enum and Boolean fields validators --- .../validate/BooleanFieldValidator.java | 74 +++++++++++++++++++ .../server/validate/EnumFieldValidator.java | 60 +++++++++++++++ .../server/validate/FieldValidator.java | 11 ++- .../validate/FieldValidatorFactory.java | 5 ++ .../validate/FieldValidatorFactoryShould.java | 20 +++-- .../validate/MessageValidatorShould.java | 65 +++++++--------- .../spine/test/validate/msg/messages.proto | 19 ++--- 7 files changed, 193 insertions(+), 61 deletions(-) create mode 100644 server/src/main/java/org/spine3/server/validate/BooleanFieldValidator.java create mode 100644 server/src/main/java/org/spine3/server/validate/EnumFieldValidator.java diff --git a/server/src/main/java/org/spine3/server/validate/BooleanFieldValidator.java b/server/src/main/java/org/spine3/server/validate/BooleanFieldValidator.java new file mode 100644 index 00000000000..c813523fbf0 --- /dev/null +++ b/server/src/main/java/org/spine3/server/validate/BooleanFieldValidator.java @@ -0,0 +1,74 @@ +/* + * Copyright 2016, TeamDev Ltd. All rights reserved. + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.spine3.server.validate; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.Descriptors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.spine3.base.FieldPath; +import org.spine3.validate.ConstraintViolation; + +import java.util.List; + +/** + * Validates fields of type {@link Boolean}. + * + * @author Dmitry Kashcheiev + */ +/* package */ class BooleanFieldValidator extends FieldValidator { + + + /** + * Creates a new validator instance. + * + * @param descriptor a descriptor of the field to validate + * @param fieldValues values to validate + * @param rootFieldPath a path to the root field (if present) + */ + /*package*/ BooleanFieldValidator(Descriptors.FieldDescriptor descriptor, ImmutableList fieldValues, FieldPath rootFieldPath) { + super(descriptor, fieldValues, rootFieldPath, false); + } + + @Override + protected boolean isValueNotSet(Boolean value) { + // Boolean field can't be determined if it set or not, because protobuf 'false' value and 'no value' are the same + return false; + } + + @Override + protected List validate() { + if (isRequiredField()) { + log().warn("'required' option not allowed for boolean field"); + } + return super.validate(); + } + + private enum LogSingleton { + INSTANCE; + @SuppressWarnings("NonSerializableFieldInSerializableClass") + private final Logger value = LoggerFactory.getLogger(BooleanFieldValidator.class); + } + + private static Logger log() { + return LogSingleton.INSTANCE.value; + } +} diff --git a/server/src/main/java/org/spine3/server/validate/EnumFieldValidator.java b/server/src/main/java/org/spine3/server/validate/EnumFieldValidator.java new file mode 100644 index 00000000000..ef80d2852d5 --- /dev/null +++ b/server/src/main/java/org/spine3/server/validate/EnumFieldValidator.java @@ -0,0 +1,60 @@ +/* + * Copyright 2016, TeamDev Ltd. All rights reserved. + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.spine3.server.validate; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.Descriptors; +import org.spine3.base.FieldPath; +import org.spine3.validate.ConstraintViolation; + +import java.util.List; + +/** + * Validates fields of type {@link Descriptors.EnumValueDescriptor}. + * + * @author Dmitry Kashcheiev + */ +/* package */ class EnumFieldValidator extends FieldValidator { + + /** + * Creates a new validator instance. + * + * @param descriptor a descriptor of the field to validate + * @param fieldValues values to validate + * @param rootFieldPath a path to the root field (if present) + */ + /*package*/ EnumFieldValidator(Descriptors.FieldDescriptor descriptor, ImmutableList fieldValues, FieldPath rootFieldPath) { + super(descriptor, fieldValues, rootFieldPath, false); + } + + @Override + protected boolean isValueNotSet(Descriptors.EnumValueDescriptor value) { + return value.getNumber() == 0; + } + + @Override + protected List validate() { + checkIfRequiredAndNotSet(); + final List violations = super.validate(); + return violations; + } + +} diff --git a/server/src/main/java/org/spine3/server/validate/FieldValidator.java b/server/src/main/java/org/spine3/server/validate/FieldValidator.java index 78b4391e6bd..722391a77a1 100644 --- a/server/src/main/java/org/spine3/server/validate/FieldValidator.java +++ b/server/src/main/java/org/spine3/server/validate/FieldValidator.java @@ -69,7 +69,7 @@ * @param descr a descriptor of the field to validate * @param values values to validate * @param rootFieldPath a path to the root field (if present) - * @param strict if {@code true} the validator would assume that the field is required event + * @param strict if {@code true} the validator would assume that the field is required, even * if corresponding field option is not present */ protected FieldValidator(FieldDescriptor descr, ImmutableList values, FieldPath rootFieldPath, boolean strict) { @@ -132,6 +132,13 @@ protected void validateEntityId() { } } + /** + * Returns {@code true} if the field has required attribute or validation is strict. + */ + protected boolean isRequiredField() { + return requiredOption.getValue() || strict; + } + /** * Checks if the field is required and not set and adds violations found. * @@ -140,7 +147,7 @@ protected void validateEntityId() { *

It is required to override {@link #isValueNotSet(Object)} method to use this one. */ protected void checkIfRequiredAndNotSet() { - if (!requiredOption.getValue() && !strict) { + if (!isRequiredField()) { return; } if (values.isEmpty()) { diff --git a/server/src/main/java/org/spine3/server/validate/FieldValidatorFactory.java b/server/src/main/java/org/spine3/server/validate/FieldValidatorFactory.java index a44bbeefc4b..8320e116008 100644 --- a/server/src/main/java/org/spine3/server/validate/FieldValidatorFactory.java +++ b/server/src/main/java/org/spine3/server/validate/FieldValidatorFactory.java @@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.ByteString; +import com.google.protobuf.Descriptors; import com.google.protobuf.Descriptors.FieldDescriptor; import com.google.protobuf.Descriptors.FieldDescriptor.JavaType; import com.google.protobuf.Message; @@ -77,7 +78,11 @@ private static FieldValidator create(FieldDescriptor descriptor, final ImmutableList byteStrings = toValueList(fieldValue); return new ByteStringFieldValidator(descriptor, byteStrings, rootFieldPath); case BOOLEAN: + final ImmutableList booleans = toValueList(fieldValue); + return new BooleanFieldValidator(descriptor, booleans, rootFieldPath); case ENUM: + final ImmutableList enums = toValueList(fieldValue); + return new EnumFieldValidator(descriptor, enums, rootFieldPath); default: throw fieldTypeIsNotSupported(descriptor); } diff --git a/server/src/test/java/org/spine3/server/validate/FieldValidatorFactoryShould.java b/server/src/test/java/org/spine3/server/validate/FieldValidatorFactoryShould.java index 0c55805c681..946c12dbf0d 100644 --- a/server/src/test/java/org/spine3/server/validate/FieldValidatorFactoryShould.java +++ b/server/src/test/java/org/spine3/server/validate/FieldValidatorFactoryShould.java @@ -28,8 +28,8 @@ import com.google.protobuf.StringValue; import org.junit.Test; import org.spine3.base.FieldPath; -import org.spine3.test.validate.msg.AnnotatedEnumFieldValue; import org.spine3.test.validate.msg.RequiredByteStringFieldValue; +import org.spine3.test.validate.msg.RequiredEnumFieldValue; import org.spine3.test.validate.msg.RequiredMsgFieldValue; import static com.google.protobuf.Descriptors.FieldDescriptor; @@ -107,17 +107,21 @@ public void create_ByteString_field_validator() { assertTrue(validator instanceof ByteStringFieldValidator); } - @Test(expected = IllegalArgumentException.class) - public void throw_exception_if_pass_enum_field() { - final FieldDescriptor field = AnnotatedEnumFieldValue.getDescriptor().getFields().get(0); + @Test + public void create_Enum_field_validator() { + final FieldDescriptor field = RequiredEnumFieldValue.getDescriptor().getFields().get(0); + + final FieldValidator validator = create(field, new Object(), FIELD_PATH); - create(field, new Object(), FIELD_PATH); + assertTrue(validator instanceof EnumFieldValidator); } - @Test(expected = IllegalArgumentException.class) - public void throw_exception_if_pass_boolean_field() { + @Test + public void create_Boolean_field_validator() { final FieldDescriptor field = BoolValue.getDescriptor().getFields().get(0); - create(field, new Object(), FIELD_PATH); + final FieldValidator validator = create(field, new Object(), FIELD_PATH); + + assertTrue(validator instanceof BooleanFieldValidator); } } diff --git a/server/src/test/java/org/spine3/server/validate/MessageValidatorShould.java b/server/src/test/java/org/spine3/server/validate/MessageValidatorShould.java index 34b20a00bec..a12836ff4eb 100644 --- a/server/src/test/java/org/spine3/server/validate/MessageValidatorShould.java +++ b/server/src/test/java/org/spine3/server/validate/MessageValidatorShould.java @@ -30,33 +30,9 @@ import org.spine3.base.FieldPath; import org.spine3.protobuf.Durations; import org.spine3.protobuf.Values; -import org.spine3.test.validate.msg.AnnotatedBooleanFieldValue; -import org.spine3.test.validate.msg.AnnotatedEnumFieldValue; -import org.spine3.test.validate.msg.DecimalMaxIncNumberFieldValue; -import org.spine3.test.validate.msg.DecimalMaxNotIncNumberFieldValue; -import org.spine3.test.validate.msg.DecimalMinIncNumberFieldValue; -import org.spine3.test.validate.msg.DecimalMinNotIncNumberFieldValue; -import org.spine3.test.validate.msg.DigitsCountNumberFieldValue; -import org.spine3.test.validate.msg.EnclosedMessageFieldValue; -import org.spine3.test.validate.msg.EnclosedMessageWithoutAnnotationFieldValue; -import org.spine3.test.validate.msg.EntityIdByteStringFieldValue; -import org.spine3.test.validate.msg.EntityIdDoubleFieldValue; -import org.spine3.test.validate.msg.EntityIdIntFieldValue; -import org.spine3.test.validate.msg.EntityIdLongFieldValue; -import org.spine3.test.validate.msg.EntityIdMsgFieldValue; -import org.spine3.test.validate.msg.EntityIdRepeatedFieldValue; -import org.spine3.test.validate.msg.EntityIdStringFieldValue; -import org.spine3.test.validate.msg.MaxNumberFieldValue; -import org.spine3.test.validate.msg.MinNumberFieldValue; -import org.spine3.test.validate.msg.PatternStringFieldValue; -import org.spine3.test.validate.msg.RepeatedRequiredMsgFieldValue; -import org.spine3.test.validate.msg.RequiredByteStringFieldValue; -import org.spine3.test.validate.msg.RequiredMsgFieldValue; -import org.spine3.test.validate.msg.RequiredStringFieldValue; -import org.spine3.test.validate.msg.TimeInFutureFieldValue; -import org.spine3.test.validate.msg.TimeInPastFieldValue; -import org.spine3.test.validate.msg.TimeWithoutOptsFieldValue; +import org.spine3.test.validate.msg.*; import org.spine3.validate.ConstraintViolation; +import org.spine3.validate.internal.Time; import java.util.List; @@ -150,6 +126,29 @@ public void find_out_that_required_ByteString_field_is_NOT_set() { assertIsValid(false); } + @Test + public void find_out_that_required_Enum_field_is_NOT_set() { + final RequiredEnumFieldValue invalidMsg = RequiredEnumFieldValue.getDefaultInstance(); + validate(invalidMsg); + assertIsValid(false); + } + + @Test + public void find_out_that_required_Enum_field_is_set() { + final RequiredEnumFieldValue invalidMsg = RequiredEnumFieldValue.newBuilder() + .setValue(Time.FUTURE) + .build(); + validate(invalidMsg); + assertIsValid(true); + } + + @Test + public void find_out_that_required_NOT_set_Boolean_field_pass_validation() { + validate(RequiredBooleanFieldValue.getDefaultInstance()); + assertIsValid(true); + } + + @Test public void find_out_that_repeated_required_field_has_valid_values() { final RepeatedRequiredMsgFieldValue invalidMsg = RepeatedRequiredMsgFieldValue.newBuilder() @@ -664,20 +663,6 @@ public void provide_one_valid_violation_if_entity_id_in_command_is_not_valid() { assertTrue(violation.getViolationList().isEmpty()); } - /* - * Exceptional conditions tests. - */ - - @Test(expected = IllegalArgumentException.class) - public void throw_exception_if_annotate_field_of_enum_type() { - validate(AnnotatedEnumFieldValue.getDefaultInstance()); - } - - @Test(expected = IllegalArgumentException.class) - public void throw_exception_if_annotate_field_of_boolean_type() { - validate(AnnotatedBooleanFieldValue.getDefaultInstance()); - } - /* * Utility methods. */ diff --git a/server/src/test/proto/spine/test/validate/msg/messages.proto b/server/src/test/proto/spine/test/validate/msg/messages.proto index c50765aa3b7..920d24b4a54 100644 --- a/server/src/test/proto/spine/test/validate/msg/messages.proto +++ b/server/src/test/proto/spine/test/validate/msg/messages.proto @@ -51,6 +51,14 @@ message RepeatedRequiredMsgFieldValue { repeated google.protobuf.StringValue value = 1 [(required).value = true]; } +message RequiredEnumFieldValue { + Time value = 1 [(required).value = true]; +} + +message RequiredBooleanFieldValue { + bool value = 1 [(required).value = true]; +} + // Messages for "decimal_min", "decimal_max" options tests. @@ -120,14 +128,3 @@ message EnclosedMessageFieldValue { message EnclosedMessageWithoutAnnotationFieldValue { RequiredStringFieldValue outer_msg_field = 1; } - - -// Messages for exceptional conditions tests. - -message AnnotatedEnumFieldValue { - Time value = 1 [(required).value = true]; -} - -message AnnotatedBooleanFieldValue { - bool value = 1 [(required).value = true]; -} From 5c04edf9262765cb6628621b230e994469d87a6c Mon Sep 17 00:00:00 2001 From: Dmitry Kashcheiev Date: Fri, 7 Oct 2016 19:48:02 +0300 Subject: [PATCH 2/3] Review updates, for Enum and Boolean fields validators --- .../validate/BooleanFieldValidator.java | 8 +++- .../validate/ByteStringFieldValidator.java | 4 +- .../server/validate/EnumFieldValidator.java | 5 ++- .../server/validate/FieldValidator.java | 3 +- .../validate/MessageFieldValidator.java | 4 +- .../server/validate/NumberFieldValidator.java | 4 +- .../server/validate/StringFieldValidator.java | 4 +- .../validate/BooleanFieldValidatorShould.java | 43 +++++++++++++++++++ 8 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 server/src/test/java/org/spine3/server/validate/BooleanFieldValidatorShould.java diff --git a/server/src/main/java/org/spine3/server/validate/BooleanFieldValidator.java b/server/src/main/java/org/spine3/server/validate/BooleanFieldValidator.java index c813523fbf0..721ace862a8 100644 --- a/server/src/main/java/org/spine3/server/validate/BooleanFieldValidator.java +++ b/server/src/main/java/org/spine3/server/validate/BooleanFieldValidator.java @@ -20,6 +20,7 @@ package org.spine3.server.validate; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.protobuf.Descriptors; import org.slf4j.Logger; @@ -36,7 +37,6 @@ */ /* package */ class BooleanFieldValidator extends FieldValidator { - /** * Creates a new validator instance. * @@ -48,9 +48,13 @@ super(descriptor, fieldValues, rootFieldPath, false); } + /** + * Boolean field can't be determined if it set or not, because protobuf 'false' value and 'no value' are the same + * + * @return false + */ @Override protected boolean isValueNotSet(Boolean value) { - // Boolean field can't be determined if it set or not, because protobuf 'false' value and 'no value' are the same return false; } diff --git a/server/src/main/java/org/spine3/server/validate/ByteStringFieldValidator.java b/server/src/main/java/org/spine3/server/validate/ByteStringFieldValidator.java index 4abbcef5a19..a6ff1c7cdd7 100644 --- a/server/src/main/java/org/spine3/server/validate/ByteStringFieldValidator.java +++ b/server/src/main/java/org/spine3/server/validate/ByteStringFieldValidator.java @@ -67,7 +67,7 @@ protected void validateEntityId() { @Override protected boolean isValueNotSet(ByteString value) { - final boolean isNotSet = value.isEmpty(); - return isNotSet; + final boolean result = value.isEmpty(); + return result; } } diff --git a/server/src/main/java/org/spine3/server/validate/EnumFieldValidator.java b/server/src/main/java/org/spine3/server/validate/EnumFieldValidator.java index ef80d2852d5..39ae595f352 100644 --- a/server/src/main/java/org/spine3/server/validate/EnumFieldValidator.java +++ b/server/src/main/java/org/spine3/server/validate/EnumFieldValidator.java @@ -47,7 +47,9 @@ @Override protected boolean isValueNotSet(Descriptors.EnumValueDescriptor value) { - return value.getNumber() == 0; + final int intValue = value.getNumber(); + final boolean result = intValue == 0; + return result; } @Override @@ -56,5 +58,4 @@ protected List validate() { final List violations = super.validate(); return violations; } - } diff --git a/server/src/main/java/org/spine3/server/validate/FieldValidator.java b/server/src/main/java/org/spine3/server/validate/FieldValidator.java index 722391a77a1..2cb48a86c9a 100644 --- a/server/src/main/java/org/spine3/server/validate/FieldValidator.java +++ b/server/src/main/java/org/spine3/server/validate/FieldValidator.java @@ -136,7 +136,8 @@ protected void validateEntityId() { * Returns {@code true} if the field has required attribute or validation is strict. */ protected boolean isRequiredField() { - return requiredOption.getValue() || strict; + final boolean result = requiredOption.getValue() || strict; + return result; } /** diff --git a/server/src/main/java/org/spine3/server/validate/MessageFieldValidator.java b/server/src/main/java/org/spine3/server/validate/MessageFieldValidator.java index c6240930a1a..f7e8b2a0262 100644 --- a/server/src/main/java/org/spine3/server/validate/MessageFieldValidator.java +++ b/server/src/main/java/org/spine3/server/validate/MessageFieldValidator.java @@ -84,8 +84,8 @@ protected List validate() { @Override protected boolean isValueNotSet(Message value) { - final boolean isNotSet = isDefault(value); - return isNotSet; + final boolean result = isDefault(value); + return result; } private void validateFieldsOfMessageIfNeeded() { diff --git a/server/src/main/java/org/spine3/server/validate/NumberFieldValidator.java b/server/src/main/java/org/spine3/server/validate/NumberFieldValidator.java index db518a6013a..b2981e82ce1 100644 --- a/server/src/main/java/org/spine3/server/validate/NumberFieldValidator.java +++ b/server/src/main/java/org/spine3/server/validate/NumberFieldValidator.java @@ -101,8 +101,8 @@ protected List validate() { @Override protected boolean isValueNotSet(V value) { final int intValue = value.intValue(); - final boolean isNotSet = intValue == 0; - return isNotSet; + final boolean result = intValue == 0; + return result; } private void validateRangeOptions(V value) { diff --git a/server/src/main/java/org/spine3/server/validate/StringFieldValidator.java b/server/src/main/java/org/spine3/server/validate/StringFieldValidator.java index b855bfac922..9fbcf822341 100644 --- a/server/src/main/java/org/spine3/server/validate/StringFieldValidator.java +++ b/server/src/main/java/org/spine3/server/validate/StringFieldValidator.java @@ -92,7 +92,7 @@ private ConstraintViolation newViolation(String fieldValue) { @Override protected boolean isValueNotSet(String value) { - final boolean isNotSet = value.isEmpty(); - return isNotSet; + final boolean result = value.isEmpty(); + return result; } } diff --git a/server/src/test/java/org/spine3/server/validate/BooleanFieldValidatorShould.java b/server/src/test/java/org/spine3/server/validate/BooleanFieldValidatorShould.java new file mode 100644 index 00000000000..22c0055d814 --- /dev/null +++ b/server/src/test/java/org/spine3/server/validate/BooleanFieldValidatorShould.java @@ -0,0 +1,43 @@ +/* + * Copyright 2016, TeamDev Ltd. All rights reserved. + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.spine3.server.validate; + + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.Any; +import org.junit.Test; +import org.spine3.base.FieldPath; + +import static org.junit.Assert.assertFalse; + +/** + * @author dmitry.kashcheiev + */ +public class BooleanFieldValidatorShould { + + private final BooleanFieldValidator validator = + new BooleanFieldValidator(Any.getDescriptor().getFields().get(0), ImmutableList.of(false), FieldPath.getDefaultInstance()); + + @Test + public void convert_string_to_number() { + assertFalse(validator.isValueNotSet(false)); + } +} From 757c1d07472948f6af1841d38a3fa0c6ad1a388d Mon Sep 17 00:00:00 2001 From: Dmitry Kashcheiev Date: Mon, 10 Oct 2016 19:28:23 +0300 Subject: [PATCH 3/3] Update javadoc for BooleanFieldValidator --- .../java/org/spine3/server/validate/BooleanFieldValidator.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/src/main/java/org/spine3/server/validate/BooleanFieldValidator.java b/server/src/main/java/org/spine3/server/validate/BooleanFieldValidator.java index 721ace862a8..973e663d995 100644 --- a/server/src/main/java/org/spine3/server/validate/BooleanFieldValidator.java +++ b/server/src/main/java/org/spine3/server/validate/BooleanFieldValidator.java @@ -20,7 +20,6 @@ package org.spine3.server.validate; -import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.protobuf.Descriptors; import org.slf4j.Logger; @@ -49,7 +48,7 @@ } /** - * Boolean field can't be determined if it set or not, because protobuf 'false' value and 'no value' are the same + * In Protobuf there is no way to tell if the value is {@code false} or was not set. * * @return false */