def test_other_domain(self): influence_target = CharacterItem(self.ch.type_(type_id=2, attributes={self.tgt_attr.id: 100})) self.fit.items.add(influence_target) self.assertAlmostEqual(influence_target.attributes[self.tgt_attr.id], 100) self.fit.items.remove(self.influence_source) self.fit.items.remove(influence_target) self.assertEqual(len(self.log), 0) self.assert_link_buffers_empty(self.fit)
def test_character(self): self.fit.character = self.influence_source influence_target = CharacterItem(self.ch.type_(type_id=1, attributes={self.tgt_attr.id: 100})) self.fit.items.add(influence_target) self.assertNotAlmostEqual(influence_target.attributes[self.tgt_attr.id], 100) self.fit.character = None self.assertAlmostEqual(influence_target.attributes[self.tgt_attr.id], 100) self.fit.items.remove(influence_target) self.assertEqual(len(self.log), 0) self.assert_link_buffers_empty(self.fit)
def test_character(self): holder = CharacterItem( self.ch.type_(type_id=1, effects=(self.effect, ), attributes={ self.tgt_attr.id: 100, self.src_attr.id: 20 })) self.fit.items.add(holder) self.assertNotAlmostEqual(holder.attributes[self.tgt_attr.id], 100) self.fit.items.remove(holder) self.assertEqual(len(self.log), 0) self.assert_link_buffers_empty(self.fit)
def test_attribute(self): attr1 = self.ch.attribute(attribute_id=1) attr2 = self.ch.attribute(attribute_id=2) attr3 = self.ch.attribute(attribute_id=3) modifier1 = Modifier() modifier1.state = State.offline modifier1.scope = Scope.local modifier1.src_attr = attr1.id modifier1.operator = Operator.post_mul modifier1.tgt_attr = attr2.id modifier1.domain = Domain.ship modifier1.filter_type = None modifier1.filter_value = None effect1 = self.ch.effect(effect_id=1, category=EffectCategory.passive) effect1.modifiers = (modifier1, ) holder1 = CharacterItem( self.ch.type_(type_id=1, effects=(effect1, ), attributes={attr1.id: 5})) modifier2 = Modifier() modifier2.state = State.offline modifier2.scope = Scope.local modifier2.src_attr = attr2.id modifier2.operator = Operator.post_percent modifier2.tgt_attr = attr3.id modifier2.domain = Domain.ship modifier2.filter_type = FilterType.all_ modifier2.filter_value = None effect2 = self.ch.effect(effect_id=2, category=EffectCategory.passive) effect2.modifiers = (modifier2, ) holder2 = IndependentItem( self.ch.type_(type_id=2, effects=(effect2, ), attributes={attr2.id: 7.5})) holder3 = ShipItem(self.ch.type_(type_id=3, attributes={attr3.id: 0.5})) self.fit.items.add(holder1) self.fit.ship = holder2 self.fit.items.add(holder3) self.assertAlmostEqual(holder3.attributes[attr3.id], 0.6875) holder1.attributes[attr1.id] = 4 # Manually changed attribute must trigger damaging whole chain # of attributes, effectively allowing us to recalculate its new value self.assertAlmostEqual(holder3.attributes[attr3.id], 0.65) self.fit.items.remove(holder1) self.fit.ship = None self.fit.items.remove(holder3) self.assertEqual(len(self.log), 0) self.assert_link_buffers_empty(self.fit)
def test_attribute(self): attr1 = self.ch.attribute(attribute_id=1) attr2 = self.ch.attribute(attribute_id=2) attr3 = self.ch.attribute(attribute_id=3) modifier1 = Modifier() modifier1.state = State.offline modifier1.scope = Scope.local modifier1.src_attr = attr1.id modifier1.operator = Operator.post_mul modifier1.tgt_attr = attr2.id modifier1.domain = Domain.ship modifier1.filter_type = None modifier1.filter_value = None effect1 = self.ch.effect(effect_id=1, category=EffectCategory.passive) effect1.modifiers = (modifier1, ) holder1 = CharacterItem( self.ch.type_(type_id=1, effects=(effect1, ), attributes={attr1.id: 5})) modifier2 = Modifier() modifier2.state = State.offline modifier2.scope = Scope.local modifier2.src_attr = attr2.id modifier2.operator = Operator.post_percent modifier2.tgt_attr = attr3.id modifier2.domain = Domain.ship modifier2.filter_type = FilterType.all_ modifier2.filter_value = None effect2 = self.ch.effect(effect_id=2, category=EffectCategory.passive) effect2.modifiers = (modifier2, ) holder2 = IndependentItem( self.ch.type_(type_id=2, effects=(effect2, ), attributes={attr2.id: 7.5})) holder3 = ShipItem(self.ch.type_(type_id=3, attributes={attr3.id: 0.5})) self.fit.items.add(holder1) self.fit.ship = holder2 self.fit.items.add(holder3) self.assertAlmostEqual(holder3.attributes[attr3.id], 0.6875) self.fit.items.remove(holder1) # When holder1 is removed, attr2 of holder2 and attr3 of holder3 # must be cleaned to allow recalculation of attr3 based on new data self.assertAlmostEqual(holder3.attributes[attr3.id], 0.5375) self.fit.ship = None self.fit.items.remove(holder3) self.assertEqual(len(self.log), 0) self.assert_link_buffers_empty(self.fit)
def test_other(self): # Here we check that self-reference modifies only carrier-item, # and nothing else is affected. We position item as character and # check character item to also check that items 'belonging' to self # are not affected too influence_source = IndependentItem( self.ch.type_(type_id=1, effects=(self.effect, ), attributes={ self.tgt_attr.id: 100, self.src_attr.id: 20 })) self.fit.character = influence_source influence_target = CharacterItem( self.ch.type_(type_id=2, attributes={self.tgt_attr.id: 100})) self.fit.items.add(influence_target) self.assertAlmostEqual(influence_target.attributes[self.tgt_attr.id], 100) self.fit.character = None self.fit.items.remove(influence_target) self.assertEqual(len(self.log), 0) self.assert_link_buffers_empty(self.fit)
def test_calculation(self): attr1 = self.ch.attribute(attribute_id=1) attr2 = self.ch.attribute(attribute_id=2) attr3 = self.ch.attribute(attribute_id=3) attr4 = self.ch.attribute(attribute_id=4) modifier1 = Modifier() modifier1.state = State.offline modifier1.scope = Scope.local modifier1.src_attr = attr1.id modifier1.operator = Operator.post_mul modifier1.tgt_attr = attr2.id modifier1.domain = Domain.self_ modifier1.filter_type = None modifier1.filter_value = None effect1 = self.ch.effect(effect_id=1, category=EffectCategory.passive) effect1.modifiers = (modifier1, ) modifier2 = Modifier() modifier2.state = State.offline modifier2.scope = Scope.local modifier2.src_attr = attr2.id modifier2.operator = Operator.post_percent modifier2.tgt_attr = attr3.id modifier2.domain = Domain.ship modifier2.filter_type = None modifier2.filter_value = None effect2 = self.ch.effect(effect_id=2, category=EffectCategory.passive) effect2.modifiers = (modifier2, ) holder1 = CharacterItem( self.ch.type_(type_id=1, effects=(effect1, effect2), attributes={ attr1.id: 5, attr2.id: 20 })) modifier3 = Modifier() modifier3.state = State.offline modifier3.scope = Scope.local modifier3.src_attr = attr3.id modifier3.operator = Operator.post_percent modifier3.tgt_attr = attr4.id modifier3.domain = Domain.ship modifier3.filter_type = FilterType.all_ modifier3.filter_value = None effect3 = self.ch.effect(effect_id=3, category=EffectCategory.passive) effect3.modifiers = (modifier3, ) holder2 = IndependentItem( self.ch.type_(type_id=2, effects=(effect3, ), attributes={attr3.id: 150})) holder3 = ShipItem( self.ch.type_(type_id=3, attributes={attr4.id: 12.5})) self.fit.items.add(holder1) self.fit.ship = holder2 self.fit.items.add(holder3) # If everything is processed properly, holder1 will multiply attr2 by attr1 # on self, resulting in 20 * 5 = 100, then apply it as percentage modifier # on ship's (holder2) attr3, resulting in 150 + 100% = 300, then it is applied # to all entities assigned to ship, including holder3, to theirs attr4 as # percentage modifier again - so final result is 12.5 + 300% = 50 self.assertAlmostEqual(holder3.attributes[attr4.id], 50) self.fit.items.remove(holder1) self.fit.ship = None self.fit.items.remove(holder3) self.assertEqual(len(self.log), 0) self.assert_link_buffers_empty(self.fit)