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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)