/*
* Copyright 2014 WANdisco
*
* WANdisco licenses this file to you 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 c5db.interfaces.log;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
import java.util.List;
import static c5db.interfaces.log.SequentialEntryIterable.SequentialEntryIterator;
public class SequentialEntryIterableMatchers {
public static <E extends SequentialEntry> TypeSafeMatcher<SequentialEntryIterator<E>>
isIteratorContainingInOrder(List<E> entries) {
return new TypeSafeMatcher<SequentialEntryIterator<E>>() {
private Exception exception;
@Override
protected boolean matchesSafely(SequentialEntryIterator<E> iterator) {
int listIndex = 0;
try {
while (iterator.hasNext()) {
E next = iterator.next();
if (listIndex >= entries.size()
|| !next.equals(entries.get(listIndex))) {
return false;
}
listIndex++;
}
} catch (Exception e) {
exception = e;
return false;
}
return listIndex == entries.size();
}
@Override
public void describeTo(Description description) {
description.appendText(" a SequentialEntryIterator containing, in order, ")
.appendValue(entries);
}
@Override
protected void describeMismatchSafely(SequentialEntryIterator<E> item, Description mismatchDescription) {
if (exception != null) {
mismatchDescription.appendValue(exception);
} else {
super.describeMismatchSafely(item, mismatchDescription);
}
}
};
}
}