public void LTCorrectness() { const int iters = 2000; var dict = new SortedDictionary <long, long>(); var rnd = new Random(); var oi = new OpfInteger(100); for (var i = 0; i < iters; i++) { var next = (long)((rnd.NextDouble() * 2.0 - 1.0) * long.MaxValue); dict[next] = oi.GetBucketId(next); } var keys = dict.Keys.ToList(); for (var i = 0; i < keys.Count; i++) { var item = keys[i]; var res = oi.GetBucketsLT(item); Assert.Equal(keys.Take(i + 1) .Where(x => oi.GetBucketRange(x).MinValue != item) .Select(x => dict[x]) .OrderBy(x => x) .Distinct(), res.OrderBy(x => x)); } }
public void BetweenCorrectness() { const int iters = 200; var dict = new SortedDictionary <long, long>(); var rnd = new Random(); var oi = new OpfInteger(100); for (var i = 0; i < iters; i++) { var next = (long)((rnd.NextDouble() * 2.0 - 1.0) * long.MaxValue); dict[next] = oi.GetBucketId(next); } var keys = dict.Keys.ToList(); for (var i = 0; i < keys.Count; i++) { for (var j = keys.Count - 1; j >= 0; j--) { var item1 = keys[i]; var item2 = keys[j]; var res = oi.GetBucketsBetween(item1, item2); var expected = oi.GetBucketsGT(Math.Min(item1, item2)) .Intersect(oi.GetBucketsLT(Math.Max(item1, item2))); Assert.Equal(expected.OrderBy(x => x), res.OrderBy(x => x)); } } }
public void BucketRangeCorrectness() { var oi = new OpfInteger(100); for (var i = Int64.MinValue; i <= Int64.MinValue + 5000; i++) { var range = oi.GetBucketRange(i); Assert.True(range.MinValue <= i); Assert.True(range.MaxValue >= i); if (range.MinValue == Int64.MinValue) { Assert.True(range.IsFirstBucket); Assert.False(range.IsLastBucket); } else { Assert.False(range.IsFirstBucket); Assert.False(range.IsLastBucket); } } for (var i = -2500; i <= 2500; i++) { var range = oi.GetBucketRange(i); Assert.True(range.MinValue <= i); Assert.True(range.MaxValue >= i); Assert.False(range.IsFirstBucket); Assert.False(range.IsLastBucket); } for (var i = Int64.MaxValue; i >= Int64.MaxValue - 5000; i--) { var range = oi.GetBucketRange(i); Assert.True(range.MinValue <= i); Assert.True(range.MaxValue >= i); if (range.MaxValue == Int64.MaxValue) { Assert.False(range.IsFirstBucket); Assert.True(range.IsLastBucket); } else { Assert.False(range.IsFirstBucket); Assert.False(range.IsLastBucket); } } }
public void RepeatedReadCorrectness() { const int iters = 50000; var dict = new Dictionary <long, long>(); var rnd = new Random(); var oi = new OpfInteger(100); for (var i = 0; i < iters; i++) { var next = (long)((rnd.NextDouble() * 2.0 - 1.0) * long.MaxValue); dict[next] = oi.GetBucketId(next); } foreach (var key in dict.Keys) { Assert.Equal(dict[key], oi.GetBucketId(key)); } }
public void SimpleTest() { var oi = new OpfInteger(100); var first = oi.GetBucketId(-123); var second = oi.GetBucketId(321); var third = oi.GetBucketId(890); var gt50 = oi.GetBucketsGT(50); Assert.Equal(2, gt50.Count); Assert.Contains(second, gt50); Assert.Contains(third, gt50); var lt50 = oi.GetBucketsLT(50); Assert.Single(lt50); Assert.Contains(first, lt50); var bt50_500 = oi.GetBucketsBetween(50, 500); Assert.Single(bt50_500); Assert.Contains(second, bt50_500); }