def test_two_group_with_id_of_advertiser(self): """ среди участников (объект класса Сreative) есть 2 разных id_of_advertiser get_maximums вернет список из 2х списков первый будет содержать 2 элемента с максимальной ценой в своей группе второй список содержит только один максимум три победителя нельзя найти в этом списке участников - это пустой список два победителя имеют в сумме цену, равную сумме цен максимумов групп """ creatives = [ Creative(0, 10, 0), Creative(1, 12, 1), Creative(2, 24, 0, "GB"), Creative(3, 9, 1, "FR"), Creative(4, 10, 0) ] max_of_groups = get_maximums(creatives, "FR") self.assertEqual(len(max_of_groups), len(set(i.id_of_advertiser for i in creatives if i.country == "FR" or not i.country)), 'correct len of group list') self.assertListEqual([i.id for i in max_of_groups[0]], [0, 4], 'equal id elements in first') self.assertListEqual([i.id for i in max_of_groups[1]], [1], 'equal id elements in first') winners = auction(creatives, 2, "FR") self.assertEqual(sum([i.price for i in winners]), sum([i[0].price for i in max_of_groups]), 'equal id elements') # тоже самое для другой страны max_of_groups = get_maximums(creatives, "GB") self.assertEqual(len(max_of_groups), len(set(i.id_of_advertiser for i in creatives if i.country == "GB" or not i.country)), 'correct len of group list') self.assertListEqual([i.id for i in max_of_groups[0]], [2], 'equal id elements in first') self.assertListEqual([i.id for i in max_of_groups[1]], [1], 'equal id elements in first') winners = auction(creatives, 2, "GB") self.assertEqual(sum([i.price for i in winners]), sum([i[0].price for i in max_of_groups]), 'equal id elements')
def test_auction(self): """ один победитель из участников будет иметь максимальную цену из цен участников ноль победителей - это пустой список """ max_of_groups = get_maximums(self.creatives) winners = auction(self.creatives, 1) self.assertEqual(sum([i.price for i in winners]), max_of_groups[0][0].price, 'equal price') empty_winners = auction(self.creatives, 0) self.assertListEqual([i.id for i in empty_winners], [], 'equal id elements')
def test_auction(self): max_of_groups = get_maximums(self.creatives) max_of_groups.sort(key=lambda x: -x[0].price) winners = auction(self.creatives, self.count) # этот тест пройдет так как # группы победителей определяются однозначно self.assertEqual(sum([i.price for i in winners]), sum([i[0].price for i in max_of_groups[:self.count]]), 'equal price')
def test_one_group_with_id_of_advertiser(self): """ если третий аргумент "FR", возможных победителей 2: с айди 1 и 2 если третий аргумент "GB", возможных победителей 2: с айди 0 и 4 """ creatives = [ Creative(0, 10, 0, "GB"), Creative(1, 5, 0, "FR"), Creative(2, 5, 0), Creative(3, 7, 0, "GB"), Creative(4, 10, 0, "GB") ] max_of_groups = get_maximums(creatives, "FR") self.assertEqual(len(max_of_groups), len(set(i.id_of_advertiser for i in creatives if i.country == "FR" or not i.country)), 'correct len of group list') self.assertListEqual([i.id for i in max_of_groups[0]], [1, 2], 'equal id elements') winners = auction(creatives, 1, "FR") self.assertEqual(sum([i.price for i in winners]), max_of_groups[0][0].price, 'equal price') # тоже самое на другой стране max_of_groups = get_maximums(creatives, "GB") self.assertEqual(len(max_of_groups), len(set(i.id_of_advertiser for i in creatives if i.country == "GB" or not i.country)), 'correct len of group list') self.assertListEqual([i.id for i in max_of_groups[0]], [0, 4], 'equal id elements') winners = auction(creatives, 1, "GB") self.assertEqual(sum([i.price for i in winners]), max_of_groups[0][0].price, 'equal price')
def test_equiprobable_one_winner_by_elements(self): """ get_winners_from_price_equal_groups_by_elments идет по умолчани в auction она гарантирует равновероятный выбор всех победителей из множества возможных """ all_winners_id_sets = [] for i in range(self.count_system_test): winners = auction(self.creatives, self.count) all_winners_id_sets.append(tuple([j.id for j in winners])) counter = Counter(all_winners_id_sets) # print("counter", counter) values_counter = list(counter.values()) max_counter = max(values_counter) min_counter = min(values_counter) self.assertTrue(abs(max_counter - min_counter) < self.count_system_test / len(self.creatives), "abs delta max and min mean")
def test_equiprobable_one_winner_by_grouops(self): """ этот тест не проходит так как функция get_winners_from_price_equal_groups_by_groups гарантирует равновероятный выбор между группами, а не между элементами """ all_winners_id = [] for i in range(self.count_system_test): winners = auction(self.creatives, self.count, get_winners_from_price_equal_groups_by_groups) all_winners_id.extend([j.id for j in winners]) counter = Counter(all_winners_id) # print("counter", counter) values_counter = list(counter.values()) max_counter = max(values_counter) min_counter = min(values_counter) self.assertTrue(abs(max_counter - min_counter) < self.count_system_test / len(self.creatives), "abs delta max and min mean")
def test_equiprobable_one_winner_step_by_step(self): """ get_winners_from_price_equal_groups_step_by_step гарантирует на каждом шаге равновероятный выбор поэтому тест с выбором одного победителя проходит """ all_winners_id = [] for i in range(self.count_system_test): winners = auction(self.creatives, self.count, get_winners_from_price_equal_groups_step_by_step) all_winners_id.extend([j.id for j in winners]) counter = Counter(all_winners_id) # print("counter", counter) values_counter = list(counter.values()) max_counter = max(values_counter) min_counter = min(values_counter) self.assertTrue(abs(max_counter - min_counter) < self.count_system_test / len(self.creatives), "abs delta max and min mean")
def test_auction(self): max_of_groups = get_maximums(self.creatives) max_of_groups.sort(key=lambda x: -x[0].price) winners = auction(self.creatives, 1) self.assertEqual(sum([i.price for i in winners]), max_of_groups[0][0].price, 'equal price')