/**
  * Tests "cast" method with an array value
  */
 public function test_cast_array()
 {
     $parameterType = $this->prophet->prophesize('Gl3n\\HttpQueryStringFilterBundle\\ParameterType\\ParameterTypeInterface');
     $parameterType->castValue('one')->shouldBeCalled()->willReturn(1);
     $parameterType->castValue('two')->shouldBeCalled()->willReturn(2);
     $parameterType->castValue('three')->shouldBeCalled()->willReturn(3);
     $parameterTypeChain = $this->prophet->prophesize('Gl3n\\HttpQueryStringFilterBundle\\ParameterType\\ParameterTypeChain');
     $parameterTypeChain->getParameterType('special')->willReturn($parameterType->reveal());
     $caster = new HttpQueryStringFilterBundle\Caster($parameterTypeChain->reveal());
     $result = $caster->cast(['type' => 'special', 'array' => true], ['one', 'two', 'three']);
     $this->array($result)->isEqualTo([1, 2, 3]);
 }
 /**
  * Filters query parameter bag
  *
  * @param string       $filterName
  * @param ParameterBag $bag
  *
  * @return ParameterBag
  */
 public function filter($filterName, ParameterBag $bag)
 {
     $expectedParams = $this->filters[$filterName];
     // Given parameters
     foreach ($bag->all() as $name => $value) {
         if (!isset($expectedParams[$name])) {
             throw new \InvalidArgumentException(sprintf('Unknow parameter "%s"', $name));
         }
         $options = $expectedParams[$name];
         if (0 < count($options['roles']) && !$this->authorizationChecker->isGranted($options['roles'])) {
             throw new AccessDeniedException(sprintf('User has not the required role to use "%s" parameter', $name));
         }
         $this->validator->validate($name, $options, $value);
         $bag->set($name, $this->caster->cast($options, $value));
     }
     // Expected parameters
     foreach ($expectedParams as $name => $options) {
         Validator::checkMissingParameter($name, $options, $bag);
         if (!$bag->has($name) && isset($options['default'])) {
             $bag->set($name, $this->caster->getDefaultValue($options));
         }
     }
     return $bag;
 }