private static SmoothSponsorshipRunningTotals GetSampleDataForEachCompetitorWithNoSponsoredWhenCalculationTypeIsPercentage() { var input = new SmoothSponsorshipRunningTotals(); input.AddCompetitorToClashCode("C1", "P330"); input.AddCompetitorToClashCode("C2", "P330"); input.AddCompetitorToClashCode("C3", "P330"); input.AddCompetitorToClashCode("C1", "P220"); input.AddCompetitorToClashCode("C2", "P220"); input.AddCompetitorToClashCode("C3", "P220"); input.AddCompetitorToAdvertiserIdentifier("C1", "A110"); input.AddCompetitorToAdvertiserIdentifier("C4", "A110"); input.AddCompetitorToAdvertiserIdentifier("C5", "A110"); input.AddCompetitorToAdvertiserIdentifier("C1", "A20"); input.AddCompetitorToAdvertiserIdentifier("C6", "A20"); input.AddCompetitorToAdvertiserIdentifier("C7", "A20"); input.SetRestrictionValueForClashCode("P330", 10); input.SetRestrictionValueForClashCode("P220", 11); input.SetRestrictionValueForAdvertiserIdentifier("A110", 5); input.SetRestrictionValueForAdvertiserIdentifier("A20", 3); input.AddCompetitorToSpotByCount("C1", 1); input.AddCompetitorToSpotByCount("C2", 1); input.AddCompetitorToSpotByCount("C5", 2); return(input); }
internal void GivenTheProductsAreAssignedToClashCodesAndAdvertiserIdentifierWhenTheRestrictionValuesAreSetForEachCode_ThenTheProductsWithMoreRestrictionValuesAssignToThemGetTheMinimumRestrictionValue() { var runningTotal = new SmoothSponsorshipRunningTotals(); runningTotal.AddCompetitorToClashCode("p1", "c1"); runningTotal.AddCompetitorToClashCode("p2", "c1"); runningTotal.AddCompetitorToClashCode("p1", "c2"); runningTotal.AddCompetitorToAdvertiserIdentifier("p1", "a1"); runningTotal.AddCompetitorToAdvertiserIdentifier("p2", "a1"); runningTotal.AddCompetitorToAdvertiserIdentifier("p1", "a2"); runningTotal.SetRestrictionValueForClashCode("c1", 10); runningTotal.SetRestrictionValueForClashCode("c2", 20); runningTotal.SetRestrictionValueForClashCode("c1", 1); runningTotal.SetRestrictionValueForClashCode("c2", 2); runningTotal.SetRestrictionValueForClashCode("a1", 100); runningTotal.SetRestrictionValueForClashCode("a2", 200); runningTotal.SetRestrictionValueForClashCode("a1", 10); runningTotal.SetRestrictionValueForClashCode("a2", 20); var restrictionValuesForCompetitors = runningTotal.GetRestrictionValuesForCompetitors(); Assert.Equal(new ProductExternalReference[] { "p1", "p2", "c1", "c2", "a1", "a2" }, restrictionValuesForCompetitors.Keys.ToArray()); Assert.Equal(1, restrictionValuesForCompetitors["p1"]); Assert.Equal(1, restrictionValuesForCompetitors["p2"]); Assert.Equal(1, restrictionValuesForCompetitors["c1"]); Assert.Equal(2, restrictionValuesForCompetitors["c2"]); Assert.Equal(10, restrictionValuesForCompetitors["a1"]); Assert.Equal(20, restrictionValuesForCompetitors["a2"]); }
public static SmoothSponsorshipRestrictionLimits CalculateRestrictionLimits( SmoothSponsorshipRunningTotals input, SponsorshipCalculationType calculationType, SponsorshipApplicability applicability ) { switch (calculationType) { case SponsorshipCalculationType.Flat: switch (applicability) { case SponsorshipApplicability.AllCompetitors: return(CalculateRestrictionLimitsForAllCompetitorsWhenCalculationTypeIsFlat(input)); case SponsorshipApplicability.EachCompetitor: return(CalculateRestrictionLimitsForEachCompetitorWhenCalculationTypeIsFlat(input)); } break; case SponsorshipCalculationType.Percentage: switch (applicability) { case SponsorshipApplicability.AllCompetitors: return(CalculateRestrictionLimitsForAllCompetitorsWhenCalculationTypeIsPercentage(input)); case SponsorshipApplicability.EachCompetitor: return(CalculateRestrictionLimitsForEachCompetitorWhenCalculationTypeIsPercentage(input)); } break; } return(null); }
private static SmoothSponsorshipRunningTotals GetSampleDataForAllCompetitorsWhenCalculationTypeIsFlat() { var input = new SmoothSponsorshipRunningTotals(); input.AddCompetitorToClashCode("C1", "P330"); input.AddCompetitorToClashCode("C2", "P330"); input.AddCompetitorToClashCode("C3", "P330"); input.AddCompetitorToClashCode("C1", "P220"); input.AddCompetitorToClashCode("C2", "P220"); input.AddCompetitorToClashCode("C3", "P220"); input.AddCompetitorToAdvertiserIdentifier("C1", "A110"); input.AddCompetitorToAdvertiserIdentifier("C4", "A110"); input.AddCompetitorToAdvertiserIdentifier("C5", "A110"); input.AddCompetitorToAdvertiserIdentifier("C1", "A20"); input.AddCompetitorToAdvertiserIdentifier("C6", "A20"); input.AddCompetitorToAdvertiserIdentifier("C7", "A20"); input.SetRestrictionValueForClashCode("P330", 5); input.SetRestrictionValueForClashCode("P220", 5); input.SetRestrictionValueForAdvertiserIdentifier("A110", 5); input.SetRestrictionValueForAdvertiserIdentifier("A20", 5); input.AddCompetitorToSpotByCount("C1", 1); input.AddCompetitorToSpotByCount("C5", 2); input.AddSponsoredProductToSpotByCount("SP1", 1); input.AddSponsoredProductToSpotByCount("SP2", 1); input.AddSponsoredProductToSpotByCount("SP3", 1); return(input); }
private static SmoothSponsorshipRunningTotals GetSampleDataForEachCompetitorWithLessThanOneAvailibityForCompetitorWhenCalculationTypeIsPercentage() { var input = new SmoothSponsorshipRunningTotals(); input.AddCompetitorToClashCode("C1", "P330"); input.AddCompetitorToClashCode("C2", "P200"); input.SetRestrictionValueForClashCode("P330", 9); input.SetRestrictionValueForClashCode("P200", 4); input.AddSponsoredProductToSpotByCount("P1", 10); return(input); }
internal void GivenTheProductsAreAssignedToClashCodesAndAdvertiserIdentifierWhenTheGetAllCompetitorsIsCalled_ThenAListOfAllUniqueProductsIsReturned() { var runningTotal = new SmoothSponsorshipRunningTotals(); runningTotal.AddCompetitorToClashCode("p1", "c1"); runningTotal.AddCompetitorToClashCode("p2", "c1"); runningTotal.AddCompetitorToClashCode("p1", "c2"); runningTotal.AddCompetitorToAdvertiserIdentifier("p1", "a1"); runningTotal.AddCompetitorToAdvertiserIdentifier("p2", "a1"); runningTotal.AddCompetitorToAdvertiserIdentifier("p1", "a2"); runningTotal.AddCompetitorToAdvertiserIdentifier("p3", "a3"); var competitors = runningTotal.GetAllCompetitors(); Assert.Equal(new ProductExternalReference[] { "p1", "p2", "p3" }, competitors); }
internal void GivenSponsoredProductsAreBeingAddedAndRemovedFromTheSpotsByCount_TheSponsoredProductsWillContainsAllCompetitorsValuesInTheSpots() { var runningTotal = new SmoothSponsorshipRunningTotals(); runningTotal.AddSponsoredProductToSpotByCount("p1", 1); runningTotal.AddSponsoredProductToSpotByCount("p2", 1); runningTotal.AddSponsoredProductToSpotByCount("p3", 1); runningTotal.AddSponsoredProductToSpotByCount("p1", 10); runningTotal.AddSponsoredProductToSpotByCount("p2", 1); runningTotal.RemoveSponsoredProductToSpotByCount("p1", 3); runningTotal.RemoveSponsoredProductToSpotByCount("p3", 1); runningTotal.RemoveSponsoredProductToSpotByCount("p4", 1); Assert.Equal(new ProductExternalReference[] { "p1", "p2" }, runningTotal.SponsoredProducts.Keys.ToArray()); Assert.Equal(8, runningTotal.SponsoredProducts["p1"]); Assert.Equal(2, runningTotal.SponsoredProducts["p2"]); }
internal void GivenCompetitorsAreBeingAddedAndRemovedFromTheSpotsByDuration_TheAlreadyPlacedCompetitorsWillContainsAllCompetitorsValuesInTheSpots() { var runningTotal = new SmoothSponsorshipRunningTotals(); runningTotal.AddCompetitorToSpotByDuration("p1", Duration.FromMinutes(1)); runningTotal.AddCompetitorToSpotByDuration("p2", Duration.FromMinutes(2)); runningTotal.AddCompetitorToSpotByDuration("p3", Duration.FromMinutes(5)); runningTotal.AddCompetitorToSpotByDuration("p1", Duration.FromMinutes(3)); runningTotal.AddCompetitorToSpotByDuration("p2", Duration.FromMinutes(1)); runningTotal.RemoveCompetitorToSpotByDuration("p1", Duration.FromMinutes(2)); runningTotal.RemoveCompetitorToSpotByDuration("p3", Duration.FromMinutes(5)); runningTotal.RemoveCompetitorToSpotByDuration("p4", Duration.FromMinutes(5)); Assert.Equal(new ProductExternalReference[] { "p1", "p2" }, runningTotal.AlreadyPlacedCompetitors.Keys.ToArray()); Assert.Equal(120, runningTotal.AlreadyPlacedCompetitors["p1"]); Assert.Equal(180, runningTotal.AlreadyPlacedCompetitors["p2"]); }
internal void GivenProductIdsAreAddedToSomeClashesAndAdvertisersCodes_TheAllProductIdsInClashOrAdvertiserCodeWillContainsAllTheValues() { var runningTotal = new SmoothSponsorshipRunningTotals(); runningTotal.AddCompetitorToClashCode("p1", "c1"); runningTotal.AddCompetitorToClashCode("p2", "c1"); runningTotal.AddCompetitorToClashCode("p1", "c2"); runningTotal.AddCompetitorToAdvertiserIdentifier("p1", "a1"); runningTotal.AddCompetitorToAdvertiserIdentifier("p2", "a1"); runningTotal.AddCompetitorToAdvertiserIdentifier("p1", "a2"); Assert.Equal(new string[] { "c1", "c2", "a1", "a2" }, runningTotal.AllProductIdsInClashOrAdvertiserCode.Keys.ToArray()); Assert.Equal(new ProductExternalReference[] { "p1", "p2" }, runningTotal.AllProductIdsInClashOrAdvertiserCode["c1"].ToArray()); Assert.Equal(new ProductExternalReference[] { "p1", "p2" }, runningTotal.AllProductIdsInClashOrAdvertiserCode["a1"].ToArray()); Assert.Equal(new ProductExternalReference[] { "p1" }, runningTotal.AllProductIdsInClashOrAdvertiserCode["c2"].ToArray()); Assert.Equal(new ProductExternalReference[] { "p1" }, runningTotal.AllProductIdsInClashOrAdvertiserCode["a2"].ToArray()); }
private static SmoothSponsorshipRunningTotals GetSampleDataForAllCompetitorsWhenCalculationTypeIsPercentage() { var input = new SmoothSponsorshipRunningTotals(); input.AddCompetitorToClashCode("C1", "P330"); input.AddCompetitorToClashCode("C2", "P330"); input.SetRestrictionValueForClashCode("P330", 10); input.AddCompetitorToSpotByCount("C1", 1); input.AddCompetitorToSpotByCount("C2", 1); input.AddSponsoredProductToSpotByCount("P1", 20); input.AddSponsoredProductToSpotByCount("P2", 30); return(input); }
internal void GivenRestrictionValuesAreAddedToSomeClashAndAdvertiserCodes_TheAllRestrictionValuesWillContainsAllTheValues() { var runningTotal = new SmoothSponsorshipRunningTotals(); runningTotal.SetRestrictionValueForClashCode("c1", 10); runningTotal.SetRestrictionValueForClashCode("c2", 20); runningTotal.SetRestrictionValueForClashCode("c1", 1); runningTotal.SetRestrictionValueForClashCode("c2", 2); runningTotal.SetRestrictionValueForClashCode("a1", 100); runningTotal.SetRestrictionValueForClashCode("a2", 200); runningTotal.SetRestrictionValueForClashCode("a1", 10); runningTotal.SetRestrictionValueForClashCode("a2", 20); Assert.Equal(new string[] { "c1", "c2", "a1", "a2" }, runningTotal.AllRestrictionValues.Keys.ToArray()); Assert.Equal(1, runningTotal.AllRestrictionValues["c1"]); Assert.Equal(2, runningTotal.AllRestrictionValues["c2"]); Assert.Equal(10, runningTotal.AllRestrictionValues["a1"]); Assert.Equal(20, runningTotal.AllRestrictionValues["a2"]); }
internal void GivenNoProductsAreAssignedToClashCodesAndAdvertiserIdentifierWhenTheRestrictionValuesAreSetForEachCodeClashAndAdvertiserThenTheClashesAndAdvertisersWillBeInTheRrestrictionValue() { var runningTotal = new SmoothSponsorshipRunningTotals(); runningTotal.SetRestrictionValueForClashCode("c1", 10); runningTotal.SetRestrictionValueForClashCode("c2", 20); runningTotal.SetRestrictionValueForClashCode("c1", 1); runningTotal.SetRestrictionValueForClashCode("c2", 2); runningTotal.SetRestrictionValueForClashCode("a1", 100); runningTotal.SetRestrictionValueForClashCode("a2", 200); runningTotal.SetRestrictionValueForClashCode("a1", 10); runningTotal.SetRestrictionValueForClashCode("a2", 20); var restrictionValuesForCompetitors = runningTotal.GetRestrictionValuesForCompetitors(); Assert.Equal(new ProductExternalReference[] { "c1", "c2", "a1", "a2" }, restrictionValuesForCompetitors.Keys.ToArray()); Assert.Equal(1, restrictionValuesForCompetitors["c1"]); Assert.Equal(2, restrictionValuesForCompetitors["c2"]); Assert.Equal(10, restrictionValuesForCompetitors["a1"]); Assert.Equal(20, restrictionValuesForCompetitors["a2"]); }
private static SmoothSponsorshipRestrictionLimits CalculateRestrictionLimitsForEachCompetitorWhenCalculationTypeIsPercentage( SmoothSponsorshipRunningTotals input) { var totalSponsoredProduct = input.SponsoredProducts.Sum(x => x.Value); if (totalSponsoredProduct == 0) { return(AllCompetitorsWithUnlimitedAvailibility(input)); } var output = new SmoothSponsorshipRestrictionLimits(); foreach (var item in input.AllRestrictionValues) { var productId = item.Key; var alreadyPlacedValue = 0.0; if (input.AllProductIdsInClashOrAdvertiserCode .TryGetValue(productId, out List <ProductExternalReference> products)) { foreach (var product in products) { if (input.AlreadyPlacedCompetitors.ContainsKey(product)) { alreadyPlacedValue += input.AlreadyPlacedCompetitors[product]; } } } var maximumAllowedValue = CalculateRestrictionValueForPercentage(item.Value, totalSponsoredProduct); var availValueRemaining = maximumAllowedValue - alreadyPlacedValue; if (availValueRemaining > 0) { output.AvailabilitiesForCompetitors.Add(productId, availValueRemaining); } } return(output); }
private static SmoothSponsorshipRunningTotals GetSampleDataForEachCompetitorWithCompetitorsAvalibityInDecimalWhenCalculationTypeIsPercentage() { var input = new SmoothSponsorshipRunningTotals(); input.AddCompetitorToClashCode("C1", "P1"); input.AddCompetitorToClashCode("C2", "P2"); input.AddCompetitorToClashCode("C3", "P3"); input.AddCompetitorToClashCode("C4", "P4"); input.AddCompetitorToClashCode("C5", "P5"); input.AddCompetitorToClashCode("C6", "P6"); input.AddCompetitorToClashCode("C7", "P7"); input.AddCompetitorToClashCode("C8", "P8"); input.AddCompetitorToClashCode("C9", "P9"); input.AddCompetitorToClashCode("C10", "P10"); input.AddCompetitorToClashCode("C11", "P11"); input.AddCompetitorToClashCode("C12", "P12"); input.AddCompetitorToClashCode("C13", "P13"); input.SetRestrictionValueForClashCode("P1", 9); input.SetRestrictionValueForClashCode("P2", 10); input.SetRestrictionValueForClashCode("P3", 11); input.SetRestrictionValueForClashCode("P4", 12); input.SetRestrictionValueForClashCode("P5", 13); input.SetRestrictionValueForClashCode("P6", 14); input.SetRestrictionValueForClashCode("P7", 15); input.SetRestrictionValueForClashCode("P8", 16); input.SetRestrictionValueForClashCode("P9", 17); input.SetRestrictionValueForClashCode("P10", 18); input.SetRestrictionValueForClashCode("P11", 19); input.SetRestrictionValueForClashCode("P12", 20); input.SetRestrictionValueForClashCode("P13", 21); input.AddSponsoredProductToSpotByCount("SponsoredProduct", 10); return(input); }
private static SmoothSponsorshipRestrictionLimits CalculateRestrictionLimitsForEachCompetitorWhenCalculationTypeIsFlat(SmoothSponsorshipRunningTotals input) { var output = new SmoothSponsorshipRestrictionLimits(); foreach (var item in input.AllRestrictionValues) { var productId = item.Key; var alreadyPlacedValue = 0.0; if (input.AllProductIdsInClashOrAdvertiserCode .TryGetValue(productId, out List <ProductExternalReference> products)) { foreach (var product in products) { if (input.AlreadyPlacedCompetitors.ContainsKey(product)) { alreadyPlacedValue += input.AlreadyPlacedCompetitors[product]; } } } var availValueRemaining = item.Value - alreadyPlacedValue; if (availValueRemaining > 0) { output.AvailabilitiesForCompetitors.Add(productId, availValueRemaining); } } return(output); }
private static SmoothSponsorshipRestrictionLimits AllCompetitorsWithUnlimitedAvailibility(SmoothSponsorshipRunningTotals input) { return(new SmoothSponsorshipRestrictionLimits { AvailabilitiesForCompetitors = input .GetAllCompetitors() .ToDictionary(x => x, _ => double.MaxValue) }); }
private static SmoothSponsorshipRestrictionLimits CalculateRestrictionLimitsForAllCompetitorsWhenCalculationTypeIsFlat(SmoothSponsorshipRunningTotals input) { var output = new SmoothSponsorshipRestrictionLimits(); var competitorsAndRestrictionValues = input.GetRestrictionValuesForCompetitors(); var alreadyBookedCompetitorsInTotal = input.AlreadyPlacedCompetitors.Sum(x => x.Value); foreach (var item in competitorsAndRestrictionValues) { var productId = item.Key; var availValueRemaining = item.Value - alreadyBookedCompetitorsInTotal; if (availValueRemaining > 0) { output.AvailabilitiesForCompetitors.Add(productId, availValueRemaining); } } return(output); }
private static SmoothSponsorshipRestrictionLimits CalculateRestrictionLimitsForAllCompetitorsWhenCalculationTypeIsPercentage(SmoothSponsorshipRunningTotals input) { var totalSponsoredProduct = input.SponsoredProducts.Sum(x => x.Value); if (totalSponsoredProduct == 0) { return(AllCompetitorsWithUnlimitedAvailibility(input)); } var output = new SmoothSponsorshipRestrictionLimits(); var competitorsAndRestrictionValues = input.GetRestrictionValuesForCompetitors(); var alreadyBookedCompetitorsInTotal = input.AlreadyPlacedCompetitors.Sum(x => x.Value); foreach (var item in competitorsAndRestrictionValues) { var productId = item.Key; var maximumAllowedValue = CalculateRestrictionValueForPercentage(item.Value, totalSponsoredProduct); var availValueRemaining = maximumAllowedValue - alreadyBookedCompetitorsInTotal; if (availValueRemaining > 0) { output.AvailabilitiesForCompetitors.Add(productId, availValueRemaining); } } return(output); }