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()->getFullPrefix()) ->toBe(''); it('gets the path without parents') ->expect(fn () => $make()->prefix('/t1/t2')->getFullPrefix()) ->toBe('/t1/t2'); it('gets the path with parent') ->expect(fn () => $make( $make()->prefix('hello/world') )->prefix('/t1/t2')->getFullPrefix()) ->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')->getFullPrefix()) ->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')->getFullPrefix()) ->toBe('/test/hello/world/t1/t2'); it('gets the name with no prefix or parents') ->expect(fn () => $make()->getFullName()) ->toBeNull(); it('gets the name without parents') ->expect(fn () => $make()->name('test-test')->getFullName()) ->toBe('test-test'); it('gets the name with parent') ->expect(fn () => $make( $make()->name('hello-world.') )->name('test')->getFullName()) ->toBe('hello-world.test'); it('gets the name with two ancestors') ->expect(fn () => $make( $make( $make()->name('test.') )->name('test1') )->name('hello')->getFullName()) ->toBe('test.test1hello'); it('gets the name with three ancestors, one without name') ->expect(fn () => $make( $make( $make($make()->name('test1.')) )->name('test2.') )->name('test3.')->getFullName()) ->toBe('test1.test2.test3.'); it('has middleware')->todo();