private void ValidateBalanced(BinManager manager, List <MachineId> locations) { var expectedLocationsPerBin = locations.Count > manager.LocationsPerBin ? manager.LocationsPerBin : locations.Count; var expectedBinsPerLocation = locations.Count >= manager.LocationsPerBin ? BinManager.NumberOfBins / locations.Count * manager.LocationsPerBin : BinManager.NumberOfBins; var binMappings = manager.GetBins(); var counts = new Dictionary <int, int>(); foreach (var location in locations) { counts[location.Index] = 0; } foreach (var bin in binMappings) { bin.Length.Should().Be(expectedLocationsPerBin); foreach (var mapping in bin) { counts[mapping.Index]++; } } foreach (var count in counts.Values) { count.Should().BeInRange((int)(expectedBinsPerLocation * .9), (int)(expectedBinsPerLocation * 1.1)); } }
private void VerifyMappingsAreEqual(BinManager x, BinManager y) { var xBins = x.GetBins(); var yBins = y.GetBins(); var xExpired = x.GetExpiredAssignments(); var yExpired = y.GetExpiredAssignments(); xBins.Length.Should().Be(yBins.Length); for (var bin = 0; bin < xBins.Length; bin++) { xBins[bin].Length.Should().Be(yBins[bin].Length); for (var mapping = 0; mapping < xBins[bin].Length; mapping++) { xBins[bin][mapping].Index.Should().Be(yBins[bin][mapping].Index); } } xExpired.Count.Should().Be(yExpired.Count); foreach (var bin in xExpired.Keys) { var xBinExpired = xExpired[bin]; var yBinExpired = yExpired[bin]; xBinExpired.Count.Should().Be(yBinExpired.Count); foreach (var machine in xBinExpired.Keys) { xBinExpired[machine].Should().Be(yBinExpired[machine]); } } }
private void RemoveLocationsAndValidate(BinManager manager, List <MachineId> locations, int locationsToRemove) { for (var i = 0; i < locationsToRemove; i++) { var locationToRemove = locations[0]; var binsWithMachineAssigned = manager.GetBins(force: true) .Select((machines, bin) => (machines, bin)) .Where(t => t.machines.Contains(locationToRemove)) .Select(t => (uint)t.bin) .ToHashSet(); var chain = manager.EnumeratePreviousBins(0).Take(30).Select(b => (b, binsWithMachineAssigned.Contains(b))).ToList(); locations.Remove(locationToRemove); manager.RemoveLocation(locationToRemove); ValidateBalanced(manager, locations); foreach (var binWithMachineAssigned in binsWithMachineAssigned) { var assignedMachines = manager.GetDesignatedLocations(binWithMachineAssigned, includeExpired: false); var assignedMachinesWithExpired = manager.GetDesignatedLocations(binWithMachineAssigned, includeExpired: true); assignedMachines.Should().NotContain(locationToRemove); assignedMachinesWithExpired.Should().Contain(locationToRemove); } } }