public void when_instantiated_parses_string_into_address_prefix_and_suffix(string range, byte expectedMostSignificantByte, byte expectedSuffix) { //arrange //act var sut = new CidrRange(range); //assert Assert.AreEqual(expectedMostSignificantByte, sut.Prefix[3]); Assert.AreEqual(expectedSuffix, sut.Suffix); }
public void when_insignificant_prefix_bits_differ_should_consider_other_to_be_equal(string leftRange, string rightRange) { //arrange var sut = new CidrRange(leftRange); var other = new CidrRange(rightRange); //act //assert Assert.AreEqual(sut, other); }
public RangeIntersectionResult CompareTo(CidrRange other) { if (Equals(other)) return RangeIntersectionResult.Equals; if (PrefixesEquals(other) && Suffix > other.Suffix) return RangeIntersectionResult.Subset; if (PrefixesEquals(other) && Suffix < other.Suffix) return RangeIntersectionResult.Superset; return RangeIntersectionResult.Disjoint; }
public void when_prefixes_are_equal_and_left_suffix_is_less_should_consider_left_to_be_a_superset(string leftRange, string rightRange) { //arrange var sut = new CidrRange(leftRange); var right = new CidrRange(rightRange); //act var actual = sut.CompareTo(right); var expected = sut.Prefix.Skip(1).SequenceEqual(right.Prefix.Skip(1)) && sut.Suffix < right.Suffix ? RangeIntersectionResult.Superset : RangeIntersectionResult.Disjoint; //assert Assert.AreEqual(expected, actual); }
public void when_prefixes_are_different_should_consider_left_to_be_a_disjoint(string leftRange, string rightRange) { //arrange var sut = new CidrRange(leftRange); var right = new CidrRange(rightRange); //act var actual = sut.CompareTo(right); var expected = !sut.Prefix.SequenceEqual(right.Prefix)//this is not exactly correct specification, but it's OK for the sake of simplicity ? RangeIntersectionResult.Disjoint : RangeIntersectionResult.Subset; //assert Assert.AreEqual(expected, actual); }
private bool PrefixesEquals(CidrRange other) { var leftMask = new BitArray(Prefix); var leftSuffix = new BitArray(32, false); for (int i = 31; i >= 32 - Suffix; i--) { leftSuffix[i] = true; } leftMask = leftSuffix.And(leftMask); var rightMask = new BitArray(other.Prefix); var rightSuffix = new BitArray(32, false); for (int i = 31; i >= 32 - other.Suffix; i--) { rightSuffix[i] = true; } rightMask = rightSuffix.And(rightMask); var result = rightMask.Xor(leftMask); return result.Cast<bool>().ToArray().Skip(32 - Math.Min(Suffix, other.Suffix)).All(x => !x); }
public void when_prefix_and_suffix_are_equal_should_consider_other_to_be_equal(string range) { //arrange var sut = new CidrRange(range); var other = new CidrRange(range); //act //assert Assert.AreEqual(sut, other); }
protected bool Equals(CidrRange other) { return Suffix == other.Suffix && PrefixesEquals(other); }