/**
*
*/
package com.sap.furcas.runtime.textblocks;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Map;
import org.junit.Test;
import com.sap.furcas.metamodel.FURCAS.textblocks.AbstractToken;
import com.sap.furcas.metamodel.FURCAS.textblocks.DocumentNode;
import com.sap.furcas.metamodel.FURCAS.textblocks.TextBlock;
import com.sap.furcas.metamodel.FURCAS.textblocks.Version;
import com.sap.furcas.runtime.textblocks.testbase.FixtureProvidingTextBlockTest;
/**
*
*/
public class TestTbUtil extends FixtureProvidingTextBlockTest {
@Test
public void testIsAncestorTrue() throws Exception {
TextBlock block1 = modelFactory.createTextBlock();
TextBlock block2 = modelFactory.createTextBlock();
TextBlock block3 = modelFactory.createTextBlock();
block1.setParent(block2);
block2.setParent(block3);
assertTrue(TbUtil.isAncestorOf(block3, block1));
}
@Test
public void testIsAncestorFalse() throws Exception {
TextBlock block1 = modelFactory.createTextBlock();
TextBlock block2 = modelFactory.createTextBlock();
TextBlock block3 = modelFactory.createTextBlock();
block1.setParent(block2);
block3.setParent(block2);
assertFalse(TbUtil.isAncestorOf(block3, block1));
}
@Test
public void testIsAncestorNull() throws Exception {
assertFalse(TbUtil.isAncestorOf(null, null));
}
/**
* Only tests with all offsets relative.
*
*/
@Test
public void testGetAbsoluteOffset() {
assertEquals(0, TbUtil.getAbsoluteOffset(main));
assertEquals(0, TbUtil.getAbsoluteOffset(left));
assertEquals(0, TbUtil.getAbsoluteOffset(leftLeft));
assertEquals(0, TbUtil.getAbsoluteOffset(bos));
assertEquals(0, TbUtil.getAbsoluteOffset(lexed1));
assertEquals(5, TbUtil.getAbsoluteOffset(lexed2));
assertEquals(6, TbUtil.getAbsoluteOffset(middle));
assertEquals(6, TbUtil.getAbsoluteOffset(lexed3));
assertEquals(14, TbUtil.getAbsoluteOffset(subBlock1));
assertEquals(14, TbUtil.getAbsoluteOffset(subBlock2));
assertEquals(14, TbUtil.getAbsoluteOffset(subBlock3));
assertEquals(14, TbUtil.getAbsoluteOffset(subBlock4));
assertEquals(14, TbUtil.getAbsoluteOffset(subToken));
assertEquals(15, TbUtil.getAbsoluteOffset(right));
assertEquals(15, TbUtil.getAbsoluteOffset(lexed4));
assertEquals(20, TbUtil.getAbsoluteOffset(eos));
}
@Test
public void testGetNewestVersion() {
assertEquals(Version.REFERENCE, main.getVersion());
assertEquals(0, main.getOtherVersions().size());
// REFERENCE is newest Version
assertEquals(main, TbUtil.getNewestVersion(main));
TextBlock mainPrevious = modelFactory.createTextBlock();
mainPrevious.setVersion(Version.PREVIOUS);
main.getOtherVersions().add(mainPrevious);
mainPrevious.getOtherVersions().add(main);
assertEquals(1, main.getOtherVersions().size());
assertEquals(1, mainPrevious.getOtherVersions().size());
// PREVIOUS is newest Version
assertEquals(mainPrevious, TbUtil.getNewestVersion(main));
assertEquals(mainPrevious, TbUtil.getNewestVersion(mainPrevious));
TextBlock mainCurrent = modelFactory.createTextBlock();
mainCurrent.setVersion(Version.CURRENT);
main.getOtherVersions().add(mainCurrent);
mainCurrent.getOtherVersions().add(main);
mainCurrent.getOtherVersions().add(mainPrevious);
mainPrevious.getOtherVersions().add(mainCurrent);
assertEquals(2, main.getOtherVersions().size());
assertEquals(2, mainCurrent.getOtherVersions().size());
assertEquals(2, mainPrevious.getOtherVersions().size());
// CURRENT is newest Version
assertEquals(mainCurrent, TbUtil.getNewestVersion(mainCurrent));
}
@Test
public void testCreateNewCopyMain() {
assertEquals(Version.REFERENCE, main.getVersion());
assertEquals(0, main.getOtherVersions().size());
DocumentNode mainCurrentNode = TbUtil.createNewCopy(main, Version.CURRENT, false, null);
assertEquals(true, mainCurrentNode instanceof TextBlock);
TextBlock mainCurrent = (TextBlock) mainCurrentNode;
// check versions and version references of root block
assertEquals(Version.REFERENCE, main.getVersion());
assertEquals(Version.CURRENT, mainCurrent.getVersion());
assertEquals(1, main.getOtherVersions().size());
assertEquals(1, mainCurrent.getOtherVersions().size());
assertEquals(true, main.getOtherVersions().contains(mainCurrent));
assertEquals(true, mainCurrent.getOtherVersions().contains(main));
// check that the old model has a new other version reference
// with the correct version and equal attributes and corresponding
// references (a parallel structure with a new version)
assertNewCopyResult(main);
assertNewCopyResult(left);
assertNewCopyResult(leftLeft);
assertNewCopyResult(bos);
assertNewCopyResult(lexed1);
assertNewCopyResult(lexed2);
assertNewCopyResult(middle);
assertNewCopyResult(lexed3);
assertNewCopyResult(subBlock1);
assertNewCopyResult(subBlock2);
assertNewCopyResult(subBlock3);
assertNewCopyResult(subBlock4);
assertNewCopyResult(subToken);
assertNewCopyResult(lexed4);
assertNewCopyResult(right);
assertNewCopyResult(eos);
}
/**
* Checks the existence of other version CURRENT with equal attributes and
* corresponding references.
*
* @param copyBase
* the node that was copied
*/
private void assertNewCopyResult(DocumentNode oldVersion) {
assertEquals(Version.REFERENCE, oldVersion.getVersion());
assertEquals(1, oldVersion.getOtherVersions().size());
DocumentNode newVersion = oldVersion.getOtherVersions().get(0);
assertEquals(Version.CURRENT, newVersion.getVersion());
assertEquals(1, newVersion.getOtherVersions().size());
assertEquals(true, newVersion.getOtherVersions().contains(oldVersion));
assertEquals(newVersion.getOffset(), oldVersion.getOffset());
assertEquals(newVersion.getLength(), oldVersion.getLength());
assertEquals(newVersion.isOffsetRelative(), oldVersion.isOffsetRelative());
if (oldVersion instanceof TextBlock) {
assertNewCopyResultBlock((TextBlock) oldVersion, (TextBlock) newVersion);
} else {
assertNewCopyResultToken((AbstractToken) oldVersion, (AbstractToken) newVersion);
}
}
private void assertNewCopyResultBlock(TextBlock oldVersion, TextBlock newVersion) {
if (oldVersion.getParent() != null) {
assertEquals(newVersion.getParent(), oldVersion.getParent().getOtherVersions().get(0));
} else {
assertEquals(null, newVersion.getParent());
}
assertEquals(oldVersion.getSubBlocks().size(), newVersion.getSubBlocks().size());
for (TextBlock oldSubBlock : oldVersion.getSubBlocks()) {
assertEquals(true, newVersion.getSubBlocks().contains(oldSubBlock.getOtherVersions().get(0)));
}
assertEquals(oldVersion.getTokens().size(), newVersion.getTokens().size());
for (AbstractToken oldToken : oldVersion.getTokens()) {
assertEquals(true, newVersion.getTokens().contains(oldToken.getOtherVersions().get(0)));
}
}
private void assertNewCopyResultToken(AbstractToken oldVersion, AbstractToken newVersion) {
assertEquals(newVersion.getParent(), oldVersion.getParent().getOtherVersions().get(0));
}
@Test
public void testReferenceVersions() {
assertEquals(Version.REFERENCE, main.getVersion());
assertEquals(0, main.getOtherVersions().size());
TextBlock mainPrevious = modelFactory.createTextBlock();
mainPrevious.setVersion(Version.PREVIOUS);
TextBlock mainCurrent = modelFactory.createTextBlock();
mainCurrent.setVersion(Version.CURRENT);
TbUtil.referenceVersions(main, mainPrevious);
assertEquals(1, main.getOtherVersions().size());
assertEquals(1, mainPrevious.getOtherVersions().size());
assertEquals(true, main.getOtherVersions().contains(mainPrevious));
assertEquals(true, mainPrevious.getOtherVersions().contains(main));
TbUtil.referenceVersions(mainCurrent, mainPrevious);
assertEquals(2, main.getOtherVersions().size());
assertEquals(2, mainPrevious.getOtherVersions().size());
assertEquals(2, mainCurrent.getOtherVersions().size());
assertEquals(true, main.getOtherVersions().contains(mainPrevious));
assertEquals(true, main.getOtherVersions().contains(mainCurrent));
assertEquals(true, mainPrevious.getOtherVersions().contains(main));
assertEquals(true, mainPrevious.getOtherVersions().contains(mainCurrent));
assertEquals(true, mainCurrent.getOtherVersions().contains(main));
assertEquals(true, mainCurrent.getOtherVersions().contains(mainPrevious));
// should not add more, already existing
TbUtil.referenceVersions(main, mainCurrent);
TbUtil.referenceVersions(mainCurrent, main);
assertEquals(2, main.getOtherVersions().size());
assertEquals(2, mainPrevious.getOtherVersions().size());
assertEquals(2, mainCurrent.getOtherVersions().size());
assertEquals(true, main.getOtherVersions().contains(mainPrevious));
assertEquals(true, main.getOtherVersions().contains(mainCurrent));
assertEquals(true, mainPrevious.getOtherVersions().contains(main));
assertEquals(true, mainPrevious.getOtherVersions().contains(mainCurrent));
assertEquals(true, mainCurrent.getOtherVersions().contains(main));
assertEquals(true, mainCurrent.getOtherVersions().contains(mainPrevious));
// should not add more, not reflexive
TbUtil.referenceVersions(main, main);
assertEquals(2, main.getOtherVersions().size());
assertEquals(2, mainPrevious.getOtherVersions().size());
assertEquals(2, mainCurrent.getOtherVersions().size());
assertEquals(true, main.getOtherVersions().contains(mainPrevious));
assertEquals(true, main.getOtherVersions().contains(mainCurrent));
assertEquals(true, mainPrevious.getOtherVersions().contains(main));
assertEquals(true, mainPrevious.getOtherVersions().contains(mainCurrent));
assertEquals(true, mainCurrent.getOtherVersions().contains(main));
assertEquals(true, mainCurrent.getOtherVersions().contains(mainPrevious));
}
/**
* Almost same test as testReferenceVersions, only with the parameters
* swapped.
*
*/
@Test
public void testReferenceVersionsSwappedParameters() {
TextBlock mainPrevious = modelFactory.createTextBlock();
mainPrevious.setVersion(Version.PREVIOUS);
TextBlock mainCurrent = modelFactory.createTextBlock();
mainCurrent.setVersion(Version.CURRENT);
TbUtil.referenceVersions(mainPrevious, main);
assertEquals(1, main.getOtherVersions().size());
assertEquals(1, mainPrevious.getOtherVersions().size());
assertEquals(true, main.getOtherVersions().contains(mainPrevious));
assertEquals(true, mainPrevious.getOtherVersions().contains(main));
TbUtil.referenceVersions(mainPrevious, mainCurrent);
assertEquals(2, main.getOtherVersions().size());
assertEquals(2, mainPrevious.getOtherVersions().size());
assertEquals(2, mainCurrent.getOtherVersions().size());
assertEquals(true, main.getOtherVersions().contains(mainPrevious));
assertEquals(true, main.getOtherVersions().contains(mainCurrent));
assertEquals(true, mainPrevious.getOtherVersions().contains(main));
assertEquals(true, mainPrevious.getOtherVersions().contains(mainCurrent));
assertEquals(true, mainCurrent.getOtherVersions().contains(main));
assertEquals(true, mainCurrent.getOtherVersions().contains(mainPrevious));
// should not add more, already existing
TbUtil.referenceVersions(mainCurrent, main);
TbUtil.referenceVersions(main, mainCurrent);
assertEquals(2, main.getOtherVersions().size());
assertEquals(2, mainPrevious.getOtherVersions().size());
assertEquals(2, mainCurrent.getOtherVersions().size());
assertEquals(true, main.getOtherVersions().contains(mainPrevious));
assertEquals(true, main.getOtherVersions().contains(mainCurrent));
assertEquals(true, mainPrevious.getOtherVersions().contains(main));
assertEquals(true, mainPrevious.getOtherVersions().contains(mainCurrent));
assertEquals(true, mainCurrent.getOtherVersions().contains(main));
assertEquals(true, mainCurrent.getOtherVersions().contains(mainPrevious));
}
@Test
public void testGetRelativeOffsetFromToken() {
// at start offset
assertEquals(0, TbUtil.getRelativeOffsetFromNode(6, lexed3));
// before start offset
assertEquals(-2, TbUtil.getRelativeOffsetFromNode(4, lexed3));
// after start offset
assertEquals(2, TbUtil.getRelativeOffsetFromNode(8, lexed3));
}
@Test
public void testFillNodeLevelMap() {
Map<Integer, DocumentNode> nodeLevelMap = TbUtil.createNodeLevelMap(subToken, TbNavigationUtil.getLevel(subToken));
assertEquals(main, nodeLevelMap.get(0));
assertEquals(middle, nodeLevelMap.get(1));
assertEquals(subBlock1, nodeLevelMap.get(2));
assertEquals(subBlock2, nodeLevelMap.get(3));
assertEquals(subBlock3, nodeLevelMap.get(4));
assertEquals(subBlock4, nodeLevelMap.get(5));
}
}