package com.sap.furcas.runtime.textblocks.testbase; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.EcoreUtil; import com.sap.furcas.metamodel.FURCAS.textblocks.AbstractToken; import com.sap.furcas.metamodel.FURCAS.textblocks.Bostoken; import com.sap.furcas.metamodel.FURCAS.textblocks.DocumentNode; import com.sap.furcas.metamodel.FURCAS.textblocks.Eostoken; import com.sap.furcas.metamodel.FURCAS.textblocks.LexedToken; import com.sap.furcas.metamodel.FURCAS.textblocks.TextBlock; import com.sap.furcas.runtime.textblocks.TbNavigationUtil; import com.sap.furcas.runtime.textblocks.TbUtil; public class TextblocksTestHelper { /** * Asserts, that the offset is the sum of the lenghts of all left siblings. * * @param node * the DocumentNode to check */ public static void assertNodeOffset(DocumentNode node) { TextBlock parent = node.getParent(); if (parent == null) { assertEquals(0, node.getOffset()); return; } int sum = 0; int index = 0; // TODO: Replace both TbNavigationUtil.getSubNodeAt() calls with // node.getSubNodes().get(), once OCL has been adapted to sort // result list by offset correctly DocumentNode curNode = TbNavigationUtil.getSubNodeAt(parent, index); while (!curNode.equals(node)) { sum += curNode.getLength(); index++; curNode = TbNavigationUtil.getSubNodeAt(parent, index); } assertEquals(sum, node.getOffset()); } /** * Asserts, that a lexedtoken's length equals it's value string's length, * and that a textblock's length equals the sum of it's subnodes. * * @param node * the DocumentNode to check */ public static void assertNodeLength(DocumentNode node) { if (node instanceof LexedToken) { LexedToken t = (LexedToken) node; assertEquals(t.getLength(), t.getValue().length()); } if (node instanceof TextBlock) { TextBlock b = (TextBlock) node; int sum = 0; for (DocumentNode subNode : b.getSubNodes()) { sum += subNode.getLength(); } assertEquals(sum, b.getLength()); } } public static void assertTextBlockAndChildren(TextBlock block) { assertTextBlockChildrenSortedByOffset(block); assertNodeLength(block); assertNodeOffset(block); for (DocumentNode node : block.getSubNodes()) { if (node instanceof AbstractToken) { if (!(node instanceof Bostoken) && !(node instanceof Eostoken)) { assertNodeLength(node); assertNodeOffset(node); } } else { assertTextBlockAndChildren((TextBlock) node); } } } public static void assertTextBlockChildrenSortedByOffset(TextBlock block) { int curOffset = -1; int curAbsOffset = -1; for (DocumentNode node : block.getSubNodes()) { if (!(node instanceof Bostoken) && !(node instanceof Eostoken)) { assertTrue(curOffset < node.getOffset()); int absOffset = TbUtil.getAbsoluteOffset(node); assertTrue(curAbsOffset < absOffset); curOffset = node.getOffset(); curAbsOffset = absOffset; } } } /** * Assert, that the cached string of a block equals the concatenated string * of it's children. * * @param block * TextBlock to check */ public static void assertCachedString(TextBlock block) { String complete = ""; // TODO: replace TbNavigationUtil.getSubNodes(), // once OCL of DocumentNode.getSubNodes() sorts correctly for (DocumentNode subNode : TbNavigationUtil.getSubNodes(block)) { if (subNode instanceof AbstractToken) { AbstractToken t = (AbstractToken) subNode; // catch null value of eos and bos token if (t.getValue() != null) { complete += t.getValue(); } } else { TextBlock b = (TextBlock) subNode; complete += b.getCachedString(); } } assertEquals(complete, block.getCachedString()); } /** * @return true, if RefObject was deleted, false otherwise */ public static boolean isDeleted(EObject eObject) { return EcoreUtil.getRootContainer(eObject).eResource() == null; } public static Resource createTransientResource() { ResourceSet resourceSet = new ResourceSetImpl(); return resourceSet.createResource(URI.createURI("http://some_uri.xmi")); } }