/**
  *
  */
 public function testWrite_WriteObjects_ObjectsWritten()
 {
     $batchSizes = array(10, 30, 100, 300);
     foreach ($batchSizes as $size) {
         $owners = array();
         $dogs = array();
         $cats = array();
         $writer = new \BatchedWriter($size);
         for ($i = 0; $i < 100; $i++) {
             $owner = new Human();
             $owner->Name = 'Human ' . $i;
             $dog = new Dog();
             $dog->Name = 'Dog ' . $i;
             $cat = new Cat();
             $cat->Name = 'Cat ' . $i;
             $owner->onAfterExistsCallback(function ($owner) use($dog, $writer) {
                 $dog->OwnerID = $owner->ID;
                 $writer->write($dog);
             });
             $dog->onAfterExistsCallback(function ($dog) use($cat, $writer) {
                 $cat->EnemyID = $dog->ID;
                 $writer->write($cat);
             });
             $owners[] = $owner;
             $dogs[] = $dog;
             $cats[] = $cat;
         }
         // writes dogs first time
         $writer->write($dogs);
         // dogs written again from owner callback
         $writer->write($owners);
         $writer->finish();
         $owners = Human::get();
         $dogs = Dog::get();
         $cats = Cat::get();
         $this->assertEquals(100, $owners->Count());
         $this->assertEquals(100, $dogs->Count());
         $this->assertEquals(100, $cats->Count());
         for ($i = 0; $i < 100; $i++) {
             $owner = $owners[$i];
             $dog = $dogs[$i];
             $cat = $cats[$i];
             $this->assertEquals($owner->ID, $dog->OwnerID);
             $this->assertEquals($dog->ID, $cat->EnemyID);
         }
         $writer->delete($owners);
         $writer->delete($dogs);
         $writer->delete($cats);
         $writer->finish();
         $this->assertEquals(0, Human::get()->Count());
         $this->assertEquals(0, Dog::get()->Count());
         $this->assertEquals(0, Cat::get()->Count());
     }
 }
 /**
  * @throws \ValidationException
  * @throws null
  */
 public function testBranchDeleteIDs_DeleteManyIDs_ObjectsDeleted()
 {
     $className = '';
     $ids = array();
     for ($i = 0; $i < 100; $i++) {
         $dog = new Dog();
         $dog->Name = 'Pup ' . $i;
         $dog->Color = 'Fifty Shade No. ' . $i;
         $dog->write();
         $className = $dog->ClassName;
         $ids[] = $dog->ID;
     }
     $batch = new \Batch();
     $batch->deleteIDs($className, $ids);
     $this->assertEquals(0, Dog::get()->Count());
 }
 /**
  *
  */
 public function testBatchWrite_DifferentClasses_WritesObjects()
 {
     $dog = new Dog();
     $dog->Name = 'Snuffins';
     $dog->Color = 'Red';
     $cat = new Cat();
     $cat->Name = 'Puff daddy';
     $cat->HasClaws = true;
     $batch = new \Batch();
     $batch->write(array($dog, $cat));
     $this->assertTrue($dog->exists());
     $this->assertTrue($cat->exists());
     $dog = Dog::get()->first();
     $this->assertEquals('Snuffins', $dog->Name);
     $this->assertEquals('Red', $dog->Color);
     $cat = Cat::get()->first();
     $this->assertEquals('Puff daddy', $cat->Name);
     $this->assertEquals(1, $cat->HasClaws);
 }
 /**
  * @throws \ValidationException
  * @throws null
  */
 public function testCallback_SetOnAfterExistsCallback_CallbackCalled()
 {
     $dog1 = new Dog();
     $dog1->Name = 'Jim bob';
     $dog2 = new Dog();
     $dog2->Name = 'Super Dog';
     $owner = new Human();
     $owner->Name = 'Hilly Stewart';
     $owner->write();
     $owner->onAfterExistsCallback(function ($owner) use($dog1) {
         $dog1->OwnerID = $owner->ID;
         $dog1->write();
     });
     $owner->write();
     $owner->onAfterExistsCallback(function ($owner) use($dog2) {
         $dog2->OwnerID = $owner->ID;
         $dog2->write();
     });
     $this->assertTrue($owner->exists());
     $this->assertTrue($dog1->exists());
     $this->assertTrue($dog2->exists());
     $this->assertEquals(1, Human::get()->Count());
     $this->assertEquals(2, Dog::get()->Count());
     $this->assertEquals($owner->ID, $dog1->OwnerID);
     $this->assertEquals($owner->ID, $dog2->OwnerID);
 }