/**
* This tests the basic combination of filters.
*/
public function testCombine()
{
// Setup.
$filter0 = Horde_Ldap_Filter::create('foo', 'equals', 'bar');
$this->assertInstanceOf('Horde_Ldap_Filter', $filter0);
$filter1 = Horde_Ldap_Filter::create('bar', 'equals', 'foo');
$this->assertInstanceOf('Horde_Ldap_Filter', $filter1);
$filter2 = Horde_Ldap_Filter::create('you', 'equals', 'me');
$this->assertInstanceOf('Horde_Ldap_Filter', $filter2);
$filter3 = Horde_Ldap_Filter::parse('(perlinterface=used)');
$this->assertInstanceOf('Horde_Ldap_Filter', $filter3);
// Negation test.
$filter_not1 = Horde_Ldap_Filter::combine('not', $filter0);
$this->assertInstanceOf('Horde_Ldap_Filter', $filter_not1, 'Negation failed for literal NOT');
$this->assertEquals('(!(foo=bar))', (string) $filter_not1);
$filter_not2 = Horde_Ldap_Filter::combine('!', $filter0);
$this->assertInstanceOf('Horde_Ldap_Filter', $filter_not2, 'Negation failed for logical NOT');
$this->assertEquals('(!(foo=bar))', (string) $filter_not2);
$filter_not3 = Horde_Ldap_Filter::combine('!', (string) $filter0);
$this->assertInstanceOf('Horde_Ldap_Filter', $filter_not3, 'Negation failed for logical NOT');
$this->assertEquals('(!' . $filter0 . ')', (string) $filter_not3);
// Combination test: OR
$filter_comb_or1 = Horde_Ldap_Filter::combine('or', array($filter1, $filter2));
$this->assertInstanceOf('Horde_Ldap_Filter', $filter_comb_or1, 'Combination failed for literal OR');
$this->assertEquals('(|(bar=foo)(you=me))', (string) $filter_comb_or1);
$filter_comb_or2 = Horde_Ldap_Filter::combine('|', array($filter1, $filter2));
$this->assertInstanceOf('Horde_Ldap_Filter', $filter_comb_or2, 'combination failed for logical OR');
$this->assertEquals('(|(bar=foo)(you=me))', (string) $filter_comb_or2);
// Combination test: AND
$filter_comb_and1 = Horde_Ldap_Filter::combine('and', array($filter1, $filter2));
$this->assertInstanceOf('Horde_Ldap_Filter', $filter_comb_and1, 'Combination failed for literal AND');
$this->assertEquals('(&(bar=foo)(you=me))', (string) $filter_comb_and1);
$filter_comb_and2 = Horde_Ldap_Filter::combine('&', array($filter1, $filter2));
$this->assertInstanceOf('Horde_Ldap_Filter', $filter_comb_and2, 'combination failed for logical AND');
$this->assertEquals('(&(bar=foo)(you=me))', (string) $filter_comb_and2);
// Combination test: using filter created with perl interface.
$filter_comb_perl1 = Horde_Ldap_Filter::combine('and', array($filter1, $filter3));
$this->assertInstanceOf('Horde_Ldap_Filter', $filter_comb_perl1, 'Combination failed for literal AND');
$this->assertEquals('(&(bar=foo)(perlinterface=used))', (string) $filter_comb_perl1);
$filter_comb_perl2 = Horde_Ldap_Filter::combine('&', array($filter1, $filter3));
$this->assertInstanceOf('Horde_Ldap_Filter', $filter_comb_perl2, 'combination failed for logical AND');
$this->assertEquals('(&(bar=foo)(perlinterface=used))', (string) $filter_comb_perl2);
// Combination test: using filter_str instead of object
$filter_comb_fstr1 = Horde_Ldap_Filter::combine('and', array($filter1, '(filter_str=foo)'));
$this->assertInstanceOf('Horde_Ldap_Filter', $filter_comb_fstr1, 'Combination failed for literal AND using filter_str');
$this->assertEquals('(&(bar=foo)(filter_str=foo))', (string) $filter_comb_fstr1);
// Combination test: deep combination
$filter_comp_deep = Horde_Ldap_Filter::combine('and', array($filter2, $filter_not1, $filter_comb_or1, $filter_comb_perl1));
$this->assertInstanceOf('Horde_Ldap_Filter', $filter_comp_deep, 'Deep combination failed!');
$this->assertEquals('(&(you=me)(!(foo=bar))(|(bar=foo)(you=me))(&(bar=foo)(perlinterface=used)))', (string) $filter_comp_deep);
// Test failure in combination
try {
Horde_Ldap_Filter::create('foo', 'test_undefined_matchingrule', 'bar');
$this->fail('Horde_Ldap_Exception expected.');
} catch (Horde_Ldap_Exception $e) {
}
try {
Horde_Ldap_Filter::combine('not', 'damaged_filter_str');
$this->fail('Horde_Ldap_Exception expected.');
} catch (Horde_Ldap_Exception $e) {
}
try {
Horde_Ldap_Filter::combine('not', array($filter0, $filter1));
$this->fail('Horde_Ldap_Exception expected.');
} catch (Horde_Ldap_Exception $e) {
}
try {
Horde_Ldap_Filter::combine('not', null);
$this->fail('Horde_Ldap_Exception expected.');
} catch (Horde_Ldap_Exception $e) {
}
try {
Horde_Ldap_Filter::combine('and', $filter_not1);
$this->fail('Horde_Ldap_Exception expected.');
} catch (Horde_Ldap_Exception $e) {
}
try {
Horde_Ldap_Filter::combine('and', array($filter_not1));
$this->fail('Horde_Ldap_Exception expected.');
} catch (Horde_Ldap_Exception $e) {
}
try {
Horde_Ldap_Filter::combine('and', $filter_not1);
$this->fail('Horde_Ldap_Exception expected.');
} catch (Horde_Ldap_Exception $e) {
}
try {
Horde_Ldap_Filter::combine('or', array($filter_not1));
$this->fail('Horde_Ldap_Exception expected.');
} catch (Horde_Ldap_Exception $e) {
}
try {
Horde_Ldap_Filter::combine('some_unknown_method', array($filter_not1));
$this->fail('Horde_Ldap_Exception expected.');
} catch (Horde_Ldap_Exception $e) {
}
try {
Horde_Ldap_Filter::combine('and', array($filter_not1, 'some_invalid_filterstring'));
$this->fail('Horde_Ldap_Exception expected.');
} catch (Horde_Ldap_Exception $e) {
}
try {
Horde_Ldap_Filter::combine('and', array($filter_not1, null));
$this->fail('Horde_Ldap_Exception expected.');
} catch (Horde_Ldap_Exception $e) {
}
}