Refactor enums

This commit is contained in:
Stephan
2019-01-29 10:17:26 +01:00
parent 5135635bf8
commit d24b7f2aba
8 changed files with 109 additions and 28 deletions

View File

@@ -0,0 +1,45 @@
using System;
namespace Umbraco.Core
{
/// <summary>
/// Provides extension methods to enums.
/// </summary>
public static class EnumExtensions
{
// note:
// - no need to HasFlagExact, that's basically an == test
// - HasFlagAll cannot be named HasFlag because ext. methods never take priority over instance methods
/// <summary>
/// Determines whether a flag enum has all the specified values.
/// </summary>
/// <remarks>
/// <para>True when all bits set in <paramref name="uses"/> are set in <paramref name="use"/>, though other bits may be set too.</para>
/// <para>This is the behavior of the original <see cref="Enum.HasFlag"/> method.</para>
/// </remarks>
public static bool HasFlagAll<T>(this T use, T uses)
where T : Enum
{
var num = Convert.ToUInt64(use);
var nums = Convert.ToUInt64(uses);
return (num & nums) == nums;
}
/// <summary>
/// Determines whether a flag enum has any of the specified values.
/// </summary>
/// <remarks>
/// <para>True when at least one of the bits set in <paramref name="uses"/> is set in <paramref name="use"/>.</para>
/// </remarks>
public static bool HasFlagAny<T>(this T use, T uses)
where T : Enum
{
var num = Convert.ToUInt64(use);
var nums = Convert.ToUInt64(uses);
return (num & nums) > 0;
}
}
}

View File

@@ -333,6 +333,7 @@
<Compile Include="ContentVariationExtensions.cs" />
<Compile Include="Deploy\IDataTypeConfigurationConnector.cs" />
<Compile Include="DisposableObjectSlim.cs" />
<Compile Include="EnumExtensions.cs" />
<Compile Include="Events\ExportedMemberEventArgs.cs" />
<Compile Include="Events\RolesEventArgs.cs" />
<Compile Include="Events\UserGroupWithUsers.cs" />

View File

@@ -0,0 +1,55 @@
using NUnit.Framework;
using Umbraco.Web.Trees;
using Umbraco.Core;
namespace Umbraco.Tests.CoreThings
{
[TestFixture]
public class EnumExtensionsTests
{
[TestCase(TreeUse.Dialog, TreeUse.Dialog, true)]
[TestCase(TreeUse.Dialog, TreeUse.Main, false)]
[TestCase(TreeUse.Dialog | TreeUse.Main, TreeUse.Dialog, true)]
[TestCase(TreeUse.Dialog, TreeUse.Dialog | TreeUse.Main, false)]
public void HasFlagTest(TreeUse value, TreeUse test, bool expected)
{
// the built-in Enum.HasFlag() method determines whether
// all bits from <test> are set (other bits can be set too)
if (expected)
Assert.IsTrue(value.HasFlag(test));
else
Assert.IsFalse(value.HasFlag(test));
}
[TestCase(TreeUse.Dialog, TreeUse.Dialog, true)]
[TestCase(TreeUse.Dialog, TreeUse.Main, false)]
[TestCase(TreeUse.Dialog | TreeUse.Main, TreeUse.Dialog, true)]
[TestCase(TreeUse.Dialog, TreeUse.Dialog | TreeUse.Main, false)]
public void HasFlagAllTest(TreeUse value, TreeUse test, bool expected)
{
// the HasFlagAll() extension method determines whether
// all bits from <test> are set (other bits can be set too)
if (expected)
Assert.IsTrue(value.HasFlagAll(test));
else
Assert.IsFalse(value.HasFlagAll(test));
}
[TestCase(TreeUse.Dialog, TreeUse.Dialog, true)]
[TestCase(TreeUse.Dialog, TreeUse.Main, false)]
[TestCase(TreeUse.Dialog | TreeUse.Main, TreeUse.Dialog, true)]
[TestCase(TreeUse.Dialog, TreeUse.Dialog | TreeUse.Main, true)]
public void HasFlagAnyTest(TreeUse value, TreeUse test, bool expected)
{
// the HasFlagAny() extension method determines whether
// at least one bit from <test> is set
if (expected)
Assert.IsTrue(value.HasFlagAny(test));
else
Assert.IsFalse(value.HasFlagAny(test));
}
}
}

View File

@@ -69,6 +69,7 @@
<Reference Include="System.Text.Encoding" />
<Reference Include="System.Web" />
<Reference Include="System.Web.ApplicationServices" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Web.Services" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
@@ -122,6 +123,7 @@
<Compile Include="Composing\ContainerConformingTests.cs" />
<Compile Include="CoreThings\CallContextTests.cs" />
<Compile Include="Components\ComponentTests.cs" />
<Compile Include="CoreThings\EnumExtensionsTests.cs" />
<Compile Include="CoreThings\GuidUtilsTests.cs" />
<Compile Include="CoreThings\HexEncoderTests.cs" />
<Compile Include="CoreXml\RenamedRootNavigatorTests.cs" />

View File

@@ -26,11 +26,14 @@ namespace Umbraco.Web.Services
public Tree GetByAlias(string treeAlias) => _treeCollection.FirstOrDefault(x => x.TreeAlias == treeAlias);
/// <inheritdoc />
public IEnumerable<Tree> GetAll(TreeUse use = TreeUse.Main) => _treeCollection.Where(x => x.TreeUse.HasAny(use));
public IEnumerable<Tree> GetAll(TreeUse use = TreeUse.Main)
// use HasFlagAny: if use is Main|Dialog, we want to return Main *and* Dialog trees
=> _treeCollection.Where(x => x.TreeUse.HasFlagAny(use));
/// <inheritdoc />
public IEnumerable<Tree> GetBySection(string sectionAlias, TreeUse use = TreeUse.Main)
=> _treeCollection.Where(x => x.SectionAlias.InvariantEquals(sectionAlias) && x.TreeUse.HasAny(use)).OrderBy(x => x.SortOrder).ToList();
// use HasFlagAny: if use is Main|Dialog, we want to return Main *and* Dialog trees
=> _treeCollection.Where(x => x.SectionAlias.InvariantEquals(sectionAlias) && x.TreeUse.HasFlagAny(use)).OrderBy(x => x.SortOrder).ToList();
/// <inheritdoc />
public IDictionary<string, IEnumerable<Tree>> GetBySectionGrouped(string sectionAlias, TreeUse use = TreeUse.Main)

View File

@@ -1,24 +0,0 @@
namespace Umbraco.Web.Trees
{
/// <summary>
/// Provides extension methods to the <see cref="TreeUse"/> method.
/// </summary>
public static class TreeUseExtensions
{
/// <summary>
/// Determines whether a TreeUse has all the specified values.
/// </summary>
public static bool Has(this TreeUse use, TreeUse uses)
{
return (use & uses) == uses;
}
/// <summary>
/// Determines whether a TreeUse has any of the specified values.
/// </summary>
public static bool HasAny(this TreeUse use, TreeUse uses)
{
return (use & uses) > 0;
}
}
}

View File

@@ -186,7 +186,6 @@
<Compile Include="Trees\TranslationBackOfficeSection.cs" />
<Compile Include="Trees\TreeCollectionBuilder.cs" />
<Compile Include="Trees\TreeUse.cs" />
<Compile Include="Trees\TreeUseExtensions.cs" />
<Compile Include="Trees\UsersBackOfficeSection.cs" />
<Compile Include="Trees\Tree.cs" />
<Compile Include="Trees\ITree.cs" />

View File

@@ -4,6 +4,6 @@
<s:String x:Key="/Default/PatternsAndTemplates/StructuralSearch/Pattern/=2DA32DA040A7D74599ABE288C7224CF0/Comment/@EntryValue">Disposable construction</s:String>
<s:String x:Key="/Default/PatternsAndTemplates/StructuralSearch/Pattern/=2DA32DA040A7D74599ABE288C7224CF0/Severity/@EntryValue">HINT</s:String>
<s:Boolean x:Key="/Default/PatternsAndTemplates/StructuralSearch/Pattern/=37A0B37A0ABAA34AA5CB32A93653C4FE/@KeyIndexDefined">False</s:Boolean>
<s:String x:Key="/Default/CodeInspection/CSharpLanguageProject/LanguageLevel/@EntryValue">CSharp71</s:String>
<s:String x:Key="/Default/CodeInspection/CSharpLanguageProject/LanguageLevel/@EntryValue">Default</s:String>
<s:Boolean x:Key="/Default/UserDictionary/Words/=unpublish/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=unpublishing/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>