@CanIgnoreReturnValue
  public final Ordered containsAtLeastEntriesIn(Multimap<?, ?> expectedMultimap) {
    checkNotNull(expectedMultimap, "expectedMultimap");
    checkNotNull(actual);
    ListMultimap<?, ?> missing = difference(expectedMultimap, actual);

    // TODO(kak): Possible enhancement: Include "[1 copy]" if the element does appear in
    // the subject but not enough times. Similarly for unexpected extra items.
    if (!missing.isEmpty()) {
      failWithActual(
          fact("missing", countDuplicatesMultimap(annotateEmptyStringsMultimap(missing))),
          simpleFact("---"),
          fact("expected to contain at least", annotateEmptyStringsMultimap(expectedMultimap)));
      return ALREADY_FAILED;
    }

    return new MultimapInOrder(/* allowUnexpected = */ true, expectedMultimap);
  }
@Test
  public void containsAtLeastInOrderFailure() {
    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", 3, "two", 3, "one");

    assertThat(actual).containsAtLeastEntriesIn(expected);
    expectFailureWhenTestingThat(actual).containsAtLeastEntriesIn(expected).inOrder();
    assertFailureKeys(
        "contents match, but order was wrong",
        "keys are not in order",
        "keys with out-of-order values",
        "---",
        "expected to contain at least",
        "but was");
    assertFailureValue("keys with out-of-order values", "[3]");
    assertFailureValue("expected to contain at least", "{4=[four], 3=[six, two, one]}");
    assertFailureValue("but was", "{3=[one, six, two], 4=[five, four]}");
  }