Prechádzať zdrojové kódy

Add prof-of-concept test, this test will fail without changes in previous commit

Dariusz Górecki 13 rokov pred
rodič
commit
7f7c2a7094

+ 179 - 24
tests/Symfony/Tests/Component/Validator/Constraints/CollectionValidatorTest.php

@@ -13,9 +13,71 @@ namespace Symfony\Tests\Component\Validator\Constraints;
 
 use Symfony\Component\Validator\ExecutionContext;
 use Symfony\Component\Validator\Constraints\Min;
+use Symfony\Component\Validator\Constraints\NotBlank;
+use Symfony\Component\Validator\Constraints\NotNull;
 use Symfony\Component\Validator\Constraints\Collection;
 use Symfony\Component\Validator\Constraints\CollectionValidator;
 
+/**
+ * This class is a hand written simplified version of PHP native `ArrayObject`
+ * class, to show that it behaves different than PHP native implementation.
+ */
+class TestArrayObject implements \ArrayAccess, \IteratorAggregate, \Countable, \Serializable
+{
+    private $array;
+
+    public function __construct(array $array = null)
+    {
+        $this->array = (array) ($array ?: array());
+    }
+
+    public function offsetExists($offset)
+    {
+        return array_key_exists($offset, $this->array);
+    }
+
+    public function offsetGet($offset)
+    {
+        return $this->array[$offset];
+    }
+
+    public function offsetSet($offset, $value)
+    {
+        if (null === $offset) {
+            $this->array[] = $value;
+        } else {
+            $this->array[$offset] = $value;
+        }
+    }
+
+    public function offsetUnset($offset)
+    {
+        if (array_key_exists($offset, $this->array)) {
+            unset($this->array[$offset]);
+        }
+    }
+
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->array);
+    }
+
+    public function count()
+    {
+        return count($this->array);
+    }
+
+    public function serialize()
+    {
+        return serialize($this->array);
+    }
+
+    public function unserialize($serialized)
+    {
+        $this->array = (array) unserialize((string) $serialized);
+    }
+}
+
 class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
 {
     protected $validator;
@@ -49,15 +111,22 @@ class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
 
     public function testFieldsAsDefaultOption()
     {
-        $this->validator->isValid(array('foo' => 'foobar'), new Collection(array(
+        $this->assertTrue($this->validator->isValid(array('foo' => 'foobar'), new Collection(array(
             'foo' => new Min(4),
-        )));
+        ))));
+        $this->assertTrue($this->validator->isValid(new \ArrayObject(array('foo' => 'foobar')), new Collection(array(
+            'foo' => new Min(4),
+        ))));
+        $this->assertTrue($this->validator->isValid(new TestArrayObject(array('foo' => 'foobar')), new Collection(array(
+            'foo' => new Min(4),
+        ))));
     }
 
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
     public function testThrowsExceptionIfNotTraversable()
     {
-        $this->setExpectedException('Symfony\Component\Validator\Exception\UnexpectedTypeException');
-
         $this->validator->isValid('foobar', new Collection(array('fields' => array(
             'foo' => new Min(4),
         ))));
@@ -112,13 +181,11 @@ class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
         ))));
     }
 
-    public function testExtraFieldsDisallowed()
+    /**
+     * @dataProvider getArgumentsWithExtraFields
+     */
+    public function testExtraFieldsDisallowed($array)
     {
-        $array = array(
-            'foo' => 5,
-            'bar' => 6,
-        );
-
         $this->assertFalse($this->validator->isValid($array, new Collection(array(
             'fields' => array(
                 'foo' => new Min(4),
@@ -132,12 +199,15 @@ class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
         $array = array(
             'foo' => null,
         );
-
-        $this->assertTrue($this->validator->isValid($array, new Collection(array(
+        $collection = new Collection(array(
             'fields' => array(
                 'foo' => new Min(4),
             ),
-        ))));
+        ));
+
+        $this->assertTrue($this->validator->isValid($array, $collection));
+        $this->assertTrue($this->validator->isValid(new \ArrayObject($array), $collection));
+        $this->assertTrue($this->validator->isValid(new TestArrayObject($array), $collection));
     }
 
     public function testExtraFieldsAllowed()
@@ -146,13 +216,16 @@ class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
             'foo' => 5,
             'bar' => 6,
         );
-
-        $this->assertTrue($this->validator->isValid($array, new Collection(array(
+        $collection = new Collection(array(
             'fields' => array(
                 'foo' => new Min(4),
             ),
             'allowExtraFields' => true,
-        ))));
+        ));
+
+        $this->assertTrue($this->validator->isValid($array, $collection));
+        $this->assertTrue($this->validator->isValid(new \ArrayObject($array), $collection));
+        $this->assertTrue($this->validator->isValid(new TestArrayObject($array), $collection));
     }
 
     public function testMissingFieldsDisallowed()
@@ -162,6 +235,16 @@ class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
                 'foo' => new Min(4),
             ),
         ))));
+        $this->assertFalse($this->validator->isValid(new \ArrayObject(array()), new Collection(array(
+            'fields' => array(
+                'foo' => new Min(4),
+            ),
+        ))));
+        $this->assertFalse($this->validator->isValid(new TestArrayObject(array()), new Collection(array(
+            'fields' => array(
+                'foo' => new Min(4),
+            ),
+        ))));
     }
 
     public function testMissingFieldsAllowed()
@@ -172,16 +255,58 @@ class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
             ),
             'allowMissingFields' => true,
         ))));
+        $this->assertTrue($this->validator->isValid(new \ArrayObject(array()), new Collection(array(
+            'fields' => array(
+                'foo' => new Min(4),
+            ),
+            'allowMissingFields' => true,
+        ))));
+        $this->assertTrue($this->validator->isValid(new TestArrayObject(array()), new Collection(array(
+            'fields' => array(
+                'foo' => new Min(4),
+            ),
+            'allowMissingFields' => true,
+        ))));
     }
 
-    public function getValidArguments()
-    {
-        return array(
-            // can only test for one entry, because PHPUnits mocking does not allow
-            // to expect multiple method calls with different arguments
-            array(array('foo' => 3)),
-            array(new \ArrayObject(array('foo' => 3))),
-        );
+    public function testArrayAccessObject() {
+        $value = new TestArrayObject();
+        $value['foo'] = 12;
+        $value['asdf'] = 'asdfaf';
+
+        $this->assertTrue(isset($value['asdf']));
+        $this->assertTrue(isset($value['foo']));
+        $this->assertFalse(empty($value['asdf']));
+        $this->assertFalse(empty($value['foo']));
+
+        $result = $this->validator->isValid($value, new Collection(array(
+            'fields' => array(
+                'foo' => new NotBlank(),
+                'asdf' => new NotBlank()
+            )
+        )));
+
+        $this->assertTrue($result);
+    }
+
+    public function testArrayObject() {
+        $value = new \ArrayObject(array());
+        $value['foo'] = 12;
+        $value['asdf'] = 'asdfaf';
+
+        $this->assertTrue(isset($value['asdf']));
+        $this->assertTrue(isset($value['foo']));
+        $this->assertFalse(empty($value['asdf']));
+        $this->assertFalse(empty($value['foo']));
+
+        $result = $this->validator->isValid($value, new Collection(array(
+            'fields' => array(
+                'foo' => new NotBlank(),
+                'asdf' => new NotBlank()
+            )
+        )));
+
+        $this->assertTrue($result);
     }
 
     public function testObjectShouldBeLeftUnchanged()
@@ -199,4 +324,34 @@ class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
             'foo' => 3
         ), (array) $value);
     }
+
+    public function getValidArguments()
+    {
+        return array(
+            // can only test for one entry, because PHPUnits mocking does not allow
+            // to expect multiple method calls with different arguments
+            array(array('foo' => 3)),
+            array(new \ArrayObject(array('foo' => 3))),
+            array(new TestArrayObject(array('foo' => 3))),
+        );
+    }
+
+    public function getArgumentsWithExtraFields()
+    {
+        return array(
+            array(array(
+                'foo' => 5,
+                'bar' => 6,
+            )),
+            array(new \ArrayObject(array(
+                'foo' => 5,
+                'bar' => 6,
+            ))),
+            array(new TestArrayObject(array(
+                'foo' => 5,
+                'bar' => 6,
+            )))
+        );
+    }
 }
+