title)->toBe('Test Page'); expect($layoutData->currentPath)->toBe('/admin/test'); expect($layoutData->navigationMenu)->toBe($navigationMenu); expect($layoutData->breadcrumbs)->toBe($breadcrumbs); }); it('can be created from array', function () { $data = [ 'title' => 'Dashboard', 'current_path' => '/admin/dashboard', 'navigation_menu' => [ [ 'section' => 'System', 'items' => [ ['name' => 'Dashboard', 'url' => '/admin'], ['name' => 'Users', 'url' => '/admin/users'], ], ], ], 'breadcrumbs_data' => [ ['name' => 'Admin', 'url' => '/admin'], ['name' => 'Dashboard', 'url' => '/admin/dashboard'], ], ]; $layoutData = AdminLayoutData::fromArray($data); expect($layoutData->title)->toBe('Dashboard'); expect($layoutData->currentPath)->toBe('/admin/dashboard'); expect($layoutData->navigationMenu->sections)->toHaveCount(1); expect($layoutData->breadcrumbs->breadcrumbs)->toHaveCount(2); }); it('converts to array correctly', function () { $navigationMenu = new NavigationMenu([ new NavigationSection('System', [ new NavigationItem('Dashboard', '/admin'), ]), ]); $breadcrumbs = new BreadcrumbCollection([ new Breadcrumb('Admin', '/admin'), ]); $layoutData = new AdminLayoutData( title: 'Test Page', navigationMenu: $navigationMenu, breadcrumbs: $breadcrumbs, currentPath: '/admin/test' ); $array = $layoutData->toArray(); expect($array['title'])->toBe('Test Page'); expect($array['page_title'])->toBe('Test Page'); expect($array['current_path'])->toBe('/admin/test'); expect($array['navigation_menu'])->toBeArray(); expect($array['breadcrumbs_data'])->toBeArray(); }); it('supports immutable transformations', function () { $originalData = new AdminLayoutData( title: 'Original', navigationMenu: new NavigationMenu([]), breadcrumbs: new BreadcrumbCollection([]), currentPath: '/admin' ); $newData = $originalData->withTitle('New Title'); expect($originalData->title)->toBe('Original'); expect($newData->title)->toBe('New Title'); expect($newData !== $originalData)->toBeTrue(); }); it('handles optional parameters correctly', function () { $layoutData = new AdminLayoutData( title: 'Test', navigationMenu: new NavigationMenu([]), breadcrumbs: new BreadcrumbCollection([]), currentPath: '/admin', metaDescription: 'Test description', pageClass: 'admin-page' ); expect($layoutData->metaDescription)->toBe('Test description'); expect($layoutData->pageClass)->toBe('admin-page'); $array = $layoutData->toArray(); expect($array['meta_description'])->toBe('Test description'); expect($array['page_class'])->toBe('admin-page'); }); });