Beispiel #1
0
 def test_switch_item(self):
     # Here we create 2 separate fits with ships; each ship affects module
     # with different strength. When we pass module from one fit to another,
     # its internal attribute storage should be cleared. If it wasn't
     # cleared, we wouldn't be able to get refreshed value of attribute
     # Setup
     src_attr_id = self.allocate_attr_id('src1', 'src2')
     self.mkattr(src='src1', attr_id=src_attr_id)
     self.mkattr(src='src2', attr_id=src_attr_id)
     tgt_attr_id = self.allocate_attr_id('src1', 'src2')
     self.mkattr(src='src1', attr_id=tgt_attr_id)
     self.mkattr(src='src2', attr_id=tgt_attr_id)
     modifier = self.mkmod(affectee_filter=ModAffecteeFilter.domain,
                           affectee_domain=ModDomain.ship,
                           affectee_attr_id=tgt_attr_id,
                           operator=ModOperator.post_percent,
                           affector_attr_id=src_attr_id)
     effect_id = self.allocate_effect_id('src1', 'src2')
     effect_src1 = self.mkeffect(src='src1',
                                 effect_id=effect_id,
                                 category_id=EffectCategoryId.passive,
                                 modifiers=[modifier])
     effect_src2 = self.mkeffect(src='src2',
                                 effect_id=effect_id,
                                 category_id=EffectCategoryId.passive,
                                 modifiers=[modifier])
     ship_type_id = self.allocate_type_id('src1', 'src2')
     ship1 = Ship(
         self.mktype(src='src1',
                     type_id=ship_type_id,
                     attrs={
                         src_attr_id: 10
                     },
                     effects=[effect_src1]).id)
     ship2 = Ship(
         self.mktype(src='src2',
                     type_id=ship_type_id,
                     attrs={
                         src_attr_id: 20
                     },
                     effects=[effect_src2]).id)
     item_type_id = self.allocate_type_id('src1', 'src2')
     self.mktype(src='src1', type_id=item_type_id, attrs={tgt_attr_id: 50})
     self.mktype(src='src2', type_id=item_type_id, attrs={tgt_attr_id: 50})
     item = Rig(item_type_id)
     fit1 = Fit(SolarSystem('src1'))
     fit1.ship = ship1
     fit2 = Fit(SolarSystem('src2'))
     fit2.ship = ship2
     fit1.rigs.add(item)
     self.assertAlmostEqual(item.attrs.get(tgt_attr_id), 55)
     # Action
     fit1.rigs.remove(item)
     fit2.rigs.add(item)
     # Verification
     self.assertAlmostEqual(item.attrs.get(tgt_attr_id), 60)
     # Cleanup
     self.assert_solsys_buffers_empty(fit1.solar_system)
     self.assert_solsys_buffers_empty(fit2.solar_system)
     self.assert_log_entries(0)
Beispiel #2
0
 def test_item_to_item(self):
     fit = Fit()
     ship_type = self.mktype()
     item1 = Ship(ship_type.id)
     item2 = Ship(ship_type.id)
     fit.ship = item1
     # Action
     fit.ship = item2
     # Verification
     self.assertIs(fit.ship, item2)
     # Cleanup
     self.assert_item_buffers_empty(item1)
     self.assert_item_buffers_empty(item2)
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Beispiel #3
0
 def test_fail_multiple(self):
     # Check that error works for multiple items
     self.fit.ship = Ship(
         self.mktype(attrs={
             AttrId.launcher_slots_left: 1
         }).id)
     item_type = self.mktype(effects=[self.effect])
     item1 = ModuleHigh(item_type.id)
     item2 = ModuleHigh(item_type.id)
     self.fit.modules.high.append(item1)
     self.fit.modules.high.append(item2)
     # Action
     error1 = self.get_error(item1, Restriction.launcher_slot)
     # Verification
     self.assertIsNotNone(error1)
     self.assertEqual(error1.used, 2)
     self.assertEqual(error1.total, 1)
     # Action
     error2 = self.get_error(item2, Restriction.launcher_slot)
     # Verification
     self.assertIsNotNone(error2)
     self.assertEqual(error2.used, 2)
     self.assertEqual(error2.total, 1)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #4
0
 def test_dmg_profile_rah_to_default(self):
     # Setup
     ship = Ship(self.make_ship_type((0.5, 0.65, 0.75, 0.9)).id)
     self.fit.ship = ship
     rah = ModuleLow(self.make_rah_type((0.85, 0.85, 0.85, 0.85), 6,
                                        1000).id,
                     state=State.active)
     self.fit.modules.low.equip(rah)
     self.fit.rah_incoming_dmg = DmgProfile(1, 0, 0, 0)
     # Force resonance calculation
     self.assertAlmostEqual(rah.attrs[self.armor_em.id], 0.4)
     self.assertAlmostEqual(rah.attrs[self.armor_therm.id], 1)
     self.assertAlmostEqual(rah.attrs[self.armor_kin.id], 1)
     self.assertAlmostEqual(rah.attrs[self.armor_expl.id], 1)
     self.assertAlmostEqual(ship.attrs[self.armor_em.id], 0.2)
     self.assertAlmostEqual(ship.attrs[self.armor_therm.id], 0.65)
     self.assertAlmostEqual(ship.attrs[self.armor_kin.id], 0.75)
     self.assertAlmostEqual(ship.attrs[self.armor_expl.id], 0.9)
     # Action
     self.fit.rah_incoming_dmg = None
     # Verification
     self.assertAlmostEqual(rah.attrs[self.armor_em.id], 1)
     self.assertAlmostEqual(rah.attrs[self.armor_therm.id], 0.925)
     self.assertAlmostEqual(rah.attrs[self.armor_kin.id], 0.82)
     self.assertAlmostEqual(rah.attrs[self.armor_expl.id], 0.655)
     self.assertAlmostEqual(ship.attrs[self.armor_em.id], 0.5)
     self.assertAlmostEqual(ship.attrs[self.armor_therm.id], 0.60125)
     self.assertAlmostEqual(ship.attrs[self.armor_kin.id], 0.615)
     self.assertAlmostEqual(ship.attrs[self.armor_expl.id], 0.5895)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #5
0
 def test_relay(self):
     # Check that stats service relays ehp stats properly
     self.fit.ship = Ship(
         self.mktype(
             attrs={
                 AttrId.hp: 10,
                 AttrId.em_dmg_resonance: 0.5,
                 AttrId.therm_dmg_resonance: 0.5,
                 AttrId.kin_dmg_resonance: 0.5,
                 AttrId.expl_dmg_resonance: 0.5,
                 AttrId.armor_hp: 15,
                 AttrId.armor_em_dmg_resonance: 0.5,
                 AttrId.armor_therm_dmg_resonance: 0.5,
                 AttrId.armor_kin_dmg_resonance: 0.5,
                 AttrId.armor_expl_dmg_resonance: 0.5,
                 AttrId.shield_capacity: 20,
                 AttrId.shield_em_dmg_resonance: 0.5,
                 AttrId.shield_therm_dmg_resonance: 0.5,
                 AttrId.shield_kin_dmg_resonance: 0.5,
                 AttrId.shield_expl_dmg_resonance: 0.5
             }).id)
     # Action
     ehp_stats = self.fit.stats.get_ehp(DmgProfile(1, 1, 1, 1))
     # Verification
     self.assertAlmostEqual(ehp_stats.hull, 20)
     self.assertAlmostEqual(ehp_stats.armor, 30)
     self.assertAlmostEqual(ehp_stats.shield, 40)
     self.assertAlmostEqual(ehp_stats.total, 90)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #6
0
 def test_fail_modified(self):
     # Make sure modified powergrid values are taken
     self.fit.ship = Ship(self.mktype(attrs={AttrId.power_output: 50}).id)
     src_attr = self.mkattr()
     modifier = self.mkmod(affectee_filter=ModAffecteeFilter.item,
                           affectee_domain=ModDomain.self,
                           affectee_attr_id=AttrId.power,
                           operator=ModOperator.post_mul,
                           affector_attr_id=src_attr.id)
     mod_effect = self.mkeffect(category_id=EffectCategoryId.passive,
                                modifiers=[modifier])
     item = ModuleHigh(self.mktype(attrs={
         AttrId.power: 50,
         src_attr.id: 2
     },
                                   effects=(self.effect, mod_effect)).id,
                       state=State.online)
     self.fit.modules.high.append(item)
     # Action
     error = self.get_error(item, Restriction.powergrid)
     # Verification
     self.assertIsNotNone(error)
     self.assertEqual(error.output, 50)
     self.assertEqual(error.total_use, 100)
     self.assertEqual(error.item_use, 100)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #7
0
 def test_pass(self):
     # When total consumption is less than output, no errors should be raised
     self.fit.ship = Ship(self.mktype(attrs={AttrId.power_output: 50}).id)
     item1 = ModuleHigh(self.mktype(attrs={
         AttrId.power: 25
     },
                                    effects=[self.effect]).id,
                        state=State.online)
     self.fit.modules.high.append(item1)
     item2 = ModuleHigh(self.mktype(attrs={
         AttrId.power: 20
     },
                                    effects=[self.effect]).id,
                        state=State.online)
     self.fit.modules.high.append(item2)
     # Action
     error1 = self.get_error(item1, Restriction.powergrid)
     # Verification
     self.assertIsNone(error1)
     # Action
     error2 = self.get_error(item2, Restriction.powergrid)
     # Verification
     self.assertIsNone(error2)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #8
0
 def test_fail_modified(self):
     # Make sure modified drone bandwidth values are taken
     self.fit.ship = Ship(
         self.mktype(attrs={
             AttrId.drone_bandwidth: 50
         }).id)
     src_attr = self.mkattr()
     modifier = self.mkmod(affectee_filter=ModAffecteeFilter.item,
                           affectee_domain=ModDomain.self,
                           affectee_attr_id=AttrId.drone_bandwidth_used,
                           operator=ModOperator.post_mul,
                           affector_attr_id=src_attr.id)
     effect = self.mkeffect(category_id=EffectCategoryId.passive,
                            modifiers=[modifier])
     item = Drone(self.mktype(attrs={
         AttrId.drone_bandwidth_used: 50,
         src_attr.id: 2
     },
                              effects=[effect]).id,
                  state=State.online)
     self.fit.drones.add(item)
     # Action
     error = self.get_error(item, Restriction.drone_bandwidth)
     # Verification
     self.assertIsNotNone(error)
     self.assertEqual(error.output, 50)
     self.assertEqual(error.total_use, 100)
     self.assertEqual(error.item_use, 100)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #9
0
 def test_pass(self):
     # When total consumption is less than output, no errors should be raised
     self.fit.ship = Ship(
         self.mktype(attrs={
             AttrId.drone_bandwidth: 50
         }).id)
     item1 = Drone(self.mktype(attrs={
         AttrId.drone_bandwidth_used: 25
     }).id,
                   state=State.online)
     self.fit.drones.add(item1)
     item2 = Drone(self.mktype(attrs={
         AttrId.drone_bandwidth_used: 20
     }).id,
                   state=State.online)
     self.fit.drones.add(item2)
     # Action
     error1 = self.get_error(item1, Restriction.drone_bandwidth)
     # Verification
     self.assertIsNone(error1)
     # Action
     error2 = self.get_error(item2, Restriction.drone_bandwidth)
     # Verification
     self.assertIsNone(error2)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #10
0
 def test_order_em_therm_kin(self):
     # Setup
     self.fit.rah_incoming_dmg = DmgProfile(1, 1, 1, 0)
     ship = Ship(self.make_ship_type((0.675, 0.675, 0.675, 0.675)).id)
     self.fit.ship = ship
     rah = ModuleLow(self.make_rah_type((0.85, 0.85, 0.85, 0.85), 6,
                                        1000).id,
                     state=State.active)
     self.fit.modules.low.equip(rah)
     # Verification
     # From real tests, gecko vs gnosis with 2 explosive hardeners
     # 0 0.850 0.850 0.850 0.850
     # 1 0.910 0.790 0.790 0.910 (kin therm > em)
     # 2 0.850 0.730 0.850 0.970 (therm > kin)
     # ---loop---
     # 3 0.805 0.790 0.805 1.000
     # 4 0.775 0.850 0.775 1.000
     # 5 0.835 0.820 0.745 1.000 (kin > em)
     self.assertAlmostEqual(rah.attrs[self.armor_em.id], 0.805)
     self.assertAlmostEqual(rah.attrs[self.armor_therm.id], 0.82)
     self.assertAlmostEqual(rah.attrs[self.armor_kin.id], 0.775)
     self.assertAlmostEqual(rah.attrs[self.armor_expl.id], 1)
     self.assertAlmostEqual(ship.attrs[self.armor_em.id], 0.543, places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_therm.id],
                            0.553,
                            places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_kin.id], 0.523, places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_expl.id], 0.675, places=3)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #11
0
 def test_order_multi(self):
     # Setup
     ship = Ship(self.make_ship_type((0.675, 0.675, 0.675, 0.675)).id)
     self.fit.ship = ship
     rah = ModuleLow(self.make_rah_type((0.85, 0.85, 0.85, 0.85), 6,
                                        1000).id,
                     state=State.active)
     self.fit.modules.low.equip(rah)
     # Verification
     # From real tests, gecko vs gnosis
     # ---loop---
     # 0 0.850 0.850 0.850 0.850
     # 1 0.910 0.790 0.790 0.910 (kin therm > em expl)
     self.assertAlmostEqual(rah.attrs[self.armor_em.id], 0.88)
     self.assertAlmostEqual(rah.attrs[self.armor_therm.id], 0.82)
     self.assertAlmostEqual(rah.attrs[self.armor_kin.id], 0.82)
     self.assertAlmostEqual(rah.attrs[self.armor_expl.id], 0.88)
     self.assertAlmostEqual(ship.attrs[self.armor_em.id], 0.594, places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_therm.id],
                            0.554,
                            places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_kin.id], 0.554, places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_expl.id], 0.594, places=3)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #12
0
 def test_no_loop_half_history(self):
     # Setup
     ship = Ship(self.make_ship_type((0.5, 0.65, 0.75, 0.9)).id)
     self.fit.ship = ship
     rah_type = self.make_rah_type((0.85, 0.85, 0.85, 0.85), 6, 1000)
     rah1 = ModuleLow(rah_type.id, state=State.active)
     rah2 = ModuleLow(rah_type.id, state=State.overload)
     self.fit.modules.low.equip(rah1)
     self.fit.modules.low.equip(rah2)
     # Verification
     # Same as previous test, but here whole history is just 5 ticks, and we
     # cannot ignore all of them - here we should ignore just 2 first ticks
     self.assertAlmostEqual(rah1.attrs[self.armor_em.id], 0.94, places=3)
     self.assertAlmostEqual(rah1.attrs[self.armor_therm.id], 0.88, places=3)
     self.assertAlmostEqual(rah1.attrs[self.armor_kin.id], 0.82, places=3)
     self.assertAlmostEqual(rah1.attrs[self.armor_expl.id], 0.76, places=3)
     self.assertAlmostEqual(rah2.attrs[self.armor_em.id], 0.97, places=3)
     self.assertAlmostEqual(rah2.attrs[self.armor_therm.id], 0.85, places=3)
     self.assertAlmostEqual(rah2.attrs[self.armor_kin.id], 0.85, places=3)
     self.assertAlmostEqual(rah2.attrs[self.armor_expl.id], 0.73, places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_em.id], 0.458, places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_therm.id],
                            0.495,
                            places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_kin.id], 0.535, places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_expl.id], 0.52, places=3)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #13
0
 def test_worst_em(self):
     fit = Fit()
     item = Ship(
         self.mktype(
             attrs={
                 AttrId.hp: 1,
                 AttrId.em_dmg_resonance: 0.8,
                 AttrId.therm_dmg_resonance: 0.7,
                 AttrId.kin_dmg_resonance: 0.7,
                 AttrId.expl_dmg_resonance: 0.7,
                 AttrId.armor_hp: 10,
                 AttrId.armor_em_dmg_resonance: 0.4,
                 AttrId.armor_therm_dmg_resonance: 0.3,
                 AttrId.armor_kin_dmg_resonance: 0.3,
                 AttrId.armor_expl_dmg_resonance: 0.3,
                 AttrId.shield_capacity: 100,
                 AttrId.shield_em_dmg_resonance: 0.2,
                 AttrId.shield_therm_dmg_resonance: 0.1,
                 AttrId.shield_kin_dmg_resonance: 0.1,
                 AttrId.shield_expl_dmg_resonance: 0.1
             }).id)
     fit.ship = item
     # Verification
     self.assertAlmostEqual(item.worst_case_ehp.hull, 1.25)
     self.assertAlmostEqual(item.worst_case_ehp.armor, 25)
     self.assertAlmostEqual(item.worst_case_ehp.shield, 500)
     self.assertAlmostEqual(item.worst_case_ehp.total, 526.25)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Beispiel #14
0
 def test_item_attr_hp_all_absent(self):
     fit = Fit()
     item = Ship(
         self.mktype(
             attrs={
                 AttrId.em_dmg_resonance: 0.8,
                 AttrId.therm_dmg_resonance: 0.8,
                 AttrId.kin_dmg_resonance: 0.8,
                 AttrId.expl_dmg_resonance: 0.8,
                 AttrId.armor_em_dmg_resonance: 0.4,
                 AttrId.armor_therm_dmg_resonance: 0.4,
                 AttrId.armor_kin_dmg_resonance: 0.4,
                 AttrId.armor_expl_dmg_resonance: 0.4,
                 AttrId.shield_em_dmg_resonance: 0.2,
                 AttrId.shield_therm_dmg_resonance: 0.2,
                 AttrId.shield_kin_dmg_resonance: 0.2,
                 AttrId.shield_expl_dmg_resonance: 0.2
             }).id)
     fit.ship = item
     # Verification
     self.assertAlmostEqual(item.worst_case_ehp.hull, 0)
     self.assertAlmostEqual(item.worst_case_ehp.armor, 0)
     self.assertAlmostEqual(item.worst_case_ehp.shield, 0)
     self.assertAlmostEqual(item.worst_case_ehp.total, 0)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Beispiel #15
0
 def test_override_priority(self):
     # Setup
     ship = Ship(self.make_ship_type((0.5, 0.65, 0.75, 0.9)).id)
     self.fit.ship = ship
     rah = ModuleLow(
         self.make_rah_type((0.85, 0.85, 0.85, 0.85), 6, 1000).id,
         state=State.online)
     self.fit.modules.low.equip(rah)
     # Calculate modified values
     self.assertAlmostEqual(rah.attrs[self.armor_em.id], 0.85)
     self.assertAlmostEqual(rah.attrs[self.armor_therm.id], 0.85)
     self.assertAlmostEqual(rah.attrs[self.armor_kin.id], 0.85)
     self.assertAlmostEqual(rah.attrs[self.armor_expl.id], 0.85)
     self.assertAlmostEqual(ship.attrs[self.armor_em.id], 0.5)
     self.assertAlmostEqual(ship.attrs[self.armor_therm.id], 0.65)
     self.assertAlmostEqual(ship.attrs[self.armor_kin.id], 0.75)
     self.assertAlmostEqual(ship.attrs[self.armor_expl.id], 0.9)
     # Action
     rah.state = State.active
     # Verification
     # Make sure override values are returned, even when modified values were
     # stored
     self.assertAlmostEqual(rah.attrs[self.armor_em.id], 1)
     self.assertAlmostEqual(rah.attrs[self.armor_therm.id], 0.925)
     self.assertAlmostEqual(rah.attrs[self.armor_kin.id], 0.82)
     self.assertAlmostEqual(rah.attrs[self.armor_expl.id], 0.655)
     self.assertAlmostEqual(ship.attrs[self.armor_em.id], 0.5)
     self.assertAlmostEqual(ship.attrs[self.armor_therm.id], 0.60125)
     self.assertAlmostEqual(ship.attrs[self.armor_kin.id], 0.615)
     self.assertAlmostEqual(ship.attrs[self.armor_expl.id], 0.5895)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #16
0
 def test_output_ship_not_loaded(self):
     self.fit.ship = Ship(self.allocate_type_id())
     # Verification
     self.assertAlmostEqual(self.fit.stats.dronebay.output, 0)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #17
0
 def test_mix_usage_zero(self):
     # If some item has zero usage and drone bandwidth error is still raised,
     # check it's not raised for item with zero usage
     self.fit.ship = Ship(
         self.mktype(attrs={
             AttrId.drone_bandwidth: 50
         }).id)
     item1 = Drone(self.mktype(attrs={
         AttrId.drone_bandwidth_used: 100
     }).id,
                   state=State.online)
     self.fit.drones.add(item1)
     item2 = Drone(self.mktype(attrs={
         AttrId.drone_bandwidth_used: 0
     }).id,
                   state=State.online)
     self.fit.drones.add(item2)
     # Action
     error1 = self.get_error(item1, Restriction.drone_bandwidth)
     # Verification
     self.assertIsNotNone(error1)
     self.assertEqual(error1.output, 50)
     self.assertEqual(error1.total_use, 100)
     self.assertEqual(error1.item_use, 100)
     # Action
     error2 = self.get_error(item2, Restriction.drone_bandwidth)
     # Verification
     self.assertIsNone(error2)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #18
0
 def test_unexpected_exception(self):
     # Setup
     ship = Ship(self.make_ship_type((0.5, 0.65, 0.75, 0.9)).id)
     self.fit.ship = ship
     # Set cycle time to zero to force exception
     rah = ModuleLow(self.make_rah_type((0.85, 0.85, 0.85, 0.85), 6, 0).id,
                     state=State.active)
     self.fit.modules.low.equip(rah)
     # Verification
     self.assertAlmostEqual(rah.attrs[self.armor_em.id], 0.85)
     self.assertAlmostEqual(rah.attrs[self.armor_therm.id], 0.85)
     self.assertAlmostEqual(rah.attrs[self.armor_kin.id], 0.85)
     self.assertAlmostEqual(rah.attrs[self.armor_expl.id], 0.85)
     self.assertAlmostEqual(ship.attrs[self.armor_em.id], 0.425)
     self.assertAlmostEqual(ship.attrs[self.armor_therm.id], 0.5525)
     self.assertAlmostEqual(ship.attrs[self.armor_kin.id], 0.6375)
     self.assertAlmostEqual(ship.attrs[self.armor_expl.id], 0.765)
     self.assert_log_entries(1)
     log_record = self.log[0]
     self.assertEqual(log_record.name, 'eos.sim.reactive_armor_hardener')
     self.assertEqual(log_record.levelno, logging.WARNING)
     self.assertEqual(
         log_record.msg,
         'unexpected exception, setting unsimulated resonances')
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
Beispiel #19
0
 def test_fail_multiple(self):
     # When multiple consumers require less than drone bandwidth output
     # alone, but in sum want more than total output, it should be erroneous
     # situation
     self.fit.ship = Ship(
         self.mktype(attrs={
             AttrId.drone_bandwidth: 40
         }).id)
     item1 = Drone(self.mktype(attrs={
         AttrId.drone_bandwidth_used: 25
     }).id,
                   state=State.online)
     self.fit.drones.add(item1)
     item2 = Drone(self.mktype(attrs={
         AttrId.drone_bandwidth_used: 20
     }).id,
                   state=State.online)
     self.fit.drones.add(item2)
     # Action
     error1 = self.get_error(item1, Restriction.drone_bandwidth)
     # Verification
     self.assertIsNotNone(error1)
     self.assertEqual(error1.output, 40)
     self.assertEqual(error1.total_use, 45)
     self.assertEqual(error1.item_use, 25)
     # Action
     error2 = self.get_error(item2, Restriction.drone_bandwidth)
     # Verification
     self.assertIsNotNone(error2)
     self.assertEqual(error2.output, 40)
     self.assertEqual(error2.total_use, 45)
     self.assertEqual(error2.item_use, 20)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #20
0
 def test_double_run_unsynced(self):
     # Setup
     ship = Ship(self.make_ship_type((0.5, 0.65, 0.75, 0.9)).id)
     self.fit.ship = ship
     rah_type = self.make_rah_type((0.85, 0.85, 0.85, 0.85), 6, 1000)
     rah1 = ModuleLow(rah_type.id, state=State.active)
     rah2 = ModuleLow(rah_type.id, state=State.overload)
     self.fit.modules.low.equip(rah1)
     self.fit.modules.low.equip(rah2)
     # Verification
     self.assertAlmostEqual(rah1.attrs[self.armor_em.id], 0.975, places=3)
     self.assertAlmostEqual(rah1.attrs[self.armor_therm.id],
                            0.835,
                            places=3)
     self.assertAlmostEqual(rah1.attrs[self.armor_kin.id], 0.83, places=3)
     self.assertAlmostEqual(rah1.attrs[self.armor_expl.id], 0.76, places=3)
     self.assertAlmostEqual(rah2.attrs[self.armor_em.id], 0.979, places=3)
     self.assertAlmostEqual(rah2.attrs[self.armor_therm.id], 0.91, places=3)
     self.assertAlmostEqual(rah2.attrs[self.armor_kin.id], 0.796, places=3)
     self.assertAlmostEqual(rah2.attrs[self.armor_expl.id], 0.715, places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_em.id], 0.479, places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_therm.id], 0.5, places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_kin.id], 0.509, places=3)
     self.assertAlmostEqual(ship.attrs[self.armor_expl.id], 0.509, places=3)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #21
0
 def test_mix_usage_zero(self):
     # If some item has zero usage and powergrid error is still raised, check
     # it's not raised for item with zero usage
     self.fit.ship = Ship(self.mktype(attrs={AttrId.power_output: 50}).id)
     item1 = ModuleHigh(self.mktype(attrs={
         AttrId.power: 100
     },
                                    effects=[self.effect]).id,
                        state=State.online)
     self.fit.modules.high.append(item1)
     item2 = ModuleHigh(self.mktype(attrs={
         AttrId.power: 0
     },
                                    effects=[self.effect]).id,
                        state=State.online)
     self.fit.modules.high.append(item2)
     # Action
     error1 = self.get_error(item1, Restriction.powergrid)
     # Verification
     self.assertIsNotNone(error1)
     self.assertEqual(error1.output, 50)
     self.assertEqual(error1.total_use, 100)
     self.assertEqual(error1.item_use, 100)
     # Action
     error2 = self.get_error(item2, Restriction.powergrid)
     # Verification
     self.assertIsNone(error2)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #22
0
 def test_influence_single_item_running(self):
     # Autocharge should be able to modify container when effect, which
     # defines autocharge, is running
     autocharge_modifier = self.mkmod_filter_item(ModDomain.ship)
     autocharge_effect = self.mkeffect(category_id=EffectCategoryId.passive,
                                       modifiers=[autocharge_modifier])
     autocharge_type = self.mktype(attrs={self.src_attr.id: 50},
                                   effects=[autocharge_effect])
     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,
                            state=State.active)
     influence_tgt = Ship(self.mktype(attrs={self.tgt_attr.id: 10}).id)
     self.fit.ship = influence_tgt
     # Action
     self.fit.modules.high.append(container)
     # Verification
     self.assertAlmostEqual(influence_tgt.attrs[self.tgt_attr.id], 15)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #23
0
 def test_fail_multiple(self):
     # When multiple consumers require less than powergrid output alone, but
     # in sum want more than total output, it should be erroneous situation
     self.fit.ship = Ship(self.mktype(attrs={AttrId.power_output: 40}).id)
     item1 = ModuleHigh(self.mktype(attrs={
         AttrId.power: 25
     },
                                    effects=[self.effect]).id,
                        state=State.online)
     self.fit.modules.high.append(item1)
     item2 = ModuleHigh(self.mktype(attrs={
         AttrId.power: 20
     },
                                    effects=[self.effect]).id,
                        state=State.online)
     self.fit.modules.high.append(item2)
     # Action
     error1 = self.get_error(item1, Restriction.powergrid)
     # Verification
     self.assertIsNotNone(error1)
     self.assertEqual(error1.output, 40)
     self.assertEqual(error1.total_use, 45)
     self.assertEqual(error1.item_use, 25)
     # Action
     error2 = self.get_error(item2, Restriction.powergrid)
     # Verification
     self.assertIsNotNone(error2)
     self.assertEqual(error2.output, 40)
     self.assertEqual(error2.total_use, 45)
     self.assertEqual(error2.item_use, 20)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #24
0
 def test_fail_multiple_with_nones(self):
     # Make sure Nones are processed properly
     self.fit.ship = Ship(self.mktype(attrs={AttrId.hi_slots: 3}).id)
     item_type = self.mktype()
     item1 = ModuleHigh(item_type.id)
     item2 = ModuleHigh(item_type.id)
     item3 = ModuleHigh(item_type.id)
     self.fit.modules.high.place(1, item1)
     self.fit.modules.high.place(4, item2)
     self.fit.modules.high.place(6, item3)
     # Action
     error1 = self.get_error(item1, Restriction.high_slot)
     # Verification
     self.assertIsNone(error1)
     # Action
     error2 = self.get_error(item2, Restriction.high_slot)
     # Verification
     self.assertIsNotNone(error2)
     self.assertEqual(error2.used, 7)
     self.assertEqual(error2.total, 3)
     # Action
     error3 = self.get_error(item2, Restriction.high_slot)
     # Verification
     self.assertIsNotNone(error3)
     self.assertEqual(error3.used, 7)
     self.assertEqual(error3.total, 3)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #25
0
 def test_output_ship_attr_absent(self):
     self.fit.ship = Ship(self.mktype().id)
     # Verification
     self.assertEqual(self.fit.stats.fighter_squads_light.total, 0)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #26
0
 def test_output_ship_attr_not_loaded(self):
     self.fit.ship = Ship(self.allocate_type_id())
     # Verification
     self.assertEqual(self.fit.stats.mid_slots.total, 0)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
 def test_fail_multiple(self):
     # Check that error works for multiple items
     self.fit.ship = Ship(
         self.mktype(attrs={
             AttrId.fighter_heavy_slots: 1
         }).id)
     item_type = self.mktype(attrs={AttrId.fighter_squadron_is_heavy: 1})
     item1 = FighterSquad(item_type.id)
     item2 = FighterSquad(item_type.id)
     self.fit.fighters.add(item1)
     self.fit.fighters.add(item2)
     # Action
     error1 = self.get_error(item1, Restriction.fighter_squad_heavy)
     # Verification
     self.assertIsNotNone(error1)
     self.assertEqual(error1.used, 2)
     self.assertEqual(error1.total, 1)
     # Action
     error2 = self.get_error(item2, Restriction.fighter_squad_heavy)
     # Verification
     self.assertIsNotNone(error2)
     self.assertEqual(error2.used, 2)
     self.assertEqual(error2.total, 1)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #28
0
 def test_output_ship_attr_absent(self):
     self.fit.ship = Ship(self.mktype().id)
     # Verification
     self.assertAlmostEqual(self.fit.stats.dronebay.output, 0)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #29
0
 def test_rah_state_switch_up(self):
     # Setup
     ship = Ship(self.make_ship_type((0.5, 0.65, 0.75, 0.9)).id)
     self.fit.ship = ship
     rah = ModuleLow(self.make_rah_type((0.85, 0.85, 0.85, 0.85), 6,
                                        1000).id,
                     state=State.online)
     self.fit.modules.low.equip(rah)
     # Force resonance calculation
     self.assertAlmostEqual(rah.attrs[self.armor_em.id], 0.85)
     self.assertAlmostEqual(rah.attrs[self.armor_therm.id], 0.85)
     self.assertAlmostEqual(rah.attrs[self.armor_kin.id], 0.85)
     self.assertAlmostEqual(rah.attrs[self.armor_expl.id], 0.85)
     self.assertAlmostEqual(ship.attrs[self.armor_em.id], 0.5)
     self.assertAlmostEqual(ship.attrs[self.armor_therm.id], 0.65)
     self.assertAlmostEqual(ship.attrs[self.armor_kin.id], 0.75)
     self.assertAlmostEqual(ship.attrs[self.armor_expl.id], 0.9)
     # Action
     rah.state = State.active
     # Verification
     self.assertAlmostEqual(rah.attrs[self.armor_em.id], 1)
     self.assertAlmostEqual(rah.attrs[self.armor_therm.id], 0.925)
     self.assertAlmostEqual(rah.attrs[self.armor_kin.id], 0.82)
     self.assertAlmostEqual(rah.attrs[self.armor_expl.id], 0.655)
     self.assertAlmostEqual(ship.attrs[self.armor_em.id], 0.5)
     self.assertAlmostEqual(ship.attrs[self.armor_therm.id], 0.60125)
     self.assertAlmostEqual(ship.attrs[self.armor_kin.id], 0.615)
     self.assertAlmostEqual(ship.attrs[self.armor_expl.id], 0.5895)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Beispiel #30
0
 def test_fail_multiple(self):
     # When multiple consumers require less than calibration output alone,
     # but in sum want more than total output, it should be erroneous
     # situation
     self.fit.ship = Ship(
         self.mktype(attrs={
             AttrId.upgrade_capacity: 40
         }).id)
     item1 = Rig(
         self.mktype(attrs={
             AttrId.upgrade_cost: 25
         }, effects=[self.effect]).id)
     self.fit.rigs.add(item1)
     item2 = Rig(
         self.mktype(attrs={
             AttrId.upgrade_cost: 20
         }, effects=[self.effect]).id)
     self.fit.rigs.add(item2)
     # Action
     error1 = self.get_error(item1, Restriction.calibration)
     # Verification
     self.assertIsNotNone(error1)
     self.assertEqual(error1.output, 40)
     self.assertEqual(error1.total_use, 45)
     self.assertEqual(error1.item_use, 25)
     # Action
     error2 = self.get_error(item2, Restriction.calibration)
     # Verification
     self.assertIsNotNone(error2)
     self.assertEqual(error2.output, 40)
     self.assertEqual(error2.total_use, 45)
     self.assertEqual(error2.item_use, 20)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)