public function testAddSameRules()
{
$acl = new Acl();
$rule = new Rule('Edit');
$user = new Role('User');
$page = new Resource('Page');
$superUser = new Role('SuperUser');
$superPage = new Resource('SuperPage');
$acl->addRule($user, $page, $rule, true);
$this->assertSame($rule->getRole(), $user);
$this->assertSame($rule->getResource(), $page);
// If rule already exist don't add it in Acl, but change Role, Resource and Action
$acl->addRule($superUser, $superPage, $rule, true);
$this->assertNotSame($rule->getRole(), $user);
$this->assertNotSame($rule->getResource(), $page);
$this->assertSame($rule->getRole(), $superUser);
$this->assertSame($rule->getResource(), $superPage);
$this->assertFalse($acl->isAllowed('User', 'Page', 'Edit'));
$this->assertTrue($acl->isAllowed('SuperUser', 'SuperPage', 'Edit'));
$acl->addRule($superUser, $superPage, $rule, false);
$this->assertFalse($acl->isAllowed('SuperUser', 'SuperPage', 'Edit'));
$this->assertAttributeCount(1, 'rules', $acl);
// rule should overwrite $role, $resource and $action when they actually used in addRule
$acl->addRule($superUser, $superPage, $rule);
$this->assertFalse($acl->isAllowed('SuperUser', 'SuperPage', 'Edit'));
$this->assertAttributeCount(1, 'rules', $acl);
$acl->addRule($rule);
$this->assertFalse($acl->isAllowed('SuperUser', 'SuperPage', 'Edit'));
$this->assertSame($rule->getRole(), $superUser);
$this->assertSame($rule->getResource(), $superPage);
$acl->addRule($rule, true);
$this->assertTrue($acl->isAllowed('SuperUser', 'SuperPage', 'Edit'));
$this->assertSame($rule->getRole(), $superUser);
$this->assertSame($rule->getResource(), $superPage);
}