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

199 lines
6.4 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\ProFileReader;
use ProPresenter\Parser\ProFileWriter;
use ProPresenter\Parser\Slide;
use ProPresenter\Parser\Song;
class SlideExtendedTest extends TestCase
{
private const TEST_WITH_MACRO = __DIR__ . '/../doc/reference_samples/TestMitMakro.pro';
private const TEST_WITH_MEDIA_AND_MACRO = __DIR__ . '/../doc/reference_samples/TestMitBildernUndMakro.pro';
#[Test]
public function testCopyrightSlideHasMacro(): void
{
$song = self::readSong(self::TEST_WITH_MACRO);
$slide = self::getSlideByGroupName($song, 'COPYRIGHT', 0);
$this->assertTrue($slide->hasMacro());
}
#[Test]
public function testMacroNameAndUuid(): void
{
$song = self::readSong(self::TEST_WITH_MACRO);
$slide = self::getSlideByGroupName($song, 'COPYRIGHT', 0);
$this->assertSame('Lied 1.Folie', $slide->getMacroName());
$this->assertSame('20C1DFDE-0FB6-49E5-B90C-E6608D427212', $slide->getMacroUuid());
}
#[Test]
public function testMacroCollectionNameAndUuid(): void
{
$song = self::readSong(self::TEST_WITH_MACRO);
$slide = self::getSlideByGroupName($song, 'COPYRIGHT', 0);
$this->assertSame('--MAIN--', $slide->getMacroCollectionName());
$this->assertSame('8D02FC57-83F8-4042-9B90-81C229728426', $slide->getMacroCollectionUuid());
}
#[Test]
public function testRegularSlideHasNoMacro(): void
{
$song = self::readSong(self::TEST_WITH_MACRO);
$slide = self::getSlideByGroupName($song, 'Verse 1', 0);
$this->assertFalse($slide->hasMacro());
}
#[Test]
public function testSetMacroOnSlide(): void
{
$song = self::readSong(self::TEST_WITH_MACRO);
$slide = self::getSlideByGroupName($song, 'Verse 1', 0);
$slide->setMacro('Macro Name', '11111111-2222-3333-4444-555555555555', 'Collection Name', 'AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE');
$this->assertTrue($slide->hasMacro());
$this->assertSame('Macro Name', $slide->getMacroName());
$this->assertSame('11111111-2222-3333-4444-555555555555', $slide->getMacroUuid());
$this->assertSame('Collection Name', $slide->getMacroCollectionName());
$this->assertSame('AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE', $slide->getMacroCollectionUuid());
}
#[Test]
public function testRemoveMacro(): void
{
$song = self::readSong(self::TEST_WITH_MACRO);
$slide = self::getSlideByGroupName($song, 'Verse 1', 0);
$slide->setMacro('Macro Name', '11111111-2222-3333-4444-555555555555');
$this->assertTrue($slide->hasMacro());
$slide->removeMacro();
$this->assertFalse($slide->hasMacro());
}
#[Test]
public function testSetAndRemoveMacroRoundTrip(): void
{
$song = self::readSong(self::TEST_WITH_MACRO);
$slide = self::getSlideByGroupName($song, 'Verse 1', 0);
$slide->setMacro('Round Trip Macro', 'AAAAAAAA-1111-2222-3333-BBBBBBBBBBBB', '--MAIN--', '8D02FC57-83F8-4042-9B90-81C229728426');
$tempPath = sys_get_temp_dir() . '/propresenter-slide-extended-' . uniqid('', true) . '.pro';
try {
ProFileWriter::write($song, $tempPath);
$readBack = ProFileReader::read($tempPath);
$readBackSlide = self::getSlideByGroupName($readBack, 'Verse 1', 0);
$this->assertTrue($readBackSlide->hasMacro());
$this->assertSame('Round Trip Macro', $readBackSlide->getMacroName());
$this->assertSame('AAAAAAAA-1111-2222-3333-BBBBBBBBBBBB', $readBackSlide->getMacroUuid());
$readBackSlide->removeMacro();
$this->assertFalse($readBackSlide->hasMacro());
} finally {
@unlink($tempPath);
}
}
#[Test]
public function testImageSlideHasMedia(): void
{
$song = self::readSong(self::TEST_WITH_MEDIA_AND_MACRO);
$slide = $song->getSlides()[0];
$this->assertTrue($slide->hasMedia());
}
#[Test]
public function testMediaUrlAndFormat(): void
{
$song = self::readSong(self::TEST_WITH_MEDIA_AND_MACRO);
$slide = $song->getSlides()[0];
$this->assertStringContainsString('file://', (string) $slide->getMediaUrl());
$this->assertSame('JPG', $slide->getMediaFormat());
}
#[Test]
public function testImageSlideHasNoText(): void
{
$song = self::readSong(self::TEST_WITH_MEDIA_AND_MACRO);
$slide = $song->getSlides()[0];
$this->assertSame('', $slide->getPlainText());
}
#[Test]
public function testSlideWithLabel(): void
{
$song = self::readSong(self::TEST_WITH_MEDIA_AND_MACRO);
$slide = $song->getSlides()[1];
$this->assertSame('Seniorennachmittag März.jpg', $slide->getLabel());
}
#[Test]
public function testSlideWithoutLabel(): void
{
$song = self::readSong(self::TEST_WITH_MEDIA_AND_MACRO);
$slide = $song->getSlides()[0];
$this->assertSame('', $slide->getLabel());
}
#[Test]
public function testImageSlideWithMacro(): void
{
$song = self::readSong(self::TEST_WITH_MEDIA_AND_MACRO);
$slide = $song->getSlides()[1];
$this->assertTrue($slide->hasMacro());
$this->assertSame('1:1 - Beamer & Stream', $slide->getMacroName());
}
#[Test]
public function testSetLabel(): void
{
$song = self::readSong(self::TEST_WITH_MEDIA_AND_MACRO);
$slide = $song->getSlides()[1];
$slide->setLabel('New Label');
$this->assertSame('New Label', $slide->getLabel());
}
private static function readSong(string $path): Song
{
if (!file_exists($path)) {
self::markTestSkipped('Reference file not found: ' . $path);
}
return ProFileReader::read($path);
}
private static function getSlideByGroupName(Song $song, string $groupName, int $slideIndex): Slide
{
$group = $song->getGroupByName($groupName);
self::assertInstanceOf(Group::class, $group, 'Group not found: ' . $groupName);
$slides = $song->getSlidesForGroup($group);
self::assertArrayHasKey($slideIndex, $slides, 'Slide index not found in group: ' . $groupName);
return $slides[$slideIndex];
}
}