<?php

declare(strict_types=1);

use App\Support\Diff\DiffRow;
use App\Support\Diff\DiffRowStatus;

it('requires a non-empty key and label', function (): void {
    expect(fn (): DiffRow => 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']);
});
