public function jsonViewTestData()
{
$output = [];
$object = new \stdClass();
$object->value1 = 'foo';
$object->value2 = 1;
$configuration = [];
$expected = ['value1' => 'foo', 'value2' => 1];
$output[] = [$object, $configuration, $expected, 'all direct child properties should be serialized'];
$configuration = ['_only' => ['value1']];
$expected = ['value1' => 'foo'];
$output[] = [$object, $configuration, $expected, 'if "only" properties are specified, only these should be serialized'];
$configuration = ['_exclude' => ['value1']];
$expected = ['value2' => 1];
$output[] = [$object, $configuration, $expected, 'if "exclude" properties are specified, they should not be serialized'];
$object = new \stdClass();
$object->value1 = new \stdClass();
$object->value1->subvalue1 = 'Foo';
$object->value2 = 1;
$configuration = [];
$expected = ['value2' => 1];
$output[] = [$object, $configuration, $expected, 'by default, sub objects of objects should not be serialized.'];
$object = new \stdClass();
$object->value1 = ['subarray' => 'value'];
$object->value2 = 1;
$configuration = [];
$expected = ['value2' => 1];
$output[] = [$object, $configuration, $expected, 'by default, sub arrays of objects should not be serialized.'];
$object = ['foo' => 'bar', 1 => 'baz', 'deep' => ['test' => 'value']];
$configuration = [];
$expected = ['foo' => 'bar', 1 => 'baz', 'deep' => ['test' => 'value']];
$output[] = [$object, $configuration, $expected, 'associative arrays should be serialized deeply'];
$object = ['foo', 'bar'];
$configuration = [];
$expected = ['foo', 'bar'];
$output[] = [$object, $configuration, $expected, 'numeric arrays should be serialized'];
$nestedObject = new \stdClass();
$nestedObject->value1 = 'foo';
$object = [$nestedObject];
$configuration = [];
$expected = [['value1' => 'foo']];
$output[] = [$object, $configuration, $expected, 'array of objects should be serialized'];
$properties = ['foo' => 'bar', 'prohibited' => 'xxx'];
$nestedObject = $this->createMock(Fixtures\NestedTestObject::class);
$nestedObject->expects($this->any())->method('getName')->will($this->returnValue('name'));
$nestedObject->expects($this->any())->method('getPath')->will($this->returnValue('path'));
$nestedObject->expects($this->any())->method('getProperties')->will($this->returnValue($properties));
$nestedObject->expects($this->never())->method('getOther');
$object = $nestedObject;
$configuration = ['_only' => ['name', 'path', 'properties'], '_descend' => ['properties' => ['_exclude' => ['prohibited']]]];
$expected = ['name' => 'name', 'path' => 'path', 'properties' => ['foo' => 'bar']];
$output[] = [$object, $configuration, $expected, 'descending into arrays should be possible'];
$nestedObject = new \stdClass();
$nestedObject->value1 = 'foo';
$value = new \SplObjectStorage();
$value->attach($nestedObject);
$configuration = [];
$expected = [['value1' => 'foo']];
$output[] = [$value, $configuration, $expected, 'SplObjectStorage with objects should be serialized'];
$dateTimeObject = new \DateTime('2011-02-03T03:15:23', new \DateTimeZone('UTC'));
$configuration = [];
$expected = '2011-02-03T03:15:23+0000';
$output[] = [$dateTimeObject, $configuration, $expected, 'DateTime object in UTC time zone could not be serialized.'];
$dateTimeObject = new \DateTime('2013-08-15T15:25:30', new \DateTimeZone('America/Los_Angeles'));
$configuration = [];
$expected = '2013-08-15T15:25:30-0700';
$output[] = [$dateTimeObject, $configuration, $expected, 'DateTime object in America/Los_Angeles time zone could not be serialized.'];
return $output;
}