propresenter-php/tests/SongTest.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

117 lines
3.9 KiB
PHP

<?php
declare(strict_types=1);
namespace ProPresenter\Parser\Tests;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\TestCase;
use ProPresenter\Parser\Group;
use ProPresenter\Parser\Song;
use Rv\Data\Presentation;
class SongTest extends TestCase
{
private static ?Presentation $presentation = null;
public static function setUpBeforeClass(): void
{
$data = file_get_contents(dirname(__DIR__) . '/doc/reference_samples/Test.pro');
self::$presentation = new Presentation();
self::$presentation->mergeFromString($data);
}
#[Test]
public function getUuidAndGetPresentationExposeUnderlyingPresentation(): void
{
$song = new Song(self::$presentation);
$this->assertNotSame('', $song->getUuid());
$this->assertSame(self::$presentation, $song->getPresentation());
}
#[Test]
public function getNameAndSetNameReadAndMutatePresentationName(): void
{
$presentation = clone self::$presentation;
$song = new Song($presentation);
$this->assertSame('Test', $song->getName());
$song->setName('Renamed Song');
$this->assertSame('Renamed Song', $song->getName());
$this->assertSame('Renamed Song', $presentation->getName());
}
#[Test]
public function getGroupsAndGetGroupByNameReturnExpectedGroups(): void
{
$song = new Song(self::$presentation);
$groups = $song->getGroups();
$this->assertCount(4, $groups);
$this->assertSame(['Verse 1', 'Verse 2', 'Chorus', 'Ending'], array_map(fn (Group $group) => $group->getName(), $groups));
$this->assertNull($song->getGroupByName('Missing Group'));
$this->assertSame('Verse 1', $song->getGroupByName('Verse 1')?->getName());
}
#[Test]
public function getSlidesAndGetSlideByUuidReturnExpectedSlides(): void
{
$song = new Song(self::$presentation);
$slides = $song->getSlides();
$this->assertCount(5, $slides);
$this->assertSame('Vers1.1' . "\n" . 'Vers1.2', $song->getSlideByUuid('5A6AF946-30B0-4F40-BE7A-C6429C32868A')?->getPlainText());
$this->assertNull($song->getSlideByUuid('00000000-0000-0000-0000-000000000000'));
}
#[Test]
public function getArrangementsAndGetArrangementByNameReturnExpectedArrangements(): void
{
$song = new Song(self::$presentation);
$arrangements = $song->getArrangements();
$this->assertCount(2, $arrangements);
$this->assertSame(['normal', 'test2'], array_map(fn ($arrangement) => $arrangement->getName(), $arrangements));
$this->assertNull($song->getArrangementByName('missing'));
$this->assertSame('normal', $song->getArrangementByName('normal')?->getName());
}
#[Test]
public function getSlidesForGroupResolvesSlideUuidsInOrder(): void
{
$song = new Song(self::$presentation);
$verse1 = $song->getGroupByName('Verse 1');
$this->assertNotNull($verse1);
$slides = $song->getSlidesForGroup($verse1);
$this->assertCount(2, $slides);
$this->assertSame('5A6AF946-30B0-4F40-BE7A-C6429C32868A', $slides[0]->getUuid());
$this->assertSame('A18EF896-F83A-44CE-AEFB-5AE8969A9653', $slides[1]->getUuid());
$this->assertSame('Vers1.1' . "\n" . 'Vers1.2', $slides[0]->getPlainText());
$this->assertSame('Vers1.3' . "\n" . 'Vers1.4', $slides[1]->getPlainText());
}
#[Test]
public function getGroupsForArrangementResolvesGroupUuidsIncludingDuplicates(): void
{
$song = new Song(self::$presentation);
$normal = $song->getArrangementByName('normal');
$this->assertNotNull($normal);
$groups = $song->getGroupsForArrangement($normal);
$this->assertSame(
['Chorus', 'Verse 1', 'Chorus', 'Verse 2', 'Chorus'],
array_map(fn (Group $group) => $group->getName(), $groups)
);
}
}