Yaffs site version 1.1
[yaffs-website] / vendor / phpunit / phpunit / tests / Framework / ConstraintTest.php
diff --git a/vendor/phpunit/phpunit/tests/Framework/ConstraintTest.php b/vendor/phpunit/phpunit/tests/Framework/ConstraintTest.php
new file mode 100644 (file)
index 0000000..7165660
--- /dev/null
@@ -0,0 +1,3489 @@
+<?php
+/*
+ * This file is part of PHPUnit.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @since      Class available since Release 3.0.0
+ */
+class Framework_ConstraintTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers PHPUnit_Framework_Constraint_ArrayHasKey
+     * @covers PHPUnit_Framework_Assert::arrayHasKey
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayHasKey()
+    {
+        $constraint = PHPUnit_Framework_Assert::arrayHasKey(0);
+
+        $this->assertFalse($constraint->evaluate(array(), '', true));
+        $this->assertEquals('has the key 0', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(array());
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+Failed asserting that an array has the key 0.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ArrayHasKey
+     * @covers PHPUnit_Framework_Assert::arrayHasKey
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayHasKey2()
+    {
+        $constraint = PHPUnit_Framework_Assert::arrayHasKey(0);
+
+        try {
+            $constraint->evaluate(array(), 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message\nFailed asserting that an array has the key 0.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ArrayHasKey
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::arrayHasKey
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayNotHasKey()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::arrayHasKey(0)
+        );
+
+        $this->assertFalse($constraint->evaluate(array(0 => 1), '', true));
+        $this->assertEquals('does not have the key 0', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(array(0 => 1));
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that an array does not have the key 0.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ArrayHasKey
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::arrayHasKey
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayNotHasKey2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::arrayHasKey(0)
+        );
+
+        try {
+            $constraint->evaluate(array(0), 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that an array does not have the key 0.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_FileExists
+     * @covers PHPUnit_Framework_Assert::fileExists
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintFileExists()
+    {
+        $constraint = PHPUnit_Framework_Assert::fileExists();
+
+        $this->assertFalse($constraint->evaluate('foo', '', true));
+        $this->assertEquals('file exists', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('foo');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that file "foo" exists.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_FileExists
+     * @covers PHPUnit_Framework_Assert::fileExists
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintFileExists2()
+    {
+        $constraint = PHPUnit_Framework_Assert::fileExists();
+
+        try {
+            $constraint->evaluate('foo', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that file "foo" exists.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_FileExists
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_Assert::fileExists
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintFileNotExists()
+    {
+        $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ClassWithNonPublicAttributes.php';
+
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::fileExists()
+        );
+
+        $this->assertFalse($constraint->evaluate($file, '', true));
+        $this->assertEquals('file does not exist', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate($file);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that file "$file" does not exist.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_FileExists
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_Assert::fileExists
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintFileNotExists2()
+    {
+        $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ClassWithNonPublicAttributes.php';
+
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::fileExists()
+        );
+
+        try {
+            $constraint->evaluate($file, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that file "$file" does not exist.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Assert::greaterThan
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintGreaterThan()
+    {
+        $constraint = PHPUnit_Framework_Assert::greaterThan(1);
+
+        $this->assertFalse($constraint->evaluate(0, '', true));
+        $this->assertTrue($constraint->evaluate(2, '', true));
+        $this->assertEquals('is greater than 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(0);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 0 is greater than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Assert::greaterThan
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintGreaterThan2()
+    {
+        $constraint = PHPUnit_Framework_Assert::greaterThan(1);
+
+        try {
+            $constraint->evaluate(0, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 0 is greater than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::greaterThan
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotGreaterThan()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::greaterThan(1)
+        );
+
+        $this->assertTrue($constraint->evaluate(1, '', true));
+        $this->assertEquals('is not greater than 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(2);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 2 is not greater than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::greaterThan
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotGreaterThan2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::greaterThan(1)
+        );
+
+        try {
+            $constraint->evaluate(2, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 2 is not greater than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Assert::greaterThanOrEqual
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintGreaterThanOrEqual()
+    {
+        $constraint = PHPUnit_Framework_Assert::greaterThanOrEqual(1);
+
+        $this->assertTrue($constraint->evaluate(1, '', true));
+        $this->assertFalse($constraint->evaluate(0, '', true));
+        $this->assertEquals('is equal to 1 or is greater than 1', $constraint->toString());
+        $this->assertEquals(2, count($constraint));
+
+        try {
+            $constraint->evaluate(0);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 0 is equal to 1 or is greater than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Assert::greaterThanOrEqual
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintGreaterThanOrEqual2()
+    {
+        $constraint = PHPUnit_Framework_Assert::greaterThanOrEqual(1);
+
+        try {
+            $constraint->evaluate(0, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 0 is equal to 1 or is greater than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::greaterThanOrEqual
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotGreaterThanOrEqual()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::greaterThanOrEqual(1)
+        );
+
+        $this->assertFalse($constraint->evaluate(1, '', true));
+        $this->assertEquals('not( is equal to 1 or is greater than 1 )', $constraint->toString());
+        $this->assertEquals(2, count($constraint));
+
+        try {
+            $constraint->evaluate(1);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that not( 1 is equal to 1 or is greater than 1 ).
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::greaterThanOrEqual
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotGreaterThanOrEqual2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::greaterThanOrEqual(1)
+        );
+
+        try {
+            $constraint->evaluate(1, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that not( 1 is equal to 1 or is greater than 1 ).
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsAnything
+     * @covers PHPUnit_Framework_Assert::anything
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsAnything()
+    {
+        $constraint = PHPUnit_Framework_Assert::anything();
+
+        $this->assertTrue($constraint->evaluate(null, '', true));
+        $this->assertNull($constraint->evaluate(null));
+        $this->assertEquals('is anything', $constraint->toString());
+        $this->assertEquals(0, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsAnything
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::anything
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotIsAnything()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::anything()
+        );
+
+        $this->assertFalse($constraint->evaluate(null, '', true));
+        $this->assertEquals('is not anything', $constraint->toString());
+        $this->assertEquals(0, count($constraint));
+
+        try {
+            $constraint->evaluate(null);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that null is not anything.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Assert::equalTo
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsEqual()
+    {
+        $constraint = PHPUnit_Framework_Assert::equalTo(1);
+
+        $this->assertTrue($constraint->evaluate(1, '', true));
+        $this->assertFalse($constraint->evaluate(0, '', true));
+        $this->assertEquals('is equal to 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(0);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 0 matches expected 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    public function isEqualProvider()
+    {
+        $a      = new stdClass;
+        $a->foo = 'bar';
+        $b      = new stdClass;
+        $ahash  = spl_object_hash($a);
+        $bhash  = spl_object_hash($b);
+
+        $c               = new stdClass;
+        $c->foo          = 'bar';
+        $c->int          = 1;
+        $c->array        = array(0, array(1), array(2), 3);
+        $c->related      = new stdClass;
+        $c->related->foo = "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk";
+        $c->self         = $c;
+        $c->c            = $c;
+        $d               = new stdClass;
+        $d->foo          = 'bar';
+        $d->int          = 2;
+        $d->array        = array(0, array(4), array(2), 3);
+        $d->related      = new stdClass;
+        $d->related->foo = "a\np\nc\nd\ne\nf\ng\nh\ni\nw\nk";
+        $d->self         = $d;
+        $d->c            = $c;
+
+        $storage1 = new SplObjectStorage;
+        $storage1->attach($a);
+        $storage1->attach($b);
+        $storage2 = new SplObjectStorage;
+        $storage2->attach($b);
+        $storage1hash = spl_object_hash($storage1);
+        $storage2hash = spl_object_hash($storage2);
+
+        $dom1                     = new DOMDocument;
+        $dom1->preserveWhiteSpace = false;
+        $dom1->loadXML('<root></root>');
+        $dom2                     = new DOMDocument;
+        $dom2->preserveWhiteSpace = false;
+        $dom2->loadXML('<root><foo/></root>');
+
+        $data = array(
+            array(1, 0, <<<EOF
+Failed asserting that 0 matches expected 1.
+
+EOF
+            ),
+            array(1.1, 0, <<<EOF
+Failed asserting that 0 matches expected 1.1.
+
+EOF
+            ),
+            array('a', 'b', <<<EOF
+Failed asserting that two strings are equal.
+--- Expected
++++ Actual
+@@ @@
+-'a'
++'b'
+
+EOF
+            ),
+            array("a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk", "a\np\nc\nd\ne\nf\ng\nh\ni\nw\nk", <<<EOF
+Failed asserting that two strings are equal.
+--- Expected
++++ Actual
+@@ @@
+ 'a
+-b
++p
+
+@@ @@
+ i
+-j
++w
+ k'
+
+EOF
+            ),
+            array(1, array(0), <<<EOF
+Array (...) does not match expected type "integer".
+
+EOF
+            ),
+            array(array(0), 1, <<<EOF
+1 does not match expected type "array".
+
+EOF
+            ),
+            array(array(0), array(1), <<<EOF
+Failed asserting that two arrays are equal.
+--- Expected
++++ Actual
+@@ @@
+ Array (
+-    0 => 0
++    0 => 1
+ )
+
+EOF
+            ),
+            array(array(true), array('true'), <<<EOF
+Failed asserting that two arrays are equal.
+--- Expected
++++ Actual
+@@ @@
+ Array (
+-    0 => true
++    0 => 'true'
+ )
+
+EOF
+            ),
+            array(array(0, array(1), array(2), 3), array(0, array(4), array(2), 3), <<<EOF
+Failed asserting that two arrays are equal.
+--- Expected
++++ Actual
+@@ @@
+ Array (
+     0 => 0
+     1 => Array (
+-        0 => 1
++        0 => 4
+     )
+     2 => Array (...)
+     3 => 3
+ )
+
+EOF
+            ),
+            array($a, array(0), <<<EOF
+Array (...) does not match expected type "object".
+
+EOF
+            ),
+            array(array(0), $a, <<<EOF
+stdClass Object (...) does not match expected type "array".
+
+EOF
+            ),
+            array($a, $b, <<<EOF
+Failed asserting that two objects are equal.
+--- Expected
++++ Actual
+@@ @@
+ stdClass Object (
+-    'foo' => 'bar'
+ )
+
+EOF
+            ),
+            array($c, $d, <<<EOF
+Failed asserting that two objects are equal.
+--- Expected
++++ Actual
+@@ @@
+ stdClass Object (
+     'foo' => 'bar'
+-    'int' => 1
++    'int' => 2
+     'array' => Array (
+         0 => 0
+         1 => Array (
+-            0 => 1
++            0 => 4
+
+@@ @@
+         'foo' => 'a
+-        b
++        p
+
+@@ @@
+         i
+-        j
++        w
+         k'
+     )
+     'self' => stdClass Object (...)
+     'c' => stdClass Object (...)
+ )
+
+EOF
+            ),
+            array($dom1, $dom2, <<<EOF
+Failed asserting that two DOM documents are equal.
+--- Expected
++++ Actual
+@@ @@
+ <?xml version="1.0"?>
+-<root/>
++<root>
++  <foo/>
++</root>
+
+EOF
+            ),
+            array(
+              new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')),
+              new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/Chicago')),
+              <<<EOF
+Failed asserting that two DateTime objects are equal.
+--- Expected
++++ Actual
+@@ @@
+-2013-03-29T04:13:35.000000-0400
++2013-03-29T04:13:35.000000-0500
+
+EOF
+            ),
+        );
+
+        if (PHP_MAJOR_VERSION < 7) {
+            $data[] = array($storage1, $storage2, <<<EOF
+Failed asserting that two objects are equal.
+--- Expected
++++ Actual
+@@ @@
+-SplObjectStorage Object &$storage1hash (
+-    '$ahash' => Array &0 (
+-        'obj' => stdClass Object &$ahash (
+-            'foo' => 'bar'
+-        )
++SplObjectStorage Object &$storage2hash (
++    '$bhash' => Array &0 (
++        'obj' => stdClass Object &$bhash ()
+         'inf' => null
+     )
+-    '$bhash' => Array &0
+ )
+
+EOF
+            );
+        } else {
+            $data[] = array($storage1, $storage2, <<<EOF
+Failed asserting that two objects are equal.
+--- Expected
++++ Actual
+@@ @@
+-SplObjectStorage Object &$storage1hash (
+-    '$ahash' => Array &0 (
+-        'obj' => stdClass Object &$ahash (
+-            'foo' => 'bar'
+-        )
++SplObjectStorage Object &$storage2hash (
++    '$bhash' => Array &0 (
++        'obj' => stdClass Object &$bhash ()
+         'inf' => null
+     )
+-    '$bhash' => Array &0
+ )
+
+EOF
+            );
+        }
+
+        return $data;
+    }
+
+    /**
+     * @dataProvider isEqualProvider
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Assert::equalTo
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsEqual2($expected, $actual, $message)
+    {
+        $constraint = PHPUnit_Framework_Assert::equalTo($expected);
+
+        try {
+            $constraint->evaluate($actual, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              "custom message\n$message",
+              $this->trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e))
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::equalTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotEqual()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::equalTo(1)
+        );
+
+        $this->assertTrue($constraint->evaluate(0, '', true));
+        $this->assertFalse($constraint->evaluate(1, '', true));
+        $this->assertEquals('is not equal to 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(1);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 1 is not equal to 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::equalTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotEqual2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::equalTo(1)
+        );
+
+        try {
+            $constraint->evaluate(1, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 1 is not equal to 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsIdentical
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsIdentical()
+    {
+        $a = new stdClass;
+        $b = new stdClass;
+
+        $constraint = PHPUnit_Framework_Assert::identicalTo($a);
+
+        $this->assertFalse($constraint->evaluate($b, '', true));
+        $this->assertTrue($constraint->evaluate($a, '', true));
+        $this->assertEquals('is identical to an object of class "stdClass"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate($b);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+Failed asserting that two variables reference the same object.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsIdentical
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsIdentical2()
+    {
+        $a = new stdClass;
+        $b = new stdClass;
+
+        $constraint = PHPUnit_Framework_Assert::identicalTo($a);
+
+        try {
+            $constraint->evaluate($b, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that two variables reference the same object.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsIdentical
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsIdentical3()
+    {
+        $constraint = PHPUnit_Framework_Assert::identicalTo('a');
+
+        try {
+            $constraint->evaluate('b', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that two strings are identical.
+--- Expected
++++ Actual
+@@ @@
+-a
++b
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsIdentical
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotIdentical()
+    {
+        $a = new stdClass;
+        $b = new stdClass;
+
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::identicalTo($a)
+        );
+
+        $this->assertTrue($constraint->evaluate($b, '', true));
+        $this->assertFalse($constraint->evaluate($a, '', true));
+        $this->assertEquals('is not identical to an object of class "stdClass"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate($a);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+Failed asserting that two variables don't reference the same object.
+
+EOF
+              ,
+              $this->trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e))
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsIdentical
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotIdentical2()
+    {
+        $a = new stdClass;
+
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::identicalTo($a)
+        );
+
+        try {
+            $constraint->evaluate($a, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that two variables don't reference the same object.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsIdentical
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotIdentical3()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::identicalTo('a')
+        );
+
+        try {
+            $constraint->evaluate('a', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that two strings are not identical.
+
+EOF
+              ,
+              $this->trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e))
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsInstanceOf
+     * @covers PHPUnit_Framework_Assert::isInstanceOf
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsInstanceOf()
+    {
+        $constraint = PHPUnit_Framework_Assert::isInstanceOf('Exception');
+
+        $this->assertFalse($constraint->evaluate(new stdClass, '', true));
+        $this->assertTrue($constraint->evaluate(new Exception, '', true));
+        $this->assertEquals('is instance of class "Exception"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        $interfaceConstraint = PHPUnit_Framework_Assert::isInstanceOf('Countable');
+        $this->assertFalse($interfaceConstraint->evaluate(new stdClass, '', true));
+        $this->assertTrue($interfaceConstraint->evaluate(new ArrayObject, '', true));
+        $this->assertEquals('is instance of interface "Countable"', $interfaceConstraint->toString());
+
+        try {
+            $constraint->evaluate(new stdClass);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that stdClass Object () is an instance of class "Exception".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsInstanceOf
+     * @covers PHPUnit_Framework_Assert::isInstanceOf
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsInstanceOf2()
+    {
+        $constraint = PHPUnit_Framework_Assert::isInstanceOf('Exception');
+
+        try {
+            $constraint->evaluate(new stdClass, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that stdClass Object () is an instance of class "Exception".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsInstanceOf
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::isInstanceOf
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotInstanceOf()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::isInstanceOf('stdClass')
+        );
+
+        $this->assertFalse($constraint->evaluate(new stdClass, '', true));
+        $this->assertTrue($constraint->evaluate(new Exception, '', true));
+        $this->assertEquals('is not instance of class "stdClass"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(new stdClass);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that stdClass Object () is not an instance of class "stdClass".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsInstanceOf
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::isInstanceOf
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotInstanceOf2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::isInstanceOf('stdClass')
+        );
+
+        try {
+            $constraint->evaluate(new stdClass, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that stdClass Object () is not an instance of class "stdClass".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsType
+     * @covers PHPUnit_Framework_Assert::isType
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsType()
+    {
+        $constraint = PHPUnit_Framework_Assert::isType('string');
+
+        $this->assertFalse($constraint->evaluate(0, '', true));
+        $this->assertTrue($constraint->evaluate('', '', true));
+        $this->assertEquals('is of type "string"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(new stdClass);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertStringMatchesFormat(<<<EOF
+Failed asserting that stdClass Object &%x () is of type "string".
+
+EOF
+              ,
+              $this->trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e))
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsType
+     * @covers PHPUnit_Framework_Assert::isType
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsType2()
+    {
+        $constraint = PHPUnit_Framework_Assert::isType('string');
+
+        try {
+            $constraint->evaluate(new stdClass, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertStringMatchesFormat(<<<EOF
+custom message
+Failed asserting that stdClass Object &%x () is of type "string".
+
+EOF
+              ,
+              $this->trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e))
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    public function resources()
+    {
+        $fh = fopen(__FILE__, 'r');
+        fclose($fh);
+
+        return array(
+            'open resource'     => array(fopen(__FILE__, 'r')),
+            'closed resource'   => array($fh),
+        );
+    }
+
+    /**
+     * @dataProvider resources
+     * @covers PHPUnit_Framework_Constraint_IsType
+     * @covers PHPUnit_Framework_Assert::isType
+     */
+    public function testConstraintIsResourceTypeEvaluatesCorrectlyWithResources($resource)
+    {
+        $constraint = PHPUnit_Framework_Assert::isType('resource');
+
+        $this->assertTrue($constraint->evaluate($resource, '', true));
+
+        @fclose($resource);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsType
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::isType
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotType()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::isType('string')
+        );
+
+        $this->assertTrue($constraint->evaluate(0, '', true));
+        $this->assertFalse($constraint->evaluate('', '', true));
+        $this->assertEquals('is not of type "string"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that '' is not of type "string".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsType
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::isType
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotType2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::isType('string')
+        );
+
+        try {
+            $constraint->evaluate('', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that '' is not of type "string".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsNull
+     * @covers PHPUnit_Framework_Assert::isNull
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNull()
+    {
+        $constraint = PHPUnit_Framework_Assert::isNull();
+
+        $this->assertFalse($constraint->evaluate(0, '', true));
+        $this->assertTrue($constraint->evaluate(null, '', true));
+        $this->assertEquals('is null', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(0);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+Failed asserting that 0 is null.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsNull
+     * @covers PHPUnit_Framework_Assert::isNull
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNull2()
+    {
+        $constraint = PHPUnit_Framework_Assert::isNull();
+
+        try {
+            $constraint->evaluate(0, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that 0 is null.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsNull
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::isNull
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotNull()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::isNull()
+        );
+
+        $this->assertFalse($constraint->evaluate(null, '', true));
+        $this->assertTrue($constraint->evaluate(0, '', true));
+        $this->assertEquals('is not null', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(null);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+Failed asserting that null is not null.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsNull
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::isNull
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotNull2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::isNull()
+        );
+
+        try {
+            $constraint->evaluate(null, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that null is not null.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Assert::lessThan
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintLessThan()
+    {
+        $constraint = PHPUnit_Framework_Assert::lessThan(1);
+
+        $this->assertTrue($constraint->evaluate(0, '', true));
+        $this->assertFalse($constraint->evaluate(1, '', true));
+        $this->assertEquals('is less than 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(1);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 1 is less than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Assert::lessThan
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintLessThan2()
+    {
+        $constraint = PHPUnit_Framework_Assert::lessThan(1);
+
+        try {
+            $constraint->evaluate(1, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 1 is less than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::lessThan
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotLessThan()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::lessThan(1)
+        );
+
+        $this->assertTrue($constraint->evaluate(1, '', true));
+        $this->assertFalse($constraint->evaluate(0, '', true));
+        $this->assertEquals('is not less than 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(0);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 0 is not less than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::lessThan
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotLessThan2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::lessThan(1)
+        );
+
+        try {
+            $constraint->evaluate(0, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 0 is not less than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Assert::lessThanOrEqual
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintLessThanOrEqual()
+    {
+        $constraint = PHPUnit_Framework_Assert::lessThanOrEqual(1);
+
+        $this->assertTrue($constraint->evaluate(1, '', true));
+        $this->assertFalse($constraint->evaluate(2, '', true));
+        $this->assertEquals('is equal to 1 or is less than 1', $constraint->toString());
+        $this->assertEquals(2, count($constraint));
+
+        try {
+            $constraint->evaluate(2);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 2 is equal to 1 or is less than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Callback
+     */
+    public function testConstraintCallback()
+    {
+        $closureReflect = function ($parameter) {
+            return $parameter;
+        };
+
+        $closureWithoutParameter = function () {
+            return true;
+        };
+
+        $constraint = PHPUnit_Framework_Assert::callback($closureWithoutParameter);
+        $this->assertTrue($constraint->evaluate('', '', true));
+
+        $constraint = PHPUnit_Framework_Assert::callback($closureReflect);
+        $this->assertTrue($constraint->evaluate(true, '', true));
+        $this->assertFalse($constraint->evaluate(false, '', true));
+
+        $callback   = array($this, 'callbackReturningTrue');
+        $constraint = PHPUnit_Framework_Assert::callback($callback);
+        $this->assertTrue($constraint->evaluate(false,  '', true));
+
+        $callback   = array('Framework_ConstraintTest', 'staticCallbackReturningTrue');
+        $constraint = PHPUnit_Framework_Assert::callback($callback);
+        $this->assertTrue($constraint->evaluate(null, '', true));
+
+        $this->assertEquals('is accepted by specified callback', $constraint->toString());
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Callback
+     * @expectedException PHPUnit_Framework_ExpectationFailedException
+     * @expectedExceptionMessage Failed asserting that 'This fails' is accepted by specified callback.
+     */
+    public function testConstraintCallbackFailure()
+    {
+        $constraint = PHPUnit_Framework_Assert::callback(function () {
+            return false;
+        });
+        $constraint->evaluate('This fails');
+    }
+
+    public function callbackReturningTrue()
+    {
+        return true;
+    }
+
+    public static function staticCallbackReturningTrue()
+    {
+        return true;
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Assert::lessThanOrEqual
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintLessThanOrEqual2()
+    {
+        $constraint = PHPUnit_Framework_Assert::lessThanOrEqual(1);
+
+        try {
+            $constraint->evaluate(2, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 2 is equal to 1 or is less than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::lessThanOrEqual
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotLessThanOrEqual()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::lessThanOrEqual(1)
+        );
+
+        $this->assertTrue($constraint->evaluate(2, '', true));
+        $this->assertFalse($constraint->evaluate(1, '', true));
+        $this->assertEquals('not( is equal to 1 or is less than 1 )', $constraint->toString());
+        $this->assertEquals(2, count($constraint));
+
+        try {
+            $constraint->evaluate(1);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that not( 1 is equal to 1 or is less than 1 ).
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::lessThanOrEqual
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotLessThanOrEqual2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::lessThanOrEqual(1)
+        );
+
+        try {
+            $constraint->evaluate(1, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that not( 1 is equal to 1 or is less than 1 ).
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasAttribute
+     * @covers PHPUnit_Framework_Assert::classHasAttribute
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassHasAttribute()
+    {
+        $constraint = PHPUnit_Framework_Assert::classHasAttribute('privateAttribute');
+
+        $this->assertTrue($constraint->evaluate('ClassWithNonPublicAttributes', '', true));
+        $this->assertFalse($constraint->evaluate('stdClass', '', true));
+        $this->assertEquals('has attribute "privateAttribute"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('stdClass');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that class "stdClass" has attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasAttribute
+     * @covers PHPUnit_Framework_Assert::classHasAttribute
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassHasAttribute2()
+    {
+        $constraint = PHPUnit_Framework_Assert::classHasAttribute('privateAttribute');
+
+        try {
+            $constraint->evaluate('stdClass', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that class "stdClass" has attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasAttribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::classHasAttribute
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassNotHasAttribute()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::classHasAttribute('privateAttribute')
+        );
+
+        $this->assertTrue($constraint->evaluate('stdClass', '', true));
+        $this->assertFalse($constraint->evaluate('ClassWithNonPublicAttributes', '', true));
+        $this->assertEquals('does not have attribute "privateAttribute"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('ClassWithNonPublicAttributes');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that class "ClassWithNonPublicAttributes" does not have attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasAttribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::classHasAttribute
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassNotHasAttribute2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::classHasAttribute('privateAttribute')
+        );
+
+        try {
+            $constraint->evaluate('ClassWithNonPublicAttributes', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that class "ClassWithNonPublicAttributes" does not have attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasStaticAttribute
+     * @covers PHPUnit_Framework_Assert::classHasStaticAttribute
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassHasStaticAttribute()
+    {
+        $constraint = PHPUnit_Framework_Assert::classHasStaticAttribute('privateStaticAttribute');
+
+        $this->assertTrue($constraint->evaluate('ClassWithNonPublicAttributes', '', true));
+        $this->assertFalse($constraint->evaluate('stdClass', '', true));
+        $this->assertEquals('has static attribute "privateStaticAttribute"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('stdClass');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that class "stdClass" has static attribute "privateStaticAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasStaticAttribute
+     * @covers PHPUnit_Framework_Assert::classHasStaticAttribute
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassHasStaticAttribute2()
+    {
+        $constraint = PHPUnit_Framework_Assert::classHasStaticAttribute('foo');
+
+        try {
+            $constraint->evaluate('stdClass', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that class "stdClass" has static attribute "foo".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasStaticAttribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::classHasStaticAttribute
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassNotHasStaticAttribute()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::classHasStaticAttribute('privateStaticAttribute')
+        );
+
+        $this->assertTrue($constraint->evaluate('stdClass', '', true));
+        $this->assertFalse($constraint->evaluate('ClassWithNonPublicAttributes', '', true));
+        $this->assertEquals('does not have static attribute "privateStaticAttribute"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('ClassWithNonPublicAttributes');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that class "ClassWithNonPublicAttributes" does not have static attribute "privateStaticAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasStaticAttribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::classHasStaticAttribute
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassNotHasStaticAttribute2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::classHasStaticAttribute('privateStaticAttribute')
+        );
+
+        try {
+            $constraint->evaluate('ClassWithNonPublicAttributes', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that class "ClassWithNonPublicAttributes" does not have static attribute "privateStaticAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ObjectHasAttribute
+     * @covers PHPUnit_Framework_Assert::objectHasAttribute
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintObjectHasAttribute()
+    {
+        $constraint = PHPUnit_Framework_Assert::objectHasAttribute('privateAttribute');
+
+        $this->assertTrue($constraint->evaluate(new ClassWithNonPublicAttributes, '', true));
+        $this->assertFalse($constraint->evaluate(new stdClass, '', true));
+        $this->assertEquals('has attribute "privateAttribute"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(new stdClass);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that object of class "stdClass" has attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ObjectHasAttribute
+     * @covers PHPUnit_Framework_Assert::objectHasAttribute
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintObjectHasAttribute2()
+    {
+        $constraint = PHPUnit_Framework_Assert::objectHasAttribute('privateAttribute');
+
+        try {
+            $constraint->evaluate(new stdClass, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that object of class "stdClass" has attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ObjectHasAttribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::objectHasAttribute
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintObjectNotHasAttribute()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::objectHasAttribute('privateAttribute')
+        );
+
+        $this->assertTrue($constraint->evaluate(new stdClass, '', true));
+        $this->assertFalse($constraint->evaluate(new ClassWithNonPublicAttributes, '', true));
+        $this->assertEquals('does not have attribute "privateAttribute"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(new ClassWithNonPublicAttributes);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that object of class "ClassWithNonPublicAttributes" does not have attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ObjectHasAttribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::objectHasAttribute
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintObjectNotHasAttribute2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::objectHasAttribute('privateAttribute')
+        );
+
+        try {
+            $constraint->evaluate(new ClassWithNonPublicAttributes, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that object of class "ClassWithNonPublicAttributes" does not have attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_PCREMatch
+     * @covers PHPUnit_Framework_Assert::matchesRegularExpression
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintPCREMatch()
+    {
+        $constraint = PHPUnit_Framework_Assert::matchesRegularExpression('/foo/');
+
+        $this->assertFalse($constraint->evaluate('barbazbar', '', true));
+        $this->assertTrue($constraint->evaluate('barfoobar', '', true));
+        $this->assertEquals('matches PCRE pattern "/foo/"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('barbazbar');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'barbazbar' matches PCRE pattern "/foo/".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_PCREMatch
+     * @covers PHPUnit_Framework_Assert::matchesRegularExpression
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintPCREMatch2()
+    {
+        $constraint = PHPUnit_Framework_Assert::matchesRegularExpression('/foo/');
+
+        try {
+            $constraint->evaluate('barbazbar', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that 'barbazbar' matches PCRE pattern "/foo/".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_PCREMatch
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::matchesRegularExpression
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintPCRENotMatch()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::matchesRegularExpression('/foo/')
+        );
+
+        $this->assertTrue($constraint->evaluate('barbazbar', '', true));
+        $this->assertFalse($constraint->evaluate('barfoobar', '', true));
+        $this->assertEquals('does not match PCRE pattern "/foo/"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('barfoobar');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'barfoobar' does not match PCRE pattern "/foo/".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_PCREMatch
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::matchesRegularExpression
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintPCRENotMatch2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::matchesRegularExpression('/foo/')
+        );
+
+        try {
+            $constraint->evaluate('barfoobar', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that 'barfoobar' does not match PCRE pattern "/foo/".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringMatches
+     * @covers PHPUnit_Framework_Assert::matches
+     * @covers PHPUnit_Framework_Constraint::count
+     */
+    public function testConstraintStringMatches()
+    {
+        $constraint = PHPUnit_Framework_Assert::matches('*%c*');
+        $this->assertFalse($constraint->evaluate('**', '', true));
+        $this->assertTrue($constraint->evaluate('***', '', true));
+        $this->assertEquals('matches PCRE pattern "/^\*.\*$/s"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringMatches
+     * @covers PHPUnit_Framework_Assert::matches
+     * @covers PHPUnit_Framework_Constraint::count
+     */
+    public function testConstraintStringMatches2()
+    {
+        $constraint = PHPUnit_Framework_Assert::matches('*%s*');
+        $this->assertFalse($constraint->evaluate('**', '', true));
+        $this->assertTrue($constraint->evaluate('***', '', true));
+        $this->assertEquals('matches PCRE pattern "/^\*[^\r\n]+\*$/s"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringMatches
+     * @covers PHPUnit_Framework_Assert::matches
+     * @covers PHPUnit_Framework_Constraint::count
+     */
+    public function testConstraintStringMatches3()
+    {
+        $constraint = PHPUnit_Framework_Assert::matches('*%i*');
+        $this->assertFalse($constraint->evaluate('**', '', true));
+        $this->assertTrue($constraint->evaluate('*0*', '', true));
+        $this->assertEquals('matches PCRE pattern "/^\*[+-]?\d+\*$/s"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringMatches
+     * @covers PHPUnit_Framework_Assert::matches
+     * @covers PHPUnit_Framework_Constraint::count
+     */
+    public function testConstraintStringMatches4()
+    {
+        $constraint = PHPUnit_Framework_Assert::matches('*%d*');
+        $this->assertFalse($constraint->evaluate('**', '', true));
+        $this->assertTrue($constraint->evaluate('*0*', '', true));
+        $this->assertEquals('matches PCRE pattern "/^\*\d+\*$/s"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringMatches
+     * @covers PHPUnit_Framework_Assert::matches
+     * @covers PHPUnit_Framework_Constraint::count
+     */
+    public function testConstraintStringMatches5()
+    {
+        $constraint = PHPUnit_Framework_Assert::matches('*%x*');
+        $this->assertFalse($constraint->evaluate('**', '', true));
+        $this->assertTrue($constraint->evaluate('*0f0f0f*', '', true));
+        $this->assertEquals('matches PCRE pattern "/^\*[0-9a-fA-F]+\*$/s"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringMatches
+     * @covers PHPUnit_Framework_Assert::matches
+     * @covers PHPUnit_Framework_Constraint::count
+     */
+    public function testConstraintStringMatches6()
+    {
+        $constraint = PHPUnit_Framework_Assert::matches('*%f*');
+        $this->assertFalse($constraint->evaluate('**', '', true));
+        $this->assertTrue($constraint->evaluate('*1.0*', '', true));
+        $this->assertEquals('matches PCRE pattern "/^\*[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?\*$/s"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringStartsWith
+     * @covers PHPUnit_Framework_Assert::stringStartsWith
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringStartsWith()
+    {
+        $constraint = PHPUnit_Framework_Assert::stringStartsWith('prefix');
+
+        $this->assertFalse($constraint->evaluate('foo', '', true));
+        $this->assertTrue($constraint->evaluate('prefixfoo', '', true));
+        $this->assertEquals('starts with "prefix"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('foo');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'foo' starts with "prefix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringStartsWith
+     * @covers PHPUnit_Framework_Assert::stringStartsWith
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringStartsWith2()
+    {
+        $constraint = PHPUnit_Framework_Assert::stringStartsWith('prefix');
+
+        try {
+            $constraint->evaluate('foo', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message\nFailed asserting that 'foo' starts with "prefix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringStartsWith
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::stringStartsWith
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringStartsNotWith()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::stringStartsWith('prefix')
+        );
+
+        $this->assertTrue($constraint->evaluate('foo', '', true));
+        $this->assertFalse($constraint->evaluate('prefixfoo', '', true));
+        $this->assertEquals('starts not with "prefix"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('prefixfoo');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'prefixfoo' starts not with "prefix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringStartsWith
+     * @covers PHPUnit_Framework_Assert::stringStartsWith
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringStartsNotWith2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::stringStartsWith('prefix')
+        );
+
+        try {
+            $constraint->evaluate('prefixfoo', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 'prefixfoo' starts not with "prefix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringContains
+     * @covers PHPUnit_Framework_Assert::stringContains
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringContains()
+    {
+        $constraint = PHPUnit_Framework_Assert::stringContains('foo');
+
+        $this->assertFalse($constraint->evaluate('barbazbar', '', true));
+        $this->assertTrue($constraint->evaluate('barfoobar', '', true));
+        $this->assertEquals('contains "foo"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('barbazbar');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'barbazbar' contains "foo".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringContains
+     * @covers PHPUnit_Framework_Assert::stringContains
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringContains2()
+    {
+        $constraint = PHPUnit_Framework_Assert::stringContains('foo');
+
+        try {
+            $constraint->evaluate('barbazbar', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 'barbazbar' contains "foo".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringContains
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::stringContains
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringNotContains()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::stringContains('foo')
+        );
+
+        $this->assertTrue($constraint->evaluate('barbazbar', '', true));
+        $this->assertFalse($constraint->evaluate('barfoobar', '', true));
+        $this->assertEquals('does not contain "foo"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('barfoobar');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'barfoobar' does not contain "foo".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringContains
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::stringContains
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringNotContains2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::stringContains('foo')
+        );
+
+        try {
+            $constraint->evaluate('barfoobar', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 'barfoobar' does not contain "foo".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringEndsWith
+     * @covers PHPUnit_Framework_Assert::stringEndsWith
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringEndsWith()
+    {
+        $constraint = PHPUnit_Framework_Assert::stringEndsWith('suffix');
+
+        $this->assertFalse($constraint->evaluate('foo', '', true));
+        $this->assertTrue($constraint->evaluate('foosuffix', '', true));
+        $this->assertEquals('ends with "suffix"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('foo');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'foo' ends with "suffix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringEndsWith
+     * @covers PHPUnit_Framework_Assert::stringEndsWith
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringEndsWith2()
+    {
+        $constraint = PHPUnit_Framework_Assert::stringEndsWith('suffix');
+
+        try {
+            $constraint->evaluate('foo', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 'foo' ends with "suffix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringEndsWith
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::stringEndsWith
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringEndsNotWith()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::stringEndsWith('suffix')
+        );
+
+        $this->assertTrue($constraint->evaluate('foo', '', true));
+        $this->assertFalse($constraint->evaluate('foosuffix', '', true));
+        $this->assertEquals('ends not with "suffix"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('foosuffix');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'foosuffix' ends not with "suffix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringEndsWith
+     * @covers PHPUnit_Framework_Assert::stringEndsWith
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringEndsNotWith2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::stringEndsWith('suffix')
+        );
+
+        try {
+            $constraint->evaluate('foosuffix', 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 'foosuffix' ends not with "suffix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     */
+    public function testConstraintArrayContainsCheckForObjectIdentity()
+    {
+        // Check for primitive type.
+        $constraint = new PHPUnit_Framework_Constraint_TraversableContains('foo', true, true);
+
+        $this->assertFalse($constraint->evaluate(array(0), '', true));
+        $this->assertFalse($constraint->evaluate(array(true), '', true));
+
+        // Default case.
+        $constraint = new PHPUnit_Framework_Constraint_TraversableContains('foo');
+
+        $this->assertTrue($constraint->evaluate(array(0), '', true));
+        $this->assertTrue($constraint->evaluate(array(true), '', true));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayContains()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_TraversableContains('foo');
+
+        $this->assertFalse($constraint->evaluate(array('bar'), '', true));
+        $this->assertTrue($constraint->evaluate(array('foo'), '', true));
+        $this->assertEquals("contains 'foo'", $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(array('bar'));
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that an array contains 'foo'.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayContains2()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_TraversableContains('foo');
+
+        try {
+            $constraint->evaluate(array('bar'), 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that an array contains 'foo'.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayNotContains()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          new PHPUnit_Framework_Constraint_TraversableContains('foo')
+        );
+
+        $this->assertTrue($constraint->evaluate(array('bar'), '', true));
+        $this->assertFalse($constraint->evaluate(array('foo'), '', true));
+        $this->assertEquals("does not contain 'foo'", $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(array('foo'));
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that an array does not contain 'foo'.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayNotContains2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          new PHPUnit_Framework_Constraint_TraversableContains('foo')
+        );
+
+        try {
+            $constraint->evaluate(array('foo'), 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that an array does not contain 'foo'.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintSplObjectStorageContains()
+    {
+        $object     = new StdClass;
+        $constraint = new PHPUnit_Framework_Constraint_TraversableContains($object);
+        $this->assertStringMatchesFormat('contains stdClass Object &%s ()', $constraint->toString());
+
+        $storage = new SplObjectStorage;
+        $this->assertFalse($constraint->evaluate($storage, '', true));
+
+        $storage->attach($object);
+        $this->assertTrue($constraint->evaluate($storage, '', true));
+
+        try {
+            $constraint->evaluate(new SplObjectStorage);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertStringMatchesFormat(
+              <<<EOF
+Failed asserting that a traversable contains stdClass Object &%x ().
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintSplObjectStorageContains2()
+    {
+        $object     = new StdClass;
+        $constraint = new PHPUnit_Framework_Constraint_TraversableContains($object);
+
+        try {
+            $constraint->evaluate(new SplObjectStorage, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertStringMatchesFormat(
+              <<<EOF
+custom message
+Failed asserting that a traversable contains stdClass Object &%x ().
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::attributeEqualTo
+     * @covers PHPUnit_Framework_Constraint_Attribute
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testAttributeEqualTo()
+    {
+        $object     = new ClassWithNonPublicAttributes;
+        $constraint = PHPUnit_Framework_Assert::attributeEqualTo('foo', 1);
+
+        $this->assertTrue($constraint->evaluate($object, '', true));
+        $this->assertEquals('attribute "foo" is equal to 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        $constraint = PHPUnit_Framework_Assert::attributeEqualTo('foo', 2);
+
+        $this->assertFalse($constraint->evaluate($object, '', true));
+
+        try {
+            $constraint->evaluate($object);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that attribute "foo" is equal to 2.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::attributeEqualTo
+     * @covers PHPUnit_Framework_Constraint_Attribute
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testAttributeEqualTo2()
+    {
+        $object     = new ClassWithNonPublicAttributes;
+        $constraint = PHPUnit_Framework_Assert::attributeEqualTo('foo', 2);
+
+        try {
+            $constraint->evaluate($object, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message\nFailed asserting that attribute "foo" is equal to 2.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::attributeEqualTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_Constraint_Attribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testAttributeNotEqualTo()
+    {
+        $object     = new ClassWithNonPublicAttributes;
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::attributeEqualTo('foo', 2)
+        );
+
+        $this->assertTrue($constraint->evaluate($object, '', true));
+        $this->assertEquals('attribute "foo" is not equal to 2', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::attributeEqualTo('foo', 1)
+        );
+
+        $this->assertFalse($constraint->evaluate($object, '', true));
+
+        try {
+            $constraint->evaluate($object);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that attribute "foo" is not equal to 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::attributeEqualTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_Constraint_Attribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testAttributeNotEqualTo2()
+    {
+        $object     = new ClassWithNonPublicAttributes;
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::attributeEqualTo('foo', 1)
+        );
+
+        try {
+            $constraint->evaluate($object, 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message\nFailed asserting that attribute "foo" is not equal to 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEmpty
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsEmpty()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_IsEmpty;
+
+        $this->assertFalse($constraint->evaluate(array('foo'), '', true));
+        $this->assertTrue($constraint->evaluate(array(), '', true));
+        $this->assertFalse($constraint->evaluate(new ArrayObject(array('foo')), '', true));
+        $this->assertTrue($constraint->evaluate(new ArrayObject(array()), '', true));
+        $this->assertEquals('is empty', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(array('foo'));
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that an array is empty.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEmpty
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsEmpty2()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_IsEmpty;
+
+        try {
+            $constraint->evaluate(array('foo'), 'custom message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message\nFailed asserting that an array is empty.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Count
+     */
+    public function testConstraintCountWithAnArray()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_Count(5);
+
+        $this->assertTrue($constraint->evaluate(array(1, 2, 3, 4, 5), '', true));
+        $this->assertFalse($constraint->evaluate(array(1, 2, 3, 4), '', true));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Count
+     */
+    public function testConstraintCountWithAnIteratorWhichDoesNotImplementCountable()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_Count(5);
+
+        $this->assertTrue($constraint->evaluate(new TestIterator(array(1, 2, 3, 4, 5)), '', true));
+        $this->assertFalse($constraint->evaluate(new TestIterator(array(1, 2, 3, 4)), '', true));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Count
+     */
+    public function testConstraintCountWithAnObjectImplementingCountable()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_Count(5);
+
+        $this->assertTrue($constraint->evaluate(new ArrayObject(array(1, 2, 3, 4, 5)), '', true));
+        $this->assertFalse($constraint->evaluate(new ArrayObject(array(1, 2, 3, 4)), '', true));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintCountFailing()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_Count(5);
+
+        try {
+            $constraint->evaluate(array(1, 2));
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that actual size 2 matches expected size 5.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Count
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotCountFailing()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          new PHPUnit_Framework_Constraint_Count(2)
+        );
+
+        try {
+            $constraint->evaluate(array(1, 2));
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that actual size 2 does not match expected size 2.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_SameSize
+     */
+    public function testConstraintSameSizeWithAnArray()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_SameSize(array(1, 2, 3, 4, 5));
+
+        $this->assertTrue($constraint->evaluate(array(6, 7, 8, 9, 10), '', true));
+        $this->assertFalse($constraint->evaluate(array(1, 2, 3, 4), '', true));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_SameSize
+     */
+    public function testConstraintSameSizeWithAnIteratorWhichDoesNotImplementCountable()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_SameSize(new TestIterator(array(1, 2, 3, 4, 5)));
+
+        $this->assertTrue($constraint->evaluate(new TestIterator(array(6, 7, 8, 9, 10)), '', true));
+        $this->assertFalse($constraint->evaluate(new TestIterator(array(1, 2, 3, 4)), '', true));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_SameSize
+     */
+    public function testConstraintSameSizeWithAnObjectImplementingCountable()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_SameSize(new ArrayObject(array(1, 2, 3, 4, 5)));
+
+        $this->assertTrue($constraint->evaluate(new ArrayObject(array(6, 7, 8, 9, 10)), '', true));
+        $this->assertFalse($constraint->evaluate(new ArrayObject(array(1, 2, 3, 4)), '', true));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_SameSize
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintSameSizeFailing()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_SameSize(array(1, 2, 3, 4, 5));
+
+        try {
+            $constraint->evaluate(array(1, 2));
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that actual size 2 matches expected size 5.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_SameSize
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotSameSizeFailing()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          new PHPUnit_Framework_Constraint_SameSize(array(1, 2))
+        );
+
+        try {
+            $constraint->evaluate(array(3, 4));
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that actual size 2 does not match expected size 2.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Exception
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintException()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_Exception('FoobarException');
+        $exception  = new DummyException('Test');
+        $stackTrace = $exception->getTraceAsString();
+
+        try {
+            $constraint->evaluate($exception);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that exception of type "DummyException" matches expected exception "FoobarException". Message was: "Test" at
+$stackTrace.
+
+EOF
+                ,
+                PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * Removes spaces in front of newlines
+     *
+     * @param string $string
+     *
+     * @return string
+     */
+    private function trimnl($string)
+    {
+        return preg_replace('/[ ]*\n/', "\n", $string);
+    }
+}