From d24b7f2abaa9ffa7fe5b4d87a40335e1c125dfdf Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 29 Jan 2019 10:17:26 +0100 Subject: [PATCH] Refactor enums --- src/Umbraco.Core/EnumExtensions.cs | 45 +++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + .../CoreThings/EnumExtensionsTests.cs | 55 +++++++++++++++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 2 + src/Umbraco.Web/Services/TreeService.cs | 7 ++- src/Umbraco.Web/Trees/TreeUseExtensions.cs | 24 -------- src/Umbraco.Web/Umbraco.Web.csproj | 1 - src/umbraco.sln.DotSettings | 2 +- 8 files changed, 109 insertions(+), 28 deletions(-) create mode 100644 src/Umbraco.Core/EnumExtensions.cs create mode 100644 src/Umbraco.Tests/CoreThings/EnumExtensionsTests.cs delete mode 100644 src/Umbraco.Web/Trees/TreeUseExtensions.cs diff --git a/src/Umbraco.Core/EnumExtensions.cs b/src/Umbraco.Core/EnumExtensions.cs new file mode 100644 index 0000000000..1443a27876 --- /dev/null +++ b/src/Umbraco.Core/EnumExtensions.cs @@ -0,0 +1,45 @@ +using System; + +namespace Umbraco.Core +{ + /// + /// Provides extension methods to enums. + /// + 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 + + /// + /// Determines whether a flag enum has all the specified values. + /// + /// + /// True when all bits set in are set in , though other bits may be set too. + /// This is the behavior of the original method. + /// + public static bool HasFlagAll(this T use, T uses) + where T : Enum + { + var num = Convert.ToUInt64(use); + var nums = Convert.ToUInt64(uses); + + return (num & nums) == nums; + } + + /// + /// Determines whether a flag enum has any of the specified values. + /// + /// + /// True when at least one of the bits set in is set in . + /// + public static bool HasFlagAny(this T use, T uses) + where T : Enum + { + var num = Convert.ToUInt64(use); + var nums = Convert.ToUInt64(uses); + + return (num & nums) > 0; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 1a978650f0..10c3964448 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -333,6 +333,7 @@ + diff --git a/src/Umbraco.Tests/CoreThings/EnumExtensionsTests.cs b/src/Umbraco.Tests/CoreThings/EnumExtensionsTests.cs new file mode 100644 index 0000000000..72a55cee85 --- /dev/null +++ b/src/Umbraco.Tests/CoreThings/EnumExtensionsTests.cs @@ -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 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 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 is set + + if (expected) + Assert.IsTrue(value.HasFlagAny(test)); + else + Assert.IsFalse(value.HasFlagAny(test)); + } + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 11f5527a8c..95b6608c42 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -69,6 +69,7 @@ + @@ -122,6 +123,7 @@ + diff --git a/src/Umbraco.Web/Services/TreeService.cs b/src/Umbraco.Web/Services/TreeService.cs index a5574946a6..dc500f2583 100644 --- a/src/Umbraco.Web/Services/TreeService.cs +++ b/src/Umbraco.Web/Services/TreeService.cs @@ -26,11 +26,14 @@ namespace Umbraco.Web.Services public Tree GetByAlias(string treeAlias) => _treeCollection.FirstOrDefault(x => x.TreeAlias == treeAlias); /// - public IEnumerable GetAll(TreeUse use = TreeUse.Main) => _treeCollection.Where(x => x.TreeUse.HasAny(use)); + public IEnumerable 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)); /// public IEnumerable 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(); /// public IDictionary> GetBySectionGrouped(string sectionAlias, TreeUse use = TreeUse.Main) diff --git a/src/Umbraco.Web/Trees/TreeUseExtensions.cs b/src/Umbraco.Web/Trees/TreeUseExtensions.cs deleted file mode 100644 index 02b417eb98..0000000000 --- a/src/Umbraco.Web/Trees/TreeUseExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Umbraco.Web.Trees -{ - /// - /// Provides extension methods to the method. - /// - public static class TreeUseExtensions - { - /// - /// Determines whether a TreeUse has all the specified values. - /// - public static bool Has(this TreeUse use, TreeUse uses) - { - return (use & uses) == uses; - } - - /// - /// Determines whether a TreeUse has any of the specified values. - /// - public static bool HasAny(this TreeUse use, TreeUse uses) - { - return (use & uses) > 0; - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 361c2aa28a..f5cd7ce142 100755 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -186,7 +186,6 @@ - diff --git a/src/umbraco.sln.DotSettings b/src/umbraco.sln.DotSettings index d6826e5f90..2f99fe6350 100644 --- a/src/umbraco.sln.DotSettings +++ b/src/umbraco.sln.DotSettings @@ -4,6 +4,6 @@ Disposable construction HINT False - CSharp71 + Default True True