blob: f92d60ef3c85cd09afe2c9a5741384d5588fc92d [file] [log] [blame]
/*
* Copyright (c) 2014 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;
import static com.google.common.truth.StringUtil.format;
import static com.google.common.truth.TestCorrespondences.STRING_PARSES_TO_INTEGER_CORRESPONDENCE;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.junit.Assert.fail;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSetMultimap;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimap;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Tests for Multimap Subjects.
*
* @author Daniel Ploch
* @author Kurt Alfred Kluever
*/
@RunWith(JUnit4.class)
public class MultimapSubjectTest extends BaseSubjectTestCase {
@Test
public void listMultimapIsEqualTo_passes() {
ImmutableListMultimap<String, String> multimapA =
ImmutableListMultimap.<String, String>builder()
.putAll("kurt", "kluever", "russell", "cobain")
.build();
ImmutableListMultimap<String, String> multimapB =
ImmutableListMultimap.<String, String>builder()
.putAll("kurt", "kluever", "russell", "cobain")
.build();
assertThat(multimapA.equals(multimapB)).isTrue();
assertThat(multimapA).isEqualTo(multimapB);
}
@Test
public void listMultimapIsEqualTo_fails() {
ImmutableListMultimap<String, String> multimapA =
ImmutableListMultimap.<String, String>builder()
.putAll("kurt", "kluever", "russell", "cobain")
.build();
ImmutableListMultimap<String, String> multimapB =
ImmutableListMultimap.<String, String>builder()
.putAll("kurt", "kluever", "cobain", "russell")
.build();
assertThat(multimapA.equals(multimapB)).isFalse();
expectFailure.whenTesting().that(multimapA).isEqualTo(multimapB);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{kurt=[kluever, russell, cobain]}> contains exactly "
+ "<{kurt=[kluever, cobain, russell]}> in order. "
+ "The values for keys <[kurt]> are not in order");
}
@Test
public void setMultimapIsEqualTo_passes() {
ImmutableSetMultimap<String, String> multimapA =
ImmutableSetMultimap.<String, String>builder()
.putAll("kurt", "kluever", "russell", "cobain")
.build();
ImmutableSetMultimap<String, String> multimapB =
ImmutableSetMultimap.<String, String>builder()
.putAll("kurt", "kluever", "cobain", "russell")
.build();
assertThat(multimapA.equals(multimapB)).isTrue();
assertThat(multimapA).isEqualTo(multimapB);
}
@Test
public void setMultimapIsEqualTo_fails() {
ImmutableSetMultimap<String, String> multimapA =
ImmutableSetMultimap.<String, String>builder()
.putAll("kurt", "kluever", "russell", "cobain")
.build();
ImmutableSetMultimap<String, String> multimapB =
ImmutableSetMultimap.<String, String>builder().putAll("kurt", "kluever", "russell").build();
assertThat(multimapA.equals(multimapB)).isFalse();
expectFailure.whenTesting().that(multimapA).isEqualTo(multimapB);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{kurt=[kluever, russell, cobain]}> contains exactly "
+ "<{kurt=[kluever, russell]}>. It has unexpected items <{kurt=[cobain]}>");
}
@Test
public void isEqualTo_failsWithSameToString() {
expectFailure
.whenTesting()
.that(ImmutableMultimap.of(1, "a", 1, "b", 2, "c"))
.isEqualTo(ImmutableMultimap.of(1L, "a", 1L, "b", 2L, "c"));
AssertionError e = expectFailure.getFailure();
assertWithMessage("Full message: %s", e.getMessage())
.that(e)
.hasMessageThat()
.isEqualTo(
"Not true that <{1=[a, b], 2=[c]}> contains exactly <{1=[a, b], 2=[c]}>. It is "
+ "missing <[1=a, 1=b, 2=c] (Map.Entry<java.lang.Long, java.lang.String>)> and "
+ "has unexpected items "
+ "<[1=a, 1=b, 2=c] (Map.Entry<java.lang.Integer, java.lang.String>)>");
}
@Test
public void multimapIsEmpty() {
ImmutableMultimap<String, String> multimap = ImmutableMultimap.of();
assertThat(multimap).isEmpty();
}
@Test
public void multimapIsEmptyWithFailure() {
ImmutableMultimap<Integer, Integer> multimap = ImmutableMultimap.of(1, 5);
expectFailure.whenTesting().that(multimap).isEmpty();
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo("Not true that <{1=[5]}> is empty");
}
@Test
public void multimapIsNotEmpty() {
ImmutableMultimap<Integer, Integer> multimap = ImmutableMultimap.of(1, 5);
assertThat(multimap).isNotEmpty();
}
@Test
public void multimapIsNotEmptyWithFailure() {
ImmutableMultimap<Integer, Integer> multimap = ImmutableMultimap.of();
expectFailure.whenTesting().that(multimap).isNotEmpty();
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo("Not true that <{}> is not empty");
}
@Test
public void multimapNamedValuesForKey() {
ImmutableMultimap<Integer, Integer> multimap = ImmutableMultimap.of(1, 5);
expectFailure.whenTesting().that(multimap).named("multymap").valuesForKey(1).containsExactly(4);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that "
+ "<Values for key <1> (<[5]>) in multymap (<{1=[5]}>)> contains exactly <[4]>. "
+ "It is missing <[4]> and has unexpected items <[5]>");
}
@Test
public void valuesForKeyNamed() {
ImmutableMultimap<Integer, Integer> multimap = ImmutableMultimap.of(1, 5);
expectFailure.whenTesting().that(multimap).valuesForKey(1).named("valuez").containsExactly(4);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that "
+ "valuez (<Values for key <1> (<[5]>) in <{1=[5]}>>) contains exactly <[4]>. "
+ "It is missing <[4]> and has unexpected items <[5]>");
}
@Test
public void hasSize() {
assertThat(ImmutableMultimap.of(1, 2, 3, 4)).hasSize(2);
}
@Test
public void hasSizeZero() {
assertThat(ImmutableMultimap.of()).hasSize(0);
}
@Test
public void hasSizeNegative() {
try {
assertThat(ImmutableMultimap.of(1, 2)).hasSize(-1);
fail();
} catch (IllegalArgumentException expected) {
}
}
@Test
public void containsKey() {
ImmutableMultimap<String, String> multimap = ImmutableMultimap.of("kurt", "kluever");
assertThat(multimap).containsKey("kurt");
}
@Test
public void containsKeyFailure() {
ImmutableMultimap<String, String> multimap = ImmutableMultimap.of("kurt", "kluever");
expectFailure.whenTesting().that(multimap).containsKey("daniel");
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo("Not true that <{kurt=[kluever]}> contains key <daniel>");
}
@Test
public void containsKeyNull() {
Multimap<String, String> multimap = HashMultimap.create();
multimap.put(null, "null");
assertThat(multimap).containsKey(null);
}
@Test
public void containsKeyNullFailure() {
ImmutableMultimap<String, String> multimap = ImmutableMultimap.of("kurt", "kluever");
expectFailure.whenTesting().that(multimap).containsKey(null);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo("Not true that <{kurt=[kluever]}> contains key <null>");
}
@Test
public void containsKey_failsWithSameToString() {
expectFailure
.whenTesting()
.that(ImmutableMultimap.of(1L, "value1a", 1L, "value1b", 2L, "value2", "1", "value3"))
.containsKey(1);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{1=[value1a, value1b], 2=[value2], 1=[value3]}> contains key "
+ "<1 (java.lang.Integer)>. However, it does contain keys "
+ "<[1 (java.lang.Long), 1 (java.lang.String)]>.");
}
@Test
public void doesNotContainKey() {
ImmutableMultimap<String, String> multimap = ImmutableMultimap.of("kurt", "kluever");
assertThat(multimap).doesNotContainKey("daniel");
assertThat(multimap).doesNotContainKey(null);
}
@Test
public void doesNotContainKeyFailure() {
ImmutableMultimap<String, String> multimap = ImmutableMultimap.of("kurt", "kluever");
expectFailure.whenTesting().that(multimap).doesNotContainKey("kurt");
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo("Not true that <{kurt=[kluever]}> does not contain key <kurt>");
}
@Test
public void doesNotContainNullKeyFailure() {
Multimap<String, String> multimap = HashMultimap.create();
multimap.put(null, "null");
expectFailure.whenTesting().that(multimap).doesNotContainKey(null);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo("Not true that <{null=[null]}> does not contain key <null>");
}
@Test
public void containsEntry() {
ImmutableMultimap<String, String> multimap = ImmutableMultimap.of("kurt", "kluever");
assertThat(multimap).containsEntry("kurt", "kluever");
}
@Test
public void containsEntryFailure() {
ImmutableMultimap<String, String> multimap = ImmutableMultimap.of("kurt", "kluever");
expectFailure.whenTesting().that(multimap).containsEntry("daniel", "ploch");
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo("Not true that <{kurt=[kluever]}> contains entry <daniel=ploch>");
}
@Test
public void containsEntryWithNullValueNullExpected() {
ListMultimap<String, String> actual = ArrayListMultimap.create();
actual.put("a", null);
assertThat(actual).containsEntry("a", null);
}
@Test
public void failContainsEntry() {
ImmutableMultimap<String, String> actual = ImmutableMultimap.of("a", "A");
expectFailure.whenTesting().that(actual).containsEntry("a", "a");
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{a=[A]}> contains entry <a=a>. "
+ "However, it has a mapping from <a> to <[A]>");
}
@Test
public void failContainsEntryWithNullValuePresentExpected() {
ListMultimap<String, String> actual = ArrayListMultimap.create();
actual.put("a", null);
expectFailure.whenTesting().that(actual).containsEntry("a", "A");
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{a=[null]}> contains entry <a=A>. "
+ "However, it has a mapping from <a> to <[null]>");
}
@Test
public void failContainsEntryWithPresentValueNullExpected() {
ImmutableMultimap<String, String> actual = ImmutableMultimap.of("a", "A");
expectFailure.whenTesting().that(actual).containsEntry("a", null);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{a=[A]}> contains entry <a=null>. "
+ "However, it has a mapping from <a> to <[A]>");
}
@Test
public void containsEntry_failsWithSameToString() throws Exception {
expectFailure
.whenTesting()
.that(ImmutableMultimap.builder().put(1, "1").put(1, 1L).put(1L, 1).put(2, 3).build())
.containsEntry(1, 1);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{1=[1, 1], 1=[1], 2=[3]}> contains entry "
+ "<1=1 (Map.Entry<java.lang.Integer, java.lang.Integer>)>. However, it does "
+ "contain entries <[1=1 (Map.Entry<java.lang.Integer, java.lang.String>), "
+ "1=1 (Map.Entry<java.lang.Integer, java.lang.Long>), "
+ "1=1 (Map.Entry<java.lang.Long, java.lang.Integer>)]>");
}
@Test
public void doesNotContainEntry() {
ImmutableMultimap<String, String> multimap = ImmutableMultimap.of("kurt", "kluever");
assertThat(multimap).doesNotContainEntry("daniel", "ploch");
}
@Test
public void doesNotContainEntryFailure() {
ImmutableMultimap<String, String> multimap = ImmutableMultimap.of("kurt", "kluever");
expectFailure.whenTesting().that(multimap).doesNotContainEntry("kurt", "kluever");
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo("Not true that <{kurt=[kluever]}> does not contain entry <kurt=kluever>");
}
@Test
public void valuesForKey() {
ImmutableMultimap<Integer, String> multimap =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
assertThat(multimap).valuesForKey(3).hasSize(3);
assertThat(multimap).valuesForKey(4).containsExactly("four", "five");
assertThat(multimap).valuesForKey(3).containsAllOf("one", "six").inOrder();
assertThat(multimap).valuesForKey(5).isEmpty();
}
@Test
public void valuesForKeyListMultimap() {
ImmutableListMultimap<Integer, String> multimap =
ImmutableListMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
assertThat(multimap).valuesForKey(4).isStrictlyOrdered();
}
@Test
public void containsExactlyEntriesIn() {
ImmutableListMultimap<Integer, String> listMultimap =
ImmutableListMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ImmutableSetMultimap<Integer, String> setMultimap = ImmutableSetMultimap.copyOf(listMultimap);
assertThat(listMultimap).containsExactlyEntriesIn(setMultimap);
}
@Test
public void containsExactlyNoArg() {
ImmutableMultimap<Integer, String> actual = ImmutableMultimap.of();
assertThat(actual).containsExactly(ImmutableMultimap.of());
assertThat(actual).containsExactly(ImmutableMultimap.of()).inOrder();
expectFailure
.whenTesting()
.that(ImmutableMultimap.of(42, "Answer", 42, "6x7"))
.containsExactly();
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo("Not true that <{42=[Answer, 6x7]}> is empty");
}
@Test
public void containsExactlyEmpty() {
ImmutableListMultimap<Integer, String> actual = ImmutableListMultimap.of();
ImmutableSetMultimap<Integer, String> expected = ImmutableSetMultimap.of();
assertThat(actual).containsExactlyEntriesIn(expected);
assertThat(actual).containsExactlyEntriesIn(expected).inOrder();
}
@Test
public void containsExactlyRejectsNull() {
ImmutableMultimap<Integer, String> multimap =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
try {
assertThat(multimap).containsExactlyEntriesIn(null);
fail("Should have thrown.");
} catch (NullPointerException expected) {
}
}
@Test
public void containsExactlyRespectsDuplicates() {
ImmutableListMultimap<Integer, String> actual =
ImmutableListMultimap.of(3, "one", 3, "two", 3, "one", 4, "five", 4, "five");
ImmutableListMultimap<Integer, String> expected =
ImmutableListMultimap.of(3, "two", 4, "five", 3, "one", 4, "five", 3, "one");
assertThat(actual).containsExactlyEntriesIn(expected);
}
@Test
public void containsExactlyRespectsDuplicatesFailure() {
ImmutableListMultimap<Integer, String> actual =
ImmutableListMultimap.of(3, "one", 3, "two", 3, "one", 4, "five", 4, "five");
ImmutableSetMultimap<Integer, String> expected = ImmutableSetMultimap.copyOf(actual);
expectFailure.whenTesting().that(actual).containsExactlyEntriesIn(expected);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
format(
"Not true that <%s> contains exactly <%s>. "
+ "It has unexpected items <{3=[one], 4=[five]}>",
actual, expected));
}
@Test
public void containsExactlyFailureMissing() {
ImmutableMultimap<Integer, String> expected =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ListMultimap<Integer, String> actual = LinkedListMultimap.create(expected);
actual.remove(3, "six");
actual.remove(4, "five");
expectFailure.whenTesting().that(actual).containsExactlyEntriesIn(expected);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
format(
"Not true that <%s> contains exactly <%s>. "
+ "It is missing <{3=[six], 4=[five]}>",
actual, expected));
}
@Test
public void containsExactlyFailureExtra() {
ImmutableMultimap<Integer, String> expected =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ListMultimap<Integer, String> actual = LinkedListMultimap.create(expected);
actual.put(4, "nine");
actual.put(5, "eight");
expectFailure.whenTesting().that(actual).containsExactlyEntriesIn(expected);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
format(
"Not true that <%s> contains exactly <%s>. "
+ "It has unexpected items <{4=[nine], 5=[eight]}>",
actual, expected));
}
@Test
public void containsExactlyFailureBoth() {
ImmutableMultimap<Integer, String> expected =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ListMultimap<Integer, String> actual = LinkedListMultimap.create(expected);
actual.remove(3, "six");
actual.remove(4, "five");
actual.put(4, "nine");
actual.put(5, "eight");
expectFailure.whenTesting().that(actual).containsExactlyEntriesIn(expected);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
format(
"Not true that <%s> contains exactly <%s>. "
+ "It is missing <{3=[six], 4=[five]}> "
+ "and has unexpected items <{4=[nine], 5=[eight]}>",
actual, expected));
}
@Test
public void containsExactlyFailureWithEmptyStringMissing() {
expectFailure.whenTesting().that(ImmutableMultimap.of()).containsExactly("", "a");
assertThat(expectFailure.getFailure().getMessage())
.isEqualTo(
"Not true that <{}> contains exactly <{\"\" (empty String)=[a]}>. "
+ "It is missing <{\"\" (empty String)=[a]}>");
}
@Test
public void containsExactlyFailureWithEmptyStringExtra() {
expectFailure
.whenTesting()
.that(ImmutableMultimap.of("a", "", "", ""))
.containsExactly("a", "");
assertThat(expectFailure.getFailure().getMessage())
.isEqualTo(
"Not true that <{a=[], =[]}> contains exactly <{a=[\"\" (empty String)]}>. "
+ "It has unexpected items <{\"\" (empty String)=[\"\" (empty String)]}>");
}
@Test
public void containsExactlyFailureWithEmptyStringBoth() {
expectFailure.whenTesting().that(ImmutableMultimap.of("a", "")).containsExactly("", "a");
assertThat(expectFailure.getFailure().getMessage())
.isEqualTo(
"Not true that <{a=[]}> contains exactly <{\"\" (empty String)=[a]}>. "
+ "It is missing <{\"\" (empty String)=[a]}> "
+ "and has unexpected items <{a=[\"\" (empty String)]}>");
}
@Test
public void containsExactlyInOrder() {
ImmutableMultimap<Integer, String> actual =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ImmutableMultimap<Integer, String> expected =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
assertThat(actual).containsExactlyEntriesIn(expected).inOrder();
}
@Test
public void containsExactlyInOrderDifferentTypes() {
ImmutableListMultimap<Integer, String> listMultimap =
ImmutableListMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ImmutableSetMultimap<Integer, String> setMultimap = ImmutableSetMultimap.copyOf(listMultimap);
assertThat(listMultimap).containsExactlyEntriesIn(setMultimap).inOrder();
}
@Test
public void containsExactlyInOrderFailure() {
ImmutableMultimap<Integer, String> actual =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ImmutableMultimap<Integer, String> expected =
ImmutableMultimap.of(4, "four", 3, "six", 4, "five", 3, "two", 3, "one");
assertThat(actual).containsExactlyEntriesIn(expected);
expectFailure.whenTesting().that(actual).containsExactlyEntriesIn(expected).inOrder();
assertThat(expectFailure.getFailure())
.hasMessageThat()
.startsWith(
format("Not true that <%s> contains exactly <%s> in order. ", actual, expected));
}
@Test
public void containsExactlyInOrderFailureValuesOnly() {
ImmutableMultimap<Integer, String> actual =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ImmutableMultimap<Integer, String> expected =
ImmutableMultimap.of(3, "six", 3, "two", 3, "one", 4, "five", 4, "four");
assertThat(actual).containsExactlyEntriesIn(expected);
expectFailure.whenTesting().that(actual).containsExactlyEntriesIn(expected).inOrder();
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
format(
"Not true that <%s> contains exactly <%s> in order. "
+ "The values for keys <[3]> are not in order",
actual, expected));
}
@Test
public void containsExactlyVararg() {
ImmutableListMultimap<Integer, String> listMultimap =
ImmutableListMultimap.of(1, "one", 3, "six", 3, "two");
assertThat(listMultimap).containsExactly(1, "one", 3, "six", 3, "two");
}
@Test
public void containsExactlyVarargWithNull() {
Multimap<Integer, String> listMultimap =
LinkedListMultimap.create(ImmutableListMultimap.of(1, "one", 3, "six", 3, "two"));
listMultimap.put(4, null);
assertThat(listMultimap).containsExactly(1, "one", 3, "six", 3, "two", 4, null);
}
@Test
public void containsExactlyVarargFailureMissing() {
ImmutableMultimap<Integer, String> expected =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ListMultimap<Integer, String> actual = LinkedListMultimap.create(expected);
actual.remove(3, "six");
actual.remove(4, "five");
expectFailure
.whenTesting()
.that(actual)
.containsExactly(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
format(
"Not true that <%s> contains exactly <%s>. "
+ "It is missing <{3=[six], 4=[five]}>",
actual, expected));
}
@Test
public void containsExactlyVarargFailureExtra() {
ImmutableMultimap<Integer, String> expected =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ListMultimap<Integer, String> actual = LinkedListMultimap.create(expected);
actual.put(4, "nine");
actual.put(5, "eight");
expectFailure
.whenTesting()
.that(actual)
.containsExactly(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
format(
"Not true that <%s> contains exactly <%s>. "
+ "It has unexpected items <{4=[nine], 5=[eight]}>",
actual, expected));
}
@Test
public void containsExactlyVarargFailureBoth() {
ImmutableMultimap<Integer, String> expected =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ListMultimap<Integer, String> actual = LinkedListMultimap.create(expected);
actual.remove(3, "six");
actual.remove(4, "five");
actual.put(4, "nine");
actual.put(5, "eight");
expectFailure
.whenTesting()
.that(actual)
.containsExactly(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
format(
"Not true that <%s> contains exactly <%s>. "
+ "It is missing <{3=[six], 4=[five]}> "
+ "and has unexpected items <{4=[nine], 5=[eight]}>",
actual, expected));
}
@Test
public void containsExactlyVarargRespectsDuplicates() {
ImmutableListMultimap<Integer, String> actual =
ImmutableListMultimap.of(3, "one", 3, "two", 3, "one", 4, "five", 4, "five");
assertThat(actual).containsExactly(3, "two", 4, "five", 3, "one", 4, "five", 3, "one");
}
@Test
public void containsExactlyVarargRespectsDuplicatesFailure() {
ImmutableListMultimap<Integer, String> actual =
ImmutableListMultimap.of(3, "one", 3, "two", 3, "one", 4, "five", 4, "five");
ImmutableSetMultimap<Integer, String> expected = ImmutableSetMultimap.copyOf(actual);
expectFailure.whenTesting().that(actual).containsExactly(3, "one", 3, "two", 4, "five");
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
format(
"Not true that <%s> contains exactly <%s>. "
+ "It has unexpected items <{3=[one], 4=[five]}>",
actual, expected));
}
@Test
public void containsExactlyVarargInOrder() {
ImmutableMultimap<Integer, String> actual =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
assertThat(actual)
.containsExactly(3, "one", 3, "six", 3, "two", 4, "five", 4, "four")
.inOrder();
}
@Test
public void containsExactlyVarargInOrderFailure() {
ImmutableMultimap<Integer, String> actual =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ImmutableMultimap<Integer, String> expected =
ImmutableMultimap.of(4, "four", 3, "six", 4, "five", 3, "two", 3, "one");
assertThat(actual).containsExactly(4, "four", 3, "six", 4, "five", 3, "two", 3, "one");
expectFailure
.whenTesting()
.that(actual)
.containsExactly(4, "four", 3, "six", 4, "five", 3, "two", 3, "one")
.inOrder();
assertThat(expectFailure.getFailure())
.hasMessageThat()
.startsWith(
format("Not true that <%s> contains exactly <%s> in order. ", actual, expected));
}
@Test
public void containsExactlyVarargInOrderFailureValuesOnly() {
ImmutableMultimap<Integer, String> actual =
ImmutableMultimap.of(3, "one", 3, "six", 3, "two", 4, "five", 4, "four");
ImmutableMultimap<Integer, String> expected =
ImmutableMultimap.of(3, "six", 3, "two", 3, "one", 4, "five", 4, "four");
assertThat(actual).containsExactly(3, "six", 3, "two", 3, "one", 4, "five", 4, "four");
expectFailure
.whenTesting()
.that(actual)
.containsExactly(3, "six", 3, "two", 3, "one", 4, "five", 4, "four")
.inOrder();
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
format(
"Not true that <%s> contains exactly <%s> in order. "
+ "The values for keys <[3]> are not in order",
actual, expected));
}
@Test
public void containsExactlyEntriesIn_homogeneousMultimap_failsWithSameToString()
throws Exception {
expectFailure
.whenTesting()
.that(ImmutableMultimap.of(1, "a", 1, "b", 2, "c"))
.containsExactlyEntriesIn(ImmutableMultimap.of(1L, "a", 1L, "b", 2L, "c"));
assertWithMessage("Full message: %s", expectFailure.getFailure().getMessage())
.that(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{1=[a, b], 2=[c]}> contains exactly <{1=[a, b], 2=[c]}>. It is "
+ "missing <[1=a, 1=b, 2=c] (Map.Entry<java.lang.Long, java.lang.String>)> and "
+ "has unexpected items "
+ "<[1=a, 1=b, 2=c] (Map.Entry<java.lang.Integer, java.lang.String>)>");
}
@Test
public void containsExactlyEntriesIn_heterogeneousMultimap_failsWithSameToString()
throws Exception {
expectFailure
.whenTesting()
.that(ImmutableMultimap.of(1, "a", 1, "b", 2L, "c"))
.containsExactlyEntriesIn(ImmutableMultimap.of(1L, "a", 1L, "b", 2, "c"));
assertWithMessage("Full message: %s", expectFailure.getFailure().getMessage())
.that(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{1=[a, b], 2=[c]}> contains exactly <{1=[a, b], 2=[c]}>. It is "
+ "missing <["
+ "1=a (Map.Entry<java.lang.Long, java.lang.String>), "
+ "1=b (Map.Entry<java.lang.Long, java.lang.String>), "
+ "2=c (Map.Entry<java.lang.Integer, java.lang.String>)]> "
+ "and has unexpected items <["
+ "1=a (Map.Entry<java.lang.Integer, java.lang.String>), "
+ "1=b (Map.Entry<java.lang.Integer, java.lang.String>), "
+ "2=c (Map.Entry<java.lang.Long, java.lang.String>)]>");
}
@Test
public void comparingValuesUsing_containsEntry_success() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+456", "def", "+789");
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsEntry("def", 789);
}
@Test
public void comparingValuesUsing_containsEntry_failsExpectedKeyHasWrongValues() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+456", "def", "+789");
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsEntry("def", 123);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{abc=[+123], def=[+456, +789]}> contains at least one entry with "
+ "key <def> and a value that parses to <123>. "
+ "However, it has a mapping from that key to <[+456, +789]>");
}
@Test
public void comparingValuesUsing_containsEntry_failsWrongKeyHasExpectedValue() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+456", "def", "+789");
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsEntry("xyz", 789);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{abc=[+123], def=[+456, +789]}> contains at least one entry with "
+ "key <xyz> and a value that parses to <789>. "
+ "However, the following keys are mapped to such values: <[def]>");
}
@Test
public void comparingValuesUsing_containsEntry_failsMissingExpectedKeyAndValue() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+456", "def", "+789");
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsEntry("xyz", 321);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{abc=[+123], def=[+456, +789]}> contains at least one entry with "
+ "key <xyz> and a value that parses to <321>");
}
@Test
public void comparingValuesUsing_containsEntry_wrongTypeInActual() {
ImmutableListMultimap<String, Object> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+456", "def", new Object());
try {
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsEntry("def", 123);
fail("Should have thrown.");
} catch (ClassCastException expected) {
}
}
@Test
public void comparingValuesUsing_doesNotContainEntry_successExcludeKeyHasWrongValues() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+456", "def", "+789");
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.doesNotContainEntry("def", 123);
}
@Test
public void comparingValuesUsing_doesNotContainEntry_successWrongKeyHasExcludedValue() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+456", "def", "+789");
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.doesNotContainEntry("xyz", 789);
}
@Test
public void comparingValuesUsing_doesNotContainEntry_successMissingExcludedKeyAndValue() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+456", "def", "+789");
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.doesNotContainEntry("xyz", 321);
}
@Test
public void comparingValuesUsing_doesNotContainEntry_failure() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+456", "def", "+789");
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.doesNotContainEntry("def", 789);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{abc=[+123], def=[+456, +789]}> did not contain an entry with "
+ "key <def> and a value that parses to <789>. "
+ "It maps that key to the following such values: <[+789]>");
}
@Test
public void comparingValuesUsing_doesNotContainEntry_wrongTypeInActual() {
ImmutableListMultimap<String, Object> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+456", "def", new Object());
try {
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.doesNotContainEntry("def", 789);
fail("Should have thrown.");
} catch (ClassCastException expected) {
}
}
@Test
public void comparingValuesUsing_containsExactlyEntriesIn_success() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", "+128");
ImmutableListMultimap<String, Integer> expected =
ImmutableListMultimap.of("def", 64, "def", 128, "def", 64, "abc", 123);
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactlyEntriesIn(expected);
}
@Test
public void comparingValuesUsing_containsExactlyEntriesIn_missingKey() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("def", "+64", "def", "0x40", "def", "+128");
ImmutableListMultimap<String, Integer> expected =
ImmutableListMultimap.of("def", 64, "def", 128, "def", 64, "abc", 123);
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactlyEntriesIn(expected);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{def=[+64, 0x40, +128]}> contains exactly one element that has a "
+ "key that is equal to and a value that parses to the key and value of each "
+ "element of <[def=64, def=128, def=64, abc=123]>. It is missing an element "
+ "that has a key that is equal to and a value that parses to the key and value "
+ "of <abc=123>");
}
@Test
public void comparingValuesUsing_containsExactlyEntriesIn_extraKey() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", "+128");
ImmutableListMultimap<String, Integer> expected =
ImmutableListMultimap.of("def", 64, "def", 128, "def", 64);
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactlyEntriesIn(expected);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{abc=[+123], def=[+64, 0x40, +128]}> contains exactly one element "
+ "that has a key that is equal to and a value that parses to the key and value "
+ "of each element of <[def=64, def=128, def=64]>. It has unexpected elements "
+ "<[abc=+123]>");
}
@Test
public void comparingValuesUsing_containsExactlyEntriesIn_wrongValueForKey() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", "+128");
ImmutableListMultimap<String, Integer> expected =
ImmutableListMultimap.of("def", 64, "def", 128, "def", 128, "abc", 123);
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactlyEntriesIn(expected);
String expectedPreamble =
"Not true that <{abc=[+123], def=[+64, 0x40, +128]}> contains exactly one element that "
+ "has a key that is equal to and a value that parses to the key and value of each "
+ "element of <[def=64, def=128, def=128, abc=123]>. It contains at least one "
+ "element that matches each expected element, and every element it contains matches "
+ "at least one expected element, but there was no 1:1 mapping between all the "
+ "actual and expected elements. Using the most complete 1:1 mapping (or one such "
+ "mapping, if there is a tie), it is missing an element that has a key that is "
+ "equal to and a value that parses to the key and value of <def=128> and has "
+ "unexpected elements ";
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isAnyOf(expectedPreamble + "<[def=+64]>", expectedPreamble + "<[def=0x40]>");
}
@Test
public void comparingValuesUsing_containsExactlyEntriesIn_wrongTypeInActual() {
ImmutableListMultimap<String, Object> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", new Object());
ImmutableListMultimap<String, Integer> expected =
ImmutableListMultimap.of("def", 64, "def", 123, "def", 64, "abc", 123);
try {
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactlyEntriesIn(expected);
fail("Should have thrown.");
} catch (ClassCastException e) {
// expected
}
}
@Test
public void comparingValuesUsing_containsExactlyEntriesIn_inOrder_success() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", "+128");
ImmutableListMultimap<String, Integer> expected =
ImmutableListMultimap.of("abc", 123, "def", 64, "def", 64, "def", 128);
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactlyEntriesIn(expected);
}
@Test
public void comparingValuesUsing_containsExactlyEntriesIn_inOrder_wrongKeyOrder() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", "+128");
ImmutableListMultimap<String, Integer> expected =
ImmutableListMultimap.of("def", 64, "def", 64, "def", 128, "abc", 123);
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactlyEntriesIn(expected)
.inOrder();
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{abc=[+123], def=[+64, 0x40, +128]}> contains, in order, exactly one "
+ "element that has a key that is equal to and a value that parses to the key "
+ "and value of each element of <[def=64, def=64, def=128, abc=123]>");
}
@Test
public void comparingValuesUsing_containsExactlyEntriesIn_inOrder_wrongValueOrder() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", "+128");
ImmutableListMultimap<String, Integer> expected =
ImmutableListMultimap.of("abc", 123, "def", 64, "def", 128, "def", 64);
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactlyEntriesIn(expected)
.inOrder();
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{abc=[+123], def=[+64, 0x40, +128]}> contains, in order, exactly one "
+ "element that has a key that is equal to and a value that parses to the key "
+ "and value of each element of <[abc=123, def=64, def=128, def=64]>");
}
@Test
public void comparingValuesUsing_containsExactlyEntriesIn_failsWithNamed() {
ImmutableListMultimap<String, String> actual = ImmutableListMultimap.of("abc", "+123");
ImmutableListMultimap<String, Integer> expected =
ImmutableListMultimap.of("abc", 123, "def", 456);
expectFailure
.whenTesting()
.that(actual)
.named("multymap")
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactlyEntriesIn(expected);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that multymap (<{abc=[+123]}>) contains exactly one element that has a key "
+ "that is equal to and a value that parses to the key and value of each element "
+ "of <[abc=123, def=456]>. It is missing an element that has a key that is "
+ "equal to and a value that parses to the key and value of <def=456>");
}
@Test
public void comparingValuesUsing_containsExactlyNoArgs() {
ImmutableListMultimap<String, String> actual = ImmutableListMultimap.of();
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactly();
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactly()
.inOrder();
expectFailure
.whenTesting()
.that(ImmutableListMultimap.of("abc", "+123"))
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactly();
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo("Not true that <{abc=[+123]}> is empty");
}
@Test
public void comparingValuesUsing_containsExactly_success() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", "+128");
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactly("def", 64, "def", 128, "def", 64, "abc", 123);
}
@Test
public void comparingValuesUsing_containsExactly_missingKey() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("def", "+64", "def", "0x40", "def", "+128");
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactly("def", 64, "def", 128, "def", 64, "abc", 123);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{def=[+64, 0x40, +128]}> contains exactly one element that has a "
+ "key that is equal to and a value that parses to the key and value of each "
+ "element of <[def=64, def=128, def=64, abc=123]>. It is missing an element "
+ "that has a key that is equal to and a value that parses to the key and value "
+ "of <abc=123>");
}
@Test
public void comparingValuesUsing_containsExactly_extraKey() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", "+128");
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactly("def", 64, "def", 128, "def", 64);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{abc=[+123], def=[+64, 0x40, +128]}> contains exactly one element "
+ "that has a key that is equal to and a value that parses to the key and value "
+ "of each element of <[def=64, def=128, def=64]>. It has unexpected elements "
+ "<[abc=+123]>");
}
@Test
public void comparingValuesUsing_containsExactly_wrongValueForKey() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", "+128");
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactly("def", 64, "def", 128, "def", 128, "abc", 123);
String expectedPreamble =
"Not true that <{abc=[+123], def=[+64, 0x40, +128]}> contains exactly one element that "
+ "has a key that is equal to and a value that parses to the key and value of each "
+ "element of <[def=64, def=128, def=128, abc=123]>. It contains at least one "
+ "element that matches each expected element, and every element it contains matches "
+ "at least one expected element, but there was no 1:1 mapping between all the "
+ "actual and expected elements. Using the most complete 1:1 mapping (or one such "
+ "mapping, if there is a tie), it is missing an element that has a key that is "
+ "equal to and a value that parses to the key and value of <def=128> and has "
+ "unexpected elements ";
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isAnyOf(expectedPreamble + "<[def=+64]>", expectedPreamble + "<[def=0x40]>");
}
@Test
public void comparingValuesUsing_containsExactly_wrongTypeInActual() {
ImmutableListMultimap<String, Object> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", new Object());
try {
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactly("def", 64, "def", 123, "def", 64, "abc", 123);
fail("Should have thrown.");
} catch (ClassCastException e) {
// expected
}
}
@Test
public void comparingValuesUsing_containsExactly_inOrder_success() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", "+128");
assertThat(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactly("abc", 123, "def", 64, "def", 64, "def", 128);
}
@Test
public void comparingValuesUsing_containsExactly_inOrder_wrongKeyOrder() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", "+128");
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactly("def", 64, "def", 64, "def", 128, "abc", 123)
.inOrder();
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{abc=[+123], def=[+64, 0x40, +128]}> contains, in order, exactly one "
+ "element that has a key that is equal to and a value that parses to the key "
+ "and value of each element of <[def=64, def=64, def=128, abc=123]>");
}
@Test
public void comparingValuesUsing_containsExactly_inOrder_wrongValueOrder() {
ImmutableListMultimap<String, String> actual =
ImmutableListMultimap.of("abc", "+123", "def", "+64", "def", "0x40", "def", "+128");
expectFailure
.whenTesting()
.that(actual)
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactly("abc", 123, "def", 64, "def", 128, "def", 64)
.inOrder();
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that <{abc=[+123], def=[+64, 0x40, +128]}> contains, in order, exactly one "
+ "element that has a key that is equal to and a value that parses to the key "
+ "and value of each element of <[abc=123, def=64, def=128, def=64]>");
}
@Test
public void comparingValuesUsing_containsExactly_failsWithNamed() {
ImmutableListMultimap<String, String> actual = ImmutableListMultimap.of("abc", "+123");
expectFailure
.whenTesting()
.that(actual)
.named("multymap")
.comparingValuesUsing(STRING_PARSES_TO_INTEGER_CORRESPONDENCE)
.containsExactly("abc", 123, "def", 456);
assertThat(expectFailure.getFailure())
.hasMessageThat()
.isEqualTo(
"Not true that multymap (<{abc=[+123]}>) contains exactly one element that has a key "
+ "that is equal to and a value that parses to the key and value of each element "
+ "of <[abc=123, def=456]>. It is missing an element that has a key that is "
+ "equal to and a value that parses to the key and value of <def=456>");
}
}