@Test(expected = IllegalArgumentException.class)
  public void invalid_up_cast() {
    CatCage catCage = new CatCage();
    PetCage cage = (PetCage) catCage;

    cage.enter(new Dog());
  }
  @Test
  public void allows() {
    Animal a = new Animal();
    Cat c = new Cat();
    Dog d = new Dog();
    PersianCat pc = new PersianCat();

    PetCage cage = new PetCage();
    assertTrue(cage.allows(a));
    assertTrue(cage.allows(c));
    assertTrue(cage.allows(d));
    assertTrue(cage.allows(pc));

    PetCage catCage = new CatCage();
    assertTrue(catCage.allows(c));
    assertTrue(catCage.allows(pc));
    assertFalse(catCage.allows(a));
    assertFalse(catCage.allows(d));
  }
  @Test(expected = IllegalStateException.class)
  public void takeOut_from_empty_cat_cage() {
    PetCage cage = new CatCage();

    cage.takeOut();
  }
  @Test
  public void empty() {
    PetCage cage = new PetCage();
    PetCage catCage = new CatCage();

    assertTrue(cage.isEmpty());
    assertTrue(catCage.isEmpty());

    Animal a = new Animal();
    Cat c = new Cat();

    cage.enter(a);
    catCage.enter(c);

    assertFalse(cage.isEmpty());
    assertFalse(catCage.isEmpty());

    cage.takeOut();
    catCage.takeOut();

    assertTrue(cage.isEmpty());
    assertTrue(catCage.isEmpty());
  }