public static void ConvertersTest() { using (var scope = new TempLinksTestScope()) { const int N = 10; var links = scope.Links; var meaningRoot = links.CreatePoint(); var one = links.CreateAndUpdate(meaningRoot, links.Constants.Itself); var powerOf2ToUnaryNumberConverter = new PowerOf2ToUnaryNumberConverter <ulong>(links, one); var toUnaryNumberConverter = new AddressToUnaryNumberConverter <ulong>(links, powerOf2ToUnaryNumberConverter); var random = new System.Random(0); ulong[] numbers = new ulong[N]; ulong[] unaryNumbers = new ulong[N]; for (int i = 0; i < N; i++) { numbers[i] = random.NextUInt64(); unaryNumbers[i] = toUnaryNumberConverter.Convert(numbers[i]); } var fromUnaryNumberConverterUsingOrOperation = new UnaryNumberToAddressOrOperationConverter <ulong>(links, powerOf2ToUnaryNumberConverter); var fromUnaryNumberConverterUsingAddOperation = new UnaryNumberToAddressAddOperationConverter <ulong>(links, one); for (int i = 0; i < N; i++) { Assert.Equal(numbers[i], fromUnaryNumberConverterUsingOrOperation.Convert(unaryNumbers[i])); Assert.Equal(numbers[i], fromUnaryNumberConverterUsingAddOperation.Convert(unaryNumbers[i])); } } }
public static void TestMultipleRandomCreationsAndDeletions<TLink>(this ILinks<TLink> links, int maximumOperationsPerCycle) { var comparer = Comparer<TLink>.Default; var addressToUInt64Converter = CheckedConverter<TLink, ulong>.Default; var uInt64ToAddressConverter = CheckedConverter<ulong, TLink>.Default; for (var N = 1; N < maximumOperationsPerCycle; N++) { var random = new System.Random(N); var created = 0UL; var deleted = 0UL; for (var i = 0; i < N; i++) { var linksCount = addressToUInt64Converter.Convert(links.Count()); var createPoint = random.NextBoolean(); if (linksCount >= 2 && createPoint) { var linksAddressRange = new Range<ulong>(1, linksCount); TLink source = uInt64ToAddressConverter.Convert(random.NextUInt64(linksAddressRange)); TLink target = uInt64ToAddressConverter.Convert(random.NextUInt64(linksAddressRange)); //-V3086 var resultLink = links.GetOrCreate(source, target); if (comparer.Compare(resultLink, uInt64ToAddressConverter.Convert(linksCount)) > 0) { created++; } } else { links.Create(); created++; } } Assert.True(created == addressToUInt64Converter.Convert(links.Count())); for (var i = 0; i < N; i++) { TLink link = uInt64ToAddressConverter.Convert((ulong)i + 1UL); if (links.Exists(link)) { links.Delete(link); deleted++; } } Assert.True(addressToUInt64Converter.Convert(links.Count()) == 0L); } }
private static void TestMultipleRandomCreationsAndDeletions(int maximumOperationsPerCycle) { var and = Link.Create(Link.Itself, Link.Itself, Link.Itself); //var comparer = Comparer<TLink>.Default; for (var N = 1; N < maximumOperationsPerCycle; N++) { var random = new System.Random(N); var linksCount = 1; for (var i = 0; i < N; i++) { var createPoint = random.NextBoolean(); if (linksCount > 2 && createPoint) { var linksAddressRange = new Range <ulong>(1, (ulong)linksCount); Link source = random.NextUInt64(linksAddressRange); Link target = random.NextUInt64(linksAddressRange); //-V3086 var resultLink = Link.Create(source, and, target); if (resultLink > linksCount) { linksCount++; } } else { Link.Create(Link.Itself, Link.Itself, Link.Itself); linksCount++; } } for (var i = 0; i < N; i++) { Link link = i + 2; if (link.Linker != null) { Link.Delete(link); linksCount--; } } } }
public static ulong NextUInt64(this System.Random random) => random.NextUInt64(Range.UInt64);