new Group(new Router, $parent); it('initializes with null defaults') ->expect(fn() => $make()) ->toBeInstanceOf(Group::class) ->getName()->toBeNull() ->getPrefix()->toBeNull(); it('initializes with values') ->expect(new Group(new Router, null, '/test-path', 'test-name')) ->toBeInstanceOf(Group::class) ->getName()->toBe('test-name') ->getPrefix()->toBe('/test-path'); it('can set/get prefix') ->expect(fn() => $make()->prefix('/test')) ->toBeInstanceOf(Group::class) ->getPrefix()->toBe('/test'); it('can set/get name') ->expect(fn() => $make()->name('test')) ->toBeInstanceOf(Group::class) ->getName()->toBe('test'); it('calls group call back with definition', function () use ($make) { $cb = TestCallable::make(fn() => null); $make()->group($cb); $cb->assertCalled(); $call = $cb->getLastCall(); expect($call?->args)->{0}->toBeInstanceOf(GroupDefinition::class); }); it('can have a parent') ->expect(fn () => $make($make())->getParent()) ->toBeInstanceOf(Group::class); it('can have a null parent') ->expect(fn () => $make(null)->getParent()) ->toBeNull(); it('can get all ancestors') ->expect(fn () => $make($make($make()))->getAncestors()) ->toBeArray() ->toContainOnlyInstancesOf(Group::class) ->toHaveCount(2); it('order all ancestors root first', function () use($make) { $g3 = $make($g2 = $make($g1 = $make())); expect($g3->getAncestors()) ->toHaveCount(2) ->{0}->toBe($g1) ->{1}->toBe($g2); }); it('can get all ancestors and self') ->expect(fn () => $make($make($make()))->getAncestorsAndSelf()) ->toBeArray() ->toContainOnlyInstancesOf(Group::class) ->toHaveCount(3); it('order all ancestors and self root first', function () use($make) { $g3 = $make($g2 = $make($g1 = $make())); expect($g3->getAncestorsAndSelf()) ->toHaveCount(3) ->{0}->toBe($g1) ->{1}->toBe($g2) ->{2}->toBe($g3); }); it('gets the path with no prefix or parents') ->expect(fn () => $make()->getPath()) ->toBe('/'); it('gets the path without parents') ->expect(fn () => $make()->prefix('/t1/t2')->getPath()) ->toBe('/t1/t2'); it('gets the path with parent') ->expect(fn () => $make( $make()->prefix('hello/world') )->prefix('/t1/t2')->getPath()) ->toBe('/hello/world/t1/t2'); it('gets the path with two ancestors') ->expect(fn () => $make( $make( $make()->prefix('test') )->prefix('hello/world') )->prefix('/t1/t2')->getPath()) ->toBe('/test/hello/world/t1/t2'); it('gets the path with three ancestors, one without prefix') ->expect(fn () => $make( $make( $make($make()->prefix('test')) )->prefix('hello/world') )->prefix('/t1/t2')->getPath()) ->toBe('/test/hello/world/t1/t2');