2026-10-25 18:52:39 +01:00
using AIStudio.Tools.PowerPoint ;
namespace AIStudio.Tests.Tools.PowerPoint ;
/// <summary>
/// Checks how the choices for some slides of a template, e.g., the preselection of an organization, become a use for each slide.
/// </summary>
[TestFixture]
public sealed class TemplateSlideUsesTests
{
[Test]
public void EverySlideGetsAUseInTheOrderOfTheTemplate ()
{
var template = TemplateWithAContentSlideAndAClosingSlide ();
var uses = new Dictionary < int , TemplateSlideUse > { [ 2 ] = TemplateSlideUse . KEEP }. ToTemplateSlideUses ( template );
Assert . That ( uses , Is . EqualTo ( new [] { TemplateSlideUse . OMIT , TemplateSlideUse . KEEP }), "A slide without a choice is left out, as by default." );
}
[Test]
public void ASlideWithoutRoomForContentIsKeptInsteadOfEdited ()
{
var template = TemplateWithAContentSlideAndAClosingSlide ();
var uses = new Dictionary < int , TemplateSlideUse > { [ 1 ] = TemplateSlideUse . EDIT , [ 2 ] = TemplateSlideUse . EDIT }. ToTemplateSlideUses ( template );
2026-11-01 20:32:16 +01:00
using ( Assert . EnterMultipleScope ())
2026-10-25 18:52:39 +01:00
{
Assert . That ( template . Slides . Select ( slide => slide . IsEditable ), Is . EqualTo ( new [] { true , false }), "The test needs one slide which the model can edit and one which it cannot." );
Assert . That ( uses , Is . EqualTo ( new [] { TemplateSlideUse . EDIT , TemplateSlideUse . KEEP }), "An organization may lock the choice, so it must not block the form." );
2026-11-01 20:32:16 +01:00
}
2026-10-25 18:52:39 +01:00
}
[Test]
public void AChoiceForASlideTheTemplateLacksIsPassedOver ()
{
var template = TemplateWithAContentSlideAndAClosingSlide ();
var uses = new Dictionary < int , TemplateSlideUse > { [ 0 ] = TemplateSlideUse . KEEP , [ 3 ] = TemplateSlideUse . EDIT }. ToTemplateSlideUses ( template );
Assert . That ( uses , Is . EqualTo ( new [] { TemplateSlideUse . OMIT , TemplateSlideUse . OMIT }));
}
/// <summary>
/// A template whose first slide uses a layout with room for content, and whose second slide uses one with a title only.
/// </summary>
private static PresentationTemplate TemplateWithAContentSlideAndAClosingSlide ()
{
using var file = TestTemplate . Create (
new TestTemplateOptions ( Slides : [ new TestSlide ( 0 , ( TestPlaceholder . Title (), "Mission" )), new TestSlide ( 1 , ( TestPlaceholder . Title (), "Thank you" ))]),
new TestLayout ( "Content" , TestPlaceholder . Title (), TestPlaceholder . Text ( 1 , TestTemplate . MASTER_BODY_BOUNDS )),
new TestLayout ( "Title Only" , TestPlaceholder . Title ()));
return PresentationTemplate . Read ( file );
}
}