class TestMember(unittest.TestCase): def setUp(self): member_doc = { 'id': 123, 'innocence': 0.1, 'experience': 0.5, 'charisma': 0.2, 'recruited': [], 'money': 1000, 'week_joined': 3 } self.member = Member(member_doc) def test_get_max_weeks(self): result = self.member.get_max_weeks() self.assertEqual(result, 4) def test_get_recruit_probability_with_recruit(self): for i in range(1, 11): self.member.recruited.append(i) result = self.member.get_recruit_probability() self.assertEqual(result, 0) def test_get_recruit_probability(self): result = self.member.get_recruit_probability() self.assertEqual(result, 0.1)
def __simulate_one_week__(self): """ Makes the program being simulated to advance in one week. This method will search all active members and apply the rules of the program. """ self.__set_week__(self.current_week + 1) members = self.db_controller.get_members() filtered = filter(lambda x: (len(x['recruited']) < 10) & x['active'], members) members = list(filtered) if not members: self.db_controller.end_program() self.continue_simulation = False return for member_doc in members: member = Member(member_doc) # 3.b of the document actually says "If the number is greater than the member's probability..." # I'm going to use "less than", to make sense. The bigger the probability, the more likely the statement to be true if get_random_number() < member.get_recruit_probability(): candidate = Investor(self.db_controller.get_random_investor()) self.logger.log( 'Member {} will try to recruit investor {}'.format( member.id, candidate.id)) # Same problem with 3.c of the document if get_random_number() < candidate.get_accept_probability(): self.logger.log( 'Investor {} will join the program invited by member {}' .format(candidate.id, member.id)) member.money += 100 self.db_controller.add_member(candidate.id, member.id, self.current_week) else: self.logger.log( 'Investor {} will not join the program'.format( candidate.id)) else: self.logger.log( 'Member {} will not recruit a new investor'.format( member.id)) lasted_weeks = self.current_week - member.week_joined if (member.money < 500) & (lasted_weeks >= member.get_max_weeks()): self.logger.log( 'Member {} did not recover the investment in {} weeks and will be eliminated from the program with MM${}.' .format(member.id, lasted_weeks, member.money)) self.db_controller.eliminate_member(member.id, self.current_week)