/*
*
* * #%L
* * ACS AEM Commons Bundle
* * %%
* * Copyright (C) 2016 Adobe
* * %%
* * 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.
* * #L%
*
*/
package com.adobe.acs.commons.wcm.comparisons.impl.lines;
import com.adobe.acs.commons.wcm.comparisons.lines.Line;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import javax.annotation.Nullable;
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(MockitoJUnitRunner.class)
public class LinesTest {
LinesGenerator<String> one2OneLines = new LinesGenerator<String>(TO_ID);
@Test
public void generate_singleLine() throws Exception {
// given
List<String> left = Lists.newArrayList("A");
List<String> right = Lists.newArrayList("A");
// when
final List<Line<String>> lines = one2OneLines.generate(left, right);
// then
assertThat(lines.size(), is(1));
Line<String> line = lines.get(0);
assertThat(line, isLineWith(Optional.of("A"), Optional.of("A")));
}
@Test
public void generate_twoLines() throws Exception {
// given
List<String> left = Lists.newArrayList("A");
List<String> right = Lists.newArrayList("B");
// when
final List<Line<String>> lines = one2OneLines.generate(left, right);
// then
assertThat(lines.size(), is(2));
assertThat(lines.get(0), isLineWith(Optional.of("A"), Optional.<String>absent()));
assertThat(lines.get(1), isLineWith(Optional.<String>absent(), Optional.of("B")));
}
@Test
public void generate_twoLines_firstSpacerLeft() throws Exception {
// given
List<String> left = Lists.newArrayList("B");
List<String> right = Lists.newArrayList("A", "B");
// when
final List<Line<String>> lines = one2OneLines.generate(left, right);
// then
assertThat(lines.size(), is(2));
assertThat(lines.get(0), isLineWith(Optional.<String>absent(), Optional.of("A")));
assertThat(lines.get(1), isLineWith(Optional.of("B"), Optional.of("B")));
}
@Test
public void generate_twoLines_firstSpacerRight() throws Exception {
// given
List<String> left = Lists.newArrayList("A", "B");
List<String> right = Lists.newArrayList("B");
// when
final List<Line<String>> lines = one2OneLines.generate(left, right);
// then
assertThat(lines.size(), is(2));
assertThat(lines.get(0), isLineWith(Optional.of("A"), Optional.<String>absent()));
assertThat(lines.get(1), isLineWith(Optional.of("B"), Optional.of("B")));
}
@Test
public void generate_matrixTest1() throws Exception {
// given
List<String> left = Lists.newArrayList("A", "B", "C", "E");
List<String> right = Lists.newArrayList("B", "C", "D", "E");
/*
* A | -
* B | B
* C | C
* - | D
* E | E
*/
// when
final List<Line<String>> lines = one2OneLines.generate(left, right);
// then
assertThat(lines.size(), is(5));
Iterator<Line<String>> lineIterator = lines.iterator();
assertThat(lineIterator.next(), isLineWith(Optional.of("A"), Optional.<String>absent()));
assertThat(lineIterator.next(), isLineWith(Optional.of("B"), Optional.of("B")));
assertThat(lineIterator.next(), isLineWith(Optional.of("C"), Optional.of("C")));
assertThat(lineIterator.next(), isLineWith(Optional.<String>absent(), Optional.of("D")));
assertThat(lineIterator.next(), isLineWith(Optional.of("E"), Optional.of("E")));
}
@Test
public void generate_matrixTest2() throws Exception {
// given
List<String> left = Lists.newArrayList("E", "A", "B", "C", "X");
List<String> right = Lists.newArrayList("B", "C", "D", "E", "X");
/*
* E | -
* A | -
* B | B
* C | C
* - | D
* - | E
* X | X
*/
// when
final List<Line<String>> lines = one2OneLines.generate(left, right);
// then
assertThat(lines.size(), is(7));
Iterator<Line<String>> lineIterator = lines.iterator();
assertThat(lineIterator.next(), isLineWith(Optional.of("E"), Optional.<String>absent()));
assertThat(lineIterator.next(), isLineWith(Optional.of("A"), Optional.<String>absent()));
assertThat(lineIterator.next(), isLineWith(Optional.of("B"), Optional.of("B")));
assertThat(lineIterator.next(), isLineWith(Optional.of("C"), Optional.of("C")));
assertThat(lineIterator.next(), isLineWith(Optional.<String>absent(), Optional.of("D")));
assertThat(lineIterator.next(), isLineWith(Optional.<String>absent(), Optional.of("E")));
assertThat(lineIterator.next(), isLineWith(Optional.of("X"), Optional.of("X")));
}
@Test
public void generate_matrixTest3() throws Exception {
// given
List<String> left = Lists.newArrayList("B", "C", "D", "E", "X");
List<String> right = Lists.newArrayList("E", "A", "B", "C", "X");
/*
* - | E
* - | A
* B | B
* C | C
* D | -
* E | -
* X | X
*/
// when
final List<Line<String>> lines = one2OneLines.generate(left, right);
// then
assertThat(lines.size(), is(7));
Iterator<Line<String>> lineIterator = lines.iterator();
assertThat(lineIterator.next(), isLineWith(Optional.<String>absent(), Optional.of("E")));
assertThat(lineIterator.next(), isLineWith(Optional.<String>absent(), Optional.of("A")));
assertThat(lineIterator.next(), isLineWith(Optional.of("B"), Optional.of("B")));
assertThat(lineIterator.next(), isLineWith(Optional.of("C"), Optional.of("C")));
assertThat(lineIterator.next(), isLineWith(Optional.of("D"), Optional.<String>absent()));
assertThat(lineIterator.next(), isLineWith(Optional.of("E"), Optional.<String>absent()));
assertThat(lineIterator.next(), isLineWith(Optional.of("X"), Optional.of("X")));
}
public static TypeSafeMatcher<Line<String>> isLineWith(final Optional<String> left, final Optional<String> right) {
return new TypeSafeMatcher<Line<String>>() {
@Override
protected boolean matchesSafely(Line<String> stringLine) {
return left.equals(Optional.fromNullable(stringLine.getLeft())) &&
right.equals(Optional.fromNullable(stringLine.getRight()));
}
@Override
public void describeTo(Description description) {
description.appendText("with left: " + left + " right: " + right);
}
};
}
static final Function<String, Serializable> TO_ID = new Function<String, Serializable>() {
@Nullable
@Override
public Serializable apply(@Nullable String input) {
return input;
}
};
}