Esempio n. 1
0
def test_resource_put(resource):
    res1num = resource.number
    res2 = f.Resource("usd", 3)
    resource.put(res2)
    assert resource.number == res1num + 3
    assert res2.number == 0
    assert res2.asset_type == resource.asset_type
Esempio n. 2
0
def test_entity_receive_transfer(trade_entities):
    me, other = trade_entities
    res = f.Resource(
        me.contracts[0].assets[0],
        me.contracts[0].numbers[0],
        allow_negative=False,
    )
    other.receive_transfer(resource=res,
                           reference=me.contracts[0].reference,
                           requesting_entity=me)
    assert (other.resources[me.contracts[0].reference].number ==
            me.contracts[0].numbers[0])
Esempio n. 3
0
def test_entity_request_transfer_insufficient_funds(trade_entities):
    me, other = trade_entities
    res = f.Resource(
        me.contracts[0].assets[1],
        me.contracts[0].numbers[1] - 1,
        allow_negative=False,
    )
    other.resources[me.contracts[0].reference] = res
    with pytest.raises(f.DeniedError, match="must not become negative"):
        other.request_transfer(
            number=me.contracts[0].numbers[1],
            asset_type=me.contracts[0].assets[1],
            reference=me.contracts[0].reference,
            requesting_entity=me,
        )
Esempio n. 4
0
def test_entity_request_transfer_number_higher_than_contract(trade_entities):
    me, other = trade_entities
    res = f.Resource(
        me.contracts[0].assets[1],
        me.contracts[0].numbers[1] + 1,
        allow_negative=False,
    )
    other.resources[me.contracts[0].reference] = res
    with pytest.raises(f.DeniedError, match="only"):
        other.request_transfer(
            number=me.contracts[0].numbers[1] + 1,
            asset_type=me.contracts[0].assets[1],
            reference=me.contracts[0].reference,
            requesting_entity=me,
        )
Esempio n. 5
0
def test_entity_request_transfer(trade_entities):
    me, other = trade_entities
    res = f.Resource(
        me.contracts[0].assets[1],
        me.contracts[0].numbers[1],
        allow_negative=False,
    )
    other.resources[me.contracts[0].reference] = res
    r1 = other.request_transfer(
        number=me.contracts[0].numbers[1] / 2,
        asset_type=me.contracts[0].assets[1],
        reference=me.contracts[0].reference,
        requesting_entity=me,
    )
    r2 = other.request_transfer(
        number=me.contracts[0].numbers[1] / 2,
        asset_type=me.contracts[0].assets[1],
        reference=me.contracts[0].reference,
        requesting_entity=me,
    )
    assert other.resources[me.contracts[0].reference].number == 0
    assert r1.number == me.contracts[0].numbers[1] / 2
    assert r2.number == me.contracts[0].numbers[1] / 2
Esempio n. 6
0
    def perform_increment(self):
        """Performs one time increment of action(s) for an `Individual`"""
        logger.debug(f"{self} performing increment...")
        self.ensure_active()

        if self.age >= 67:
            self.income = 0  # Stop working
            logger.debug(f"{self} retired at age {self.age}")

        if self.world.np_random.uniform(
        ) < self.world.year_fraction * utils.cached_cdf(
                int(self.age / 2) * 2, 85, 10):
            self.die()
            logger.debug(f"{self} died at age {self.age}")
            return

        # Earn salary
        self.resources["cash"].put(
            f.Resource(asset_type="eur", number=self.income))

        try:
            # Spend living expenses (we won't simulate how this money circulates,
            # can throw away the resulting Resource object)
            r = self.resources["cash"].take(self.living_expenses)
            logger.info(f"{self} spending {r}. {self.resources['cash']} left.")
        except f.DeniedError:
            po = self.world.find_entities(PublicOpinion)[0]
            for c in self.find_contracts(type="insurance"):
                po.accuse(c.entities[1], 100)
            logger.info(f"{self} starved at age {self.age}")
            self.die()
            return

        if self.resources["cash"].number < self.living_expenses / 2:
            # Be unhappy and tell the world
            po = self.world.find_entities(PublicOpinion)[0]
            for c in self.find_contracts(type="insurance"):
                po.accuse(c.entities[1], 20)

        logger.info(self.age)
        # DEBUG:
        old_contracts = self.find_contracts(type="insurance")
        if self.age >= 25 and not old_contracts:
            # Try to get some pension insurance
            logger.info("Trying to get insurance...")
            companies = self.world.find_entities(PensionInsuranceCompany)
            po = self.world.find_entities(PublicOpinion)[0]
            best_companies_first = sorted(companies,
                                          key=po.reputation,
                                          reverse=True)
            for c in best_companies_first:
                rep = po.reputation(c)
                logger.info(f"    ...Looking at {c} with reputation {rep}...")
                if self.world.np_random.uniform() < utils.cached_cdf(
                        int(rep / 100) * 100, 0, 100):
                    try:
                        logger.info("        ...suggesting contract...")
                        contract = PensionContract(me=self,
                                                   my_role="insured",
                                                   other=c)
                        # print(f"{self} contracts before: {self.contracts}")
                        c.request_contract(contract)
                        contract.draft = False
                        self.contracts.append(contract)
                        # DEBUG -- REMOVE
                        if len(self.contracts) > 1:
                            raise RuntimeError(
                                f"self.contracts of {self} is greater than 1: {self.contracts}. "
                                f"Somehow had an old contract already: {self.contracts[0]} while I thought it had {old_contracts}"
                            )
                        # print(f"{self} contracts after: {self.contracts}")
                        logger.info("            ...got accepted.")
                        break
                    except f.DeniedError:
                        logger.info("            ...got denied.")
                        pass
                else:
                    logger.info("        ...I don't like it.")
Esempio n. 7
0
 def __init__(self, world: PensionSim):
     super().__init__(world)
     self.resources["cash"] = f.Resource(asset_type="eur", number=20000)
     self._creation_time = world.time
     self.income = 20000 * self.world.year_fraction
     self.living_expenses = 15000 * self.world.year_fraction
Esempio n. 8
0
 def __init__(self, world: PensionSim):
     super().__init__(world)
     self.resources["cash"] = f.Resource(asset_type="eur", number=20000)
     self.running_cost = 2000
Esempio n. 9
0
def resource():
    return f.Resource("usd", 42, True)
Esempio n. 10
0
def test_resource_put_wrong_type(resource):
    res2 = f.Resource("eur", 3)
    with pytest.raises(f.DeniedError):
        resource.put(res2)
Esempio n. 11
0
def test_resource_take_too_much():
    res = f.Resource("usd", 2, allow_negative=False)
    with pytest.raises(f.DeniedError):
        res.take(3)
Esempio n. 12
0
def test_resource_unknown_asset_type():
    with pytest.raises(ValueError):
        f.Resource("saoenthaueosnth", 42)
Esempio n. 13
0
def test_resource():
    f.Resource("usd", 42)