package lt.inventi.wicket.component.breadcrumb.collapse;
import static org.hamcrest.Matchers.contains;
import static org.junit.Assert.assertThat;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import lt.inventi.wicket.component.breadcrumb.BEquality;
public class CollapseUtilsTest {
BEquality<String> sameness = new BEquality<String>() {
@Override
public boolean equal(String a, String b) {
return a.equals(b);
}
};
BEquality<String> collapsibility = new BEquality<String>() {
@Override
public boolean equal(String a, String b) {
return a.split(":")[0].equals(b.split(":")[0]);
}
};
BFun<String, String> identity = new BFun<String, String>() {
@Override
public String apply(String f) {
return f;
}
};
BFun<Iterable<String>, String> grouping = new BFun<Iterable<String>, String>() {
@Override
public String apply(Iterable<String> f) {
StringBuilder sb = new StringBuilder();
for (String s : f) {
sb.append(s).append("-");
}
return sb.toString();
}
};
@Test
public void collapsesFirstRepetition() {
List<String> result = doCollapse(Arrays.asList("a:1"), 1);
assertThat(result, contains("a:1"));
result = doCollapse(Arrays.asList("a:1", "b:1"), 1);
assertThat(result, contains("a:1", "b:1"));
result = doCollapse(Arrays.asList("a:1", "b:1", "c:1", "a:2"), 1);
assertThat(result, contains("a:1-b:1-c:1-", "a:2"));
result = doCollapse(Arrays.asList("z:1", "a:1", "b:1", "c:1", "b:2", "a:2"), 1);
assertThat(result, contains("z:1", "a:1-b:1-c:1-b:2-", "a:2"));
result = doCollapse(Arrays.asList("z:1", "a:1", "b:1", "a:2", "b:2", "a:3"), 1);
assertThat(result, contains("z:1", "a:1-b:1-a:2-b:2-", "a:3"));
}
@Test
public void collapsesSecondRepetition() {
List<String> result = doCollapse(Arrays.asList("a:1"), 2);
assertThat(result, contains("a:1"));
result = doCollapse(Arrays.asList("a:1", "b:1"), 2);
assertThat(result, contains("a:1", "b:1"));
result = doCollapse(Arrays.asList("a:1", "b:1", "c:1", "a:2"), 2);
assertThat(result, contains("a:1", "b:1", "c:1", "a:2"));
result = doCollapse(Arrays.asList("a:1", "b:1", "c:1", "a:2", "a:3"), 2);
assertThat(result, contains("a:1-b:1-c:1-a:2-", "a:3"));
result = doCollapse(Arrays.asList("x:1", "z:1", "a:1", "b:1", "c:1", "b:2", "b:3", "c:2", "z:2", "a:2", "b:4", "a:3"), 2);
assertThat(result, contains("x:1", "z:1", "a:1-b:1-c:1-b:2-b:3-c:2-z:2-a:2-b:4-", "a:3"));
}
/**
* Input cannot contain items equal according to the {@code sameness}
* predicate.
*/
@Test
public void doesntCollapseImpossibleScenarios() {
List<String> result = doCollapse(Arrays.asList("a:1", "b:1", "a:1"), 1);
assertThat(result, contains("a:1", "b:1", "a:1"));
result = doCollapse(Arrays.asList("a:1", "b:1", "a:1"), 5);
assertThat(result, contains("a:1", "b:1", "a:1"));
}
private List<String> doCollapse(List<String> data, int times) {
return CollapseUtils.collapse(data, sameness, collapsibility, identity, grouping, times);
}
}