def test_rep_amount_recalc_aar_attr_mult_changed(self):
     multmod_src_attr = self.mkattr()
     multmod_mod = self.mkmod(
         affectee_filter=ModAffecteeFilter.domain,
         affectee_domain=ModDomain.ship,
         affectee_attr_id=AttrId.charged_armor_dmg_mult,
         operator=ModOperator.post_percent,
         affector_attr_id=multmod_src_attr.id)
     multmod_effect = self.mkeffect(
         category_id=EffectCategoryId.passive,
         modifiers=[multmod_mod])
     multmod = ModuleLow(self.mktype(
         attrs={multmod_src_attr.id: 50},
         effects=[multmod_effect]).id)
     effect = self.mkeffect(
         effect_id=EffectId.fueled_armor_repair,
         category_id=EffectCategoryId.active)
     aar = ModuleLow(
         self.mktype(
             attrs={
                 AttrId.armor_dmg_amount: 50,
                 AttrId.charged_armor_dmg_mult: 3},
             effects=[effect],
             default_effect=effect).id,
         state=State.active)
     aar.charge = Charge(self.mktype(type_id=TypeId.nanite_repair_paste).id)
     self.fit.modules.low.append(aar)
     self.assertAlmostEqual(aar.attrs[AttrId.armor_dmg_amount], 150)
     # Action
     self.fit.modules.low.append(multmod)
     # Verification
     self.assertAlmostEqual(aar.attrs[AttrId.armor_dmg_amount], 225)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
 def test_rep_amount_recalc_charge_to_charge_absent(self):
     effect = self.mkeffect(
         effect_id=EffectId.fueled_armor_repair,
         category_id=EffectCategoryId.active)
     aar = ModuleLow(
         self.mktype(
             attrs={
                 AttrId.armor_dmg_amount: 50,
                 AttrId.charged_armor_dmg_mult: 3},
             effects=[effect],
             default_effect=effect).id,
         state=State.active)
     aar.charge = Charge(self.mktype(type_id=TypeId.nanite_repair_paste).id)
     self.fit.modules.low.append(aar)
     self.assertAlmostEqual(aar.attrs[AttrId.armor_dmg_amount], 150)
     # Action
     aar.charge = None
     # Verification
     self.assertAlmostEqual(aar.attrs[AttrId.armor_dmg_amount], 50)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
 def test_rep_amount_aar_attr_rep_amount_absent(self):
     effect = self.mkeffect(
         effect_id=EffectId.fueled_armor_repair,
         category_id=EffectCategoryId.active)
     aar = ModuleLow(
         self.mktype(
             attrs={AttrId.charged_armor_dmg_mult: 3},
             effects=[effect],
             default_effect=effect).id,
         state=State.active)
     aar.charge = Charge(self.mktype(type_id=TypeId.nanite_repair_paste).id)
     self.fit.modules.low.append(aar)
     # Verification
     with self.assertRaises(KeyError):
         aar.attrs[AttrId.armor_dmg_amount]
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
 def test_remote_aar(self):
     effect = self.mkeffect(
         effect_id=EffectId.ship_module_ancillary_remote_armor_repairer,
         category_id=EffectCategoryId.target)
     raar = ModuleLow(
         self.mktype(
             attrs={
                 AttrId.armor_dmg_amount: 50,
                 AttrId.charged_armor_dmg_mult: 3},
             effects=[effect],
             default_effect=effect).id,
         state=State.active)
     raar.charge = Charge(self.mktype(type_id=TypeId.nanite_repair_paste).id)
     self.fit.modules.low.append(raar)
     # Verification
     self.assertAlmostEqual(raar.attrs[AttrId.armor_dmg_amount], 150)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
 def test_rep_amount_state(self):
     # Multiplier should be applied even when module is offline
     effect = self.mkeffect(
         effect_id=EffectId.fueled_armor_repair,
         category_id=EffectCategoryId.active)
     aar = ModuleLow(
         self.mktype(
             attrs={
                 AttrId.armor_dmg_amount: 50,
                 AttrId.charged_armor_dmg_mult: 3},
             effects=[effect],
             default_effect=effect).id,
         state=State.offline)
     aar.charge = Charge(self.mktype(type_id=TypeId.nanite_repair_paste).id)
     self.fit.modules.low.append(aar)
     # Verification
     self.assertAlmostEqual(aar.attrs[AttrId.armor_dmg_amount], 150)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
 def test_rep_amount_stacking(self):
     # Multiplier shouldn't be stacking penalized against any other
     # multiplicative modifications
     multmod_src_attr_mul = self.mkattr()
     multmod_src_attr_div = self.mkattr()
     multmod_src_attr_perc = self.mkattr()
     multmod_mod_premul = self.mkmod(
         affectee_filter=ModAffecteeFilter.domain,
         affectee_domain=ModDomain.ship,
         affectee_attr_id=AttrId.armor_dmg_amount,
         operator=ModOperator.pre_mul,
         affector_attr_id=multmod_src_attr_mul.id)
     multmod_mod_prediv = self.mkmod(
         affectee_filter=ModAffecteeFilter.domain,
         affectee_domain=ModDomain.ship,
         affectee_attr_id=AttrId.armor_dmg_amount,
         operator=ModOperator.pre_div,
         affector_attr_id=multmod_src_attr_div.id)
     multmod_mod_postmul = self.mkmod(
         affectee_filter=ModAffecteeFilter.domain,
         affectee_domain=ModDomain.ship,
         affectee_attr_id=AttrId.armor_dmg_amount,
         operator=ModOperator.post_mul,
         affector_attr_id=multmod_src_attr_mul.id)
     multmod_mod_postdiv = self.mkmod(
         affectee_filter=ModAffecteeFilter.domain,
         affectee_domain=ModDomain.ship,
         affectee_attr_id=AttrId.armor_dmg_amount,
         operator=ModOperator.post_div,
         affector_attr_id=multmod_src_attr_div.id)
     multmod_mod_postperc = self.mkmod(
         affectee_filter=ModAffecteeFilter.domain,
         affectee_domain=ModDomain.ship,
         affectee_attr_id=AttrId.armor_dmg_amount,
         operator=ModOperator.post_percent,
         affector_attr_id=multmod_src_attr_perc.id)
     multmod_effect = self.mkeffect(
         category_id=EffectCategoryId.passive,
         modifiers=[
             multmod_mod_premul,
             multmod_mod_prediv,
             multmod_mod_postmul,
             multmod_mod_postdiv,
             multmod_mod_postperc])
     multmod = ModuleLow(self.mktype(
         attrs={
             multmod_src_attr_mul.id: 2,
             multmod_src_attr_div.id: 0.5,
             multmod_src_attr_perc.id: 100},
         effects=[multmod_effect]).id)
     effect = self.mkeffect(
         effect_id=EffectId.fueled_armor_repair,
         category_id=EffectCategoryId.active)
     aar = ModuleLow(
         self.mktype(
             attrs={
                 AttrId.armor_dmg_amount: 50,
                 AttrId.charged_armor_dmg_mult: 3},
             effects=[effect],
             default_effect=effect).id,
         state=State.active)
     aar.charge = Charge(self.mktype(type_id=TypeId.nanite_repair_paste).id)
     self.fit.modules.low.append(aar)
     self.fit.modules.low.append(multmod)
     # Verification
     # If paste multiplier is not stacking penalized against any mods, final
     # result will be 50 * 3 * 2 ^ 5
     self.assertAlmostEqual(aar.attrs[AttrId.armor_dmg_amount], 4800)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)