using Artemis.Core.Tests.Infrastructure.Plugins.LayerBrushes;
using Artemis.UI.Shared.Tests.Infrastructure;
using RGB.NET.Core;
namespace Artemis.UI.Shared.Tests.ProfileEditor;
///
/// Adding new folders and layers through the editor
///
public class ProfileEditorCreateElementTests : ProfileEditorTestBase
{
[Fact]
public async Task CreateAndAddFolder_InAFolder_AddsItAtTheTop()
{
Layer existing = AddLayer("Existing", null, LedId.Keyboard_A);
await StartEditing();
Folder folder = Service.CreateAndAddFolder(Root);
folder.Name.ShouldBe("New folder");
Root.Children.ShouldBe([folder, existing]);
}
[Fact]
public async Task CreateAndAddFolder_GivesEachFolderAUniqueName()
{
await StartEditing();
Service.CreateAndAddFolder(Root);
Folder second = Service.CreateAndAddFolder(Root);
second.Name.ShouldBe("New folder (2)");
}
[Fact]
public async Task CreateAndAddFolder_OnALayer_AddsItBelowTheLayer()
{
Layer first = AddLayer("First", null, LedId.Keyboard_A);
Layer second = AddLayer("Second", null, LedId.Keyboard_B);
await StartEditing();
Folder folder = Service.CreateAndAddFolder(first);
// The layer's order is 1-based while AddChild takes a 0-based index, so the folder lands right below the layer
Root.Children.ShouldBe([first, folder, second]);
}
[Fact]
public async Task CreateAndAddFolder_CanBeUndone()
{
await StartEditing();
string before = Snapshot();
Folder folder = Service.CreateAndAddFolder(Root);
Undo();
Root.Children.ShouldNotContain(folder);
Snapshot().ShouldBe(before);
}
[Fact]
public async Task CreateAndAddLayer_InAFolder_CoversEveryEnabledLedAndGetsTheDefaultBrush()
{
LayerBrushService.DefaultBrush = BrushDescriptor();
Folder folder = Harness.AddFolder(Root, "Folder");
Layer existing = AddLayer("Existing", folder, LedId.Keyboard_A);
await StartEditing();
Layer layer = Service.CreateAndAddLayer(folder);
layer.Name.ShouldBe("New layer");
folder.Children.ShouldBe([layer, existing]);
layer.Leds.ShouldBe(Keyboard.Leds, ignoreOrder: true);
layer.LayerBrush.ShouldBeOfType();
layer.Enabled.ShouldBeTrue();
}
[Fact]
public async Task CreateAndAddLayer_WithoutDefaultBrush_HasNoBrush()
{
await StartEditing();
Layer layer = Service.CreateAndAddLayer(Root);
layer.LayerBrush.ShouldBeNull();
}
[Fact]
public async Task CreateAndAddLayer_OnALayer_AddsItBelowTheLayer()
{
Layer first = AddLayer("First", null, LedId.Keyboard_A);
Layer second = AddLayer("Second", null, LedId.Keyboard_B);
await StartEditing();
Layer layer = Service.CreateAndAddLayer(first);
Root.Children.ShouldBe([first, layer, second]);
}
[Fact]
public async Task CreateAndAddLayer_OnALayer_CanRepeatANameAlreadyInUse()
{
Layer existing = AddLayer("New layer", null, LedId.Keyboard_A);
await StartEditing();
Layer layer = Service.CreateAndAddLayer(existing);
// Pinned as-is: the name is picked from the children of the target layer (which has none) rather than from its
// parent, so the new layer gets the same name as its sibling. CreateAndAddFolder uses the parent.
layer.Name.ShouldBe("New layer");
Root.Children.Count(c => c.Name == "New layer").ShouldBe(2);
}
[Fact]
public async Task CreateAndAddLayer_CanBeUndone()
{
await StartEditing();
string before = Snapshot();
Layer layer = Service.CreateAndAddLayer(Root);
Undo();
Root.Children.ShouldNotContain(layer);
Snapshot().ShouldBe(before);
}
}