package com.hannesdorfmann.sqlbrite.objectmapper.processor;

import java.util.HashSet;
import java.util.Set;
import javax.lang.model.element.Element;
import javax.lang.model.element.Modifier;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

/**
 * @author Hannes Dorfmann
 */
public class CompareModifierUtilsTest {

  Element a, b;
  Set<Modifier> aModifiers, bModifiers;

  @Before
  public void init() {
    a = Mockito.mock(Element.class);
    b = Mockito.mock(Element.class);

    aModifiers = new HashSet<Modifier>();
    bModifiers = new HashSet<Modifier>();

    Mockito.doReturn(aModifiers).when(a).getModifiers();
    Mockito.doReturn(bModifiers).when(b).getModifiers();
  }

  @Test
  public void aPublicBnot() {
    aModifiers.add(Modifier.PUBLIC);
    bModifiers.add(Modifier.PRIVATE);

    Assert.assertEquals(-1, ModifierUtils.compareModifierVisibility(a, b));
  }

  @Test
  public void aDefaultBnot() {
    bModifiers.add(Modifier.PRIVATE);

    Assert.assertEquals(-1, ModifierUtils.compareModifierVisibility(a, b));
  }

  @Test
  public void aProtectedBnot() {
    aModifiers.add(Modifier.PROTECTED);
    bModifiers.add(Modifier.PRIVATE);

    Assert.assertEquals(-1, ModifierUtils.compareModifierVisibility(a, b));
  }


  @Test
  public void bPublicAnot() {
    bModifiers.add(Modifier.PUBLIC);
    aModifiers.add(Modifier.PRIVATE);

    Assert.assertEquals(1, ModifierUtils.compareModifierVisibility(a, b));
  }

  @Test
  public void bDefaultAnot() {
    aModifiers.add(Modifier.PRIVATE);

    Assert.assertEquals(1, ModifierUtils.compareModifierVisibility(a, b));
  }

  @Test
  public void bProtectedAnot() {
    aModifiers.add(Modifier.PRIVATE);
    bModifiers.add(Modifier.PROTECTED);

    Assert.assertEquals(1, ModifierUtils.compareModifierVisibility(a, b));
  }

  @Test
  public void samePrivate() {
    aModifiers.add(Modifier.PRIVATE);
    bModifiers.add(Modifier.PRIVATE);

    Assert.assertEquals(0, ModifierUtils.compareModifierVisibility(a, b));
  }

  @Test
  public void sameProtected() {
    aModifiers.add(Modifier.PRIVATE);
    bModifiers.add(Modifier.PRIVATE);

    Assert.assertEquals(0, ModifierUtils.compareModifierVisibility(a, b));
  }

  @Test
  public void sameDefault() {

    Assert.assertEquals(0, ModifierUtils.compareModifierVisibility(a, b));
  }

  @Test
  public void samePublic() {
    aModifiers.add(Modifier.PUBLIC);
    bModifiers.add(Modifier.PUBLIC);

    Assert.assertEquals(0, ModifierUtils.compareModifierVisibility(a, b));
  }




}
