Пример #1
0
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)
Пример #2
0
 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)