/*
* Copyright 2017 ThoughtWorks, 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.thoughtworks.go.server.domain;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.thoughtworks.go.helper.PipelineMaterialModificationMother.modification;
import com.thoughtworks.go.domain.PipelineTimelineEntry;
import static org.hamcrest.core.Is.is;
import org.joda.time.DateTime;
import static org.junit.Assert.assertThat;
import org.junit.Test;
public class PipelineMaterialModificationTest {
@Test public void shouldThrowNPEIfNullIsPassedIn() throws Exception {
try {
modification(new ArrayList<>(), 1, "123").compareTo(null);
fail("Should throw NPE. That is the Comparable's contract.");
} catch (NullPointerException expected) {
assertThat(expected.getMessage(), is("Cannot compare this object with null"));
}
}
@Test public void shouldReturn0IfComparedToItself() throws Exception {
DateTime now = new DateTime();
PipelineTimelineEntry self = modification(Arrays.asList("flyweight"), 1, "123", now);
assertThat(self.compareTo(self), is(0));
PipelineTimelineEntry another = modification(Arrays.asList("flyweight"), 1, "123", now);
assertThat(self.compareTo(another), is(0));
assertThat(another.compareTo(self), is(0));
}
@Test public void shouldThrowExceptionIfIfComparedToADifferentClassObject() throws Exception {
try {
modification(Arrays.asList("flyweight"), 1, "123").compareTo(new Object());
fail("Should throw up.");
} catch (RuntimeException expected) {
}
}
@Test public void shouldCompareWhenThisModificationOccuredBeforeTheOtherModification() throws Exception {
PipelineTimelineEntry modification = modification(Arrays.asList("flyweight"), 1, "123", new DateTime());
PipelineTimelineEntry that = modification(2, Arrays.asList("flyweight"), Arrays.asList(new DateTime().plusMinutes(1)), 1, "123");
assertThat(modification.compareTo(that), is(-1));
assertThat(that.compareTo(modification), is(1));
}
@Test public void shouldCompareModsWithMultipleMaterials() throws Exception {
List<String> materials = Arrays.asList("flyweight", "another");
DateTime base = new DateTime();
PipelineTimelineEntry modification = modification(1, materials, Arrays.asList(base.plusMinutes(1), base.plusMinutes(3)), 1, "123");
PipelineTimelineEntry that = modification(2, materials, Arrays.asList(base.plusMinutes(4), base.plusMinutes(2)), 1, "123");
assertThat(modification.compareTo(that), is(-1));
assertThat(that.compareTo(modification), is(1));
}
@Test public void shouldCompareModsWithMultipleMaterialsWithOneMaterialNotChanged() throws Exception {
List<String> materials = Arrays.asList("flyweight", "another");
DateTime base = new DateTime();
PipelineTimelineEntry modification = modification(1, materials, Arrays.asList(base, base.plusMinutes(3)), 1, "123");
PipelineTimelineEntry that = modification(2, materials, Arrays.asList(base, base.plusMinutes(2)), 1, "123");
assertThat(modification.compareTo(that), is(1));
assertThat(that.compareTo(modification), is(-1));
}
@Test public void shouldCompareModsWithNoMaterialsChanged() throws Exception {
List<String> materials = Arrays.asList("flyweight", "another");
DateTime base = new DateTime();
PipelineTimelineEntry modification = modification(1, materials, Arrays.asList(base, base.plusMinutes(3)), 1, "123", "pipeline");
PipelineTimelineEntry that = modification(2, materials, Arrays.asList(base, base.plusMinutes(3)), 2, "123", "pipeline");
assertThat(modification.compareTo(that), is(-1));
assertThat(that.compareTo(modification), is(1));
}
@Test public void shouldBreakTieOnMinimumUsingPipelineCounter() throws Exception {
List<String> materials = Arrays.asList("first", "second", "third", "fourth");
DateTime base = new DateTime();
//Because there is a tie on the lowest value i.e. date 2, use the counter to order
PipelineTimelineEntry modification = modification(1, materials, Arrays.asList(base, base.plusMinutes(3), base.plusMinutes(2), base.plusMinutes(4)), 1, "123", "pipeline");
PipelineTimelineEntry that = modification(2, materials, Arrays.asList(base, base.plusMinutes(2), base.plusMinutes(3), base.plusMinutes(2)), 2, "123", "pipeline");
assertThat(modification.compareTo(that), is(-1));
assertThat(that.compareTo(modification), is(1));
}
@Test public void shouldCompareModsWith4MaterialsWithOneMaterialNotChanged() throws Exception {
List<String> materials = Arrays.asList("first", "second", "third", "fourth");
DateTime base = new DateTime();
PipelineTimelineEntry modification = modification(1, materials, Arrays.asList(base, base.plusMinutes(3), base.plusMinutes(2), base.plusMinutes(4)), 1, "123", "pipeline");
PipelineTimelineEntry that = modification(2, materials, Arrays.asList(base, base.plusMinutes(2), base.plusMinutes(3), base.plusMinutes(1)), 2, "123", "pipeline");
assertThat(modification.compareTo(that), is(1));
assertThat(that.compareTo(modification), is(-1));
}
@Test public void shouldCompareModsUsingCounterToBreakTies() throws Exception {
List<String> materials = Arrays.asList("first", "second", "third");
DateTime base = new DateTime();
PipelineTimelineEntry modification = modification(1, materials, Arrays.asList(base, base.plusMinutes(3), base.plusMinutes(2)), 1, "123", "pipeline");
PipelineTimelineEntry that = modification(2, materials, Arrays.asList(base, base.plusMinutes(2), base.plusMinutes(3)), 2, "123", "pipeline");
assertThat(modification.compareTo(that), is(-1));
assertThat(that.compareTo(modification), is(1));
}
@Test public void shouldIgnoreExtraMaterialForComparison() throws Exception {
DateTime base = new DateTime();
//Ignore the extra material
PipelineTimelineEntry modification = modification(1, Arrays.asList("first", "second", "third"), Arrays.asList(base, base.plusMinutes(3), base.plusMinutes(2)), 1, "123", "pipeline");
PipelineTimelineEntry that = modification(2, Arrays.asList("first", "second"), Arrays.asList(base, base.plusMinutes(2)), 2, "123", "pipeline");
assertThat(modification.compareTo(that), is(1));
assertThat(that.compareTo(modification), is(-1));
//Now break the tie using counter and ignore the extra third material
modification = modification(1, Arrays.asList("first", "second", "third"), Arrays.asList(base, base.plusMinutes(3), base.plusMinutes(2)), 1, "123", "pipeline");
that = modification(2, Arrays.asList("first", "second"), Arrays.asList(base, base.plusMinutes(3)), 2, "123", "pipeline");
assertThat(modification.compareTo(that), is(-1));
assertThat(that.compareTo(modification), is(1));
}
}