Skip to content

Commit

Permalink
Adding menu support. Fixes tryphotino#44.
Browse files Browse the repository at this point in the history
  • Loading branch information
sinterdev committed Nov 26, 2024
1 parent 8f8504c commit 0dee443
Show file tree
Hide file tree
Showing 18 changed files with 927 additions and 3 deletions.
111 changes: 111 additions & 0 deletions Photino.NET.Tests/MenuItemTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.Versioning;
using FluentAssertions;
using NUnit.Framework;

namespace Photino.NET.Tests;

[TestFixture]
[Platform("win")]
[SupportedOSPlatform("windows")]
public sealed class MenuItemTests
{
[Test]
[SuppressMessage("ReSharper", "AccessToDisposedClosure")]
public void Add_ShouldThrow_WhenMenuItemHasParent()
{
// Arrange

using var menuItem1 = new MenuItem(new MenuItemOptions { Label = "Item 1" });
using var menuItem2 = new MenuItem(new MenuItemOptions { Label = "Item 2" });
using var menuItem3 = new MenuItem(new MenuItemOptions { Label = "Item 3" });
menuItem1.Add(menuItem3);

// Act

var act = () =>
{
menuItem2.Add(menuItem3);
};

// Assert

act.Should().Throw<Exception>();
}

[Test]
[SuppressMessage("ReSharper", "AccessToDisposedClosure")]
public void Add_ShouldThrow_WhenMenuItemIsSelf()
{
// Arrange

using var menuItem = new MenuItem(new MenuItemOptions { Label = "Item 1" });

// Act

var act = () =>
{
menuItem.Add(menuItem);
};

// Assert

act.Should().Throw<Exception>();
}

[Test]
[SuppressMessage("ReSharper", "AccessToDisposedClosure")]
public void Add_ShouldThrow_WhenMenuSeparatorHasParent()
{
// Arrange

var window = new PhotinoWindow();
using var menu = new Menu(window);
using var menuItem = new MenuItem(new MenuItemOptions { Label = "Item 1" });
using var menuSeparator = new MenuSeparator();
menu.Add(menuSeparator);

// Act

var act = () =>
{
menuItem.Add(menuSeparator);
};

// Assert

act.Should().Throw<Exception>();
}

[Test]
public void MenuItem_ShouldInitialize_WhenImageIsNull()
{
// Act & Assert

_ = new MenuItem(new MenuItemOptions { Label = "Item 1" });
}

[Test]
public void MenuItem_ShouldInitialize_WhenLabelIsNull()
{
// Act & Assert

_ = new MenuItem(new MenuItemOptions { ImagePath = "image.png" });
}

[Test]
public void MenuItem_ShouldThrow_WhenImageDoesNotExist()
{
// Act

var act = () =>
{
_ = new MenuItem(new MenuItemOptions { ImagePath = "image_that_does_not_exist.png", Label = "Item" });
};

// Assert

act.Should().Throw<PhotinoNativeException>();
}
}
124 changes: 124 additions & 0 deletions Photino.NET.Tests/MenuTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.Versioning;
using System.Threading.Tasks;
using FluentAssertions;
using NUnit.Framework;

namespace Photino.NET.Tests;

[TestFixture]
[Platform("win")]
[SupportedOSPlatform("windows")]
public sealed class MenuTests
{
[Test]
[SuppressMessage("ReSharper", "AccessToDisposedClosure")]
public void Add_ShouldThrow_WhenMenuItemHasParent()
{
// Arrange

var window = new PhotinoWindow();
using var menu1 = new Menu(window);
using var menu2 = new Menu(window);
using var menuItem = new MenuItem(new MenuItemOptions { Label = "Item 1" });
menu1.Add(menuItem);

// Act

var act = () =>
{
menu2.Add(menuItem);
};

// Assert

act.Should().Throw<Exception>();
}

[Test]
[SuppressMessage("ReSharper", "AccessToDisposedClosure")]
public void Add_ShouldThrow_WhenMenuSeparatorHasParent()
{
// Arrange

var window = new PhotinoWindow();
using var menu1 = new Menu(window);
using var menu2 = new Menu(window);
using var menuSeparator = new MenuSeparator();
menu1.Add(menuSeparator);

// Act

var act = () =>
{
menu2.Add(menuSeparator);
};

// Assert

act.Should().Throw<Exception>();
}

[Test]
[SuppressMessage("ReSharper", "AccessToDisposedClosure")]
public void Dispose_ShouldDisposeAllDescendants()
{
// Arrange

var window = new PhotinoWindow();
var menu = new Menu(window);

MenuItem[] menuItems =
[
new MenuItem(new MenuItemOptions { Label = "Item 1" }),
new MenuItem(new MenuItemOptions { Label = "Item 2" }),
new MenuItem(new MenuItemOptions { Label = "Item 3" }),
new MenuItem(new MenuItemOptions { Label = "Item 4" })
];

menu.Add(menuItems[0]);
menu.Add(menuItems[1]);
menuItems[1].Add(menuItems[2]);
menuItems[1].Add(menuItems[3]);

// Act

menu.Dispose();

// Assert

using var undisposedMenuItem = new MenuItem(new MenuItemOptions { Label = "Item 5" });

foreach (var menuItem in menuItems)
{
var add = () =>
{
menuItem.Add(undisposedMenuItem);
};

add.Should().Throw<ObjectDisposedException>();
}
}

[Test]
[SuppressMessage("ReSharper", "AccessToDisposedClosure")]
public async Task Show_ShouldThrow_WhenPhotinoHasNotInitialized()
{
// Arrange

var window = new PhotinoWindow();
using var menu = new Menu(window);

// Act

var act = async () =>
{
await menu.Show(0, 0);
};

// Assert

await act.Should().ThrowAsync<InvalidOperationException>();
}
}
29 changes: 29 additions & 0 deletions Photino.NET.Tests/Photino.NET.Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="FluentAssertions" Version="7.0.0-alpha.5" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="NUnit" Version="3.14.0" />
<PackageReference Include="NUnit.Analyzers" Version="3.9.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Photino.NET\Photino.NET.csproj" />
</ItemGroup>

<ItemGroup>
<None Update="image.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
Binary file added Photino.NET.Tests/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions Photino.NET.sln
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
README.md = README.md
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Photino.NET.Tests", "Photino.NET.Tests\Photino.NET.Tests.csproj", "{0287EFF1-DF1F-409D-B0F3-6239B8A2AE5A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -23,6 +25,10 @@ Global
{BB5C5BF0-D891-4005-BEC2-A654FCF02D5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BB5C5BF0-D891-4005-BEC2-A654FCF02D5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BB5C5BF0-D891-4005-BEC2-A654FCF02D5B}.Release|Any CPU.Build.0 = Release|Any CPU
{0287EFF1-DF1F-409D-B0F3-6239B8A2AE5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0287EFF1-DF1F-409D-B0F3-6239B8A2AE5A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0287EFF1-DF1F-409D-B0F3-6239B8A2AE5A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0287EFF1-DF1F-409D-B0F3-6239B8A2AE5A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
6 changes: 6 additions & 0 deletions Photino.NET/IMenuChild.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Photino.NET;

internal interface IMenuChild
{
void ClearHandles();
}
Loading

0 comments on commit 0dee443

Please sign in to comment.