Refactor enums
This commit is contained in:
45
src/Umbraco.Core/EnumExtensions.cs
Normal file
45
src/Umbraco.Core/EnumExtensions.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
55
src/Umbraco.Tests/CoreThings/EnumExtensionsTests.cs
Normal file
55
src/Umbraco.Tests/CoreThings/EnumExtensionsTests.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user