def test_fit_charge_to_fully_bound_charge(self): fit = Fit() fit_other = Fit() module = ModuleHigh(self.mktype().id, state=State.active, charge=None) charge = Charge(self.mktype().id) module_other = ModuleHigh(self.mktype().id, state=State.active, charge=None) charge_other = Charge(self.mktype().id) fit.modules.high.append(module) fit_other.modules.high.append(module_other) module.charge = charge module_other.charge = charge_other # Action with self.assertRaises(ValueError): module.charge = charge_other # Verification self.assertIs(module.charge, charge) self.assertIs(module_other.charge, charge_other) # Cleanup self.assert_item_buffers_empty(module) self.assert_item_buffers_empty(charge) self.assert_item_buffers_empty(module_other) self.assert_item_buffers_empty(charge_other) self.assert_solsys_buffers_empty(fit.solar_system) self.assert_solsys_buffers_empty(fit_other.solar_system) self.assert_log_entries(0)
def test_arguments_custom_filter(self): item1 = ModuleHigh( self.mktype( group_id=55, attrs={ AttrId.dmg_mult: 2, AttrId.capacity: 1, AttrId.charge_rate: 1, self.cycle_attr.id: 2500, AttrId.reload_time: 2000}, effects=[self.dd_effect], default_effect=self.dd_effect).id, state=State.active) item1.charge = Charge(self.mktype(attrs={ AttrId.em_dmg: 1.2, AttrId.therm_dmg: 2.4, AttrId.kin_dmg: 4.8, AttrId.expl_dmg: 9.6, AttrId.volume: 1}).id) self.fit.modules.high.append(item1) item2 = ModuleHigh( self.mktype( group_id=54, attrs={ AttrId.dmg_mult: 2, AttrId.capacity: 1, AttrId.charge_rate: 1, self.cycle_attr.id: 2000, AttrId.reload_time: 2000}, effects=[self.dd_effect], default_effect=self.dd_effect).id, state=State.active) item2.charge = Charge(self.mktype(attrs={ AttrId.em_dmg: 12, AttrId.therm_dmg: 24, AttrId.kin_dmg: 48, AttrId.expl_dmg: 96, AttrId.volume: 1}).id) self.fit.modules.high.append(item2) # Action stats_dps = self.fit.stats.get_dps( item_filter=lambda i: i._type.group_id == 55) # Verification self.assertAlmostEqual(stats_dps.em, 0.96) self.assertAlmostEqual(stats_dps.thermal, 1.92) self.assertAlmostEqual(stats_dps.kinetic, 3.84) self.assertAlmostEqual(stats_dps.explosive, 7.68) self.assertAlmostEqual(stats_dps.total, 14.4) # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)
def test_arguments_custom_filter(self): item1 = ModuleHigh(self.mktype(group_id=55, attrs={ AttrId.capacity: 2.0, AttrId.charge_rate: 1.0, AttrId.dmg_mult: 2 }, effects=[self.dd_effect], default_effect=self.dd_effect).id, state=State.active) item1.charge = Charge( self.mktype( attrs={ AttrId.volume: 1.0, AttrId.em_dmg: 1.2, AttrId.therm_dmg: 2.4, AttrId.kin_dmg: 4.8, AttrId.expl_dmg: 9.6 }).id) self.fit.modules.high.append(item1) item2 = ModuleHigh(self.mktype(group_id=54, attrs={ AttrId.capacity: 2.0, AttrId.charge_rate: 1.0, AttrId.dmg_mult: 2 }, effects=[self.dd_effect], default_effect=self.dd_effect).id, state=State.active) item2.charge = Charge( self.mktype( attrs={ AttrId.volume: 1.0, AttrId.em_dmg: 12, AttrId.therm_dmg: 24, AttrId.kin_dmg: 48, AttrId.expl_dmg: 96 }).id) self.fit.modules.high.append(item2) # Action stats_volley = self.fit.stats.get_volley( item_filter=lambda i: i._type.group_id == 55) # Verification self.assertAlmostEqual(stats_volley.em, 2.4) self.assertAlmostEqual(stats_volley.thermal, 4.8) self.assertAlmostEqual(stats_volley.kinetic, 9.6) self.assertAlmostEqual(stats_volley.explosive, 19.2) self.assertAlmostEqual(stats_volley.total, 36) # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)
def test_detached_module_charge_to_free_charge(self): module = ModuleHigh(self.mktype().id, state=State.active, charge=None) charge_type = self.mktype() charge1 = Charge(charge_type.id) charge2 = Charge(charge_type.id) module.charge = charge1 # Action module.charge = charge2 # Verification self.assertIs(module.charge, charge2) # Cleanup self.assert_item_buffers_empty(module) self.assert_item_buffers_empty(charge1) self.assert_item_buffers_empty(charge2) self.assert_log_entries(0)
def test_multiple(self): item1 = ModuleHigh(self.mktype(attrs={ AttrId.capacity: 2.0, AttrId.charge_rate: 1.0, AttrId.dmg_mult: 2 }, effects=[self.dd_effect], default_effect=self.dd_effect).id, state=State.active) item1.charge = Charge( self.mktype( attrs={ AttrId.volume: 1.0, AttrId.em_dmg: 1.2, AttrId.therm_dmg: 2.4, AttrId.kin_dmg: 4.8, AttrId.expl_dmg: 9.6 }).id) self.fit.modules.high.append(item1) item2 = ModuleHigh(self.mktype(attrs={ AttrId.capacity: 2.0, AttrId.charge_rate: 1.0, AttrId.dmg_mult: 2 }, effects=[self.dd_effect], default_effect=self.dd_effect).id, state=State.active) item2.charge = Charge( self.mktype( attrs={ AttrId.volume: 1.0, AttrId.em_dmg: 12, AttrId.therm_dmg: 24, AttrId.kin_dmg: 48, AttrId.expl_dmg: 96 }).id) self.fit.modules.high.append(item2) # Action stats_volley = self.fit.stats.get_volley() # Verification self.assertAlmostEqual(stats_volley.em, 26.4) self.assertAlmostEqual(stats_volley.thermal, 52.8) self.assertAlmostEqual(stats_volley.kinetic, 105.6) self.assertAlmostEqual(stats_volley.explosive, 211.2) self.assertAlmostEqual(stats_volley.total, 396) # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)
def test_cycles_until_reload_none(self): fit = Fit() item = ModuleHigh(self.mktype(attrs={ AttrId.capacity: 2.0, self.cycle_attr.id: 2000, AttrId.charge_rate: 1.0, AttrId.reload_time: 10000 }, effects=[self.effect_item], default_effect=self.effect_item).id, state=State.active) item.charge = Charge( self.mktype(attrs={ AttrId.volume: 2.1, AttrId.em_dmg: 5.2, AttrId.therm_dmg: 6.3, AttrId.kin_dmg: 7.4, AttrId.expl_dmg: 8.5 }, effects=[self.effect_charge], default_effect=self.effect_charge).id) fit.modules.high.append(item) # Verification volley = item.get_volley() self.assertAlmostEqual(volley.em, 0) self.assertAlmostEqual(volley.thermal, 0) self.assertAlmostEqual(volley.kinetic, 0) self.assertAlmostEqual(volley.explosive, 0) self.assertAlmostEqual(volley.total, 0) # Cleanup self.assert_solsys_buffers_empty(fit.solar_system) self.assert_log_entries(0)
def test_arguments_custom_reload(self): item = ModuleHigh( self.mktype( attrs={ AttrId.dmg_mult: 2, AttrId.capacity: 1, AttrId.charge_rate: 1, self.cycle_attr.id: 3000, AttrId.reload_time: 2000}, effects=[self.dd_effect], default_effect=self.dd_effect).id, state=State.active) item.charge = Charge(self.mktype(attrs={ AttrId.em_dmg: 1.2, AttrId.therm_dmg: 2.4, AttrId.kin_dmg: 4.8, AttrId.expl_dmg: 9.6, AttrId.volume: 1}).id) self.fit.modules.high.append(item) # Action stats_dps = self.fit.stats.get_dps(reload=True) # Verification self.assertAlmostEqual(stats_dps.em, 0.48) self.assertAlmostEqual(stats_dps.thermal, 0.96) self.assertAlmostEqual(stats_dps.kinetic, 1.92) self.assertAlmostEqual(stats_dps.explosive, 3.84) self.assertAlmostEqual(stats_dps.total, 7.2) # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)
def test_reload(self): fit = Fit() item = ModuleHigh(self.mktype(attrs={ AttrId.dmg_mult: 2.5, AttrId.capacity: 0.2, self.cycle_attr.id: 500, AttrId.reload_time: 5000 }, effects=[self.effect], default_effect=self.effect).id, state=State.active) item.charge = Charge( self.mktype( attrs={ AttrId.volume: 0.1, AttrId.hp: 2.0, AttrId.crystals_get_damaged: 1.0, AttrId.crystal_volatility_dmg: 0.8, AttrId.crystal_volatility_chance: 0.5, AttrId.em_dmg: 5.2, AttrId.therm_dmg: 6.3, AttrId.kin_dmg: 7.4, AttrId.expl_dmg: 8.5 }).id) fit.modules.high.append(item) # Verification dps = item.get_dps(reload=True) self.assertAlmostEqual(dps.em, 13) self.assertAlmostEqual(dps.thermal, 15.75) self.assertAlmostEqual(dps.kinetic, 18.5) self.assertAlmostEqual(dps.explosive, 21.25) self.assertAlmostEqual(dps.total, 68.5) # Cleanup self.assert_solsys_buffers_empty(fit.solar_system) self.assert_log_entries(0)
def test_charge_attr_em_absent(self): fit = Fit() item = ModuleHigh( self.mktype( attrs={ AttrId.dmg_mult: 2.5, AttrId.capacity: 2.0, self.cycle_attr.id: 500, AttrId.charge_rate: 1.0, AttrId.reload_time: 5000}, effects=[self.effect], default_effect=self.effect).id, state=State.active) item.charge = Charge(self.mktype(attrs={ AttrId.volume: 0.2, AttrId.therm_dmg: 6.3, AttrId.kin_dmg: 7.4, AttrId.expl_dmg: 8.5}).id) fit.modules.high.append(item) # Verification volley = item.get_volley() self.assertAlmostEqual(volley.em, 0) self.assertAlmostEqual(volley.thermal, 15.75) self.assertAlmostEqual(volley.kinetic, 18.5) self.assertAlmostEqual(volley.explosive, 21.25) self.assertAlmostEqual(volley.total, 55.5) # Cleanup self.assert_solsys_buffers_empty(fit.solar_system) self.assert_log_entries(0)
def test_reload(self): fit = Fit() item = ModuleHigh( self.mktype( attrs={ AttrId.capacity: 2.0, self.cycle_attr.id: 2000, AttrId.charge_rate: 1.0, AttrId.reload_time: 10000}, effects=[self.effect_item], default_effect=self.effect_item).id, state=State.active) item.charge = Charge(self.mktype( attrs={ AttrId.volume: 0.1, AttrId.em_dmg: 5.2, AttrId.therm_dmg: 6.3, AttrId.kin_dmg: 7.4, AttrId.expl_dmg: 8.5}, effects=[self.effect_charge], default_effect=self.effect_charge).id) fit.modules.high.append(item) # Verification dps = item.get_dps(reload=True) self.assertAlmostEqual(dps.em, 2.08) self.assertAlmostEqual(dps.thermal, 2.52) self.assertAlmostEqual(dps.kinetic, 2.96) self.assertAlmostEqual(dps.explosive, 3.4) self.assertAlmostEqual(dps.total, 10.96) # Cleanup self.assert_solsys_buffers_empty(fit.solar_system) self.assert_log_entries(0)
def test_effective(self): fit = Fit() item = ModuleHigh(self.mktype(attrs={ AttrId.dmg_mult: 2.5, AttrId.capacity: 2.0, self.cycle_attr.id: 500, AttrId.charge_rate: 1.0, AttrId.reload_time: 5000 }, effects=[self.effect], default_effect=self.effect).id, state=State.active) item.charge = Charge( self.mktype( attrs={ AttrId.volume: 0.2, AttrId.em_dmg: 5.2, AttrId.therm_dmg: 6.3, AttrId.kin_dmg: 7.4, AttrId.expl_dmg: 8.5 }).id) fit.modules.high.append(item) # Verification profile = ResistProfile(0.2, 0.2, 0.8, 1) dps = item.get_dps(tgt_resists=profile) self.assertAlmostEqual(dps.em, 20.8) self.assertAlmostEqual(dps.thermal, 25.2) self.assertAlmostEqual(dps.kinetic, 7.4) self.assertAlmostEqual(dps.explosive, 0) self.assertAlmostEqual(dps.total, 53.4) # Cleanup self.assert_solsys_buffers_empty(fit.solar_system) self.assert_log_entries(0)
def test_reactivation_shorter_than_reload(self): fit = Fit() item = ModuleHigh(self.mktype(attrs={ AttrId.dmg_mult: 2.5, AttrId.capacity: 2.0, self.cycle_attr.id: 500, AttrId.charge_rate: 1.0, AttrId.reload_time: 6500, AttrId.module_reactivation_delay: 1500 }, effects=[self.effect], default_effect=self.effect).id, state=State.active) item.charge = Charge( self.mktype( attrs={ AttrId.volume: 0.2, AttrId.em_dmg: 5.2, AttrId.therm_dmg: 6.3, AttrId.kin_dmg: 7.4, AttrId.expl_dmg: 8.5 }).id) fit.modules.high.append(item) # Verification dps = item.get_dps(reload=True) self.assertAlmostEqual(dps.em, 5.2) self.assertAlmostEqual(dps.thermal, 6.3) self.assertAlmostEqual(dps.kinetic, 7.4) self.assertAlmostEqual(dps.explosive, 8.5) self.assertAlmostEqual(dps.total, 27.4) # Cleanup self.assert_solsys_buffers_empty(fit.solar_system) self.assert_log_entries(0)
def test_charge_attr_expl_zero(self): item = ModuleHigh(self.mktype(attrs={ AttrId.capacity: 2.0, AttrId.charge_rate: 1.0, AttrId.dmg_mult: 2 }, effects=[self.dd_effect], default_effect=self.dd_effect).id, state=State.active) item.charge = Charge( self.mktype(attrs={ AttrId.volume: 1.0, AttrId.expl_dmg: 0 }).id) self.fit.modules.high.append(item) # Action stats_volley = self.fit.stats.get_volley() # Verification self.assertAlmostEqual(stats_volley.em, 0) self.assertAlmostEqual(stats_volley.thermal, 0) self.assertAlmostEqual(stats_volley.kinetic, 0) self.assertAlmostEqual(stats_volley.explosive, 0) self.assertAlmostEqual(stats_volley.total, 0) # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)
def test_round_down(self): fit = Fit() item = ModuleHigh(self.mktype(attrs={ AttrId.capacity: 1.0 }, effects=[self.effect], default_effect=self.effect).id, state=State.active) item.charge = Charge( self.mktype( attrs={ AttrId.volume: 1.0, AttrId.crystals_get_damaged: 1.0, AttrId.hp: 1.0, AttrId.crystal_volatility_chance: 0.1, AttrId.crystal_volatility_dmg: 0.01, AttrId.em_dmg: 1.0, AttrId.therm_dmg: 1.0, AttrId.kin_dmg: 1.0, AttrId.expl_dmg: 1.0 }).id) fit.modules.high.append(item) # Verification self.assertEqual(item.cycles_until_reload, 1000) # Cleanup self.assert_solsys_buffers_empty(fit.solar_system) self.assert_log_entries(0)
def test_arguments_custom_profile(self): item = ModuleHigh(self.mktype(attrs={ AttrId.capacity: 2.0, AttrId.charge_rate: 1.0, AttrId.dmg_mult: 2 }, effects=[self.dd_effect], default_effect=self.dd_effect).id, state=State.active) item.charge = Charge( self.mktype( attrs={ AttrId.volume: 1.0, AttrId.em_dmg: 1.2, AttrId.therm_dmg: 2.4, AttrId.kin_dmg: 4.8, AttrId.expl_dmg: 9.6 }).id) self.fit.modules.high.append(item) # Action resists = ResistProfile(0, 1, 1, 1) stats_volley = self.fit.stats.get_volley(tgt_resists=resists) # Verification self.assertAlmostEqual(stats_volley.em, 2.4) self.assertAlmostEqual(stats_volley.thermal, 0) self.assertAlmostEqual(stats_volley.kinetic, 0) self.assertAlmostEqual(stats_volley.explosive, 0) self.assertAlmostEqual(stats_volley.total, 2.4) # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)
def test_charge_attr_kin_zero(self): item = ModuleHigh( self.mktype( attrs={ AttrId.dmg_mult: 2, AttrId.capacity: 1, AttrId.charge_rate: 1, self.cycle_attr.id: 2500, AttrId.reload_time: 2000}, effects=[self.dd_effect], default_effect=self.dd_effect).id, state=State.active) item.charge = Charge(self.mktype( attrs={AttrId.kin_dmg: 0, AttrId.volume: 1}).id) self.fit.modules.high.append(item) # Action stats_dps = self.fit.stats.get_dps() # Verification self.assertAlmostEqual(stats_dps.em, 0) self.assertAlmostEqual(stats_dps.thermal, 0) self.assertAlmostEqual(stats_dps.kinetic, 0) self.assertAlmostEqual(stats_dps.explosive, 0) self.assertAlmostEqual(stats_dps.total, 0) # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)
def test_source_to_none(self): tgt_attr = self.mkattr() src_attr = self.mkattr() modifier_container = self.make_modifier(src_attr.id, tgt_attr.id) effect_container = self.mkeffect(category_id=EffectCategoryId.passive, modifiers=[modifier_container]) container = ModuleHigh( self.mktype(attrs={ src_attr.id: 20, tgt_attr.id: 100 }, effects=[effect_container]).id) modifier_charge = self.make_modifier(src_attr.id, tgt_attr.id) effect_charge = self.mkeffect(category_id=EffectCategoryId.passive, modifiers=[modifier_charge]) charge = Charge( self.mktype(attrs={ src_attr.id: 40, tgt_attr.id: 50 }, effects=[effect_charge]).id) self.fit.modules.high.append(container) container.charge = charge self.assertAlmostEqual(container.attrs[tgt_attr.id], 140) self.assertAlmostEqual(charge.attrs[tgt_attr.id], 60) # Action self.fit.solar_system.source = None # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)
def test_charge_not_loaded(self): src_attr = self.mkattr() modifier = self.mkmod(affectee_filter=ModAffecteeFilter.item, affectee_domain=ModDomain.self, affectee_attr_id=AttrId.dmg_mult, operator=ModOperator.post_mul, affector_attr_id=src_attr.id) effect = self.mkeffect(category_id=EffectCategoryId.passive, modifiers=[modifier]) item = ModuleHigh(self.mktype(attrs={ AttrId.capacity: 2.0, AttrId.charge_rate: 1.0, AttrId.dmg_mult: 2, src_attr.id: 1.5 }, effects=(self.dd_effect, effect), default_effect=self.dd_effect).id, state=State.active) item.charge = Charge(self.allocate_type_id()) self.fit.modules.high.append(item) # Action stats_volley = self.fit.stats.get_volley() # Verification self.assertAlmostEqual(stats_volley.em, 0) self.assertAlmostEqual(stats_volley.thermal, 0) self.assertAlmostEqual(stats_volley.kinetic, 0) self.assertAlmostEqual(stats_volley.explosive, 0) self.assertAlmostEqual(stats_volley.total, 0) # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)
def test_charge_attr_em_absent(self): fit = Fit() item = ModuleHigh(self.mktype(attrs={ AttrId.capacity: 60.0, self.cycle_attr.id: 5000, AttrId.charge_rate: 1.0, AttrId.reload_time: 10000, AttrId.module_reactivation_delay: 120000 }, effects=[self.effect_item], default_effect=self.effect_item).id, state=State.active) item.charge = Charge( self.mktype(attrs={ AttrId.volume: 30.0, AttrId.therm_dmg: 6300, AttrId.kin_dmg: 7400, AttrId.expl_dmg: 8500 }, effects=[self.effect_charge], default_effect=self.effect_charge).id) fit.modules.high.append(item) # Verification volley = item.get_volley() self.assertAlmostEqual(volley.em, 0) self.assertAlmostEqual(volley.thermal, 6300) self.assertAlmostEqual(volley.kinetic, 7400) self.assertAlmostEqual(volley.explosive, 8500) self.assertAlmostEqual(volley.total, 22200) # Cleanup self.assert_solsys_buffers_empty(fit.solar_system) self.assert_log_entries(0)
def test_pass_autocharge_with_charge(self): charge = Charge(self.mktype(attrs={AttrId.volume: 2}).id) autocharge_type = self.mktype(attrs={AttrId.volume: 2}) container_effect = self.mkeffect( effect_id=EffectId.target_attack, category_id=EffectCategoryId.target) container = ModuleHigh( self.mktype( attrs={ AttrId.capacity: 2, AttrId.ammo_loaded: autocharge_type.id}, effects=[container_effect]).id, state=State.offline) container.charge = charge self.fit.modules.high.append(container) self.assertIn(container_effect.id, container.autocharges) autocharge = container.autocharges[container_effect.id] # Action error1 = self.get_error(container, Restriction.charge_volume) # Verification self.assertIsNone(error1) # Action error2 = self.get_error(charge, Restriction.charge_volume) # Verification self.assertIsNone(error2) # Action error3 = self.get_error(autocharge, Restriction.charge_volume) # Verification self.assertIsNone(error3) # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)
def test_effective_attr_single_expl_zero(self): fit = Fit() item = ModuleHigh(self.mktype(attrs={ AttrId.dmg_mult: 2.5, AttrId.capacity: 2.0, self.cycle_attr.id: 500, AttrId.charge_rate: 1.0, AttrId.reload_time: 5000 }, effects=[self.effect], default_effect=self.effect).id, state=State.active) item.charge = Charge( self.mktype(attrs={ AttrId.volume: 0.2, AttrId.expl_dmg: 0 }).id) fit.modules.high.append(item) # Verification profile = ResistProfile(0.2, 0.2, 0.8, 1) volley = item.get_volley(tgt_resists=profile) self.assertAlmostEqual(volley.em, 0) self.assertAlmostEqual(volley.thermal, 0) self.assertAlmostEqual(volley.kinetic, 0) self.assertAlmostEqual(volley.explosive, 0) self.assertAlmostEqual(volley.total, 0) # Cleanup self.assert_solsys_buffers_empty(fit.solar_system) self.assert_log_entries(0)
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_charge_not_loaded(self): fit = Fit() item = ModuleHigh( self.mktype( attrs={ AttrId.dmg_mult: 2.5, AttrId.capacity: 2.0, self.cycle_attr.id: 500, AttrId.charge_rate: 1.0, AttrId.reload_time: 5000}, effects=[self.effect], default_effect=self.effect).id, state=State.active) item.charge = Charge(self.allocate_type_id()) fit.modules.high.append(item) # Verification volley = item.get_volley() self.assertAlmostEqual(volley.em, 0) self.assertAlmostEqual(volley.thermal, 0) self.assertAlmostEqual(volley.kinetic, 0) self.assertAlmostEqual(volley.explosive, 0) self.assertAlmostEqual(volley.total, 0) # Cleanup self.assert_solsys_buffers_empty(fit.solar_system) self.assert_log_entries(0)
def test_no_influence_from_charge(self): # Charge shouldn't be able to affect autocharge autocharge_type = self.mktype(attrs={self.tgt_attr.id: 10}) charge_modifier = self.mkmod_filter_item(ModDomain.other) charge_effect = self.mkeffect(category_id=EffectCategoryId.passive, modifiers=[charge_modifier]) charge = Charge( self.mktype(attrs={ self.src_attr.id: 50 }, effects=[charge_effect]).id) container_effect = self.mkeffect(effect_id=EffectId.target_attack, category_id=EffectCategoryId.target) container = ModuleHigh(self.mktype(attrs={ self.autocharge_attr_id: autocharge_type.id }, effects=[container_effect]).id, charge=charge, state=State.active) # Action self.fit.modules.high.append(container) # Verification self.assertIn(container_effect.id, container.autocharges) autocharge = container.autocharges[container_effect.id] self.assertAlmostEqual(autocharge.attrs[self.tgt_attr.id], 10) # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)
def test_reload(self): fit = Fit() item = ModuleHigh(self.mktype(attrs={ AttrId.capacity: 60.0, self.cycle_attr.id: 5000, AttrId.charge_rate: 1.0, AttrId.reload_time: 10000, AttrId.module_reactivation_delay: 120000 }, effects=[self.effect_item], default_effect=self.effect_item).id, state=State.active) item.charge = Charge( self.mktype(attrs={ AttrId.volume: 30.0, AttrId.em_dmg: 5200, AttrId.therm_dmg: 6300, AttrId.kin_dmg: 7400, AttrId.expl_dmg: 8500 }, effects=[self.effect_charge], default_effect=self.effect_charge).id) fit.modules.high.append(item) # Verification dps = item.get_dps(reload=True) # Reload doesn't affect DPS because reactivation time is higher, item # manages to reload during that time self.assertAlmostEqual(dps.em, 41.6) self.assertAlmostEqual(dps.thermal, 50.4) self.assertAlmostEqual(dps.kinetic, 59.2) self.assertAlmostEqual(dps.explosive, 68) self.assertAlmostEqual(dps.total, 219.2) # Cleanup self.assert_solsys_buffers_empty(fit.solar_system) self.assert_log_entries(0)
def setUp(self): StatsTestCase.setUp(self) self.mkattr(attr_id=AttrId.em_dmg) self.mkattr(attr_id=AttrId.therm_dmg) self.mkattr(attr_id=AttrId.kin_dmg) self.mkattr(attr_id=AttrId.expl_dmg) self.mkattr(attr_id=AttrId.dmg_mult) self.mkattr(attr_id=AttrId.volume) self.mkattr(attr_id=AttrId.capacity) self.mkattr(attr_id=AttrId.reload_time) self.mkattr(attr_id=AttrId.charge_rate) self.mkattr(attr_id=AttrId.fighter_ability_kamikaze_dmg_em) self.mkattr(attr_id=AttrId.fighter_ability_kamikaze_dmg_therm) self.mkattr(attr_id=AttrId.fighter_ability_kamikaze_dmg_kin) self.mkattr(attr_id=AttrId.fighter_ability_kamikaze_dmg_expl) cycle_attr = self.mkattr() effect_dd = self.mkeffect(effect_id=EffectId.projectile_fired, category_id=EffectCategoryId.active, duration_attr_id=cycle_attr.id) effect_suppressor = self.mkeffect( effect_id=EffectId.fighter_ability_kamikaze, category_id=EffectCategoryId.target, duration_attr_id=cycle_attr.id) item_dd = ModuleHigh(self.mktype(attrs={ AttrId.dmg_mult: 2, AttrId.capacity: 1, AttrId.charge_rate: 1, cycle_attr.id: 2500, AttrId.reload_time: 2000 }, effects=[effect_dd], default_effect=effect_dd).id, state=State.active) item_dd.charge = Charge( self.mktype( attrs={ AttrId.volume: 1.0, AttrId.em_dmg: 1.2, AttrId.therm_dmg: 2.4, AttrId.kin_dmg: 4.8, AttrId.expl_dmg: 9.6 }).id) self.item_suppressor = FighterSquad(self.mktype( attrs={ AttrId.fighter_ability_kamikaze_dmg_em: 50000, AttrId.fighter_ability_kamikaze_dmg_therm: 50000, AttrId.fighter_ability_kamikaze_dmg_kin: 50000, AttrId.fighter_ability_kamikaze_dmg_expl: 50000, AttrId.fighter_squadron_max_size: 6, cycle_attr.id: 10000 }, effects=[effect_suppressor], default_effect=effect_suppressor, abilities_data={ FighterAbilityId.kamikaze: AbilityData(0, math.inf) }).id, state=State.active) self.fit.modules.high.append(item_dd) self.fit.fighters.add(self.item_suppressor)
def test_fit_charge_to_free_charge(self): fit = Fit() module = ModuleHigh(self.mktype().id, state=State.active, charge=None) charge1 = Charge(self.mktype().id) charge2 = Charge(self.mktype().id) fit.modules.high.append(module) module.charge = charge1 # Action module.charge = charge2 # Verification self.assertIs(module.charge, charge2) # Cleanup self.assert_item_buffers_empty(module) self.assert_item_buffers_empty(charge1) self.assert_item_buffers_empty(charge2) self.assert_solsys_buffers_empty(fit.solar_system) self.assert_log_entries(0)
def test_none_and_data(self): # As container for damage dealers is not ordered, this test may be # unreliable (even if there's issue, it won't fail each run) item1 = ModuleHigh( self.mktype( attrs={ AttrId.dmg_mult: 2, AttrId.capacity: 1, AttrId.charge_rate: 1, self.cycle_attr.id: 2500, AttrId.reload_time: 2000}, effects=[self.dd_effect], default_effect=self.dd_effect).id, state=State.active) item1.charge = Charge(self.mktype(attrs={ AttrId.em_dmg: 1.2, AttrId.therm_dmg: 2.4, AttrId.kin_dmg: 4.8, AttrId.expl_dmg: 9.6, AttrId.volume: 1}).id) self.fit.modules.high.append(item1) item2 = ModuleHigh( self.mktype( attrs={ AttrId.dmg_mult: 2, AttrId.capacity: 1, AttrId.charge_rate: 1, self.cycle_attr.id: 2000, AttrId.reload_time: 2000}, effects=[self.dd_effect], default_effect=self.dd_effect).id, state=State.active) item2.charge = Charge(self.mktype(attrs={AttrId.volume: 1}).id) self.fit.modules.high.append(item2) # Action stats_dps = self.fit.stats.get_dps() # Verification self.assertAlmostEqual(stats_dps.em, 0.96) self.assertAlmostEqual(stats_dps.thermal, 1.92) self.assertAlmostEqual(stats_dps.kinetic, 3.84) self.assertAlmostEqual(stats_dps.explosive, 7.68) self.assertAlmostEqual(stats_dps.total, 14.4) # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)
def test_detached_module_none_to_free_charge(self): module = ModuleHigh(self.mktype().id, state=State.active, charge=None) charge = Charge(self.mktype().id) # Action module.charge = charge # Verification self.assert_item_buffers_empty(module) self.assert_item_buffers_empty(charge) self.assertIs(module.charge, charge)
def test_charge_skillrq_absent(self): self.mkattr(AttrId.em_dmg) charge = Charge(self.mktype(attrs={AttrId.em_dmg: 100}).id) self.launcher.charge = charge # Verification self.assertAlmostEqual(charge.attrs[AttrId.em_dmg], 100) # Cleanup self.assert_solsys_buffers_empty(self.fit.solar_system) self.assert_log_entries(0)