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.
posted @ Wednesday, November 12, 2008 6:34 PM