Пример #1
0
 def setUp(self):
     from banksys import DummyBank
     self.bank = DummyBank()
     self.auction = Auction(bank=self.bank)
     self.auction.register_reserved_money_checker()
	def setUp(self):
		from banksys import DummyBank
		self.bank = DummyBank()
		self.auction = Auction(bank=self.bank)
		self.auction.register_reserved_money_checker()
Пример #3
0
class AuctionsysTester(unittest.TestCase):
    def setUp(self):
        from banksys import DummyBank
        self.bank = DummyBank()
        self.auction = Auction(bank=self.bank)
        self.auction.register_reserved_money_checker()

    def tearDown(self):
        self.auction.deregister_reserved_money_checker()

    def test_bids(self):
        self.auction.place_bid("bob", "pepsiman", 1)
        bids = self.auction.process_bids()["all_bids"]
        self.assertEqual(bids, [("bob", "pepsiman", 1)])

        self.auction.place_bid("alice", "katamari", 2)
        bids = self.auction.process_bids()["all_bids"]
        self.assertEqual(bids, [("bob", "pepsiman", 1),
                                ("alice", "katamari", 2)])

        #if another bid has the same user_id and item_id as previously seen, remove the old bid
        self.auction.place_bid("bob", "pepsiman", 2)
        bids = self.auction.process_bids()["all_bids"]
        self.assertEqual(bids, [("alice", "katamari", 2),
                                ("bob", "pepsiman", 2)])

    def test_incremental_bidding(self):
        self.auction.place_bid("bob", "pepsiman", 100)
        self.auction.place_bid("alice", "katamari", 2)

        result = self.auction.process_bids()
        #Bob should pay 1 more than the next-lowest bid of 2
        self.assertEqual(result["winning_bid"]["total_charge"], 3)

        #now, test it with collaboration
        self.auction.clear()
        self.auction.place_bid("bob", "pepsiman", 4)
        self.auction.place_bid("alice", "katamari", 5)
        self.auction.place_bid("cirno", "pepsiman",
                               4)  #sorry; couldn't think of a good c-name

        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"]["total_charge"], 6)
        self.assertEqual(result["winning_bid"]["winning_item"], "pepsiman")

        #If there's only 1 bid, they should pay 1
        self.auction.clear()
        self.auction.place_bid("bob", "pepsiman", 100)
        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"]["total_charge"], 1)
        self.assertEqual(result["winning_bid"]["winning_item"], "pepsiman")

        #ties shouldn't change the winner
        self.auction.place_bid("deku", "unfinished_battle", 100)
        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"]["winning_item"], "pepsiman")
        self.assertEqual(result["winning_bid"]["total_cost"], 100)

    def test_winning(self):
        self.auction.place_bid("bob", "pepsiman", 3)
        self.auction.place_bid("alice", "katamari", 2)
        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"]["winning_item"], "pepsiman")

        #new bids for the same item should override previous wins
        self.auction.place_bid("cirno", "unfinished_battle", 5)
        self.auction.place_bid("alice", "katamari", 4)
        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"]["winning_item"],
                         "unfinished_battle")

        #if a new bid is equal to the winner, the winning item shouldn't change
        self.auction.place_bid("alice", "katamari", 5)
        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"]["winning_item"],
                         "unfinished_battle")

    def test_collaborative(self):
        self.auction.place_bid("bob", "pepsiman", 1)
        self.auction.place_bid("alice", "katamari", 3)
        self.auction.place_bid("cirno", "unfinished_battle", 1)

        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"]["winning_item"], "katamari")

        #ties shouldn't change the winner
        self.auction.place_bid("deku", "unfinished_battle", 2)
        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"]["winning_item"], "katamari")

        #cirno's 1 + deku's 3=4, so the winner should change
        self.auction.place_bid("deku", "unfinished_battle", 3)
        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"]["winning_item"],
                         "unfinished_battle")
        self.assertEqual(result["winning_bid"]["total_cost"], 4)

    def test_reserved(self):
        self.auction.place_bid("bob", "peach", 4)
        self.auction.place_bid("cirno", "peach", 9)
        self.auction.place_bid("alice", "yoshi", 3)

        self.assertEqual(self.auction.get_reserved_money("alice"), 3)
        self.assertEqual(self.auction.get_reserved_money("bob"), 4)
        self.assertEqual(self.auction.get_reserved_money("cirno"), 9)
        #If not in the system yet, there should be no money reserved
        self.assertEqual(self.auction.get_reserved_money("deku"), 0)

    def test_winning_bids(self):
        self.auction.place_bid("cirno", "pepsiman", 2)
        self.auction.place_bid("alice", "katamari", 2)
        self.auction.place_bid("bob", "pepsiman", 4)
        self.auction.place_bid("deku", "unfinished_battle", 3)
        #some bids get upgraded
        self.auction.place_bid("alice", "katamari", 5)
        self.auction.place_bid("cirno", "pepsiman", 4)

        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"]["winning_item"], "pepsiman")

        for bid in result["winning_bid"]["bids"]:
            self.assertEqual(bid[1], result["winning_bid"]["winning_item"])

    def test_insufficient_money(self):
        #give alice 100 money
        bank = self.auction.bank
        bank._adjust_stored_money_value('alice', -bank._starting_amount)
        bank._adjust_stored_money_value('alice', 100)
        self.assertEqual(bank.get_total_money('alice'), 100)

        self.auction.place_bid("alice", "katamari", 66)
        self.auction.place_bid("alice", "unfinished_battle", 34)

        self.assertEqual(self.auction.get_reserved_money("alice"), 100)

        try:
            self.auction.place_bid("alice", "pepsiman", 1)
            self.assertEqual("No InsufficientMoneyError raised", 0)
        except InsufficientMoneyError:
            pass

        #test raising a previous bid past the mark
        self.auction.clear()
        self.auction.place_bid("alice", "katamari", 66)
        self.auction.place_bid("alice", "unfinished_battle", 34)

        self.assertEqual(self.auction.get_reserved_money("alice"), 100)
        try:
            self.auction.place_bid("alice", "unfinished_battle", 35)
            self.assertEqual("No InsufficientMoneyError raised", 0)
        except InsufficientMoneyError:
            pass

    def test_collaborative_allotting(self):
        self.auction.place_bid("alice", "pepsiman", 1)
        self.auction.place_bid("bob", "pepsiman", 4)
        self.auction.place_bid("cirno", "pepsiman", 2)
        self.auction.place_bid("deku", "pepsiman", 2)

        self.auction.place_bid("eve", "katamari", 4)

        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"]["total_charge"], 5)
        self.assertEqual(result["winning_bid"]["amounts_owed"], {
            "alice": 1,
            "bob": 2,
            "cirno": 1,
            "deku": 1
        })

    def test_big_bids_collaborative_allotting(self):
        self.auction.place_bid("alice", "katamari", 1000)
        self.auction.place_bid("bob", "pepsiman", 1000)
        self.auction.place_bid("cirno", "pepsiman", 1000)
        self.auction.place_bid("deku", "pepsiman", 100)
        self.auction.place_bid("eve", "pepsiman", 100)
        self.auction.place_bid("flareon", "pepsiman", 1000)
        self.auction.place_bid("geforcefly", "pepsiman", 1)
        self.auction.place_bid("hlixed", "pepsiman", 1)
        #measure time to process
        start = datetime.datetime.now()
        result = self.auction.process_bids()
        finish = datetime.datetime.now()
        milliseconds = (finish - start).microseconds / 1000
        #this test is intended to be a realistic worst case scenario for bidding
        #the current implementation's run time grows very quickly for large bids
        #so if it's less than 10ms for over 3000 tokens in play it's probably OK
        self.assertTrue(milliseconds < 10)

    def test_overwrite_bid(self):
        money = self.bank._starting_amount
        self.auction.place_bid("alice", "pepsiman", money // 2)
        self.auction.place_bid("alice", "pepsiman", money)
        self.auction.place_bid("bob", "katamari",
                               money // 2 + 10)  #force the price up
        result = self.auction.process_bids()
        # Alice should be able to increase a bid on the same item, even though both bids would be too expensive together
        self.assertEqual(result["winning_bid"]["total_cost"], money)
        self.assertEqual(result["winning_bid"]["total_charge"],
                         money // 2 + 11)
        self.assertEqual(result["winning_bid"]["winning_item"], "pepsiman")
        self.assertEqual(len(result["all_bids"]), 2)  #and not 3

    def test_one_bidder(self):
        self.auction.place_bid("felk", "pepsiman", 1)
        self.auction.place_bid("felk", "pepsiman", 10)
        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"]["winning_item"], "pepsiman")
        self.assertEqual(result["winning_bid"]["total_charge"], 1)

    def test_no_bids(self):
        result = self.auction.process_bids()
        self.assertEqual(result["winning_bid"], None)
        self.assertEqual(result["all_bids"], [])

    def test_multibid_first_wins(self):
        money = self.bank._starting_amount
        self.auction.place_bid("alice", "pepsiman", 1)
        self.auction.place_bid("bob", "katamari", 2)
        self.auction.place_bid("charlie", "pepsiman", 1)
        result = self.auction.process_bids()["winning_bid"]
        # katamari should have won
        self.assertEqual(result["winning_item"], "katamari")
class AuctionsysTester(unittest.TestCase):
	def setUp(self):
		from banksys import DummyBank
		self.bank = DummyBank()
		self.auction = Auction(bank=self.bank)
		self.auction.register_reserved_money_checker()
		
	def tearDown(self):
		self.auction.deregister_reserved_money_checker()

	def test_bids(self):
		self.auction.place_bid("bob", "pepsiman", 1)
		bids = self.auction.process_bids()["all_bids"]
		self.assertEqual(bids,[("bob","pepsiman",1)])

		self.auction.place_bid("alice", "katamari", 2)
		bids = self.auction.process_bids()["all_bids"]
		self.assertEqual(bids,[("bob","pepsiman",1),("alice","katamari",2)])

		#if another bid has the same user_id and item_id as previously seen, remove the old bid
		self.auction.place_bid("bob", "pepsiman", 2)
		bids = self.auction.process_bids()["all_bids"]
		self.assertEqual(bids,[("alice","katamari",2),("bob","pepsiman",2)])

	def test_incremental_bidding(self):
		self.auction.place_bid("bob", "pepsiman", 100)
		self.auction.place_bid("alice", "katamari", 2)

		result = self.auction.process_bids()
		#Bob should pay 1 more than the next-lowest bid of 2
		self.assertEqual(result["winning_bid"]["total_charge"],3)

		#now, test it with collaboration
		self.auction.clear()
		self.auction.place_bid("bob", "pepsiman", 4)
		self.auction.place_bid("alice", "katamari", 5)
		self.auction.place_bid("cirno", "pepsiman", 4) #sorry; couldn't think of a good c-name

		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"]["total_charge"],6)
		self.assertEqual(result["winning_bid"]["winning_item"],"pepsiman")

		#If there's only 1 bid, they should pay 1
		self.auction.clear()
		self.auction.place_bid("bob", "pepsiman", 100)
		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"]["total_charge"],1)
		self.assertEqual(result["winning_bid"]["winning_item"],"pepsiman")

		#ties shouldn't change the winner
		self.auction.place_bid("deku", "unfinished_battle", 100)
		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"]["winning_item"],"pepsiman")
		self.assertEqual(result["winning_bid"]["total_cost"],100)


	def test_winning(self):
		self.auction.place_bid("bob", "pepsiman", 3)
		self.auction.place_bid("alice", "katamari", 2)
		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"]["winning_item"],"pepsiman")

		#new bids for the same item should override previous wins
		self.auction.place_bid("cirno", "unfinished_battle", 5)
		self.auction.place_bid("alice", "katamari", 4)
		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"]["winning_item"],"unfinished_battle")

		#if a new bid is equal to the winner, the winning item shouldn't change
		self.auction.place_bid("alice", "katamari", 5)
		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"]["winning_item"],"unfinished_battle")


	def test_collaborative(self):
		self.auction.place_bid("bob", "pepsiman", 1)
		self.auction.place_bid("alice", "katamari", 3)
		self.auction.place_bid("cirno", "unfinished_battle", 1)

		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"]["winning_item"],"katamari")
		
		#ties shouldn't change the winner
		self.auction.place_bid("deku", "unfinished_battle", 2)
		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"]["winning_item"],"katamari")

		#cirno's 1 + deku's 3=4, so the winner should change
		self.auction.place_bid("deku", "unfinished_battle", 3)
		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"]["winning_item"],"unfinished_battle")
		self.assertEqual(result["winning_bid"]["total_cost"],4)

	def test_reserved(self):
		self.auction.place_bid("bob", "peach", 4)
		self.auction.place_bid("cirno", "peach", 9)
		self.auction.place_bid("alice", "yoshi", 3)

		self.assertEqual(self.auction.get_reserved_money("alice"),3)
		self.assertEqual(self.auction.get_reserved_money("bob"),4)
		self.assertEqual(self.auction.get_reserved_money("cirno"),9)
		#If not in the system yet, there should be no money reserved
		self.assertEqual(self.auction.get_reserved_money("deku"),0)

	def test_winning_bids(self):
		self.auction.place_bid("cirno", "pepsiman", 2)
		self.auction.place_bid("alice", "katamari", 2)
		self.auction.place_bid("bob", "pepsiman", 4)
		self.auction.place_bid("deku", "unfinished_battle", 3)
		#some bids get upgraded
		self.auction.place_bid("alice", "katamari", 5)
		self.auction.place_bid("cirno", "pepsiman", 4)

		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"]["winning_item"],"pepsiman")

		for bid in result["winning_bid"]["bids"]:
			self.assertEqual(bid[1], result["winning_bid"]["winning_item"])

	def test_insufficient_money(self):
		#give alice 100 money
		bank = self.auction.bank
		bank._adjust_stored_money_value('alice',-bank._starting_amount)
		bank._adjust_stored_money_value('alice',100)
		self.assertEqual(bank.get_total_money('alice'),100)

		self.auction.place_bid("alice", "katamari", 66)
		self.auction.place_bid("alice", "unfinished_battle", 34)
		
		self.assertEqual(self.auction.get_reserved_money("alice"),100)

		try:
			self.auction.place_bid("alice", "pepsiman", 1)
			self.assertEqual("No InsufficientMoneyError raised",0)
		except InsufficientMoneyError:
			pass

		#test raising a previous bid past the mark
		self.auction.clear()
		self.auction.place_bid("alice", "katamari", 66)
		self.auction.place_bid("alice", "unfinished_battle", 34)

		self.assertEqual(self.auction.get_reserved_money("alice"),100)
		try:
			self.auction.place_bid("alice", "unfinished_battle", 35)
			self.assertEqual("No InsufficientMoneyError raised",0)
		except InsufficientMoneyError:
			pass

	def test_collaborative_allotting(self):
		self.auction.place_bid("alice", "pepsiman", 1)
		self.auction.place_bid("bob", "pepsiman", 4)
		self.auction.place_bid("cirno", "pepsiman", 2)
		self.auction.place_bid("deku", "pepsiman", 2)

		self.auction.place_bid("eve", "katamari", 4)

		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"]["total_charge"],5)
		self.assertEqual(result["winning_bid"]["amounts_owed"],{"alice":1,"bob":2,"cirno":1,"deku":1})

	def test_big_bids_collaborative_allotting(self):
		self.auction.place_bid("alice", "katamari", 1000)
		self.auction.place_bid("bob", "pepsiman", 1000)
		self.auction.place_bid("cirno", "pepsiman", 1000)
		self.auction.place_bid("deku", "pepsiman", 100)
		self.auction.place_bid("eve", "pepsiman", 100)
		self.auction.place_bid("flareon", "pepsiman", 1000)
		self.auction.place_bid("geforcefly", "pepsiman", 1)
		self.auction.place_bid("hlixed", "pepsiman", 1)
		#measure time to process
		start = datetime.datetime.now()
		result = self.auction.process_bids()
		finish = datetime.datetime.now()
		milliseconds = (finish-start).microseconds / 1000
		#this test is intended to be a realistic worst case scenario for bidding
		#the current implementation's run time grows very quickly for large bids
		#so if it's less than 10ms for over 3000 tokens in play it's probably OK
		self.assertTrue(milliseconds < 10)
		
	def test_overwrite_bid(self):
		money = self.bank._starting_amount
		self.auction.place_bid("alice", "pepsiman", money//2)
		self.auction.place_bid("alice", "pepsiman", money)
		self.auction.place_bid("bob", "katamari",  money//2+10) #force the price up
		result = self.auction.process_bids()
		# Alice should be able to increase a bid on the same item, even though both bids would be too expensive together
		self.assertEqual(result["winning_bid"]["total_cost"], money)
		self.assertEqual(result["winning_bid"]["total_charge"], money//2+11)
		self.assertEqual(result["winning_bid"]["winning_item"], "pepsiman")
		self.assertEqual(len(result["all_bids"]), 2) #and not 3

	def test_one_bidder(self):
		self.auction.place_bid("felk", "pepsiman", 1)
		self.auction.place_bid("felk", "pepsiman", 10)
		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"]["winning_item"], "pepsiman")
		self.assertEqual(result["winning_bid"]["total_charge"], 1)
		
	def test_no_bids(self):
		result = self.auction.process_bids()
		self.assertEqual(result["winning_bid"], None)
		self.assertEqual(result["all_bids"], [])

	def test_multibid_first_wins(self):
		money = self.bank._starting_amount
		self.auction.place_bid("alice", "pepsiman", 1)
		self.auction.place_bid("bob", "katamari", 2)
		self.auction.place_bid("charlie", "pepsiman", 1)
		result = self.auction.process_bids()["winning_bid"]
		# katamari should have won
		self.assertEqual(result["winning_item"], "katamari")