Example #1
0
 def test_disabling_not_side_effect(self):
     # Setup
     src_attr = self.mkattr()
     tgt_attr = self.mkattr()
     modifier = self.mkmod(
         affectee_filter=ModAffecteeFilter.item,
         affectee_domain=ModDomain.self,
         affectee_attr_id=tgt_attr.id,
         operator=ModOperator.post_mul,
         affector_attr_id=src_attr.id)
     effect = self.mkeffect(
         category_id=EffectCategoryId.passive,
         modifiers=[modifier])
     fit = Fit()
     item = Booster(self.mktype(
         attrs={tgt_attr.id: 100, src_attr.id: 1.2},
         effects=[effect]).id)
     fit.boosters.add(item)
     self.assertAlmostEqual(item.attrs[tgt_attr.id], 120)
     # Verification
     with self.assertRaises(NoSuchSideEffectError):
         item.set_side_effect_status(effect.id, False)
     self.assertNotIn(effect.id, item.side_effects)
     self.assertAlmostEqual(item.attrs[tgt_attr.id], 120)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Example #2
0
 def test_enabling(self):
     # Setup
     chance_attr = self.mkattr()
     src_attr = self.mkattr()
     tgt_attr = self.mkattr()
     modifier = self.mkmod(
         affectee_filter=ModAffecteeFilter.item,
         affectee_domain=ModDomain.self,
         affectee_attr_id=tgt_attr.id,
         operator=ModOperator.post_mul,
         affector_attr_id=src_attr.id)
     effect = self.mkeffect(
         category_id=EffectCategoryId.passive,
         fitting_usage_chance_attr_id=chance_attr.id,
         modifiers=[modifier])
     fit = Fit()
     item = Booster(self.mktype(
         attrs={
             chance_attr.id: 0.5,
             tgt_attr.id: 100,
             src_attr.id: 1.2},
         effects=[effect]).id)
     fit.boosters.add(item)
     self.assertAlmostEqual(item.attrs[tgt_attr.id], 100)
     # Action
     item.set_side_effect_status(effect.id, True)
     # Verification
     self.assertIs(item.side_effects[effect.id].status, True)
     self.assertAlmostEqual(item.attrs[tgt_attr.id], 120)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Example #3
0
 def test_enabling(self):
     # Setup
     chance_attr = self.mkattr()
     src_attr = self.mkattr()
     tgt_attr = self.mkattr()
     modifier = self.mkmod(affectee_filter=ModAffecteeFilter.item,
                           affectee_domain=ModDomain.self,
                           affectee_attr_id=tgt_attr.id,
                           operator=ModOperator.post_mul,
                           affector_attr_id=src_attr.id)
     effect = self.mkeffect(category_id=EffectCategoryId.passive,
                            fitting_usage_chance_attr_id=chance_attr.id,
                            modifiers=[modifier])
     fit = Fit()
     item = Booster(
         self.mktype(attrs={
             chance_attr.id: 0.5,
             tgt_attr.id: 100,
             src_attr.id: 1.2
         },
                     effects=[effect]).id)
     fit.boosters.add(item)
     self.assertAlmostEqual(item.attrs[tgt_attr.id], 100)
     # Action
     item.set_side_effect_status(effect.id, True)
     # Verification
     self.assertIs(item.side_effects[effect.id].status, True)
     self.assertAlmostEqual(item.attrs[tgt_attr.id], 120)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Example #4
0
 def test_disabling_not_side_effect(self):
     # Setup
     src_attr = self.mkattr()
     tgt_attr = self.mkattr()
     modifier = self.mkmod(affectee_filter=ModAffecteeFilter.item,
                           affectee_domain=ModDomain.self,
                           affectee_attr_id=tgt_attr.id,
                           operator=ModOperator.post_mul,
                           affector_attr_id=src_attr.id)
     effect = self.mkeffect(category_id=EffectCategoryId.passive,
                            modifiers=[modifier])
     fit = Fit()
     item = Booster(
         self.mktype(attrs={
             tgt_attr.id: 100,
             src_attr.id: 1.2
         },
                     effects=[effect]).id)
     fit.boosters.add(item)
     self.assertAlmostEqual(item.attrs[tgt_attr.id], 120)
     # Verification
     with self.assertRaises(NoSuchSideEffectError):
         item.set_side_effect_status(effect.id, False)
     self.assertNotIn(effect.id, item.side_effects)
     self.assertAlmostEqual(item.attrs[tgt_attr.id], 120)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Example #5
0
 def test_disabling_item_not_loaded(self):
     # Setup
     effect_id = self.allocate_effect_id()
     fit = Fit()
     item = Booster(self.allocate_type_id())
     fit.boosters.add(item)
     # Verification
     with self.assertRaises(NoSuchSideEffectError):
         item.set_side_effect_status(effect_id, False)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Example #6
0
 def test_disabling_item_not_loaded(self):
     # Setup
     effect_id = self.allocate_effect_id()
     fit = Fit()
     item = Booster(self.allocate_type_id())
     fit.boosters.add(item)
     # Verification
     with self.assertRaises(NoSuchSideEffectError):
         item.set_side_effect_status(effect_id, False)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Example #7
0
 def test_pass_items_not_loaded(self):
     item_type_id = self.allocate_type_id()
     item1 = Booster(item_type_id)
     item2 = Booster(item_type_id)
     self.fit.boosters.add(item1)
     self.fit.boosters.add(item2)
     # Action
     error1 = self.get_error(item1, Restriction.booster_index)
     self.assertIsNone(error1)
     # Action
     error2 = self.get_error(item2, Restriction.booster_index)
     self.assertIsNone(error2)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Example #8
0
 def test_pass_slots_different(self):
     # Items taking different slots shouldn't trigger any errors
     item1 = Booster(self.mktype(attrs={self.index_attr.id: 120}).id)
     item2 = Booster(self.mktype(attrs={self.index_attr.id: 121}).id)
     self.fit.boosters.add(item1)
     self.fit.boosters.add(item2)
     # Action
     error1 = self.get_error(item1, Restriction.booster_index)
     # Verification
     self.assertIsNone(error1)
     # Action
     error2 = self.get_error(item2, Restriction.booster_index)
     # Verification
     self.assertIsNone(error2)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Example #9
0
 def test_data(self):
     # Setup
     chance_attr1 = self.mkattr()
     chance_attr2 = self.mkattr()
     src_attr = self.mkattr()
     modifier = self.mkmod(
         affectee_filter=ModAffecteeFilter.item,
         affectee_domain=ModDomain.self,
         affectee_attr_id=chance_attr2.id,
         operator=ModOperator.post_percent,
         affector_attr_id=src_attr.id)
     effect1 = self.mkeffect(
         category_id=EffectCategoryId.passive,
         fitting_usage_chance_attr_id=chance_attr1.id)
     effect2 = self.mkeffect(
         category_id=EffectCategoryId.passive,
         fitting_usage_chance_attr_id=chance_attr2.id)
     effect3 = self.mkeffect(
         category_id=EffectCategoryId.passive,
         modifiers=[modifier])
     fit = Fit()
     item = Booster(self.mktype(
         attrs={
             chance_attr1.id: 0.5,
             chance_attr2.id: 0.1,
             src_attr.id: -25},
         effects=(effect1, effect2, effect3)).id)
     fit.boosters.add(item)
     item.set_side_effect_status(effect2.id, True)
     # Verification
     side_effects = item.side_effects
     self.assertEqual(len(side_effects), 2)
     self.assertIn(effect1.id, side_effects)
     side_effect1 = side_effects[effect1.id]
     self.assertAlmostEqual(side_effect1.chance, 0.5)
     self.assertIs(side_effect1.status, False)
     self.assertIn(effect2.id, side_effects)
     side_effect2 = side_effects[effect2.id]
     self.assertAlmostEqual(side_effect2.chance, 0.075)
     self.assertIs(side_effect2.status, True)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Example #10
0
 def test_domain_other(self):
     influence_tgt = Booster(self.mktype(attrs={self.tgt_attr.id: 100}).id)
     self.fit.boosters.add(influence_tgt)
     # Action
     self.fit.implants.add(self.influence_src)
     # Verification
     self.assertAlmostEqual(influence_tgt.attrs[self.tgt_attr.id], 100)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Example #11
0
 def test_booster_pass_loaded(self):
     item = Booster(self.mktype().id)
     self.fit.boosters.add(item)
     # Action
     error = self.get_error(item, Restriction.loaded_item)
     # Verification
     self.assertIsNone(error)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Example #12
0
 def test_fail(self):
     # Check that if 2 or more items are put into single slot index, error is
     # raised
     item_type = self.mktype(attrs={self.index_attr.id: 120})
     item1 = Booster(item_type.id)
     item2 = Booster(item_type.id)
     self.fit.boosters.add(item1)
     self.fit.boosters.add(item2)
     # Action
     error1 = self.get_error(item1, Restriction.booster_index)
     self.assertIsNotNone(error1)
     self.assertEqual(error1.slot_index, 120)
     # Action
     error2 = self.get_error(item2, Restriction.booster_index)
     self.assertIsNotNone(error2)
     self.assertEqual(error2.slot_index, 120)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Example #13
0
 def test_booster_fail_not_loaded(self):
     item = Booster(self.allocate_type_id())
     self.fit.boosters.add(item)
     # Action
     error = self.get_error(item, Restriction.loaded_item)
     # Verification
     self.assertIsNotNone(error)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Example #14
0
 def test_data_item_not_loaded(self):
     # Setup
     fit = Fit()
     item = Booster(self.allocate_type_id())
     fit.boosters.add(item)
     # Verification
     self.assertEqual(len(item.side_effects), 0)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Example #15
0
 def test_pass(self):
     # Single item which takes some slot shouldn't trigger any errors
     item = Booster(self.mktype(attrs={self.index_attr.id: 120}).id)
     self.fit.boosters.add(item)
     # Action
     error = self.get_error(item, Restriction.booster_index)
     # Verification
     self.assertIsNone(error)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Example #16
0
 def test_booster(self):
     booster = Booster(self.make_item_types())
     self.fit.boosters.add(booster)
     self.assertAlmostEqual(booster.attrs[self.tgt_attr_id], 18)
     # Action
     self.fit.solar_system.source = 'src2'
     # Verification
     self.assertAlmostEqual(booster.attrs[self.tgt_attr_id], 14)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Example #17
0
 def test_item_pass_not_loaded(self):
     # Make sure not loaded item doesn't cause any failures
     item = Booster(self.allocate_type_id())
     self.fit.boosters.add(item)
     # Action
     error = self.get_error(item, Restriction.item_class)
     # Verification
     self.assertIsNone(error)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Example #18
0
 def test_booster_fail_attr_absent(self):
     item = Booster(self.mktype(category_id=TypeCategoryId.implant).id)
     self.fit.boosters.add(item)
     # Action
     error = self.get_error(item, Restriction.item_class)
     # Verification
     self.assertIsNotNone(error)
     self.assertEqual(error.item_class, Booster)
     self.assertCountEqual(error.allowed_classes, [])
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Example #19
0
 def test_data(self):
     # Setup
     chance_attr1 = self.mkattr()
     chance_attr2 = self.mkattr()
     src_attr = self.mkattr()
     modifier = self.mkmod(affectee_filter=ModAffecteeFilter.item,
                           affectee_domain=ModDomain.self,
                           affectee_attr_id=chance_attr2.id,
                           operator=ModOperator.post_percent,
                           affector_attr_id=src_attr.id)
     effect1 = self.mkeffect(category_id=EffectCategoryId.passive,
                             fitting_usage_chance_attr_id=chance_attr1.id)
     effect2 = self.mkeffect(category_id=EffectCategoryId.passive,
                             fitting_usage_chance_attr_id=chance_attr2.id)
     effect3 = self.mkeffect(category_id=EffectCategoryId.passive,
                             modifiers=[modifier])
     fit = Fit()
     item = Booster(
         self.mktype(attrs={
             chance_attr1.id: 0.5,
             chance_attr2.id: 0.1,
             src_attr.id: -25
         },
                     effects=(effect1, effect2, effect3)).id)
     fit.boosters.add(item)
     item.set_side_effect_status(effect2.id, True)
     # Verification
     side_effects = item.side_effects
     self.assertEqual(len(side_effects), 2)
     self.assertIn(effect1.id, side_effects)
     side_effect1 = side_effects[effect1.id]
     self.assertAlmostEqual(side_effect1.chance, 0.5)
     self.assertIs(side_effect1.status, False)
     self.assertIn(effect2.id, side_effects)
     side_effect2 = side_effects[effect2.id]
     self.assertAlmostEqual(side_effect2.chance, 0.075)
     self.assertIs(side_effect2.status, True)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Example #20
0
 def test_add_item_type_failure(self):
     fit = Fit()
     item = Booster(self.mktype().id)
     # Action
     with self.assertRaises(TypeError):
         fit.implants.add(item)
     # Verification
     self.assertEqual(len(fit.implants), 0)
     fit.boosters.add(item)
     # Cleanup
     self.assert_item_buffers_empty(item)
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Example #21
0
 def test_booster_pass(self):
     item = Booster(
         self.mktype(category_id=TypeCategoryId.implant,
                     attrs={
                         AttrId.boosterness: 3
                     }).id)
     self.fit.boosters.add(item)
     # Action
     error = self.get_error(item, Restriction.item_class)
     # Verification
     self.assertIsNone(error)
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Example #22
0
 def test_booster_fail_category_other(self):
     item = Booster(
         self.mktype(category_id=1008, attrs={
             AttrId.boosterness: 3
         }).id)
     self.fit.boosters.add(item)
     # Action
     error = self.get_error(item, Restriction.item_class)
     # Verification
     self.assertIsNotNone(error)
     self.assertEqual(error.item_class, Booster)
     self.assertCountEqual(error.allowed_classes, [])
     # Cleanup
     self.assert_solsys_buffers_empty(self.fit.solar_system)
     self.assert_log_entries(0)
Example #23
0
 def test_persistence(self):
     # Here we check that when item type doesn't have effect which was
     # disabled anymore, everything runs as expected, and when this effect
     # appears again - it's disabled
     # Setup
     chance_attr1_id = self.allocate_attr_id('src1', 'src2')
     self.mkattr(src='src1', attr_id=chance_attr1_id)
     self.mkattr(src='src2', attr_id=chance_attr1_id)
     chance_attr2 = self.mkattr(src='src1')
     chance_attr3 = self.mkattr(src='src1')
     # 1st effect exists as side-effect in both sources
     effect1_id = self.allocate_effect_id('src1', 'src2')
     effect1_src1 = self.mkeffect(
         src='src1',
         effect_id=effect1_id,
         category_id=EffectCategoryId.passive,
         fitting_usage_chance_attr_id=chance_attr1_id)
     effect1_src2 = self.mkeffect(
         src='src2',
         effect_id=effect1_id,
         category_id=EffectCategoryId.passive,
         fitting_usage_chance_attr_id=chance_attr1_id)
     # 2nd effect exists as side-effect in src1, and as regular effect in
     # src2
     effect2_id = self.allocate_effect_id('src1', 'src2')
     effect2_src1 = self.mkeffect(
         src='src1',
         effect_id=effect2_id,
         category_id=EffectCategoryId.passive,
         fitting_usage_chance_attr_id=chance_attr2.id)
     effect2_src2 = self.mkeffect(src='src2',
                                  effect_id=effect2_id,
                                  category_id=EffectCategoryId.passive)
     # 3rd effect exists as side-effect in src1 and doesn't exist in src2 at
     # all
     effect3_id = self.allocate_effect_id('src1', 'src2')
     effect3_src1 = self.mkeffect(
         src='src1',
         effect_id=effect3_id,
         category_id=EffectCategoryId.passive,
         fitting_usage_chance_attr_id=chance_attr3.id)
     item_type_id = self.allocate_type_id('src1', 'src2')
     self.mktype(src='src1',
                 type_id=item_type_id,
                 attrs={
                     chance_attr1_id: 0.2,
                     chance_attr2.id: 0.3,
                     chance_attr3.id: 0.4
                 },
                 effects=(effect1_src1, effect2_src1, effect3_src1))
     self.mktype(src='src2',
                 type_id=item_type_id,
                 attrs={chance_attr1_id: 0.7},
                 effects=(effect1_src2, effect2_src2))
     fit = Fit()
     item = Booster(item_type_id)
     fit.boosters.add(item)
     item.set_side_effect_status(effect1_id, True)
     item.set_side_effect_status(effect2_id, True)
     item.set_side_effect_status(effect3_id, True)
     # Action
     fit.solar_system.source = 'src2'
     # Verification
     side_effects = item.side_effects
     self.assertEqual(len(side_effects), 1)
     self.assertIn(effect1_id, side_effects)
     side_effect1 = side_effects[effect1_id]
     self.assertAlmostEqual(side_effect1.chance, 0.7)
     self.assertIs(side_effect1.status, True)
     # Action
     fit.solar_system.source = 'src1'
     # Verification
     side_effects = item.side_effects
     self.assertEqual(len(side_effects), 3)
     self.assertIn(effect1_id, side_effects)
     side_effect1 = side_effects[effect1_id]
     self.assertAlmostEqual(side_effect1.chance, 0.2)
     self.assertIs(side_effect1.status, True)
     self.assertIn(effect2_id, side_effects)
     side_effect2 = side_effects[effect2_id]
     self.assertAlmostEqual(side_effect2.chance, 0.3)
     self.assertIs(side_effect2.status, True)
     self.assertIn(effect3_id, side_effects)
     side_effect3 = side_effects[effect3_id]
     self.assertAlmostEqual(side_effect3.chance, 0.4)
     self.assertIs(side_effect3.status, True)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)