/**
  * @test
  */
 public function shouldContainsItemWork()
 {
     $o1 = new EntitiesDescriptor();
     $o2 = new EntityDescriptor('ed1');
     $o3 = new EntitiesDescriptor();
     $o4 = new EntityDescriptor('ed2');
     $x1 = new EntitiesDescriptor();
     $x2 = new EntityDescriptor('ed3');
     $o1->addItem($o2);
     $o1->addItem($o3);
     $o3->addItem($o4);
     $this->assertTrue($o1->containsItem($o2));
     $this->assertTrue($o1->containsItem($o3));
     $this->assertTrue($o1->containsItem($o4));
     $this->assertFalse($o1->containsItem($x1));
     $this->assertFalse($o1->containsItem($x2));
     $this->assertTrue($o3->containsItem($o4));
     $this->assertFalse($o3->containsItem($o1));
     $this->assertFalse($o3->containsItem($o2));
     $this->assertFalse($o3->containsItem($x1));
     $this->assertFalse($o3->containsItem($x2));
 }
 /**
  * @param EntitiesDescriptor|EntityDescriptor $item
  * @return $this|EntitiesDescriptor
  * @throws \InvalidArgumentException
  */
 public function addItem($item)
 {
     if (!$item instanceof EntitiesDescriptor && !$item instanceof EntityDescriptor) {
         throw new \InvalidArgumentException('Expected EntitiesDescriptor or EntityDescriptor');
     }
     if ($item === $this) {
         throw new \InvalidArgumentException('Circular reference detected');
     }
     if ($item instanceof EntitiesDescriptor) {
         if ($item->containsItem($this)) {
             throw new \InvalidArgumentException('Circular reference detected');
         }
     }
     $this->items[] = $item;
     return $this;
 }