public void Value_HashCheck() { byte partitionBits = 1; int id = 1253432; // Get Value, Hash, and Partition Index Value idValue = Value.Create(id); int hash = idValue.GetHashCode(); int partition = PartitionMask.IndexOfHash(hash, partitionBits); // Verify Matches reports consistently with IndexOfHash PartitionMask mask = PartitionMask.BuildSet(partitionBits)[partition]; string maskName = mask.ToString(); Assert.IsTrue(mask.Matches(hash)); // Verify Value.Assign hash is consistent Value n = Value.Create(null); n.Assign(id); int hashViaAssign = n.GetHashCode(); Assert.AreEqual(hash, hashViaAssign); // Get Hash of unwrapped value [debuggability] int wrongHash = id.GetHashCode(); int wrongPartition = PartitionMask.IndexOfHash(wrongHash, partitionBits); }
public void PartitionMask_Basic() { PartitionMask mask = PartitionMask.All; // Verify 'All' is count zero, value zero Assert.AreEqual(0, mask.BitCount); Assert.AreEqual(0, mask.Value); // Everything matches a zero-width mask mask.BitCount = 0; Assert.IsTrue(mask.Matches(0)); Assert.IsTrue(mask.Matches(~0)); Assert.AreEqual("", mask.ToString()); // 1* should match values starting with 0x8 only mask.BitCount = 1; mask.Value = (0x1 << 31); Assert.IsFalse(mask.Matches(0)); Assert.IsTrue(mask.Matches(~0)); Assert.IsTrue(mask.Matches(unchecked ((int)0x80000000))); Assert.IsFalse(mask.Matches(0x7FFFFFFF)); Assert.AreEqual("1", mask.ToString()); // 0* should match values without the first bit set mask.BitCount = 1; mask.Value = 0; Assert.IsTrue(mask.Matches(0)); Assert.IsFalse(mask.Matches(~0)); Assert.IsFalse(mask.Matches(unchecked ((int)0x80000000))); Assert.IsTrue(mask.Matches(0x7FFFFFFF)); Assert.AreEqual("0", mask.ToString()); // 11* should match values with the first two bits mask.BitCount = 2; mask.Value = (0x3 << 30); Assert.IsFalse(mask.Matches(0)); Assert.IsTrue(mask.Matches(~0)); Assert.IsFalse(mask.Matches(unchecked ((int)0x80000000))); Assert.IsTrue(mask.Matches(unchecked ((int)0xC0000000))); Assert.IsTrue(mask.Matches(unchecked ((int)0xE0000000))); Assert.IsFalse(mask.Matches(0x7FFFFFFF)); Assert.AreEqual("11", mask.ToString()); // 1101* should match values with the first four bits mask.BitCount = 4; mask.Value = (0xD << 28); Assert.IsFalse(mask.Matches(0)); Assert.IsFalse(mask.Matches(~0)); Assert.IsFalse(mask.Matches(unchecked ((int)0xC0000000))); Assert.IsTrue(mask.Matches(unchecked ((int)0xD0000000))); Assert.IsTrue(mask.Matches(unchecked ((int)0xD7777777))); Assert.IsFalse(mask.Matches(unchecked ((int)0xE0000000))); Assert.IsFalse(mask.Matches(unchecked ((int)0xF0000000))); Assert.IsFalse(mask.Matches(unchecked ((int)0x7FFFFFFF))); Assert.AreEqual("1101", mask.ToString()); // Verify 'All' has not been altered by copy/use Assert.AreEqual(0, PartitionMask.All.BitCount); Assert.AreEqual(0, PartitionMask.All.Value); }