blob: f99e7554c3be96d0bee04bab5fd9b6f13cd43ed5 [file] [log] [blame]
/*
* Copyright (c) 2016 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.common.truth.extensions.proto;
import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.fail;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Lists;
import com.google.protobuf.ByteString;
import com.google.protobuf.Descriptors.FieldDescriptor;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Message;
import com.google.protobuf.UnknownFieldSet;
import com.google.protobuf.UnknownFieldSet.Field;
import java.util.Collection;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/** Unit tests for {@link FieldScope}, and their interaction with {@link ProtoSubject}. */
@RunWith(Parameterized.class)
public class FieldScopesTest extends ProtoSubjectTestBase {
@Parameters(name = "{0}")
public static Collection<Object[]> parameters() {
return ProtoSubjectTestBase.parameters();
}
// Set up for the ignoringTopLevelField tests.
// ignoringFieldMessage and ignoringFieldDiffMessage are simple messages with two fields set. They
// are the same for the "good" field, and different for the "bad" field. The *FieldNumber and
// *FieldDescriptor members point to these fields.
private final Message ignoringFieldMessage;
private final Message ignoringFieldDiffMessage;
private final int goodFieldNumber;
private final int badFieldNumber;
private final FieldDescriptor goodFieldDescriptor;
private final FieldDescriptor badFieldDescriptor;
public FieldScopesTest(TestType testType) {
super(testType);
ignoringFieldMessage = parse("o_int: 3 r_string: \"foo\"");
ignoringFieldDiffMessage = parse("o_int: 3 r_string: \"bar\"");
goodFieldNumber = getFieldNumber("o_int");
badFieldNumber = getFieldNumber("r_string");
goodFieldDescriptor = getFieldDescriptor("o_int");
badFieldDescriptor = getFieldDescriptor("r_string");
}
@Test
public void testUnequalMessages() {
Message message = parse("o_int: 3 r_string: \"foo\"");
Message diffMessage = parse("o_int: 5 r_string: \"bar\"");
expectThat(diffMessage).isNotEqualTo(message);
}
@Test
public void testFieldScopes_all() {
Message message = parse("o_int: 3 r_string: \"foo\"");
Message diffMessage = parse("o_int: 5 r_string: \"bar\"");
expectThat(diffMessage).withPartialScope(FieldScopes.all()).isNotEqualTo(message);
expectThat(diffMessage).ignoringFieldScope(FieldScopes.all()).isEqualTo(message);
expectFailureWhenTesting()
.that(diffMessage)
.ignoringFieldScope(FieldScopes.all())
.isNotEqualTo(message);
expectIsNotEqualToFailed();
expectThatFailure().hasMessageThat().contains("ignored: o_int");
expectThatFailure().hasMessageThat().contains("ignored: r_string");
}
@Test
public void testFieldScopes_none() {
Message message = parse("o_int: 3 r_string: \"foo\"");
Message diffMessage = parse("o_int: 5 r_string: \"bar\"");
expectThat(diffMessage).ignoringFieldScope(FieldScopes.none()).isNotEqualTo(message);
expectThat(diffMessage).withPartialScope(FieldScopes.none()).isEqualTo(message);
expectFailureWhenTesting()
.that(diffMessage)
.withPartialScope(FieldScopes.none())
.isNotEqualTo(message);
expectIsNotEqualToFailed();
expectThatFailure().hasMessageThat().contains("ignored: o_int");
expectThatFailure().hasMessageThat().contains("ignored: r_string");
}
@Test
public void testFieldScopes_none_withAnyField() {
String typeUrl =
isProto3()
? "type.googleapis.com/com.google.common.truth.extensions.proto.SubTestMessage3"
: "type.googleapis.com/com.google.common.truth.extensions.proto.SubTestMessage2";
Message message = parse("o_int: 3 o_any_message { [" + typeUrl + "]: { r_string: \"foo\" } }");
Message diffMessage =
parse("o_int: 5 o_any_message { [" + typeUrl + "]: { r_string: \"bar\" } }");
expectThat(diffMessage).ignoringFieldScope(FieldScopes.none()).isNotEqualTo(message);
expectThat(diffMessage).withPartialScope(FieldScopes.none()).isEqualTo(message);
expectFailureWhenTesting()
.that(diffMessage)
.withPartialScope(FieldScopes.none())
.isNotEqualTo(message);
expectIsNotEqualToFailed();
expectThatFailure().hasMessageThat().contains("ignored: o_int");
expectThatFailure().hasMessageThat().contains("ignored: o_any_message");
}
@Test
public void testIgnoringTopLevelField_ignoringField() {
expectThat(ignoringFieldDiffMessage)
.ignoringFields(goodFieldNumber)
.isNotEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.ignoringFields(badFieldNumber)
.isEqualTo(ignoringFieldMessage);
expectFailureWhenTesting()
.that(ignoringFieldDiffMessage)
.ignoringFields(goodFieldNumber)
.isEqualTo(ignoringFieldMessage);
expectIsEqualToFailed();
expectThatFailure().hasMessageThat().contains("modified: r_string[0]: \"foo\" -> \"bar\"");
expectFailureWhenTesting()
.that(ignoringFieldDiffMessage)
.ignoringFields(badFieldNumber)
.isNotEqualTo(ignoringFieldMessage);
expectIsNotEqualToFailed();
expectThatFailure().hasMessageThat().contains("ignored: r_string");
}
@Test
public void testIgnoringTopLevelAnyField_ignoringField() {
String typeUrl =
isProto3()
? "type.googleapis.com/com.google.common.truth.extensions.proto.SubTestMessage3"
: "type.googleapis.com/com.google.common.truth.extensions.proto.SubTestMessage2";
Message message = parse("o_int: 1 o_any_message { [" + typeUrl + "]: { r_string: \"foo\" } }");
Message diffMessage = parse("o_int: 1");
int goodFieldNumber = getFieldNumber("o_int");
int badFieldNumber = getFieldNumber("o_any_message");
expectThat(diffMessage).ignoringFields(goodFieldNumber).isNotEqualTo(message);
expectThat(diffMessage).ignoringFields(badFieldNumber).isEqualTo(diffMessage);
expectFailureWhenTesting().that(diffMessage).ignoringFields(goodFieldNumber).isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure().hasMessageThat().contains("deleted: o_any_message");
expectFailureWhenTesting()
.that(diffMessage)
.ignoringFields(badFieldNumber)
.isNotEqualTo(message);
expectIsNotEqualToFailed();
expectThatFailure().hasMessageThat().contains("ignored: o_any_message");
}
@Test
public void testIgnoringTopLevelField_fieldScopes_ignoringFields() {
expectThat(ignoringFieldDiffMessage)
.withPartialScope(FieldScopes.ignoringFields(goodFieldNumber))
.isNotEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.ignoringFieldScope(FieldScopes.ignoringFields(goodFieldNumber))
.isEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.withPartialScope(FieldScopes.ignoringFields(badFieldNumber))
.isEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.ignoringFieldScope(FieldScopes.ignoringFields(badFieldNumber))
.isNotEqualTo(ignoringFieldMessage);
}
@Test
public void testIgnoringTopLevelField_fieldScopes_allowingFields() {
expectThat(ignoringFieldDiffMessage)
.withPartialScope(FieldScopes.allowingFields(goodFieldNumber))
.isEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.ignoringFieldScope(FieldScopes.allowingFields(goodFieldNumber))
.isNotEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.withPartialScope(FieldScopes.allowingFields(badFieldNumber))
.isNotEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.ignoringFieldScope(FieldScopes.allowingFields(badFieldNumber))
.isEqualTo(ignoringFieldMessage);
}
@Test
public void testIgnoringTopLevelAnyField_fieldScopes_allowingFields() {
String typeUrl =
isProto3()
? "type.googleapis.com/com.google.common.truth.extensions.proto.SubTestMessage3"
: "type.googleapis.com/com.google.common.truth.extensions.proto.SubTestMessage2";
Message message =
parse("o_int: 1 o_any_message { [" + typeUrl + "]: { o_int: 2 r_string: \"foo\" } }");
Message diffMessage = parse("o_int: 1");
int goodFieldNumber = getFieldNumber("o_int");
expectThat(message)
.withPartialScope(FieldScopes.allowingFields(goodFieldNumber))
.isEqualTo(diffMessage);
}
@Test
public void testIgnoringTopLevelField_fieldScopes_allowingFieldDescriptors() {
expectThat(ignoringFieldDiffMessage)
.withPartialScope(FieldScopes.allowingFieldDescriptors(goodFieldDescriptor))
.isEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.ignoringFieldScope(FieldScopes.allowingFieldDescriptors(goodFieldDescriptor))
.isNotEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.withPartialScope(FieldScopes.allowingFieldDescriptors(badFieldDescriptor))
.isNotEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.ignoringFieldScope(FieldScopes.allowingFieldDescriptors(badFieldDescriptor))
.isEqualTo(ignoringFieldMessage);
}
@Test
public void testIgnoringTopLevelField_fieldScopes_ignoringFieldDescriptors() {
expectThat(ignoringFieldDiffMessage)
.withPartialScope(FieldScopes.ignoringFieldDescriptors(goodFieldDescriptor))
.isNotEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.ignoringFieldScope(FieldScopes.ignoringFieldDescriptors(goodFieldDescriptor))
.isEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.withPartialScope(FieldScopes.ignoringFieldDescriptors(badFieldDescriptor))
.isEqualTo(ignoringFieldMessage);
expectThat(ignoringFieldDiffMessage)
.ignoringFieldScope(FieldScopes.ignoringFieldDescriptors(badFieldDescriptor))
.isNotEqualTo(ignoringFieldMessage);
}
@Test
public void testEmptySubMessage() {
Message message = parse("o_int: 1 o_sub_test_message: { }");
Message eqMessage = parse("o_int: 2 o_sub_test_message: { }");
Message diffMessage = parse("o_int: 3");
// Different logic gets exercised when we add an 'ignore' clause.
// Let's ensure o_sub_test_message is compared properly in all cases.
int fieldNumber = getFieldNumber("o_int");
expectThat(eqMessage).isNotEqualTo(message);
expectThat(eqMessage).ignoringFieldAbsence().isNotEqualTo(message);
expectThat(eqMessage).ignoringFields(fieldNumber).isEqualTo(message);
expectThat(eqMessage).ignoringFields(fieldNumber).ignoringFieldAbsence().isEqualTo(message);
expectThat(diffMessage).isNotEqualTo(message);
expectThat(diffMessage).ignoringFieldAbsence().isNotEqualTo(message);
expectThat(diffMessage).ignoringFields(fieldNumber).isNotEqualTo(message);
expectThat(diffMessage).ignoringFields(fieldNumber).ignoringFieldAbsence().isEqualTo(message);
}
@Test
public void testIgnoreSubMessageField() {
Message message = parse("o_int: 1 o_sub_test_message: { o_int: 2 }");
Message diffMessage = parse("o_int: 2 o_sub_test_message: { o_int: 2 }");
Message eqMessage1 = parse("o_int: 1");
Message eqMessage2 = parse("o_int: 1 o_sub_test_message: {}");
Message eqMessage3 = parse("o_int: 1 o_sub_test_message: { o_int: 3 r_string: \"x\" }");
int fieldNumber = getFieldNumber("o_sub_test_message");
expectThat(diffMessage).ignoringFields(fieldNumber).isNotEqualTo(message);
expectThat(eqMessage1).ignoringFields(fieldNumber).isEqualTo(message);
expectThat(eqMessage2).ignoringFields(fieldNumber).isEqualTo(message);
expectThat(eqMessage3).ignoringFields(fieldNumber).isEqualTo(message);
expectFailureWhenTesting().that(diffMessage).ignoringFields(fieldNumber).isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure().hasMessageThat().contains("modified: o_int: 1 -> 2");
expectFailureWhenTesting().that(eqMessage3).ignoringFields(fieldNumber).isNotEqualTo(message);
expectIsNotEqualToFailed();
expectThatFailure().hasMessageThat().contains("ignored: o_sub_test_message");
}
@Test
public void testIgnoreFieldOfSubMessage() {
// Ignore o_int of sub message fields.
Message message = parse("o_int: 1 o_sub_test_message: { o_int: 2 r_string: \"foo\" }");
Message diffMessage1 = parse("o_int: 2 o_sub_test_message: { o_int: 2 r_string: \"foo\" }");
Message diffMessage2 = parse("o_int: 1 o_sub_test_message: { o_int: 2 r_string: \"bar\" }");
Message eqMessage = parse("o_int: 1 o_sub_test_message: { o_int: 3 r_string: \"foo\" }");
FieldDescriptor fieldDescriptor =
getFieldDescriptor("o_sub_test_message").getMessageType().findFieldByName("o_int");
FieldScope partialScope = FieldScopes.ignoringFieldDescriptors(fieldDescriptor);
expectThat(diffMessage1).withPartialScope(partialScope).isNotEqualTo(message);
expectThat(diffMessage2).withPartialScope(partialScope).isNotEqualTo(message);
expectThat(eqMessage).withPartialScope(partialScope).isEqualTo(message);
expectFailureWhenTesting().that(diffMessage1).withPartialScope(partialScope).isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure().hasMessageThat().contains("modified: o_int: 1 -> 2");
expectFailureWhenTesting().that(diffMessage2).withPartialScope(partialScope).isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure()
.hasMessageThat()
.contains("modified: o_sub_test_message.r_string[0]: \"foo\" -> \"bar\"");
}
@Test
public void testIgnoringFieldOfAnyMessage() throws Exception {
String typeUrl =
isProto3()
? "type.googleapis.com/com.google.common.truth.extensions.proto.SubTestMessage3"
: "type.googleapis.com/com.google.common.truth.extensions.proto.SubTestMessage2";
Message message =
parse("o_int: 1 o_any_message { [" + typeUrl + "]: { o_int: 2 r_string: \"foo\" } }");
Message diffMessage1 =
parse("o_int: 2 o_any_message { [" + typeUrl + "]: { o_int: 2 r_string: \"foo\" } }");
Message diffMessage2 =
parse("o_int: 1 o_any_message { [" + typeUrl + "]: { o_int: 2 r_string: \"bar\" } }");
Message eqMessage =
parse("o_int: 1 o_any_message { [" + typeUrl + "]: { o_int: 3 r_string: \"foo\" } }");
FieldDescriptor fieldDescriptor =
getTypeRegistry().getDescriptorForTypeUrl(typeUrl).findFieldByName("o_int");
FieldScope partialScope = FieldScopes.ignoringFieldDescriptors(fieldDescriptor);
expectThat(diffMessage1)
.unpackingAnyUsing(getTypeRegistry(), getExtensionRegistry())
.withPartialScope(partialScope)
.isNotEqualTo(message);
expectThat(diffMessage2)
.unpackingAnyUsing(getTypeRegistry(), getExtensionRegistry())
.withPartialScope(partialScope)
.isNotEqualTo(message);
expectThat(eqMessage)
.unpackingAnyUsing(getTypeRegistry(), getExtensionRegistry())
.withPartialScope(partialScope)
.isEqualTo(message);
expectFailureWhenTesting()
.that(diffMessage1)
.unpackingAnyUsing(getTypeRegistry(), getExtensionRegistry())
.withPartialScope(partialScope)
.isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure().hasMessageThat().contains("modified: o_int: 1 -> 2");
expectFailureWhenTesting()
.that(diffMessage2)
.unpackingAnyUsing(getTypeRegistry(), getExtensionRegistry())
.withPartialScope(partialScope)
.isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure()
.hasMessageThat()
.contains("modified: o_any_message.value.r_string[0]: \"foo\" -> \"bar\"");
}
@Test
public void testAnyMessageComparingExpectedFieldsOnly() throws Exception {
String typeUrl =
isProto3()
? "type.googleapis.com/com.google.common.truth.extensions.proto.SubTestMessage3"
: "type.googleapis.com/com.google.common.truth.extensions.proto.SubTestMessage2";
Message message = parse("o_any_message { [" + typeUrl + "]: { o_int: 2 } }");
Message eqMessage =
parse("o_any_message { [" + typeUrl + "]: { o_int: 2 r_string: \"foo\" } }");
Message diffMessage =
parse("o_any_message { [" + typeUrl + "]: { o_int: 3 r_string: \"bar\" } }");
expectThat(eqMessage)
.unpackingAnyUsing(getTypeRegistry(), getExtensionRegistry())
.comparingExpectedFieldsOnly()
.isEqualTo(message);
expectThat(diffMessage)
.unpackingAnyUsing(getTypeRegistry(), getExtensionRegistry())
.comparingExpectedFieldsOnly()
.isNotEqualTo(message);
}
@Test
public void testInvalidAnyMessageComparingExpectedFieldsOnly() throws Exception {
Message message = parse("o_any_message { type_url: 'invalid-type' value: 'abc123' }");
Message eqMessage = parse("o_any_message { type_url: 'invalid-type' value: 'abc123' }");
Message diffMessage = parse("o_any_message { type_url: 'invalid-type' value: 'def456' }");
expectThat(eqMessage)
.unpackingAnyUsing(getTypeRegistry(), getExtensionRegistry())
.comparingExpectedFieldsOnly()
.isEqualTo(message);
expectThat(diffMessage)
.unpackingAnyUsing(getTypeRegistry(), getExtensionRegistry())
.comparingExpectedFieldsOnly()
.isNotEqualTo(message);
}
@Test
public void testDifferentAnyMessagesComparingExpectedFieldsOnly() throws Exception {
// 'o_int' and 'o_float' have the same field numbers in both messages. However, to compare
// accurately, we incorporate the unpacked Descriptor type into the FieldNumberTree as well to
// disambiguate.
String typeUrl1 =
isProto3()
? "type.googleapis.com/com.google.common.truth.extensions.proto.SubTestMessage3"
: "type.googleapis.com/com.google.common.truth.extensions.proto.SubTestMessage2";
String typeUrl2 =
isProto3()
? "type.googleapis.com/com.google.common.truth.extensions.proto.SubSubTestMessage3"
: "type.googleapis.com/com.google.common.truth.extensions.proto.SubSubTestMessage2";
Message message =
parse(
"r_any_message { ["
+ typeUrl1
+ "]: { o_int: 2 } } r_any_message { ["
+ typeUrl2
+ "]: { o_float: 3.1 } }");
Message eqMessage =
parse(
"r_any_message { ["
+ typeUrl1
+ "]: { o_int: 2 o_float: 1.9 } } r_any_message { ["
+ typeUrl2
+ "]: { o_int: 5 o_float: 3.1 } }");
Message diffMessage =
parse(
"r_any_message { ["
+ typeUrl1
+ "]: { o_int: 5 o_float: 3.1 } } r_any_message { ["
+ typeUrl2
+ "]: { o_int: 2 o_float: 1.9 } }");
expectThat(eqMessage)
.unpackingAnyUsing(getTypeRegistry(), getExtensionRegistry())
.ignoringRepeatedFieldOrder()
.comparingExpectedFieldsOnly()
.isEqualTo(message);
expectThat(diffMessage)
.unpackingAnyUsing(getTypeRegistry(), getExtensionRegistry())
.ignoringRepeatedFieldOrder()
.comparingExpectedFieldsOnly()
.isNotEqualTo(message);
}
@Test
public void testIgnoringAllButOneFieldOfSubMessage() {
// Consider all of TestMessage, but none of o_sub_test_message, except
// o_sub_test_message.o_int.
Message message =
parse(
"o_int: 3 o_sub_test_message: { o_int: 4 r_string: \"foo\" } "
+ "r_sub_test_message: { o_int: 5 r_string: \"bar\" }");
// All of these differ in a critical field.
Message diffMessage1 =
parse(
"o_int: 999999 o_sub_test_message: { o_int: 4 r_string: \"foo\" } "
+ "r_sub_test_message: { o_int: 5 r_string: \"bar\" }");
Message diffMessage2 =
parse(
"o_int: 3 o_sub_test_message: { o_int: 999999 r_string: \"foo\" } "
+ "r_sub_test_message: { o_int: 5 r_string: \"bar\" }");
Message diffMessage3 =
parse(
"o_int: 3 o_sub_test_message: { o_int: 4 r_string: \"foo\" } "
+ "r_sub_test_message: { o_int: 999999 r_string: \"bar\" }");
Message diffMessage4 =
parse(
"o_int: 3 o_sub_test_message: { o_int: 4 r_string: \"foo\" } "
+ "r_sub_test_message: { o_int: 5 r_string: \"999999\" }");
// This one only differs in o_sub_test_message.r_string, which is ignored.
Message eqMessage =
parse(
"o_int: 3 o_sub_test_message: { o_int: 4 r_string: \"999999\" } "
+ "r_sub_test_message: { o_int: 5 r_string: \"bar\" }");
FieldScope fieldScope =
FieldScopes.ignoringFields(getFieldNumber("o_sub_test_message"))
.allowingFieldDescriptors(
getFieldDescriptor("o_sub_test_message").getMessageType().findFieldByName("o_int"));
expectThat(diffMessage1).withPartialScope(fieldScope).isNotEqualTo(message);
expectThat(diffMessage2).withPartialScope(fieldScope).isNotEqualTo(message);
expectThat(diffMessage3).withPartialScope(fieldScope).isNotEqualTo(message);
expectThat(diffMessage4).withPartialScope(fieldScope).isNotEqualTo(message);
expectThat(eqMessage).withPartialScope(fieldScope).isEqualTo(message);
expectFailureWhenTesting().that(diffMessage4).withPartialScope(fieldScope).isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure()
.hasMessageThat()
.contains("modified: r_sub_test_message[0].r_string[0]: \"bar\" -> \"999999\"");
expectFailureWhenTesting().that(eqMessage).withPartialScope(fieldScope).isNotEqualTo(message);
expectIsNotEqualToFailed();
expectThatFailure().hasMessageThat().contains("ignored: o_sub_test_message.r_string");
}
@Test
public void testFromSetFields() {
Message scopeMessage =
parse(
"o_int: 1 r_string: \"x\" o_test_message: { o_int: 1 } "
+ "r_test_message: { r_string: \"x\" } r_test_message: { o_int: 1 } "
+ "o_sub_test_message: { o_test_message: { o_int: 1 } }");
// 1 = compared, [2, 3] = ignored, 4 = compared and fails
Message message =
parse(
"o_int: 1 r_string: \"1\" o_test_message: {o_int: 1 r_string: \"2\" } "
+ "r_test_message: { o_int: 1 r_string: \"1\" } "
+ "r_test_message: { o_int: 1 r_string: \"1\" } "
+ "o_sub_test_message: { o_int: 2 o_test_message: { o_int: 1 r_string: \"2\" } }");
Message diffMessage =
parse(
"o_int: 4 r_string: \"4\" o_test_message: {o_int: 4 r_string: \"3\" } "
+ "r_test_message: { o_int: 4 r_string: \"4\" } "
+ "r_test_message: { o_int: 4 r_string: \"4\" }"
+ "o_sub_test_message: { r_string: \"3\" o_int: 3 "
+ "o_test_message: { o_int: 4 r_string: \"3\" } }");
Message eqMessage =
parse(
"o_int: 1 r_string: \"1\" o_test_message: {o_int: 1 r_string: \"3\" } "
+ "r_test_message: { o_int: 1 r_string: \"1\" } "
+ "r_test_message: { o_int: 1 r_string: \"1\" }"
+ "o_sub_test_message: { o_int: 3 o_test_message: { o_int: 1 r_string: \"3\" } }");
expectThat(diffMessage).isNotEqualTo(message);
expectThat(eqMessage).isNotEqualTo(message);
expectThat(diffMessage)
.withPartialScope(FieldScopes.fromSetFields(scopeMessage))
.isNotEqualTo(message);
expectThat(eqMessage)
.withPartialScope(FieldScopes.fromSetFields(scopeMessage))
.isEqualTo(message);
expectFailureWhenTesting().that(diffMessage).isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure().hasMessageThat().contains("1 -> 4");
expectThatFailure().hasMessageThat().contains("\"1\" -> \"4\"");
expectThatFailure().hasMessageThat().contains("2 -> 3");
expectThatFailure().hasMessageThat().contains("\"2\" -> \"3\"");
expectFailureWhenTesting()
.that(diffMessage)
.withPartialScope(FieldScopes.fromSetFields(scopeMessage))
.isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure().hasMessageThat().contains("1 -> 4");
expectThatFailure().hasMessageThat().contains("\"1\" -> \"4\"");
expectThatFailure().hasMessageThat().doesNotContain("2 -> 3");
expectThatFailure().hasMessageThat().doesNotContain("\"2\" -> \"3\"");
expectFailureWhenTesting()
.that(eqMessage)
.withPartialScope(FieldScopes.fromSetFields(scopeMessage))
.isNotEqualTo(message);
expectIsNotEqualToFailed();
expectThatFailure().hasMessageThat().contains("ignored: o_test_message.r_string");
expectThatFailure().hasMessageThat().contains("ignored: o_sub_test_message.o_int");
expectThatFailure()
.hasMessageThat()
.contains("ignored: o_sub_test_message.o_test_message.r_string");
}
@Test
public void testFromSetFields_comparingExpectedFieldsOnly()
throws InvalidProtocolBufferException {
Message message1 = parse("o_int: 1 o_double: 333 oneof_message1: { o_int: 3 o_double: 333 }");
Message message2 =
parse("o_int: 333 o_double: 1.2 oneof_message2: { o_int: 333 o_double: 3.14 }");
Message diffMessage1 = parse("o_int: 1 oneof_message1: { o_int: 4 }");
Message diffMessage2 = parse("o_double: 1.2 oneof_message2: { o_double: 4.14 }");
Message eqMessage1 = parse("o_int: 1 oneof_message1: { o_int: 3 }");
Message eqMessage2 = parse("o_double: 1.2 oneof_message2: { o_double: 3.14 }");
expectThat(message1).comparingExpectedFieldsOnly().isEqualTo(eqMessage1);
expectThat(message2).comparingExpectedFieldsOnly().isEqualTo(eqMessage2);
expectFailureWhenTesting().that(message1).comparingExpectedFieldsOnly().isEqualTo(diffMessage1);
expectFailureWhenTesting().that(message2).comparingExpectedFieldsOnly().isEqualTo(diffMessage2);
expectThat(listOf(message1, message2))
.comparingExpectedFieldsOnly()
.containsExactly(eqMessage1, eqMessage2);
expectFailureWhenTesting()
.that(listOf(message1, message2))
.comparingExpectedFieldsOnly()
.containsExactly(diffMessage1, eqMessage2);
expectFailureWhenTesting()
.that(listOf(message1, message2))
.comparingExpectedFieldsOnly()
.containsExactly(eqMessage1, diffMessage2);
}
@Test
public void testFromSetFields_unknownFields() throws InvalidProtocolBufferException {
// Make sure that merging of repeated fields, separation by tag number, and separation by
// unknown field type all work.
Message scopeMessage =
fromUnknownFields(
UnknownFieldSet.newBuilder()
.addField(333, Field.newBuilder().addFixed32(1).addFixed64(1).build())
.addField(
444,
Field.newBuilder()
.addVarint(1)
.addLengthDelimited(ByteString.copyFrom("1", UTF_8))
.addGroup(
UnknownFieldSet.newBuilder()
.addField(1, Field.newBuilder().addFixed32(1).build())
.build())
.addGroup(
UnknownFieldSet.newBuilder()
.addField(2, Field.newBuilder().addFixed64(1).build())
.build())
.build())
.build());
// 1 = compared, [2, 3] = ignored, 4 = compared and fails
Message message =
fromUnknownFields(
UnknownFieldSet.newBuilder()
.addField(222, Field.newBuilder().addFixed32(2).addFixed64(2).build())
.addField(
333,
Field.newBuilder()
.addFixed32(1)
.addFixed64(1)
.addVarint(2)
.addLengthDelimited(ByteString.copyFrom("2", UTF_8))
.addGroup(
UnknownFieldSet.newBuilder()
.addField(1, Field.newBuilder().addFixed32(2).build())
.build())
.build())
.addField(
444,
Field.newBuilder()
.addFixed32(2)
.addFixed64(2)
.addVarint(1)
.addLengthDelimited(ByteString.copyFrom("1", UTF_8))
.addGroup(
UnknownFieldSet.newBuilder()
.addField(1, Field.newBuilder().addFixed32(1).addFixed64(2).build())
.addField(2, Field.newBuilder().addFixed32(2).addFixed64(1).build())
.addField(3, Field.newBuilder().addFixed32(2).build())
.build())
.build())
.build());
Message diffMessage =
fromUnknownFields(
UnknownFieldSet.newBuilder()
.addField(222, Field.newBuilder().addFixed32(3).addFixed64(3).build())
.addField(
333,
Field.newBuilder()
.addFixed32(4)
.addFixed64(4)
.addVarint(3)
.addLengthDelimited(ByteString.copyFrom("3", UTF_8))
.addGroup(
UnknownFieldSet.newBuilder()
.addField(1, Field.newBuilder().addFixed32(3).build())
.build())
.build())
.addField(
444,
Field.newBuilder()
.addFixed32(3)
.addFixed64(3)
.addVarint(4)
.addLengthDelimited(ByteString.copyFrom("4", UTF_8))
.addGroup(
UnknownFieldSet.newBuilder()
.addField(1, Field.newBuilder().addFixed32(4).addFixed64(3).build())
.addField(2, Field.newBuilder().addFixed32(3).addFixed64(4).build())
.addField(3, Field.newBuilder().addFixed32(3).build())
.build())
.build())
.build());
Message eqMessage =
fromUnknownFields(
UnknownFieldSet.newBuilder()
.addField(222, Field.newBuilder().addFixed32(3).addFixed64(3).build())
.addField(
333,
Field.newBuilder()
.addFixed32(1)
.addFixed64(1)
.addVarint(3)
.addLengthDelimited(ByteString.copyFrom("3", UTF_8))
.addGroup(
UnknownFieldSet.newBuilder()
.addField(1, Field.newBuilder().addFixed32(3).build())
.build())
.build())
.addField(
444,
Field.newBuilder()
.addFixed32(3)
.addFixed64(3)
.addVarint(1)
.addLengthDelimited(ByteString.copyFrom("1", UTF_8))
.addGroup(
UnknownFieldSet.newBuilder()
.addField(1, Field.newBuilder().addFixed32(1).addFixed64(3).build())
.addField(2, Field.newBuilder().addFixed32(3).addFixed64(1).build())
.addField(3, Field.newBuilder().addFixed32(3).build())
.build())
.build())
.build());
expectThat(diffMessage).isNotEqualTo(message);
expectThat(eqMessage).isNotEqualTo(message);
expectThat(diffMessage)
.withPartialScope(FieldScopes.fromSetFields(scopeMessage))
.isNotEqualTo(message);
expectThat(eqMessage)
.withPartialScope(FieldScopes.fromSetFields(scopeMessage))
.isEqualTo(message);
expectFailureWhenTesting().that(diffMessage).isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure().hasMessageThat().contains("1 -> 4");
expectThatFailure().hasMessageThat().contains("\"1\" -> \"4\"");
expectThatFailure().hasMessageThat().contains("2 -> 3");
expectThatFailure().hasMessageThat().contains("\"2\" -> \"3\"");
expectFailureWhenTesting()
.that(diffMessage)
.withPartialScope(FieldScopes.fromSetFields(scopeMessage))
.isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure().hasMessageThat().contains("1 -> 4");
expectThatFailure().hasMessageThat().contains("\"1\" -> \"4\"");
expectThatFailure().hasMessageThat().doesNotContain("2 -> 3");
expectThatFailure().hasMessageThat().doesNotContain("\"2\" -> \"3\"");
expectFailureWhenTesting()
.that(eqMessage)
.withPartialScope(FieldScopes.fromSetFields(scopeMessage))
.isNotEqualTo(message);
expectIsNotEqualToFailed();
expectThatFailure().hasMessageThat().doesNotContain("2 -> 3");
expectThatFailure().hasMessageThat().doesNotContain("\"2\" -> \"3\"");
}
@Test
public void testFieldNumbersAreRecursive() {
// o_int is compared, r_string is not.
Message message =
parse("o_int: 1 r_string: \"foo\" r_test_message: { o_int: 2 r_string: \"bar\" }");
Message diffMessage =
parse("o_int: 2 r_string: \"bar\" r_test_message: { o_int: 1 r_string: \"foo\" }");
Message eqMessage =
parse("o_int: 1 r_string: \"bar\" r_test_message: { o_int: 2 r_string: \"foo\" }");
int fieldNumber = getFieldNumber("o_int");
FieldDescriptor fieldDescriptor = getFieldDescriptor("o_int");
expectThat(diffMessage)
.withPartialScope(FieldScopes.allowingFields(fieldNumber))
.isNotEqualTo(message);
expectThat(eqMessage)
.withPartialScope(FieldScopes.allowingFields(fieldNumber))
.isEqualTo(message);
expectThat(diffMessage)
.withPartialScope(FieldScopes.allowingFieldDescriptors(fieldDescriptor))
.isNotEqualTo(message);
expectThat(eqMessage)
.withPartialScope(FieldScopes.allowingFieldDescriptors(fieldDescriptor))
.isEqualTo(message);
expectFailureWhenTesting()
.that(diffMessage)
.withPartialScope(FieldScopes.allowingFields(fieldNumber))
.isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure().hasMessageThat().contains("modified: o_int: 1 -> 2");
expectThatFailure().hasMessageThat().contains("modified: r_test_message[0].o_int: 2 -> 1");
expectFailureWhenTesting()
.that(eqMessage)
.withPartialScope(FieldScopes.allowingFields(fieldNumber))
.isNotEqualTo(message);
expectIsNotEqualToFailed();
expectThatFailure().hasMessageThat().contains("ignored: r_test_message[0].r_string");
}
@Test
public void testMultipleFieldNumbers() {
Message message = parse("o_int: 1 r_string: \"x\" o_enum: TWO");
Message diffMessage = parse("o_int: 2 r_string: \"y\" o_enum: TWO");
Message eqMessage =
parse("o_int: 1 r_string: \"x\" o_enum: ONE o_sub_test_message: { r_string: \"bar\" }");
FieldScope fieldScope =
FieldScopes.allowingFields(getFieldNumber("o_int"), getFieldNumber("r_string"));
expectThat(diffMessage).withPartialScope(fieldScope).isNotEqualTo(message);
expectThat(eqMessage).withPartialScope(fieldScope).isEqualTo(message);
expectFailureWhenTesting().that(diffMessage).withPartialScope(fieldScope).isEqualTo(message);
expectIsEqualToFailed();
expectThatFailure().hasMessageThat().contains("modified: o_int: 1 -> 2");
expectThatFailure().hasMessageThat().contains("modified: r_string[0]: \"x\" -> \"y\"");
expectFailureWhenTesting().that(eqMessage).withPartialScope(fieldScope).isNotEqualTo(message);
expectIsNotEqualToFailed();
expectThatFailure().hasMessageThat().contains("ignored: o_enum");
expectThatFailure().hasMessageThat().contains("ignored: o_sub_test_message");
}
@Test
public void testInvalidFieldNumber() {
Message message1 = parse("o_int: 44");
Message message2 = parse("o_int: 33");
try {
assertThat(message1).ignoringFields(999).isEqualTo(message2);
fail("Expected failure.");
} catch (Exception expected) {
// TODO(user): Use hasTransitiveCauseThat() if/when it becomes available.
Throwable cause = expected;
while (cause != null) {
if (cause
.getMessage()
.contains("Message type " + fullMessageName() + " has no field with number 999.")) {
break;
} else {
cause = cause.getCause();
}
}
if (cause == null) {
fail("No cause with field number error message.");
}
}
}
@Test
public void testIgnoreFieldsAtDifferentLevels() {
// Ignore all 'o_int' fields, in different ways.
Message message =
parse(
"o_int: 1 r_string: \"foo\" o_sub_test_message: { o_int: 2 "
+ "o_sub_sub_test_message: { o_int: 3 r_string: \"bar\" } }");
// Even though o_int is ignored, message presence is not. So these all fail.
Message diffMessage1 = parse("r_string: \"baz\"");
Message diffMessage2 = parse("r_string: \"foo\"");
Message diffMessage3 = parse("r_string: \"foo\" o_sub_test_message: {}");
Message diffMessage4 =
parse("r_string: \"foo\" o_sub_test_message: { o_sub_sub_test_message: {} }");
// All of these messages are equivalent, because all o_int are ignored.
Message eqMessage1 =
parse(
"o_int: 111 r_string: \"foo\" o_sub_test_message: { o_int: 222 "
+ "o_sub_sub_test_message: { o_int: 333 r_string: \"bar\" } }");
Message eqMessage2 =
parse(
"o_int: 1 r_string: \"foo\" o_sub_test_message: { o_int: 2 "
+ "o_sub_sub_test_message: { o_int: 3 r_string: \"bar\" } }");
Message eqMessage3 =
parse(
"r_string: \"foo\" o_sub_test_message: { "
+ "o_sub_sub_test_message: { r_string: \"bar\" } }");
Message eqMessage4 =
parse(
"o_int: 333 r_string: \"foo\" o_sub_test_message: { o_int: 111 "
+ "o_sub_sub_test_message: { o_int: 222 r_string: \"bar\" } }");
FieldDescriptor top = getFieldDescriptor("o_int");
FieldDescriptor middle =
getFieldDescriptor("o_sub_test_message").getMessageType().findFieldByName("o_int");
FieldDescriptor bottom =
getFieldDescriptor("o_sub_test_message")
.getMessageType()
.findFieldByName("o_sub_sub_test_message")
.getMessageType()
.findFieldByName("o_int");
ImmutableMap<String, FieldScope> fieldScopes =
ImmutableMap.of(
"BASIC", FieldScopes.ignoringFieldDescriptors(top, middle, bottom),
"CHAINED",
FieldScopes.ignoringFieldDescriptors(top)
.ignoringFieldDescriptors(middle)
.ignoringFieldDescriptors(bottom),
"REPEATED",
FieldScopes.ignoringFieldDescriptors(top, middle)
.ignoringFieldDescriptors(middle, bottom));
for (String scopeName : fieldScopes.keySet()) {
String msg = "FieldScope(" + scopeName + ")";
FieldScope scope = fieldScopes.get(scopeName);
expectThatWithMessage(msg, diffMessage1).withPartialScope(scope).isNotEqualTo(message);
expectThatWithMessage(msg, diffMessage2).withPartialScope(scope).isNotEqualTo(message);
expectThatWithMessage(msg, diffMessage3).withPartialScope(scope).isNotEqualTo(message);
expectThatWithMessage(msg, diffMessage4).withPartialScope(scope).isNotEqualTo(message);
expectThatWithMessage(msg, eqMessage1).withPartialScope(scope).isEqualTo(message);
expectThatWithMessage(msg, eqMessage2).withPartialScope(scope).isEqualTo(message);
expectThatWithMessage(msg, eqMessage3).withPartialScope(scope).isEqualTo(message);
expectThatWithMessage(msg, eqMessage4).withPartialScope(scope).isEqualTo(message);
}
}
@Test
public void testFromSetFields_skipNulls() {
Message message1 = parse("o_int: 1 r_string: \"foo\" r_string: \"bar\"");
Message eqMessage1 = parse("o_int: 1 r_string: \"foo\" r_string: \"bar\"");
Message eqIgnoredMessage1 = parse("o_int: 2 r_string: \"foo\" r_string: \"bar\"");
Message message2 = parse("o_int: 3 r_string: \"baz\" r_string: \"qux\"");
Message eqMessage2 = parse("o_int: 3 r_string: \"baz\" r_string: \"qux\"");
Message eqIgnoredMessage2 = parse("o_int: 4 r_string: \"baz\" r_string: \"qux\"");
List<Message> messages = Lists.newArrayList();
Message nullMessage = null;
messages.add(parse("o_int: -1"));
messages.add(nullMessage);
messages.add(parse("r_string: \"NaN\""));
expectThat(listOf(message1, message2))
.withPartialScope(FieldScopes.fromSetFields(messages))
.containsExactly(eqMessage1, eqMessage2);
expectThat(listOf(message1, message2))
.withPartialScope(
FieldScopes.fromSetFields(parse("o_int: -1"), nullMessage, parse("r_string: \"NaN\"")))
.containsExactly(eqMessage1, eqMessage2);
expectFailureWhenTesting()
.that(listOf(message1, message2))
.withPartialScope(FieldScopes.fromSetFields(messages))
.containsExactly(eqIgnoredMessage1, eqIgnoredMessage2);
expectThatFailure()
.factValue("testing whether")
.contains(
"is equivalent according to "
+ "assertThat(proto)"
+ ".withPartialScope("
+ "FieldScopes.fromSetFields(["
+ "{o_int: -1\n}, null, {r_string: \"NaN\"\n}]))"
+ ".isEqualTo(target)");
expectFailureWhenTesting()
.that(listOf(message1, message2))
.withPartialScope(
FieldScopes.fromSetFields(parse("o_int: -1"), nullMessage, parse("r_string: \"NaN\"")))
.containsExactly(eqIgnoredMessage1, eqIgnoredMessage2);
expectThatFailure()
.factValue("testing whether")
.contains(
"is equivalent according to "
+ "assertThat(proto)"
+ ".withPartialScope("
+ "FieldScopes.fromSetFields(["
+ "{o_int: -1\n}, null, {r_string: \"NaN\"\n}]))"
+ ".isEqualTo(target)");
}
@Test
public void testFromSetFields_iterables_vacuousIfEmptyOrAllNull() {
Message message1 = parse("o_int: 1 r_string: \"foo\" r_string: \"bar\"");
Message eqIgnoredMessage1 = parse("o_int: 2 r_string: \"foo\" r_string: \"bar\"");
Message message2 = parse("o_int: 3 r_string: \"baz\" r_string: \"qux\"");
Message eqIgnoredMessage2 = parse("o_int: 4 r_string: \"baz\" r_string: \"qux\"");
List<Message> messages = Lists.newArrayList();
messages.add(null);
messages.add(null);
expectThat(listOf(message1, message2))
.withPartialScope(FieldScopes.fromSetFields(ImmutableList.<Message>of()))
.containsExactly(eqIgnoredMessage1, eqIgnoredMessage2);
expectThat(listOf(message1, message2))
.withPartialScope(FieldScopes.fromSetFields(messages))
.containsExactly(eqIgnoredMessage1, eqIgnoredMessage2);
expectFailureWhenTesting()
.that(listOf(message1, message2))
.withPartialScope(FieldScopes.fromSetFields(ImmutableList.<Message>of()))
.containsNoneOf(eqIgnoredMessage1, eqIgnoredMessage2);
expectFailureWhenTesting()
.that(listOf(message1, message2))
.withPartialScope(FieldScopes.fromSetFields(messages))
.containsNoneOf(eqIgnoredMessage1, eqIgnoredMessage2);
expectThatFailure().isNotNull();
}
@Test
public void testFromSetFields_iterables_errorForDifferentMessageTypes() {
// Don't run this test twice.
if (!testIsRunOnce()) {
return;
}
try {
FieldScopes.fromSetFields(
TestMessage2.newBuilder().setOInt(2).build(),
TestMessage3.newBuilder().setOInt(2).build());
fail("Expected failure.");
} catch (RuntimeException expected) {
expect
.that(expected)
.hasMessageThat()
.contains("Cannot create scope from messages with different descriptors");
expect.that(expected).hasMessageThat().contains(TestMessage2.getDescriptor().getFullName());
expect.that(expected).hasMessageThat().contains(TestMessage3.getDescriptor().getFullName());
}
}
@Test
public void testFromSetFields_iterables_errorIfDescriptorMismatchesSubject() {
// Don't run this test twice.
if (!testIsRunOnce()) {
return;
}
Message message =
TestMessage2.newBuilder().setOInt(1).addRString("foo").addRString("bar").build();
Message eqMessage =
TestMessage2.newBuilder().setOInt(1).addRString("foo").addRString("bar").build();
try {
assertThat(message)
.withPartialScope(
FieldScopes.fromSetFields(
TestMessage3.newBuilder().setOInt(2).build(),
TestMessage3.newBuilder().addRString("foo").build()))
.isEqualTo(eqMessage);
fail("Expected failure.");
} catch (RuntimeException expected) {
expect
.that(expected)
.hasMessageThat()
.contains(
"Message given to FieldScopes.fromSetFields() "
+ "does not have the same descriptor as the message being tested");
expect.that(expected).hasMessageThat().contains(TestMessage2.getDescriptor().getFullName());
expect.that(expected).hasMessageThat().contains(TestMessage3.getDescriptor().getFullName());
}
}
@Test
public void testFromSetFields_iterables_unionsElements() {
Message message = parse("o_int: 1 r_string: \"foo\" r_string: \"bar\"");
Message diffMessage1 = parse("o_int: 2 r_string: \"foo\" r_string: \"bar\"");
Message diffMessage2 = parse("o_int: 4 r_string: \"baz\" r_string: \"qux\"");
expectThat(listOf(message))
.ignoringFieldScope(FieldScopes.fromSetFields(parse("o_int: 1"), parse("o_enum: TWO")))
.containsExactly(diffMessage1);
expectFailureWhenTesting()
.that(listOf(message))
.ignoringFieldScope(FieldScopes.fromSetFields(parse("o_int: 1"), parse("o_enum: TWO")))
.containsExactly(diffMessage2);
expectThatFailure().isNotNull();
}
@Test
public void testIterableFieldScopeMethodVariants_protoSubject() {
Message message = parse("o_int: 1 r_string: \"foo\"");
Message eqExceptInt = parse("o_int: 2 r_string: \"foo\"");
expectThat(message).ignoringFields(listOf(getFieldNumber("o_int"))).isEqualTo(eqExceptInt);
expectThat(message)
.reportingMismatchesOnly()
.ignoringFields(listOf(getFieldNumber("o_int")))
.isEqualTo(eqExceptInt);
expectThat(message)
.ignoringFieldScope(FieldScopes.allowingFields(listOf(getFieldNumber("o_int"))))
.isEqualTo(eqExceptInt);
expectThat(message)
.withPartialScope(FieldScopes.ignoringFields(listOf(getFieldNumber("o_int"))))
.isEqualTo(eqExceptInt);
expectThat(message)
.ignoringFieldDescriptors(listOf(getFieldDescriptor("o_int")))
.isEqualTo(eqExceptInt);
expectThat(message)
.reportingMismatchesOnly()
.ignoringFieldDescriptors(listOf(getFieldDescriptor("o_int")))
.isEqualTo(eqExceptInt);
expectThat(message)
.ignoringFieldScope(
FieldScopes.allowingFieldDescriptors(listOf(getFieldDescriptor("o_int"))))
.isEqualTo(eqExceptInt);
expectThat(message)
.withPartialScope(FieldScopes.ignoringFieldDescriptors(listOf(getFieldDescriptor("o_int"))))
.isEqualTo(eqExceptInt);
}
@Test
public void testIterableFieldScopeMethodVariants_iterableOfProtosSubject() {
ImmutableList<Message> messages = listOf(parse("o_int: 1 r_string: \"foo\""));
ImmutableList<Message> eqExceptInt = listOf(parse("o_int: 2 r_string: \"foo\""));
expectThat(messages)
.ignoringFields(listOf(getFieldNumber("o_int")))
.containsExactlyElementsIn(eqExceptInt);
expectThat(messages)
.reportingMismatchesOnly()
.ignoringFields(listOf(getFieldNumber("o_int")))
.containsExactlyElementsIn(eqExceptInt);
expectThat(messages)
.ignoringFieldDescriptors(listOf(getFieldDescriptor("o_int")))
.containsExactlyElementsIn(eqExceptInt);
expectThat(messages)
.reportingMismatchesOnly()
.ignoringFieldDescriptors(listOf(getFieldDescriptor("o_int")))
.containsExactlyElementsIn(eqExceptInt);
}
@Test
public void testIterableFieldScopeMethodVariants_mapWithProtoValuesSubject() {
ImmutableMap<String, Message> messages =
ImmutableMap.of("foo", parse("o_int: 1 r_string: \"foo\""));
ImmutableMap<String, Message> eqExceptInt =
ImmutableMap.of("foo", parse("o_int: 2 r_string: \"foo\""));
expectThat(messages)
.ignoringFieldsForValues(listOf(getFieldNumber("o_int")))
.containsExactlyEntriesIn(eqExceptInt);
expectThat(messages)
.reportingMismatchesOnlyForValues()
.ignoringFieldsForValues(listOf(getFieldNumber("o_int")))
.containsExactlyEntriesIn(eqExceptInt);
expectThat(messages)
.ignoringFieldDescriptorsForValues(listOf(getFieldDescriptor("o_int")))
.containsExactlyEntriesIn(eqExceptInt);
expectThat(messages)
.reportingMismatchesOnlyForValues()
.ignoringFieldDescriptorsForValues(listOf(getFieldDescriptor("o_int")))
.containsExactlyEntriesIn(eqExceptInt);
}
@Test
public void testIterableFieldScopeMethodVariants_multimapWithProtoValuesSubject() {
ImmutableMultimap<String, Message> messages =
ImmutableMultimap.of("foo", parse("o_int: 1 r_string: \"foo\""));
ImmutableMultimap<String, Message> eqExceptInt =
ImmutableMultimap.of("foo", parse("o_int: 2 r_string: \"foo\""));
expectThat(messages)
.ignoringFieldsForValues(listOf(getFieldNumber("o_int")))
.containsExactlyEntriesIn(eqExceptInt);
expectThat(messages)
.reportingMismatchesOnlyForValues()
.ignoringFieldsForValues(listOf(getFieldNumber("o_int")))
.containsExactlyEntriesIn(eqExceptInt);
expectThat(messages)
.ignoringFieldDescriptorsForValues(listOf(getFieldDescriptor("o_int")))
.containsExactlyEntriesIn(eqExceptInt);
expectThat(messages)
.reportingMismatchesOnlyForValues()
.ignoringFieldDescriptorsForValues(listOf(getFieldDescriptor("o_int")))
.containsExactlyEntriesIn(eqExceptInt);
}
}