/*
* 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.model.table;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.rf.ide.core.test.helpers.ClassFieldCleaner;
import org.rf.ide.core.test.helpers.ClassFieldCleaner.ForClean;
import org.rf.ide.core.testdata.text.read.IRobotLineElement;
import org.rf.ide.core.testdata.text.read.IRobotTokenType;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType;
import com.google.common.collect.Multimap;
public class RobotElementsComperatorWithPositionChangedPresaveTest {
@ForClean
private RobotElementsComparatorWithPositionChangedPresave robotElemsCmp;
@Test
public void test_getTokensInElement_forOneTypeOfElements() {
// prepare
final List<RobotToken> startToks = new ArrayList<>(Arrays.asList(new RobotToken(), new RobotToken()));
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.START_HASH_COMMENT, 1, startToks);
// execute
final List<RobotToken> toks = robotElemsCmp.getTokensInElement();
// verify
assertThat(toks).containsExactlyElementsOf(startToks);
}
@Test
public void test_getTokensInElement_forTwoTypesOfElements() {
// prepare
final List<RobotToken> startToks = new ArrayList<>(Arrays.asList(new RobotToken(), new RobotToken()));
final List<RobotToken> contToks = new ArrayList<>(Arrays.asList(new RobotToken(), new RobotToken()));
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.START_HASH_COMMENT, 1, startToks);
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.COMMENT_CONTINUE, 2, contToks);
// execute
final List<RobotToken> toks = robotElemsCmp.getTokensInElement();
// verify
final List<RobotToken> joined = new ArrayList<>(startToks);
joined.addAll(contToks);
assertThat(toks).containsOnlyElementsOf(joined);
}
@Test
public void test_findType_typeNotExists() {
// prepare
final RobotToken tok = new RobotToken();
tok.setType(RobotTokenType.COMMENT_CONTINUE);
// execute
final Optional<IRobotTokenType> res = robotElemsCmp.findType(tok);
// verify
assertThat(res.isPresent()).isFalse();
}
@Test
public void test_findType_typeExists() {
// prepare
final RobotToken tok = new RobotToken();
tok.setType(RobotTokenType.COMMENT_CONTINUE);
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.ASSIGNMENT, 0, new ArrayList<>(Arrays.asList(tok)));
// execute
final Optional<IRobotTokenType> res = robotElemsCmp.findType(tok);
// verify
assertThat(res.isPresent()).isTrue();
assertThat(res.get()).isEqualTo(RobotTokenType.ASSIGNMENT);
}
@Test
public void test_indexesOf_elementWhichNotExists() {
// prepare
final RobotToken tok = new RobotToken();
final RobotToken tok2 = new RobotToken();
// execute
final Multimap<IRobotLineElement, Integer> indexes = robotElemsCmp
.indexesOf(new ArrayList<IRobotLineElement>(Arrays.asList(tok)), tok2);
// verify
assertThat(indexes.isEmpty()).isTrue();
}
@Test
public void test_indexesOf_elementWhichExists() {
// prepare
final RobotToken tok = new RobotToken();
// execute
final Multimap<IRobotLineElement, Integer> indexes = robotElemsCmp
.indexesOf(new ArrayList<IRobotLineElement>(Arrays.asList(tok)), tok);
// verify
assertThat(indexes.size()).isEqualTo(1);
assertThat(indexes.get(tok)).containsOnly(0);
}
@Test
public void test_indexesOf_twoElementsWhichExists() {
// prepare
final RobotToken tok = new RobotToken();
final RobotToken tok2 = new RobotToken();
// execute
final Multimap<IRobotLineElement, Integer> indexes = robotElemsCmp
.indexesOf(new ArrayList<IRobotLineElement>(Arrays.asList(tok, tok2)), tok, tok2);
// verify
assertThat(indexes.size()).isEqualTo(2);
assertThat(indexes.get(tok)).containsOnly(0);
assertThat(indexes.get(tok2)).containsOnly(1);
}
@Test
public void test_indexesOf_oneElementsWhichExists_andOneNotExists() {
// prepare
final RobotToken tok = new RobotToken();
final RobotToken tok2 = new RobotToken();
// execute
final Multimap<IRobotLineElement, Integer> indexes = robotElemsCmp
.indexesOf(new ArrayList<IRobotLineElement>(Arrays.asList(tok)), tok, tok2);
// verify
assertThat(indexes.size()).isEqualTo(1);
assertThat(indexes.get(tok)).containsOnly(0);
}
@Test
public void test_compareFor_startComment_and_commentContinue() {
// prepare
final RobotToken startComment = new RobotToken();
startComment.setType(RobotTokenType.START_HASH_COMMENT);
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.START_HASH_COMMENT, 1,
new ArrayList<IRobotLineElement>(Arrays.asList(startComment)));
final RobotToken continueComment = new RobotToken();
continueComment.setType(RobotTokenType.COMMENT_CONTINUE);
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.COMMENT_CONTINUE, 2,
new ArrayList<IRobotLineElement>(Arrays.asList(continueComment)));
// execute
final int cmpResult = robotElemsCmp.compare(startComment, continueComment);
final List<RobotToken> toks = robotElemsCmp.getTokensInElement();
Collections.sort(toks, robotElemsCmp);
// verify
assertThat(cmpResult).isEqualTo(ECompareResult.LESS_THAN.getValue());
assertThat(toks).containsExactly(startComment, continueComment);
}
@Test
public void test_compareFor_commentComment_and_commentContinue() {
// prepare
final RobotToken continueComment1 = new RobotToken();
continueComment1.setType(RobotTokenType.COMMENT_CONTINUE);
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.COMMENT_CONTINUE, 2,
new ArrayList<IRobotLineElement>(Arrays.asList(continueComment1)));
final RobotToken continueComment2 = new RobotToken();
continueComment2.setType(RobotTokenType.COMMENT_CONTINUE);
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.COMMENT_CONTINUE, 2,
new ArrayList<IRobotLineElement>(Arrays.asList(continueComment2)));
// execute
final int cmpResult = robotElemsCmp.compare(continueComment1, continueComment2);
final List<RobotToken> toks = robotElemsCmp.getTokensInElement();
Collections.sort(toks, robotElemsCmp);
// verify
assertThat(cmpResult).isEqualTo(ECompareResult.LESS_THAN.getValue());
assertThat(toks).containsExactly(continueComment1, continueComment2);
}
@Test
public void test_compareFor_notExistingTypes_bothOnTheSamePosition() {
// prepare
final RobotToken tok1 = new RobotToken();
final RobotToken tok2 = new RobotToken();
// execute
final int compareResult = robotElemsCmp.compare(tok1, tok2);
// verify
assertThat(compareResult).isEqualTo(ECompareResult.EQUAL_TO.getValue());
}
@Test
public void test_compareFor_notExistingTypes_onDifferentPosition_theFirstElementIsTheFirst() {
// prepare
final RobotToken tok1 = new RobotToken();
tok1.setStartColumn(0);
tok1.setStartOffset(0);
tok1.setLineNumber(0);
final RobotToken tok2 = new RobotToken();
// execute
final int compareResult = robotElemsCmp.compare(tok1, tok2);
// verify
assertThat(compareResult).isEqualTo(ECompareResult.LESS_THAN.getValue());
}
@Test
public void test_compareFor_notExistingTypes_onDifferentPosition_theFirstElementIsTheSecond() {
// prepare
final RobotToken tok1 = new RobotToken();
final RobotToken tok2 = new RobotToken();
tok2.setStartColumn(0);
tok2.setStartOffset(0);
tok2.setLineNumber(0);
// execute
final int compareResult = robotElemsCmp.compare(tok1, tok2);
// verify
assertThat(compareResult).isEqualTo(ECompareResult.GREATER_THAN.getValue());
}
@Test
public void test_compareFor_existingTypes_differentType() {
// prepare
final RobotToken tok1 = new RobotToken();
tok1.setType(RobotTokenType.START_HASH_COMMENT);
final RobotToken tok2 = new RobotToken();
tok2.setType(RobotTokenType.COMMENT_CONTINUE);
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.START_HASH_COMMENT, 1,
new ArrayList<RobotToken>(Arrays.asList(tok1)));
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.COMMENT_CONTINUE, 2,
new ArrayList<RobotToken>(Arrays.asList(tok2)));
// execute
final int compareResult = robotElemsCmp.compare(tok1, tok2);
final List<RobotToken> toks = robotElemsCmp.getTokensInElement();
Collections.sort(toks, robotElemsCmp);
// verify
assertThat(compareResult).isEqualTo(ECompareResult.LESS_THAN.getValue());
assertThat(toks).containsExactly(tok1, tok2);
}
@Test
public void test_compareFor_existingTypes_theSameType() {
// prepare
final RobotToken tok1 = new RobotToken();
tok1.setType(RobotTokenType.START_HASH_COMMENT);
final RobotToken tok2 = new RobotToken();
tok2.setType(RobotTokenType.START_HASH_COMMENT);
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.START_HASH_COMMENT, 1,
new ArrayList<RobotToken>(Arrays.asList(tok1, tok2)));
// execute
final int compareResult = robotElemsCmp.compare(tok1, tok2);
final List<RobotToken> toks = robotElemsCmp.getTokensInElement();
Collections.sort(toks, robotElemsCmp);
// verify
assertThat(compareResult).isEqualTo(ECompareResult.LESS_THAN.getValue());
assertThat(toks).containsExactly(tok1, tok2);
}
@Test
public void test_compareFor_modifiedSequenceOfTokens() {
// prepare
final RobotToken tok1 = new RobotToken();
tok1.setType(RobotTokenType.START_HASH_COMMENT);
final RobotToken tok2 = new RobotToken();
tok2.setLineNumber(0);
tok2.setStartColumn(0);
tok2.setStartOffset(0);
tok2.setType(RobotTokenType.COMMENT_CONTINUE);
final RobotToken tok3 = new RobotToken();
tok3.setLineNumber(0);
tok3.setStartColumn(1);
tok3.setStartOffset(1);
tok3.setType(RobotTokenType.COMMENT_CONTINUE);
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.START_HASH_COMMENT, 1,
new ArrayList<RobotToken>(Arrays.asList(tok1)));
robotElemsCmp.addPresaveSequenceForType(RobotTokenType.COMMENT_CONTINUE, 2,
new ArrayList<RobotToken>(Arrays.asList(tok3, tok2)));
// execute
final int compareResult = robotElemsCmp.compare(tok3, tok2);
final List<RobotToken> toks = new ArrayList<>(Arrays.asList(tok3, tok2, tok1));
Collections.sort(toks, robotElemsCmp);
// verify
assertThat(compareResult).isEqualTo(ECompareResult.LESS_THAN.getValue());
assertThat(toks).containsExactly(tok1, tok3, tok2);
}
@Before
public void setUp() {
this.robotElemsCmp = new RobotElementsComparatorWithPositionChangedPresave();
}
@After
public void tearDown() throws Exception {
ClassFieldCleaner.init(this);
}
}