package com.thoughtworks.gauge.findUsages.helper; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import com.thoughtworks.gauge.StepValue; import com.thoughtworks.gauge.findUsages.StepCollector; import com.thoughtworks.gauge.helper.ModuleHelper; import com.thoughtworks.gauge.language.psi.impl.ConceptStepImpl; import com.thoughtworks.gauge.language.psi.impl.SpecStepImpl; import org.junit.Test; import java.util.ArrayList; import static org.mockito.Mockito.*; public class ReferenceSearchHelperTest extends LightCodeInsightFixtureTestCase { private Project project; private ModuleHelper moduleHelper; private SearchScope scope; private StepCollector collector; @Override public void setUp() throws Exception { super.setUp(); project = myFixture.getProject(); moduleHelper = mock(ModuleHelper.class); scope = mock(SearchScope.class); collector = mock(StepCollector.class); } @Test public void testShouldFindReferencesOfGaugeElement() throws Exception { SpecStepImpl element = mock(SpecStepImpl.class); ReferencesSearch.SearchParameters searchParameters = new ReferencesSearch.SearchParameters(element, GlobalSearchScope.allScope(project), true); when(moduleHelper.isGaugeModule(element)).thenReturn(true); boolean shouldFindReferences = new ReferenceSearchHelper(moduleHelper).shouldFindReferences(searchParameters, searchParameters.getElementToSearch()); assertTrue("Should find reference for SpecStep(Expected: true, Actual: false)", shouldFindReferences); } @Test public void testShouldNotFindReferencesOfNonGaugeElement() throws Exception { PsiClass element = mock(PsiClass.class); ReferencesSearch.SearchParameters searchParameters = new ReferencesSearch.SearchParameters(element, GlobalSearchScope.allScope(project), true); when(moduleHelper.isGaugeModule(element)).thenReturn(true); ReferenceSearchHelper referenceSearchHelper = new ReferenceSearchHelper(moduleHelper); boolean shouldFindReferences = referenceSearchHelper.shouldFindReferences(searchParameters, searchParameters.getElementToSearch()); assertFalse("Should find reference for PsiClass(Expected: false, Actual: true)", shouldFindReferences); } @Test public void testShouldNotFindReferencesWhenUnknownScope() throws Exception { PsiClass element = mock(PsiClass.class); ReferencesSearch.SearchParameters searchParameters = new ReferencesSearch.SearchParameters(element, scope, true); when(moduleHelper.isGaugeModule(element)).thenReturn(true); when(scope.getDisplayName()).thenReturn(ReferenceSearchHelper.UNKNOWN_SCOPE); ReferenceSearchHelper referenceSearchHelper = new ReferenceSearchHelper(moduleHelper); boolean shouldFindReferences = referenceSearchHelper.shouldFindReferences(searchParameters, searchParameters.getElementToSearch()); assertFalse("Should find reference When unknown scope(Expected: false, Actual: true)", shouldFindReferences); } @Test public void testShouldFindReferencesWhenNotUnknownScope() throws Exception { PsiClass element = mock(PsiClass.class); ReferencesSearch.SearchParameters searchParameters = new ReferencesSearch.SearchParameters(element, scope, true); when(moduleHelper.isGaugeModule(element)).thenReturn(true); when(scope.getDisplayName()).thenReturn("Other Scope"); ReferenceSearchHelper referenceSearchHelper = new ReferenceSearchHelper(moduleHelper); boolean shouldFindReferences = referenceSearchHelper.shouldFindReferences(searchParameters, searchParameters.getElementToSearch()); assertFalse("Should find reference When scope is not unknown(Expected: true, Actual: false)", shouldFindReferences); } @Test public void testGetReferenceElements() throws Exception { SpecStepImpl element = mock(SpecStepImpl.class); StepValue stepValue = new StepValue("hello", "", new ArrayList<>()); ReferencesSearch.SearchParameters searchParameters = new ReferencesSearch.SearchParameters(element, scope, true); when(element.getStepValue()).thenReturn(stepValue); ReferenceSearchHelper referenceSearchHelper = new ReferenceSearchHelper(); referenceSearchHelper.getPsiElements(collector, searchParameters.getElementToSearch()); verify(collector, times(1)).get("hello"); } @Test public void testGetReferenceElementsForConceptStep() throws Exception { ConceptStepImpl element = mock(ConceptStepImpl.class); StepValue stepValue = new StepValue("# hello", "", new ArrayList<>()); ReferencesSearch.SearchParameters searchParameters = new ReferencesSearch.SearchParameters(element, scope, true); when(element.getStepValue()).thenReturn(stepValue); ReferenceSearchHelper referenceSearchHelper = new ReferenceSearchHelper(); referenceSearchHelper.getPsiElements(collector, searchParameters.getElementToSearch()); verify(collector, times(1)).get("hello"); } @Test public void testShouldNotFindReferencesIfNotGaugeModule() throws Exception { SpecStepImpl element = mock(SpecStepImpl.class); ReferencesSearch.SearchParameters searchParameters = new ReferencesSearch.SearchParameters(element, scope, true); when(moduleHelper.isGaugeModule(element)).thenReturn(false); ReferenceSearchHelper referenceSearchHelper = new ReferenceSearchHelper(moduleHelper); boolean shouldFindReferences = referenceSearchHelper.shouldFindReferences(searchParameters, searchParameters.getElementToSearch()); assertFalse("Should find reference for non Gauge Module(Expected: false, Actual: true)", shouldFindReferences); verify(scope, never()).getDisplayName(); } @Test public void testShouldFindReferencesIfGaugeModule() throws Exception { SpecStepImpl element = mock(SpecStepImpl.class); ReferencesSearch.SearchParameters searchParameters = new ReferencesSearch.SearchParameters(element, scope, true); when(moduleHelper.isGaugeModule(element)).thenReturn(true); when(scope.getDisplayName()).thenReturn("Other Scope"); ReferenceSearchHelper referenceSearchHelper = new ReferenceSearchHelper(moduleHelper); referenceSearchHelper.shouldFindReferences(searchParameters, searchParameters.getElementToSearch()); verify(scope, times(1)).getDisplayName(); } }