Merge pull request #6693 from PerplexDaniel/pr/6691_vary-by-culture-set-unset-culture-flag-only

Properly set / unset Culture flag when "vary by Culture" is changed
This commit is contained in:
Shannon Deminick
2019-11-27 11:40:12 +11:00
committed by GitHub
3 changed files with 87 additions and 5 deletions

View File

@@ -41,5 +41,43 @@ namespace Umbraco.Core
return (num & nums) > 0;
}
/// <summary>
/// Sets a flag of the given input enum
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="input">Enum to set flag of</param>
/// <param name="flag">Flag to set</param>
/// <returns>A new enum with the flag set</returns>
public static T SetFlag<T>(this T input, T flag)
where T : Enum
{
var i = Convert.ToUInt64(input);
var f = Convert.ToUInt64(flag);
// bitwise OR to set flag f of enum i
var result = i | f;
return (T)Enum.ToObject(typeof(T), result);
}
/// <summary>
/// Unsets a flag of the given input enum
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="input">Enum to unset flag of</param>
/// <param name="flag">Flag to unset</param>
/// <returns>A new enum with the flag unset</returns>
public static T UnsetFlag<T>(this T input, T flag)
where T : Enum
{
var i = Convert.ToUInt64(input);
var f = Convert.ToUInt64(flag);
// bitwise AND combined with bitwise complement to unset flag f of enum i
var result = i & ~f;
return (T)Enum.ToObject(typeof(T), result);
}
}
}

View File

@@ -51,5 +51,47 @@ namespace Umbraco.Tests.CoreThings
else
Assert.IsFalse(value.HasFlagAny(test));
}
[TestCase(TreeUse.None, TreeUse.None, TreeUse.None)]
[TestCase(TreeUse.None, TreeUse.Main, TreeUse.Main)]
[TestCase(TreeUse.None, TreeUse.Dialog, TreeUse.Dialog)]
[TestCase(TreeUse.None, TreeUse.Main | TreeUse.Dialog, TreeUse.Main | TreeUse.Dialog)]
[TestCase(TreeUse.Main, TreeUse.None, TreeUse.Main)]
[TestCase(TreeUse.Main, TreeUse.Main, TreeUse.Main)]
[TestCase(TreeUse.Main, TreeUse.Dialog, TreeUse.Main | TreeUse.Dialog)]
[TestCase(TreeUse.Main, TreeUse.Main | TreeUse.Dialog, TreeUse.Main | TreeUse.Dialog)]
[TestCase(TreeUse.Dialog, TreeUse.None, TreeUse.Dialog)]
[TestCase(TreeUse.Dialog, TreeUse.Main, TreeUse.Main | TreeUse.Dialog)]
[TestCase(TreeUse.Dialog, TreeUse.Dialog, TreeUse.Dialog)]
[TestCase(TreeUse.Dialog, TreeUse.Main | TreeUse.Dialog, TreeUse.Main | TreeUse.Dialog)]
[TestCase(TreeUse.Main | TreeUse.Dialog, TreeUse.None, TreeUse.Main | TreeUse.Dialog)]
[TestCase(TreeUse.Main | TreeUse.Dialog, TreeUse.Main, TreeUse.Main | TreeUse.Dialog)]
[TestCase(TreeUse.Main | TreeUse.Dialog, TreeUse.Dialog, TreeUse.Main | TreeUse.Dialog)]
[TestCase(TreeUse.Main | TreeUse.Dialog, TreeUse.Main | TreeUse.Dialog, TreeUse.Main | TreeUse.Dialog)]
public void SetFlagTests(TreeUse value, TreeUse flag, TreeUse expected)
{
Assert.AreEqual(expected, value.SetFlag(flag));
}
[TestCase(TreeUse.None, TreeUse.None, TreeUse.None)]
[TestCase(TreeUse.None, TreeUse.Main, TreeUse.None)]
[TestCase(TreeUse.None, TreeUse.Dialog, TreeUse.None)]
[TestCase(TreeUse.None, TreeUse.Main | TreeUse.Dialog, TreeUse.None)]
[TestCase(TreeUse.Main, TreeUse.None, TreeUse.Main)]
[TestCase(TreeUse.Main, TreeUse.Main, TreeUse.None)]
[TestCase(TreeUse.Main, TreeUse.Dialog, TreeUse.Main)]
[TestCase(TreeUse.Main, TreeUse.Main | TreeUse.Dialog, TreeUse.None)]
[TestCase(TreeUse.Dialog, TreeUse.None, TreeUse.Dialog)]
[TestCase(TreeUse.Dialog, TreeUse.Main, TreeUse.Dialog)]
[TestCase(TreeUse.Dialog, TreeUse.Dialog, TreeUse.None)]
[TestCase(TreeUse.Dialog, TreeUse.Main | TreeUse.Dialog, TreeUse.None)]
[TestCase(TreeUse.Main | TreeUse.Dialog, TreeUse.None, TreeUse.Main | TreeUse.Dialog)]
[TestCase(TreeUse.Main | TreeUse.Dialog, TreeUse.Main, TreeUse.Dialog)]
[TestCase(TreeUse.Main | TreeUse.Dialog, TreeUse.Dialog, TreeUse.Main)]
[TestCase(TreeUse.Main | TreeUse.Dialog, TreeUse.Main | TreeUse.Dialog, TreeUse.None)]
public void UnsetFlagTests(TreeUse value, TreeUse flag, TreeUse expected)
{
Assert.AreEqual(expected, value.UnsetFlag(flag));
}
}
}

View File

@@ -225,8 +225,10 @@ namespace Umbraco.Web.Models.Mapping
target.MandatoryMessage = source.Validation.MandatoryMessage;
target.ValidationRegExp = source.Validation.Pattern;
target.ValidationRegExpMessage = source.Validation.PatternMessage;
target.Variations = source.AllowCultureVariant ? ContentVariation.Culture : ContentVariation.Nothing;
target.Variations = source.AllowCultureVariant
? target.Variations.SetFlag(ContentVariation.Culture)
: target.Variations.UnsetFlag(ContentVariation.Culture);
if (source.Id > 0)
target.Id = source.Id;
@@ -397,9 +399,9 @@ namespace Umbraco.Web.Models.Mapping
if (!(target is IMemberType))
{
target.Variations = ContentVariation.Nothing;
if (source.AllowCultureVariant)
target.Variations |= ContentVariation.Culture;
target.Variations = source.AllowCultureVariant
? target.Variations.SetFlag(ContentVariation.Culture)
: target.Variations.UnsetFlag(ContentVariation.Culture);
}
// handle property groups and property types