package com.sap.ide.refactoring.core.textual;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.text.source.ISourceViewer;
import org.junit.After;
import org.junit.Test;
import com.sap.furcas.metamodel.textblocks.DocumentNode;
import com.sap.ide.cts.editor.AbstractGrammarBasedEditor;
import com.sap.ide.cts.editor.document.CtsDocument;
import com.sap.ide.refactoring.test.RefactoringBaseTest;
import com.sap.mi.textual.parsing.textblocks.TbNavigationUtil;
import com.sap.mi.textual.textblocks.model.TextBlocksModel;
public class TestSourcePositionModelLocator extends RefactoringBaseTest {
/**
* System under test
*/
private SourcePositionModelLocator sut;
private ISourceViewer viewer;
private CtsDocument document;
private AbstractGrammarBasedEditor editor;
public TestSourcePositionModelLocator() {
isIntegrationTest = true;
}
/**
* Initialize class members for the next testcase run
*
* @param className
*/
private void initializeForClass(String className) {
final EObject refObject = findRunletClass(className);
assertNotNull(refObject);
assertTrue(refObject.is___Alive());
editor = openEditor(refObject);
document = getDocument(editor);
TextBlocksModel model = document.getTextBlocksModelStore().getModel();
viewer = editor.getSourceViewerPublic();
viewer.setEditable(false);
sut = new SourcePositionModelLocator(model, viewer);
}
@Test
public void testSourceViewerOffsetHandlingAssumption() {
initializeForClass("OrderedAssocTestCase");
setCursor(0);
assertEquals(0, viewer.getSelectedRange().x);
assertEquals(0, viewer.getSelectedRange().y);
setCursor(10);
assertEquals(10, viewer.getSelectedRange().x);
assertEquals(0, viewer.getSelectedRange().y);
selectRange(10, 20);
assertEquals(10, viewer.getSelectedRange().x);
assertEquals(20, viewer.getSelectedRange().y);
}
@Test
public void testFindSingleSelectedCorrespondingModelElements() {
initializeForClass("OrderedAssocTestCase");
setCursor("class Order".length());
Collection<EObject> selected = sut.findSelectedCorrespondingModelElements();
assertEquals(1, selected.size());
assertEquals(findRunletClass("OrderedAssocTestCase"), selected.iterator().next());
}
@Test
public void testFindRootBlockForFullSelection() {
initializeForClass("OrderedAssocTestCase");
selectRange(0, document.getLength());
Collection<DocumentNode> selected = sut.findSelecetedTextBlocks();
assertEquals("Only root TextBlock shall be contained", 1, selected.size());
DocumentNode rootNode = selected.iterator().next();
assertEquals(rootNode, TbNavigationUtil.getUltraRoot(rootNode));
}
@Test
public void testFindCorrespondingModelElementsForFullSelection() {
initializeForClass("OrderedAssocTestCase");
selectRange(0, document.getLength());
Collection<EObject> selected = sut.findSelectedCorrespondingModelElements();
assertEquals(1, selected.size());
assertEquals(findRunletClass("OrderedAssocTestCase"), selected.iterator().next());
}
@Test
public void testFindReferencedModelElementsForSelectedWord() {
initializeForClass("RedefineParameterTst2");
String text = document.get();
selectRange(text.indexOf("Number"), "Number".length());
Collection<EObject> selected = sut.findSelectedReferencedModelElements();
assertEquals(1, selected.size());
assertEquals(findRunletClass("Number"), selected.iterator().next());
}
/**
* The class has a method and within this method two statements. Select
* those two statements.
*/
@Test
public void testFindMultipleSelectedCorrespondingModelElements() {
initializeForClass("RedefineParameterTst2");
String wholeClass = document.get();
String methodOnly = wholeClass.substring(wholeClass.indexOf("{") + 1, wholeClass.lastIndexOf("}"));
int offsetOfMethodInClass = wholeClass.indexOf(methodOnly);
int statementStart = methodOnly.indexOf("var m") - 1; // begin of the
// first statement
int statementsEnd = methodOnly.lastIndexOf(";") - 1; // end of the
// second statement
selectRange(offsetOfMethodInClass + statementStart, statementsEnd - statementStart);
Collection<EObject> selected = sut.findSelectedCorrespondingModelElements();
assertEquals(2, selected.size());
}
/**
* The class contains three occurrences of the variable "m". Test that the
* last one has a reference to second occurrence (var usage to declaration)
*/
@Test
public void testFindSelectedReferencedModelElements() {
initializeForClass("RedefineParameterTst2");
String text = document.get();
int usageIndex = text.lastIndexOf("m");
int varDeclIndex = text.substring(0, usageIndex).lastIndexOf("m");
selectRange(usageIndex, 1);
Collection<EObject> referenced = sut.findSelectedReferencedModelElements();
assertEquals(1, referenced.size());
EObject varDeclReferenced = referenced.iterator().next();
selectRange(varDeclIndex, 1);
Collection<EObject> corresponding = sut.findSelectedCorrespondingModelElements();
assertEquals(1, corresponding.size());
EObject varDecl = corresponding.iterator().next();
assertEquals(varDecl, varDeclReferenced);
}
private void setCursor(int offset) {
selectRange(offset, 0);
}
private void selectRange(int offset, int length) {
viewer.setSelectedRange(offset, length); // set cursor within class name
}
@After
public void releaseResources() {
if (editor != null) {
close(editor);
}
editor = null;
document = null;
viewer = null;
sut = null;
}
}