package fr.umlv.universe;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.junit.Assert;
import org.junit.Test;
 
public class UniverseTest {
  @Test
  public void emptyConstructor() {
    Assert.assertTrue(new Universe<String>().isEmpty());
  }

  @Test
  public void universeManyMethodFactory() {
    Assert.assertEquals(1, Universe.universe("foo").size());
    Assert.assertEquals(2, Universe.universe(1, 42).size());
    Assert.assertEquals(3, Universe.universe("foo", "bar", "baz").size());
    Assert.assertEquals(2, Universe.universe(12L, 24L, 12L, 24L).size());
    Assert.assertEquals(2, Universe.universe(new String("zab"), new String("zab")).size());
  }
  
  @Test
  public void universeCollectionMethodFactory() {
    List<String> list = Collections.nCopies(100, "zarro");
    Universe<String> universe = Universe.universe(list);
    Assert.assertEquals(1, universe.size());
  }

  @Test
  public void universeAdd() {
    Universe<Object> universe = new Universe<>();
    Assert.assertTrue(universe.isEmpty());
    universe.add("foobar");
    Assert.assertEquals(1, universe.size());
    universe.add("foobar");
    Assert.assertEquals(1, universe.size());
  }
  
  @Test(expected=NullPointerException.class)
  public void universeAddNull() {
    new Universe<Object>().add(null);
  }
  
  @Test
  public void universeIsASet() {
    HashSet<String> result = new HashSet<>(Arrays.asList("h", "e", "l", "l"));
    Set<Object> universe = new Universe<>();
    universe.addAll(result);
    Assert.assertEquals(result, universe);
  }
  
  @Test
  public void universeContainsItself() {
    Universe<Object> universe = Universe.<Object>universe(7, 3);
    Assert.assertTrue(universe.containsAll(universe));
  }
}