new DiffRow( key: '', label: 'Display name', status: DiffRowStatus::Changed, ))->toThrow(\InvalidArgumentException::class, 'DiffRow key must be a non-empty string.'); expect(fn (): DiffRow => new DiffRow( key: 'display_name', label: ' ', status: DiffRowStatus::Changed, ))->toThrow(\InvalidArgumentException::class, 'DiffRow label must be a non-empty string.'); }); it('stores optional list fragments and meta for rendering', function (): void { $row = new DiffRow( key: 'assignments', label: 'Assignments', status: DiffRowStatus::Changed, oldValue: ['old-a', 'shared'], newValue: ['new-b', 'shared'], isListLike: true, addedItems: ['new-b'], removedItems: ['old-a'], unchangedItems: ['shared'], meta: ['hint' => 'policy level'], ); expect($row->key)->toBe('assignments') ->and($row->label)->toBe('Assignments') ->and($row->status)->toBe(DiffRowStatus::Changed) ->and($row->isListLike)->toBeTrue() ->and($row->addedItems)->toBe(['new-b']) ->and($row->removedItems)->toBe(['old-a']) ->and($row->unchangedItems)->toBe(['shared']) ->and($row->meta)->toBe(['hint' => 'policy level']); });