package com.thoughtworks.gauge.annotator;
import com.intellij.lang.ASTNode;
import com.intellij.lang.annotation.Annotation;
import com.intellij.lang.annotation.AnnotationHolder;
import com.intellij.lang.annotation.HighlightSeverity;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiClass;
import com.thoughtworks.gauge.language.psi.impl.ConceptStepImpl;
import com.thoughtworks.gauge.language.psi.impl.SpecStepImpl;
import org.junit.Before;
import org.junit.Test;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;
public class StepAnnotatorTest {
private AnnotationHelper helper;
private AnnotationHolder holder;
private TextRange textRange;
@Before
public void setUp() throws Exception {
holder = mock(AnnotationHolder.class);
helper = mock(AnnotationHelper.class);
textRange = mock(TextRange.class);
}
@Test
public void testShouldNotAnnotateNonGaugeElement() throws Exception {
PsiClass element = mock(PsiClass.class);
when(helper.isGaugeModule(element)).thenReturn(true);
new StepAnnotator(helper).annotate(element, holder);
verify(holder, never()).createErrorAnnotation(any(TextRange.class), any(String.class));
}
@Test
public void testShouldAnnotateBlankSpecStep() throws Exception {
SpecStepImpl element = mock(SpecStepImpl.class);
when(helper.isGaugeModule(element)).thenReturn(true);
when(helper.isEmpty(element)).thenReturn(true);
when(element.getTextRange()).thenReturn(textRange);
new StepAnnotator(helper).annotate(element, holder);
verify(holder, times(1)).createErrorAnnotation(textRange, "Step should not be blank");
}
@Test
public void testShouldAnnotateBlankConceptStep() throws Exception {
ConceptStepImpl element = mock(ConceptStepImpl.class);
when(helper.isGaugeModule(element)).thenReturn(true);
when(helper.isEmpty(any(SpecStepImpl.class))).thenReturn(true);
when(element.getTextRange()).thenReturn(textRange);
when(element.getNode()).thenReturn(mock(ASTNode.class));
new StepAnnotator(helper).annotate(element, holder);
verify(holder, times(1)).createErrorAnnotation(textRange, "Step should not be blank");
}
@Test
public void testShouldNotAnnotateInNonGaugeModule() throws Exception {
SpecStepImpl element = mock(SpecStepImpl.class);
when(helper.isGaugeModule(element)).thenReturn(false);
new StepAnnotator(helper).annotate(element, holder);
verify(holder, never()).createErrorAnnotation(any(TextRange.class), any(String.class));
}
@Test
public void testShouldAnnotateInGaugeModule() throws Exception {
SpecStepImpl element = mock(SpecStepImpl.class);
Module module = mock(Module.class);
when(helper.isGaugeModule(element)).thenReturn(true);
when(element.getTextRange()).thenReturn(textRange);
when(helper.getModule(element)).thenReturn(module);
when(helper.isEmpty(element)).thenReturn(false);
when(helper.isImplemented(element, module)).thenReturn(false);
when(holder.createErrorAnnotation(textRange, "Undefined Step")).thenReturn(new Annotation(1, 1, new HighlightSeverity("dsf", 1), "", ""));
new StepAnnotator(helper).annotate(element, holder);
verify(holder, times(1)).createErrorAnnotation(textRange, "Undefined Step");
}
}