public function dataProviderForObjectTypeConverters()
{
$data = [];
$className1 = uniqid('Neos_Flow_Testclass1_', false);
$className2 = uniqid('Neos_Flow_Testclass2_', false);
$className3 = uniqid('Neos_Flow_Testclass3_', false);
$interfaceName1 = uniqid('Neos_Flow_TestInterface1_', false);
$interfaceName2 = uniqid('Neos_Flow_TestInterface2_', false);
$interfaceName3 = uniqid('Neos_Flow_TestInterface3_', false);
eval('
interface ' . $interfaceName2 . ' {}
interface ' . $interfaceName1 . ' {}
interface ' . $interfaceName3 . ' extends ' . $interfaceName2 . ' {}
class ' . $className1 . ' implements ' . $interfaceName1 . ' {}
class ' . $className2 . ' extends ' . $className1 . ' {}
class ' . $className3 . ' extends ' . $className2 . ' implements ' . $interfaceName3 . ' {}
');
// The most specific converter should win
$data[] = ['target' => $className3, 'expectedConverter' => 'Class3Converter', 'typeConverters' => [$className2 => [0 => $this->getMockTypeConverter('Class2Converter')], $className3 => [0 => $this->getMockTypeConverter('Class3Converter')], $interfaceName1 => [0 => $this->getMockTypeConverter('Interface1Converter')], $interfaceName2 => [0 => $this->getMockTypeConverter('Interface2Converter')], $interfaceName3 => [0 => $this->getMockTypeConverter('Interface3Converter')]]];
// In case the most specific converter does not want to handle this conversion, the second one is taken.
$data[] = ['target' => $className3, 'expectedConverter' => 'Class2Converter', 'typeConverters' => [$className2 => [0 => $this->getMockTypeConverter('Class2Converter')], $className3 => [0 => $this->getMockTypeConverter('Class3Converter', false)], $interfaceName1 => [0 => $this->getMockTypeConverter('Interface1Converter')], $interfaceName2 => [0 => $this->getMockTypeConverter('Interface2Converter')], $interfaceName3 => [0 => $this->getMockTypeConverter('Interface3Converter')]]];
// In case there is no most-specific-converter, we climb ub the type hierarchy
$data[] = ['target' => $className3, 'expectedConverter' => 'Class2Converter-HighPriority', 'typeConverters' => [$className2 => [0 => $this->getMockTypeConverter('Class2Converter'), 10 => $this->getMockTypeConverter('Class2Converter-HighPriority')]]];
// If no parent class converter wants to handle it, we ask for all interface converters.
$data[] = ['target' => $className3, 'expectedConverter' => 'Interface1Converter', 'typeConverters' => [$className2 => [0 => $this->getMockTypeConverter('Class2Converter', false), 10 => $this->getMockTypeConverter('Class2Converter-HighPriority', false)], $interfaceName1 => [4 => $this->getMockTypeConverter('Interface1Converter')], $interfaceName2 => [1 => $this->getMockTypeConverter('Interface2Converter')], $interfaceName3 => [2 => $this->getMockTypeConverter('Interface3Converter')]]];
// If two interface converters have the same priority, an exception is thrown.
$data[] = ['target' => $className3, 'expectedConverter' => 'Interface1Converter', 'typeConverters' => [$className2 => [0 => $this->getMockTypeConverter('Class2Converter', false), 10 => $this->getMockTypeConverter('Class2Converter-HighPriority', false)], $interfaceName1 => [4 => $this->getMockTypeConverter('Interface1Converter')], $interfaceName2 => [2 => $this->getMockTypeConverter('Interface2Converter')], $interfaceName3 => [2 => $this->getMockTypeConverter('Interface3Converter')]], 'shouldFailWithException' => DuplicateTypeConverterException::class];
// If no interface converter wants to handle it, a converter for "object" is looked up.
$data[] = ['target' => $className3, 'expectedConverter' => 'GenericObjectConverter-HighPriority', 'typeConverters' => [$className2 => [0 => $this->getMockTypeConverter('Class2Converter', false), 10 => $this->getMockTypeConverter('Class2Converter-HighPriority', false)], $interfaceName1 => [4 => $this->getMockTypeConverter('Interface1Converter', false)], $interfaceName2 => [3 => $this->getMockTypeConverter('Interface2Converter', false)], $interfaceName3 => [2 => $this->getMockTypeConverter('Interface3Converter', false)], 'object' => [1 => $this->getMockTypeConverter('GenericObjectConverter'), 10 => $this->getMockTypeConverter('GenericObjectConverter-HighPriority')]]];
// If the target is no valid class name and no simple type, an exception is thrown
$data[] = ['target' => 'SomeNotExistingClassName', 'expectedConverter' => 'GenericObjectConverter-HighPriority', 'typeConverters' => [], 'shouldFailWithException' => InvalidTargetException::class];
// if the type converter is not found, we expect an exception
$data[] = ['target' => $className3, 'expectedConverter' => 'Class3Converter', 'typeConverters' => [], 'shouldFailWithException' => TypeConverterException::class];
// If The target type is no string, we expect an exception.
$data[] = ['target' => new \stdClass(), 'expectedConverter' => '', 'typeConverters' => [], 'shouldFailWithException' => InvalidTargetException::class];
return $data;
}