FlagsAttribute how to use it right

I like flags. Rarely do I get a chance to use them. Today the perfect opportunity came up and I recalled the "good way" of dealing with flags that I had found last time. After some digging I found it and I thought it is worthy of another post in another blog. So no news today just a helpful test class that shows exactly how to define and use an enum with the FlagsAttribute.

[TestClass]
public class FlagsTests
{
    [Flags]
    public enum Metasyntactic
    {
        Noop = 0,
        Foo = 1 << 0,
        Bar = 1 << 1,
        Baz = 1 << 2,
        Qux = 1 << 3,
        Quux = 1 << 4,
        Core = 1 << 5,
        Grault = 1 << 6,
        Xyzzy = 1 << 7,
        Thud = 1 << 8,
        Plugh = 1 << 9
    }

    [TestMethod]
    public void IntValues()
    {
        Assert.AreEqual(  0, Convert.ToInt32(Metasyntactic.Noop));
        Assert.AreEqual(  1, Convert.ToInt32(Metasyntactic.Foo));
        Assert.AreEqual(  2, Convert.ToInt32(Metasyntactic.Bar));
        Assert.AreEqual(  4, Convert.ToInt32(Metasyntactic.Baz));
        Assert.AreEqual(  8, Convert.ToInt32(Metasyntactic.Qux));
        Assert.AreEqual( 16, Convert.ToInt32(Metasyntactic.Quux));
        Assert.AreEqual( 32, Convert.ToInt32(Metasyntactic.Core));
        Assert.AreEqual( 64, Convert.ToInt32(Metasyntactic.Grault));
        Assert.AreEqual(128, Convert.ToInt32(Metasyntactic.Xyzzy));
        Assert.AreEqual(256, Convert.ToInt32(Metasyntactic.Thud));
        Assert.AreEqual(512, Convert.ToInt32(Metasyntactic.Plugh));
    }

    [TestMethod]
    public void GetValue() // Standard way of checking for a value
    {
        var newsCategory = Metasyntactic.Foo | Metasyntactic.Plugh | Metasyntactic.Grault;

        Assert.IsTrue((newsCategory & Metasyntactic.Plugh) == Metasyntactic.Plugh);
        Assert.IsTrue((newsCategory & Metasyntactic.Plugh) != 0);

        Assert.IsTrue((newsCategory & Metasyntactic.Bar) != Metasyntactic.Bar);
        Assert.IsTrue((newsCategory & Metasyntactic.Bar) == 0);
    }

    [TestMethod]
    public void RemoveValue() // ^
    {
        Assert.AreEqual((Metasyntactic.Foo | Metasyntactic.Plugh) ^ Metasyntactic.Plugh,
                                        Metasyntactic.Foo);
    }

    [TestMethod]
    public void SetValue() // |=
    {
        var expected = Metasyntactic.Foo;

        expected |= Metasyntactic.Qux;

        expected |= Metasyntactic.Noop; // This changes nothing!
        expected |= Metasyntactic.Noop;
        expected |= Metasyntactic.Noop;

        Assert.AreEqual(Metasyntactic.Foo | Metasyntactic.Qux, expected);
    }

    [TestMethod]
    public void ClearValue() // &= ~
    {
        var expected = Metasyntactic.Foo | Metasyntactic.Thud;

        expected &= ~Metasyntactic.Foo; // Remove Foo
        Assert.AreEqual(Metasyntactic.Thud, expected);

        expected &= ~Metasyntactic.Thud; // Remove Thud
        Assert.AreEqual(Metasyntactic.Noop, expected);
    }

    [TestMethod]
    public void FlipFlag() // ^=
    {
        var expected = Metasyntactic.Thud;

        expected ^= Metasyntactic.Foo; // Add Foo
        Assert.AreEqual(Metasyntactic.Thud | Metasyntactic.Foo, expected);

        expected ^= Metasyntactic.Foo; // Remove Foo
        Assert.AreEqual(Metasyntactic.Thud, expected);

        expected ^= Metasyntactic.Bar | Metasyntactic.Xyzzy; // Add Bar and Xyzzy

        Assert.AreEqual(Metasyntactic.Thud | Metasyntactic.Bar | Metasyntactic.Xyzzy, expected);
    }
}

Cheers,

M.

Technorati Tags: ,

posted @ Wednesday, November 12, 2008 6:34 PM

Print

Comments on this entry:

# re: FlagsAttribute how to use it right

Left by Rumtata at 8/24/2009 2:09 PM
Gravatar
Thanks a lot esp. for demo code for
RemoveValue & SetValue ...

Your comment:



 (will not be displayed)


 
 
 
Please add 4 and 5 and type the answer here:
 

Live Comment Preview: