/* * Copyright 2016 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.rf.ide.core.testdata.text.write; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.when; import java.io.File; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.InOrder; import org.rf.ide.core.testdata.model.AModelElement; import org.rf.ide.core.testdata.model.FilePosition; import org.rf.ide.core.testdata.model.table.SettingTable; import org.rf.ide.core.testdata.text.read.separators.Separator; /** * @author wypych */ public class RepositionElementsBaseOnListMethodTest { private RobotFileDumperInheritance testable; @Before public void setUp() { this.testable = new RobotFileDumperInheritance(); } @SuppressWarnings("unchecked") @Test(timeout = 10000) public void twoCorrectors_inWrongPositionShouldPutInCorrectOrder_theSecondIsNew() { // prepare final List<AModelElement<SettingTable>> correctorsList = new ArrayList<AModelElement<SettingTable>>(); final AModelElement<SettingTable> correctorOne = mock(AModelElement.class); when(correctorOne.getBeginPosition()).thenReturn(new FilePosition(1, 1, 1)); final AModelElement<SettingTable> correctorTwo = mock(AModelElement.class); when(correctorTwo.getBeginPosition()).thenReturn(FilePosition.createNotSet()); correctorsList.add(correctorOne); correctorsList.add(correctorTwo); final List<? extends AModelElement<SettingTable>> correctors = spy(correctorsList); final LimitedSizeList<AModelElement<SettingTable>> srcList = new LimitedSizeList<AModelElement<SettingTable>>(); srcList.add(correctorTwo); srcList.add(correctorOne); srcList.setMaxSize(srcList.size() + 1); final List<AModelElement<SettingTable>> src = spy(srcList); // execute testable.repositionElementsBaseOnList(src, correctors); // verify assertThat(srcList).containsExactly(correctorOne, correctorTwo); assertThat(correctorsList).containsExactly(correctorOne, correctorTwo); } @SuppressWarnings("unchecked") @Test(timeout = 10000) public void twoCorrectors_inWrongPositionShouldPutInCorrectOrder_theFirstIsNew() { // prepare final List<AModelElement<SettingTable>> correctorsList = new ArrayList<AModelElement<SettingTable>>(); final AModelElement<SettingTable> correctorOne = mock(AModelElement.class); when(correctorOne.getBeginPosition()).thenReturn(FilePosition.createNotSet()); final AModelElement<SettingTable> correctorTwo = mock(AModelElement.class); when(correctorTwo.getBeginPosition()).thenReturn(new FilePosition(1, 1, 1)); correctorsList.add(correctorOne); correctorsList.add(correctorTwo); final List<? extends AModelElement<SettingTable>> correctors = spy(correctorsList); final LimitedSizeList<AModelElement<SettingTable>> srcList = new LimitedSizeList<AModelElement<SettingTable>>(); srcList.add(correctorTwo); srcList.add(correctorOne); srcList.setMaxSize(srcList.size() + 1); final List<AModelElement<SettingTable>> src = spy(srcList); // execute testable.repositionElementsBaseOnList(src, correctors); // verify assertThat(srcList).containsExactly(correctorOne, correctorTwo); assertThat(correctorsList).containsExactly(correctorOne, correctorTwo); } @SuppressWarnings("unchecked") @Test(timeout = 10000) public void twoCorrectors_inWrongPositionShouldPutInCorrectOrder_bothAreNew() { // prepare final List<AModelElement<SettingTable>> correctorsList = new ArrayList<AModelElement<SettingTable>>(); final AModelElement<SettingTable> correctorOne = mock(AModelElement.class); when(correctorOne.getBeginPosition()).thenReturn(FilePosition.createNotSet()); final AModelElement<SettingTable> correctorTwo = mock(AModelElement.class); when(correctorTwo.getBeginPosition()).thenReturn(FilePosition.createNotSet()); correctorsList.add(correctorOne); correctorsList.add(correctorTwo); final List<? extends AModelElement<SettingTable>> correctors = spy(correctorsList); final LimitedSizeList<AModelElement<SettingTable>> srcList = new LimitedSizeList<AModelElement<SettingTable>>(); srcList.add(correctorTwo); srcList.add(correctorOne); srcList.setMaxSize(srcList.size() + 1); final List<AModelElement<SettingTable>> src = spy(srcList); // execute testable.repositionElementsBaseOnList(src, correctors); // verify assertThat(srcList).containsExactly(correctorOne, correctorTwo); assertThat(correctorsList).containsExactly(correctorOne, correctorTwo); } @SuppressWarnings("unchecked") @Test(timeout = 10000) public void oneCorrector_shouldDoNothing() { // prepare final LimitedSizeList<AModelElement<SettingTable>> srcList = new LimitedSizeList<AModelElement<SettingTable>>(); srcList.setMaxSize(1); final List<AModelElement<SettingTable>> src = spy(srcList); final List<AModelElement<SettingTable>> correctorsList = new ArrayList<AModelElement<SettingTable>>(); final AModelElement<SettingTable> correctorOne = mock(AModelElement.class); correctorsList.add(correctorOne); final List<? extends AModelElement<SettingTable>> correctors = spy(correctorsList); // execute testable.repositionElementsBaseOnList(src, correctors); // verify InOrder order = inOrder(src, correctors); order.verify(correctors, times(1)).size(); order.verifyNoMoreInteractions(); assertThat(srcList).isEmpty(); assertThat(correctorsList).containsOnly(correctorOne); } @Test(timeout = 10000) public void empty_correctors_shouldDoNothing() { // prepare final List<AModelElement<SettingTable>> srcList = new LimitedSizeList<AModelElement<SettingTable>>(); final List<AModelElement<SettingTable>> src = spy(srcList); final List<AModelElement<SettingTable>> correctorsList = new ArrayList<AModelElement<SettingTable>>(); final List<? extends AModelElement<SettingTable>> correctors = spy(correctorsList); // execute testable.repositionElementsBaseOnList(src, correctors); // verify InOrder order = inOrder(src, correctors); order.verify(correctors, times(1)).size(); order.verifyNoMoreInteractions(); assertThat(srcList).isEmpty(); assertThat(correctorsList).isEmpty(); } @SuppressWarnings("unchecked") @Test public void test_isNextTheSameAsCurrent_enoughElementsAndTheSame_shouldReturn_TRUE() { // prepare final List<AModelElement<SettingTable>> srcList = new ArrayList<AModelElement<SettingTable>>(); srcList.add(mock(AModelElement.class)); final AModelElement<SettingTable> m = mock(AModelElement.class); srcList.add(m); final List<AModelElement<SettingTable>> src = spy(srcList); // execute boolean result = testable.isNextTheSameAsCurrent(src, m, 0); // verify assertThat(result).isTrue(); InOrder order = inOrder(src); order.verify(src, times(1)).size(); order.verify(src, times(1)).get(1); order.verifyNoMoreInteractions(); } @SuppressWarnings("unchecked") @Test public void test_isNextTheSameAsCurrent_enoughElementsButNotTheSame_shouldReturn_FALSE() { // prepare final List<AModelElement<SettingTable>> srcList = new ArrayList<AModelElement<SettingTable>>(); srcList.add(mock(AModelElement.class)); srcList.add(mock(AModelElement.class)); final List<AModelElement<SettingTable>> src = spy(srcList); final AModelElement<SettingTable> m = mock(AModelElement.class); // execute boolean result = testable.isNextTheSameAsCurrent(src, m, 0); // verify assertThat(result).isFalse(); InOrder order = inOrder(src); order.verify(src, times(1)).size(); order.verify(src, times(1)).get(1); order.verifyNoMoreInteractions(); } @Test public void test_isNextTheSameAsCurrent_notEnoughElements_shouldReturn_FALSE() { // prepare final List<AModelElement<SettingTable>> srcList = new ArrayList<AModelElement<SettingTable>>(); final List<AModelElement<SettingTable>> src = spy(srcList); @SuppressWarnings("unchecked") final AModelElement<SettingTable> m = mock(AModelElement.class); // execute boolean result = testable.isNextTheSameAsCurrent(src, m, 0); // verify assertThat(result).isFalse(); InOrder order = inOrder(src); order.verify(src, times(1)).size(); order.verifyNoMoreInteractions(); } private class LimitedSizeList<T> extends ArrayList<T> { private static final long serialVersionUID = 8445111812492585164L; private int maxSize = -1; public void setMaxSize(final int maxSize) { this.maxSize = maxSize; } public int getMaxSize() { return this.maxSize; } @Override public void add(final int index, final T elem) { boolean toAdd = false; if (getMaxSize() >= 0 && super.size() + 1 <= getMaxSize()) { toAdd = true; } else if (getMaxSize() < 0) { toAdd = true; } if (toAdd) { super.add(index, elem); } else { throw new IndexOutOfBoundsException("Elements size exceed maximum number of elements."); } } @Override public boolean add(final T elem) { boolean toAdd = false; if (getMaxSize() >= 0 && super.size() + 1 <= getMaxSize()) { toAdd = true; } else if (getMaxSize() < 0) { toAdd = true; } if (toAdd) { return super.add(elem); } else { throw new IndexOutOfBoundsException("Elements size exceed maximum number of elements."); } } } @Test(expected = IndexOutOfBoundsException.class) public void test_limitedSizeList_addPos_notEnoughSpace() { // prepare LimitedSizeList<String> p = new LimitedSizeList<>(); p.setMaxSize(2); // execute p.add("c"); p.add("d"); p.add(1, "r"); // verify assertThat(p).containsExactly("c", "d"); } @Test public void test_limitedSizeList_addPos_enoughSpace() { // prepare LimitedSizeList<String> p = new LimitedSizeList<>(); p.setMaxSize(3); // execute p.add("c"); p.add("d"); p.add(1, "r"); // verify assertThat(p).containsExactly("c", "r", "d"); } @Test(expected = IndexOutOfBoundsException.class) public void test_limitedSizeList_add_notEnoughSpace() { // prepare LimitedSizeList<String> p = new LimitedSizeList<>(); p.setMaxSize(1); // execute p.add("c"); p.add("d"); // verify assertThat(p).containsExactly("c"); } @Test public void test_limitedSizeList_add_enoughSpace() { // prepare LimitedSizeList<String> p = new LimitedSizeList<>(); p.setMaxSize(2); // execute p.add("c"); p.add("d"); // verify assertThat(p).containsExactly("c", "d"); } private class RobotFileDumperInheritance extends ARobotFileDumper { @Override public boolean canDumpFile(final File file) { // Irrelevant for this test return false; } @Override protected Separator getSeparatorDefault() { // Irrelevant for this test return null; } @Override public void repositionElementsBaseOnList(final List<AModelElement<SettingTable>> src, final List<? extends AModelElement<SettingTable>> correctors) { super.repositionElementsBaseOnList(src, correctors); } @Override public boolean isNextTheSameAsCurrent(final List<AModelElement<SettingTable>> src, final AModelElement<SettingTable> m, int currentIndex) { return super.isNextTheSameAsCurrent(src, m, currentIndex); } @Override protected boolean isAcceptableForDefault(Separator separator) { // irrelevant return false; } @Override protected boolean canBeSeparatorAddBeforeExecutableUnitName(final Separator separator) { // irrelevant return false; } } }