using NUnit.Framework; using System; using System.Globalization; using System.Linq; using static OpenTap.UnitTests.FlagsAttributeTestStep; namespace OpenTap.UnitTests { public class FlagsAttributeTestStep : TestStep { [Flags] public enum NonPowers2Modes { None=0, A = 1, B = 2, AB = A|B, C = 4, AC = A|C, BC = B|C, ABC = A|B|C, D = 8, AD = A|D, BD = B|D, ABD = A|B|D, CD = C|D, ACD = A|C|D, BCD = B|C|D, All = A|B|C|D } [Flags] public enum Powers2Modes { None = 0, [Display("A-Name")] A = 1, B = 2, [Display("C-Name")] C = 4, D = 8 } [Flags] public enum LargeFlagValues : long { None = 0, // shortA aliases with LongA in 32 bit systems ShortA = 0x0000_00FF, LongA = 0x0000_00FF_0000_0000L, [Display("Long Long B")] LongB = 1L << 60, } #region Settings public NonPowers2Modes MyNonPowers2Mode { get; set; } public Powers2Modes MyPowers2Mode { get; set; } public LargeFlagValues MyLargeFlagValues { get; set; } #endregion public override void Run() { } } [TestFixture] public class FlagsEnumTest { [Test] public void NonPowers2EnumTest() { var flagStep = new FlagsAttributeTestStep(); var stepAnnotation = AnnotationCollection.Annotate(flagStep); var mem = stepAnnotation.GetMember(nameof(FlagsAttributeTestStep.MyNonPowers2Mode)); var select = mem.Get(); Assert.True(select.Selected.Cast().Contains(NonPowers2Modes.None)); Assert.AreEqual(select.Selected.Cast().Count(), 1); flagStep.MyNonPowers2Mode = NonPowers2Modes.AC; stepAnnotation.Read(); Assert.True(select.Selected.Cast().Contains(NonPowers2Modes.A | NonPowers2Modes.C | NonPowers2Modes.AC)); Assert.AreEqual(select.Selected.Cast().Count(), 3); flagStep.MyNonPowers2Mode = NonPowers2Modes.BC; stepAnnotation.Read(); Assert.False(select.Selected.Cast().Contains(NonPowers2Modes.A)); // A should be unselected Assert.True(select.Selected.Cast().Contains(NonPowers2Modes.B | NonPowers2Modes.C | NonPowers2Modes.BC)); Assert.AreEqual(select.Selected.Cast().Count(), 3); flagStep.MyNonPowers2Mode |= NonPowers2Modes.D; stepAnnotation.Read(); Assert.True(select.Selected.Cast().Contains(NonPowers2Modes.D | NonPowers2Modes.B | NonPowers2Modes.C | NonPowers2Modes.BC)); Assert.True(select.Selected.Cast().Contains(NonPowers2Modes.BD | NonPowers2Modes.CD | NonPowers2Modes.BCD)); Assert.AreEqual(select.Selected.Cast().Count(), 7); // Unselection flagStep.MyNonPowers2Mode ^= NonPowers2Modes.B; // Remove B from previous selection stepAnnotation.Read(); Assert.True(select.Selected.Cast().Contains(NonPowers2Modes.D | NonPowers2Modes.C | NonPowers2Modes.CD)); Assert.AreEqual(select.Selected.Cast().Count(), 3); //Select All flagStep.MyNonPowers2Mode = NonPowers2Modes.All; stepAnnotation.Read(); Assert.False(select.Selected.Cast().Contains(NonPowers2Modes.None)); Assert.AreEqual(select.Selected.Cast().Count(), 15); } [Test] public void Powers2EnumTest() { var flagStep = new FlagsAttributeTestStep(); var stepAnnotation = AnnotationCollection.Annotate(flagStep); var mem = stepAnnotation.GetMember(nameof(FlagsAttributeTestStep.MyPowers2Mode)); var select = mem.Get(); Assert.True(select.Selected.Cast().Contains(Powers2Modes.None)); Assert.AreEqual(select.Selected.Cast().Count(), 1); flagStep.MyPowers2Mode = Powers2Modes.C; stepAnnotation.Read(); Assert.True(select.Selected.Cast().Contains(Powers2Modes.C)); Assert.AreEqual(select.Selected.Cast().Count(), 1); flagStep.MyPowers2Mode |= Powers2Modes.D; stepAnnotation.Read(); Assert.True(select.Selected.Cast().Contains(Powers2Modes.C)); Assert.True(select.Selected.Cast().Contains(Powers2Modes.D)); Assert.AreEqual(select.Selected.Cast().Count(), 2); Assert.False(select.Selected.Cast().Contains(Powers2Modes.C | Powers2Modes.D)); // C|D is not a defined enum constant flagStep.MyPowers2Mode = Powers2Modes.A; stepAnnotation.Read(); Assert.True(select.Selected.Cast().Contains(Powers2Modes.A)); Assert.AreEqual(select.Selected.Cast().Count(), 1); } [Test] public void LargeFlagValuesTest() { var flagStep = new FlagsAttributeTestStep(); var stepAnnotation = AnnotationCollection.Annotate(flagStep); var mem = stepAnnotation.GetMember(nameof(FlagsAttributeTestStep.MyLargeFlagValues)); var select = mem.Get(); Assert.True(select.Selected.Cast().Contains(LargeFlagValues.None)); Assert.AreEqual(select.Selected.Cast().Count(), 1); flagStep.MyLargeFlagValues = LargeFlagValues.ShortA; stepAnnotation.Read(); Assert.True(select.Selected.Cast().Contains(LargeFlagValues.ShortA)); Assert.AreEqual(select.Selected.Cast().Count(), 1); flagStep.MyLargeFlagValues = LargeFlagValues.LongA; stepAnnotation.Read(); Assert.True(select.Selected.Cast().Contains(LargeFlagValues.LongA)); Assert.AreEqual(select.Selected.Cast().Count(), 1); flagStep.MyLargeFlagValues = LargeFlagValues.LongB; stepAnnotation.Read(); Assert.True(select.Selected.Cast().Contains(LargeFlagValues.LongB)); Assert.AreEqual(select.Selected.Cast().Count(), 1); flagStep.MyLargeFlagValues |= LargeFlagValues.LongA; stepAnnotation.Read(); Assert.True(select.Selected.Cast().Contains(LargeFlagValues.LongB) && select.Selected.Cast().Contains(LargeFlagValues.LongA)); Assert.AreEqual(select.Selected.Cast().Count(), 2); flagStep.MyLargeFlagValues = LargeFlagValues.ShortA | LargeFlagValues.LongA; stepAnnotation.Read(); Assert.True(select.Selected.Cast().Contains(LargeFlagValues.ShortA)); Assert.True(select.Selected.Cast().Contains(LargeFlagValues.LongA)); Assert.AreEqual(select.Selected.Cast().Count(), 2); } [Test] public void EnumReadableStringTest() { void testConversions(string a, Enum b) { Assert.AreEqual(a, Utils.EnumToReadableString(b)); var c = (Enum)StringConvertProvider.FromString(a, TypeData.FromType(b.GetType()), null, CultureInfo.InvariantCulture); Assert.AreEqual(c, b); } testConversions("None", (Powers2Modes)0); testConversions("A-Name", Powers2Modes.A); testConversions("A-Name", (Powers2Modes)1); testConversions("B", Powers2Modes.B); testConversions("B", (Powers2Modes)2); testConversions("A-Name | B", Powers2Modes.A | Powers2Modes.B); testConversions("A-Name | B", (Powers2Modes)3); testConversions("A-Name | B | C-Name", Powers2Modes.A | Powers2Modes.B | Powers2Modes.C); testConversions("A-Name | B | C-Name", (Powers2Modes)7); testConversions("None", (LargeFlagValues)0); testConversions("ShortA", LargeFlagValues.ShortA); testConversions("LongA", LargeFlagValues.LongA); testConversions("Long Long B", LargeFlagValues.LongB); testConversions("LongA | Long Long B", LargeFlagValues.LongA | LargeFlagValues.LongB); Assert.AreEqual("16", Utils.EnumToReadableString((Powers2Modes)16)); Assert.AreEqual("32", Utils.EnumToReadableString((Powers2Modes)32)); Assert.AreEqual("16", Utils.EnumToReadableString((LargeFlagValues)16)); } } }