propresenter-php/tests/ArrangementTest.php
Thorsten Bus 22ba4aff7d refactor: make repo Composer-compatible by moving php/ to root and ref/ to doc/reference_samples
- Move src/, tests/, bin/, generated/, proto/, composer.json, composer.lock, phpunit.xml from php/ to repo root
- Move ref/ to doc/reference_samples/ for better organization
- Remove vendor/ from git tracking (now properly gitignored)
- Update all test file paths (dirname adjustments and ref/ -> doc/reference_samples/)
- Update all documentation paths (AGENTS.md, doc/*.md)
- Remove php.bak/ directory
- All 252 tests pass
2026-03-30 13:26:29 +02:00

232 lines
7 KiB
PHP

<?php
declare(strict_types=1);
namespace ProPresenter\Parser\Tests;
use PHPUnit\Framework\TestCase;
use ProPresenter\Parser\Arrangement;
use Rv\Data\Presentation\Arrangement as ProtoArrangement;
use Rv\Data\UUID;
use Rv\Data\Presentation;
class ArrangementTest extends TestCase
{
private static ?Presentation $presentation = null;
public static function setUpBeforeClass(): void
{
$data = file_get_contents(__DIR__ . '/../doc/reference_samples/Test.pro');
self::$presentation = new Presentation();
self::$presentation->mergeFromString($data);
}
// --- Unit tests with synthetic protobuf objects ---
public function testGetUuid(): void
{
$uuid = new UUID();
$uuid->setString('arr-uuid-456');
$proto = new ProtoArrangement();
$proto->setUuid($uuid);
$proto->setName('Test Arrangement');
$arrangement = new Arrangement($proto);
$this->assertSame('arr-uuid-456', $arrangement->getUuid());
}
public function testGetName(): void
{
$proto = new ProtoArrangement();
$proto->setName('normal');
$arrangement = new Arrangement($proto);
$this->assertSame('normal', $arrangement->getName());
}
public function testSetName(): void
{
$proto = new ProtoArrangement();
$proto->setName('old');
$arrangement = new Arrangement($proto);
$arrangement->setName('renamed');
$this->assertSame('renamed', $arrangement->getName());
// Verify mutation on underlying protobuf
$this->assertSame('renamed', $proto->getName());
}
public function testGetGroupUuids(): void
{
$uuid1 = new UUID();
$uuid1->setString('group-aaa');
$uuid2 = new UUID();
$uuid2->setString('group-bbb');
$uuid3 = new UUID();
$uuid3->setString('group-ccc');
$proto = new ProtoArrangement();
$proto->setName('test');
$proto->setGroupIdentifiers([$uuid1, $uuid2, $uuid3]);
$arrangement = new Arrangement($proto);
$uuids = $arrangement->getGroupUuids();
$this->assertCount(3, $uuids);
$this->assertSame('group-aaa', $uuids[0]);
$this->assertSame('group-bbb', $uuids[1]);
$this->assertSame('group-ccc', $uuids[2]);
}
public function testGetGroupUuidsEmptyWhenNone(): void
{
$proto = new ProtoArrangement();
$proto->setName('empty');
$arrangement = new Arrangement($proto);
$this->assertSame([], $arrangement->getGroupUuids());
}
public function testSetGroupUuids(): void
{
$proto = new ProtoArrangement();
$proto->setName('test');
$arrangement = new Arrangement($proto);
$arrangement->setGroupUuids(['uuid-1', 'uuid-2']);
$result = $arrangement->getGroupUuids();
$this->assertCount(2, $result);
$this->assertSame('uuid-1', $result[0]);
$this->assertSame('uuid-2', $result[1]);
// Verify underlying protobuf was updated
$identifiers = $proto->getGroupIdentifiers();
$this->assertCount(2, $identifiers);
$this->assertSame('uuid-1', $identifiers[0]->getString());
$this->assertSame('uuid-2', $identifiers[1]->getString());
}
public function testSetGroupUuidsReplacesExisting(): void
{
$uuid1 = new UUID();
$uuid1->setString('old-1');
$proto = new ProtoArrangement();
$proto->setName('test');
$proto->setGroupIdentifiers([$uuid1]);
$arrangement = new Arrangement($proto);
$arrangement->setGroupUuids(['new-1', 'new-2', 'new-3']);
$this->assertCount(3, $arrangement->getGroupUuids());
$this->assertSame('new-1', $arrangement->getGroupUuids()[0]);
}
public function testGetProto(): void
{
$proto = new ProtoArrangement();
$proto->setName('test');
$arrangement = new Arrangement($proto);
$this->assertSame($proto, $arrangement->getProto());
}
// --- Integration tests with real Test.pro ---
public function testTestProHasTwoArrangements(): void
{
$arrangements = self::$presentation->getArrangements();
$this->assertCount(2, $arrangements);
}
public function testNormalArrangementExists(): void
{
$arrangements = self::$presentation->getArrangements();
$names = [];
foreach ($arrangements as $arr) {
$arrangement = new Arrangement($arr);
$names[] = $arrangement->getName();
}
$this->assertContains('normal', $names);
$this->assertContains('test2', $names);
}
public function testNormalArrangementHasFiveGroupRefs(): void
{
$arrangements = self::$presentation->getArrangements();
// Find "normal" arrangement
$normalArr = null;
foreach ($arrangements as $arr) {
$arrangement = new Arrangement($arr);
if ($arrangement->getName() === 'normal') {
$normalArr = $arrangement;
break;
}
}
$this->assertNotNull($normalArr, 'Normal arrangement should exist');
$this->assertCount(5, $normalArr->getGroupUuids(), 'Normal arrangement should have 5 group refs');
}
public function testTest2ArrangementHasFourGroupRefs(): void
{
$arrangements = self::$presentation->getArrangements();
$test2Arr = null;
foreach ($arrangements as $arr) {
$arrangement = new Arrangement($arr);
if ($arrangement->getName() === 'test2') {
$test2Arr = $arrangement;
break;
}
}
$this->assertNotNull($test2Arr, 'test2 arrangement should exist');
$this->assertCount(4, $test2Arr->getGroupUuids(), 'test2 arrangement should have 4 group refs');
}
public function testArrangementUuidsAreNonEmpty(): void
{
$arrangements = self::$presentation->getArrangements();
foreach ($arrangements as $arr) {
$arrangement = new Arrangement($arr);
$this->assertNotEmpty($arrangement->getUuid(), "Arrangement '{$arrangement->getName()}' should have a UUID");
}
}
public function testNormalArrangementGroupUuidsMatchKnownGroups(): void
{
// Get all group UUIDs from cue_groups
$groupUuidSet = [];
foreach (self::$presentation->getCueGroups() as $cg) {
$groupUuidSet[] = $cg->getGroup()->getUuid()->getString();
}
// Get normal arrangement
$arrangements = self::$presentation->getArrangements();
$normalArr = null;
foreach ($arrangements as $arr) {
$arrangement = new Arrangement($arr);
if ($arrangement->getName() === 'normal') {
$normalArr = $arrangement;
break;
}
}
// Every group UUID in the arrangement should reference an existing group
foreach ($normalArr->getGroupUuids() as $uuid) {
$this->assertContains($uuid, $groupUuidSet, "Arrangement group UUID '$uuid' should reference an existing group");
}
}
}