package com.codeaffine.extras.workingset.internal;
import static com.codeaffine.extras.workingset.internal.RegexPatterns.ANYTHING;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.eclipse.core.resources.IProject;
import org.eclipse.ui.IWorkingSet;
import org.junit.Before;
import org.junit.Test;
import com.codeaffine.extras.workingset.internal.JdtFeature;
import com.codeaffine.extras.workingset.internal.ValidationStatus;
import com.codeaffine.extras.workingset.internal.Validator;
import com.codeaffine.extras.workingset.internal.WorkingSetsProvider;
import com.codeaffine.extras.workingset.internal.ValidationStatus.Severity;
public class ValidatorTest {
private WorkingSetsProvider workingSetsProvider;
private TestProjectsProvider projectsProvider;
private JdtFeature jdtFeature;
private Validator validator;
@Before
public void setUp() {
workingSetsProvider = mock( WorkingSetsProvider.class );
when( workingSetsProvider.getWorkingSets() ).thenReturn( new IWorkingSet[ 0 ] );
projectsProvider = new TestProjectsProvider();
jdtFeature = mock( JdtFeature.class );
validator = new Validator( workingSetsProvider, projectsProvider, jdtFeature );
}
@Test
public void testValidateEmptyName() {
ValidationStatus validationStatus = validator.validate( null, "", "pattern" );
assertStatusIsError( validationStatus, Validator.MSG_NAME_EMPTY );
}
@Test
public void testValidateExistingName() {
IWorkingSet workingSet = createWorkingSet( "name" );
when( workingSetsProvider.getWorkingSets() ).thenReturn( new IWorkingSet[] { workingSet } );
ValidationStatus validationStatus = validator.validate( null, workingSet.getLabel(), "pattern" );
assertStatusIsWarning( validationStatus, Validator.MSG_NAME_EXISTS );
}
@Test
public void testValidateNonExistingName() {
IWorkingSet workingSet = createWorkingSet( "name" );
when( workingSetsProvider.getWorkingSets() ).thenReturn( new IWorkingSet[] { workingSet } );
ValidationStatus validationStatus = validator.validate( null, "ther-name", "pattern" );
assertStatusIsOk( validationStatus );
}
@Test
public void testValidateUnchangedName() {
IWorkingSet workingSet = createWorkingSet( "label" );
when( workingSetsProvider.getWorkingSets() ).thenReturn( new IWorkingSet[] { workingSet } );
ValidationStatus validationStatus = validator.validate( workingSet, workingSet.getLabel(), "pattern" );
assertStatusIsOk( validationStatus );
}
@Test
public void testValidateEmptyPattern() {
ValidationStatus validationStatus = validator.validate( null, "name", "" );
assertStatusIsError( validationStatus, Validator.MSG_PATTERN_EMPTY );
}
@Test
public void testValidateInvalidPattern() {
ValidationStatus validationStatus = validator.validate( null, "name", "*" );
assertStatusIsError( validationStatus, Validator.MSG_PATTERN_INVALID );
}
@Test
public void testValidateWithNameAndPattern() {
ValidationStatus validationStatus = validator.validate( null, "name", "pattern" );
assertStatusIsOk( validationStatus );
}
@Test
public void testValidateNonMatchingPatternWhenJdtInstalled() {
installJdt();
createProject( "name" );
ValidationStatus validationStatus = validator.validate( null, "name", "matches-nothing" );
assertStatusIsWarning( validationStatus, Validator.MSG_JDT_RESTRICTION );
}
@Test
public void testValidateMatchingPatternWhenJdtInstalled() {
installJdt();
createProject( "name" );
ValidationStatus validationStatus = validator.validate( null, "name", ANYTHING );
assertStatusIsOk( validationStatus );
}
@Test
public void testValidateNonMatchingPatternWhenJdtNotInstalled() {
createProject( "name" );
ValidationStatus validationStatus = validator.validate( null, "name", "matches-nothing" );
assertStatusIsOk( validationStatus );
}
@Test
public void testValidationErrorIsNotObscuredByWarning() {
installJdt();
createProject( "name" );
ValidationStatus validationStatus = validator.validate( null, "", "matches-nothing" );
assertStatusIsError( validationStatus, Validator.MSG_NAME_EMPTY );
}
private static void assertStatusIsOk( ValidationStatus validationStatus ) {
assertThat( validationStatus.getSeverity() ).isEqualTo( Severity.NONE );
assertThat( validationStatus.getMessage() ).isEmpty();
}
private static void assertStatusIsWarning( ValidationStatus validationStatus, String message ) {
assertThat( validationStatus.getSeverity() ).isEqualTo( Severity.WARNING );
assertThat( validationStatus.getMessage() ).isEqualTo( message );
}
private static void assertStatusIsError( ValidationStatus validationStatus, String message ) {
assertThat( validationStatus.getSeverity() ).isEqualTo( Severity.ERROR );
assertThat( validationStatus.getMessage() ).isEqualTo( message );
}
private void createProject( String name ) {
IProject result = mock( IProject.class );
when( result.getName() ).thenReturn( name );
projectsProvider.addProject( result );
}
private static IWorkingSet createWorkingSet( String label ) {
IWorkingSet result = mock( IWorkingSet.class );
when( result.getLabel() ).thenReturn( label );
return result;
}
private void installJdt() {
when( jdtFeature.isInstalled() ).thenReturn( true );
}
}