singleton(UnifiedDiscoveryService::class, $discovery); // Register DemoScrollDataProvider $container->singleton(DemoScrollDataProvider::class, fn () => new DemoScrollDataProvider()); // Create DataProviderResolver $resolver = new DataProviderResolver($discovery); echo "✓ DataProviderResolver created\n\n"; // 2. Test 1: Initial Render with dataSource echo "2. Test 1: Initial Render with dataSource='demo'...\n"; $component = new InfiniteScrollComponent( id: ComponentId::fromString('scroll:test'), dataProviderResolver: $resolver, items: [], currentPage: 0, pageSize: 5, dataSource: 'demo' ); echo "✓ Component created\n"; $initialData = $component->getData(); echo " - dataSource in state: " . $initialData->get('data_source') . "\n"; echo " - Initial items: " . count($initialData->get('items')) . "\n\n"; // 3. Test 2: Execute Action echo "3. Test 2: Execute Action - loadMore()...\n"; try { $actionResult = $component->loadMore(); echo "✓ Action executed\n"; $items = $actionResult->get('items'); echo " - Items loaded: " . count($items) . "\n"; echo " - Current page: " . $actionResult->get('current_page') . "\n"; echo " - dataSource preserved: " . $actionResult->get('data_source') . "\n\n"; } catch (Exception $e) { echo "✗ ERROR in loadMore(): " . $e->getMessage() . "\n"; echo " Stack trace:\n"; echo $e->getTraceAsString() . "\n\n"; exit(1); } // 4. Test 3: State Restoration echo "4. Test 3: State Restoration from ComponentData...\n"; try { $restoredComponent = new InfiniteScrollComponent( id: ComponentId::fromString('scroll:test'), dataProviderResolver: $resolver, initialData: $actionResult ); echo "✓ Component restored from state\n"; $restoredData = $restoredComponent->getData(); echo " - Restored items: " . count($restoredData->get('items')) . "\n"; echo " - Restored page: " . $restoredData->get('current_page') . "\n"; echo " - Restored dataSource: " . $restoredData->get('data_source') . "\n\n"; } catch (Exception $e) { echo "✗ ERROR in state restoration: " . $e->getMessage() . "\n"; echo " Stack trace:\n"; echo $e->getTraceAsString() . "\n\n"; exit(1); } // 5. Test 4: Action on Restored Component echo "5. Test 4: Action on Restored Component - loadMore()...\n"; try { $secondActionResult = $restoredComponent->loadMore(); echo "✓ Second action executed\n"; $secondItems = $secondActionResult->get('items'); echo " - Total items: " . count($secondItems) . "\n"; echo " - Current page: " . $secondActionResult->get('current_page') . "\n"; echo " - dataSource: " . $secondActionResult->get('data_source') . "\n\n"; } catch (Exception $e) { echo "✗ ERROR in second loadMore(): " . $e->getMessage() . "\n"; echo " Stack trace:\n"; echo $e->getTraceAsString() . "\n\n"; exit(1); } // 6. Verify Results echo "6. Verifying Results...\n"; $allPassed = true; if ($secondActionResult->get('data_source') !== 'demo') { echo "✗ FAIL: dataSource not preserved (expected 'demo', got '" . $secondActionResult->get('data_source') . "')\n"; $allPassed = false; } else { echo "✓ PASS: dataSource preserved correctly\n"; } if ($secondActionResult->get('current_page') !== 2) { echo "✗ FAIL: Page count incorrect (expected 2, got " . $secondActionResult->get('current_page') . ")\n"; $allPassed = false; } else { echo "✓ PASS: Page count correct (2)\n"; } if (count($secondItems) !== 10) { echo "✗ FAIL: Item count incorrect (expected 10, got " . count($secondItems) . ")\n"; $allPassed = false; } else { echo "✓ PASS: Item count correct (10)\n"; } echo "\n" . str_repeat('=', 70) . "\n"; if ($allPassed) { echo "✓✓✓ ALL TESTS PASSED ✓✓✓\n"; echo "DataProvider resolution flow works correctly!\n"; exit(0); } else { echo "✗✗✗ SOME TESTS FAILED ✗✗✗\n"; exit(1); }