class TestHolderMixinChargedCycles(FitTestCase): def setUp(self): super().setUp() self.holder = Module(type_id=None) self.holder.item = Mock() self.holder.item.attributes = {} self.holder.attributes = {} self.charge = Charge(type_id=None) self.charge.item = Mock() self.charge.item.attributes = {} self.charge.attributes = {} self.holder.charge = self.charge def test_ammo_generic(self): self.holder.attributes[Attribute.capacity] = 100.0 self.charge.attributes[Attribute.volume] = 2.0 self.holder.item.attributes[Attribute.charge_rate] = 1.0 self.holder.attributes[Attribute.charge_rate] = 2.0 self.assertEqual(self.holder.fully_charged_cycles, 25) self.assertEqual(self.holder.fully_charged_cycles_max, 25) def test_ammo_override(self): self.holder.attributes[Attribute.capacity] = 100.0 self.charge.attributes[Attribute.volume] = 2.0 self.holder.charge_quantity = 40 self.holder.item.attributes[Attribute.charge_rate] = 1.0 self.holder.attributes[Attribute.charge_rate] = 2.0 self.assertEqual(self.holder.fully_charged_cycles, 20) self.assertEqual(self.holder.fully_charged_cycles_max, 25) def test_ammo_round_down(self): self.holder.attributes[Attribute.capacity] = 22.0 self.charge.attributes[Attribute.volume] = 2.0 self.holder.item.attributes[Attribute.charge_rate] = 1.0 self.holder.attributes[Attribute.charge_rate] = 4.0 self.assertEqual(self.holder.fully_charged_cycles, 2) self.assertEqual(self.holder.fully_charged_cycles_max, 2) def test_ammo_no_quantity(self): self.holder.item.attributes[Attribute.charge_rate] = 1.0 self.holder.attributes[Attribute.charge_rate] = 4.0 self.assertIsNone(self.holder.fully_charged_cycles) self.assertIsNone(self.holder.fully_charged_cycles_max) def test_laser_combat(self): self.holder.attributes[Attribute.capacity] = 4.0 self.charge.attributes[Attribute.volume] = 2.0 self.charge.attributes[Attribute.crystals_get_damaged] = 1.0 self.charge.attributes[Attribute.hp] = 2.2 self.charge.attributes[Attribute.crystal_volatility_chance] = 0.1 self.charge.attributes[Attribute.crystal_volatility_damage] = 0.01 self.holder.item.default_effect.id = Effect.target_attack self.assertEqual(self.holder.fully_charged_cycles, 4400) self.assertEqual(self.holder.fully_charged_cycles_max, 4400) def test_laser_mining(self): self.holder.attributes[Attribute.capacity] = 4.0 self.charge.attributes[Attribute.volume] = 2.0 self.charge.attributes[Attribute.crystals_get_damaged] = 1.0 self.charge.attributes[Attribute.hp] = 2.2 self.charge.attributes[Attribute.crystal_volatility_chance] = 0.1 self.charge.attributes[Attribute.crystal_volatility_damage] = 0.01 self.holder.item.default_effect.id = Effect.mining_laser self.assertEqual(self.holder.fully_charged_cycles, 4400) self.assertEqual(self.holder.fully_charged_cycles_max, 4400) def test_laser_not_damageable(self): self.holder.attributes[Attribute.capacity] = 4.0 self.charge.attributes[Attribute.volume] = 2.0 self.charge.attributes[Attribute.hp] = 2.2 self.charge.attributes[Attribute.crystal_volatility_chance] = 0.1 self.charge.attributes[Attribute.crystal_volatility_damage] = 0.01 self.holder.item.default_effect.id = Effect.target_attack self.assertIsNone(self.holder.fully_charged_cycles) self.assertIsNone(self.holder.fully_charged_cycles_max) def test_laser_no_hp(self): self.holder.attributes[Attribute.capacity] = 4.0 self.charge.attributes[Attribute.volume] = 2.0 self.charge.attributes[Attribute.crystals_get_damaged] = 1.0 self.charge.attributes[Attribute.crystal_volatility_chance] = 0.1 self.charge.attributes[Attribute.crystal_volatility_damage] = 0.01 self.holder.item.default_effect.id = Effect.target_attack self.assertIsNone(self.holder.fully_charged_cycles) self.assertIsNone(self.holder.fully_charged_cycles_max) def test_laser_no_chance(self): self.holder.attributes[Attribute.capacity] = 4.0 self.charge.attributes[Attribute.volume] = 2.0 self.charge.attributes[Attribute.crystals_get_damaged] = 1.0 self.charge.attributes[Attribute.hp] = 2.2 self.charge.attributes[Attribute.crystal_volatility_damage] = 0.01 self.holder.item.default_effect.id = Effect.target_attack self.assertIsNone(self.holder.fully_charged_cycles) self.assertIsNone(self.holder.fully_charged_cycles_max) def test_laser_no_damage(self): self.holder.attributes[Attribute.capacity] = 4.0 self.charge.attributes[Attribute.volume] = 2.0 self.charge.attributes[Attribute.crystals_get_damaged] = 1.0 self.charge.attributes[Attribute.hp] = 2.2 self.charge.attributes[Attribute.crystal_volatility_chance] = 0.1 self.holder.item.default_effect.id = Effect.target_attack self.assertIsNone(self.holder.fully_charged_cycles) self.assertIsNone(self.holder.fully_charged_cycles_max) def test_laser_override(self): self.holder.attributes[Attribute.capacity] = 4.0 self.charge.attributes[Attribute.volume] = 2.0 self.holder.charge_quantity = 3 self.charge.attributes[Attribute.crystals_get_damaged] = 1.0 self.charge.attributes[Attribute.hp] = 2.2 self.charge.attributes[Attribute.crystal_volatility_chance] = 0.1 self.charge.attributes[Attribute.crystal_volatility_damage] = 0.01 self.holder.item.default_effect.id = Effect.target_attack self.assertEqual(self.holder.fully_charged_cycles, 6600) self.assertEqual(self.holder.fully_charged_cycles_max, 4400) def test_no_item(self): self.holder.attributes[Attribute.capacity] = 100.0 self.charge.attributes[Attribute.volume] = 2.0 self.holder.item = None self.holder.attributes[Attribute.charge_rate] = 2.0 self.assertIsNone(self.holder.fully_charged_cycles) self.assertIsNone(self.holder.fully_charged_cycles_max) def test_no_default_effect(self): self.holder.attributes[Attribute.capacity] = 100.0 self.charge.attributes[Attribute.volume] = 2.0 self.holder.item.default_effect = None self.holder.attributes[Attribute.charge_rate] = 2.0 self.assertIsNone(self.holder.fully_charged_cycles) self.assertIsNone(self.holder.fully_charged_cycles_max) def test_cache(self): self.holder.attributes[Attribute.capacity] = 100.0 self.charge.attributes[Attribute.volume] = 2.0 self.holder.item.attributes[Attribute.charge_rate] = 1.0 self.holder.attributes[Attribute.charge_rate] = 2.0 self.assertEqual(self.holder.fully_charged_cycles, 25) self.assertEqual(self.holder.fully_charged_cycles_max, 25) del self.holder.item.attributes[Attribute.charge_rate] del self.holder.attributes[Attribute.charge_rate] self.holder.attributes[Attribute.capacity] = 4.0 self.charge.attributes[Attribute.volume] = 2.0 self.charge.attributes[Attribute.crystals_get_damaged] = 1.0 self.charge.attributes[Attribute.hp] = 2.2 self.charge.attributes[Attribute.crystal_volatility_chance] = 0.1 self.charge.attributes[Attribute.crystal_volatility_damage] = 0.01 self.holder.item._effect_ids = (Effect.target_attack, ) self.assertEqual(self.holder.fully_charged_cycles, 25) self.assertEqual(self.holder.fully_charged_cycles_max, 25) def test_cache_volatility(self): self.holder.attributes[Attribute.capacity] = 100.0 self.charge.attributes[Attribute.volume] = 2.0 self.holder.item.attributes[Attribute.charge_rate] = 1.0 self.holder.attributes[Attribute.charge_rate] = 2.0 self.assertEqual(self.holder.fully_charged_cycles, 25) self.assertEqual(self.holder.fully_charged_cycles_max, 25) self.holder._clear_volatile_attrs() del self.holder.item.attributes[Attribute.charge_rate] del self.holder.attributes[Attribute.charge_rate] self.holder.attributes[Attribute.capacity] = 4.0 self.charge.attributes[Attribute.volume] = 2.0 self.charge.attributes[Attribute.crystals_get_damaged] = 1.0 self.charge.attributes[Attribute.hp] = 2.2 self.charge.attributes[Attribute.crystal_volatility_chance] = 0.1 self.charge.attributes[Attribute.crystal_volatility_damage] = 0.01 self.holder.item.default_effect.id = Effect.target_attack self.assertEqual(self.holder.fully_charged_cycles, 4400) self.assertEqual(self.holder.fully_charged_cycles_max, 4400)
class TestHolderMixinChargeQuantity(FitTestCase): def setUp(self): super().setUp() self.holder = Module(type_id=None) self.holder.attributes = {} self.charge = Charge(type_id=None) self.charge.attributes = {} self.holder.charge = self.charge def make_fit(self, *args, **kwargs): fit = super().make_fit(*args, **kwargs) fit.container = HolderSet(fit, Module) return fit def test_generic(self): self.holder.attributes[Attribute.capacity] = 20.0 self.charge.attributes[Attribute.volume] = 2.0 self.assertEqual(self.holder.charge_quantity_max, 10) self.assertEqual(self.holder.charge_quantity, 10) def test_float_error(self): self.holder.attributes[Attribute.capacity] = 2.3 self.charge.attributes[Attribute.volume] = 0.1 self.assertEqual(self.holder.charge_quantity_max, 23) self.assertEqual(self.holder.charge_quantity, 23) def test_round_down(self): self.holder.attributes[Attribute.capacity] = 19.7 self.charge.attributes[Attribute.volume] = 2.0 self.assertEqual(self.holder.charge_quantity_max, 9) self.assertEqual(self.holder.charge_quantity, 9) def test_no_volume(self): self.holder.attributes[Attribute.capacity] = 20.0 self.assertIsNone(self.holder.charge_quantity_max) self.assertIsNone(self.holder.charge_quantity) def test_no_capacity(self): self.charge.attributes[Attribute.volume] = 2.0 self.assertIsNone(self.holder.charge_quantity_max) self.assertIsNone(self.holder.charge_quantity) def test_no_charge(self): self.holder.attributes[Attribute.capacity] = 20.0 self.charge.attributes[Attribute.volume] = 2.0 self.holder.charge = None self.assertIsNone(self.holder.charge_quantity_max) self.assertIsNone(self.holder.charge_quantity) def test_cache(self): self.holder.attributes[Attribute.capacity] = 20.0 self.charge.attributes[Attribute.volume] = 2.0 self.assertEqual(self.holder.charge_quantity_max, 10) self.assertEqual(self.holder.charge_quantity, 10) self.holder.attributes[Attribute.capacity] = 200.0 self.charge.attributes[Attribute.volume] = 1.0 self.assertEqual(self.holder.charge_quantity_max, 10) self.assertEqual(self.holder.charge_quantity, 10) def test_volatility(self): self.holder.attributes[Attribute.capacity] = 20.0 self.charge.attributes[Attribute.volume] = 2.0 self.assertEqual(self.holder.charge_quantity_max, 10) self.assertEqual(self.holder.charge_quantity, 10) self.holder._clear_volatile_attrs() self.holder.attributes[Attribute.capacity] = 200.0 self.charge.attributes[Attribute.volume] = 1.0 self.assertEqual(self.holder.charge_quantity_max, 200) self.assertEqual(self.holder.charge_quantity, 200) def test_override_set_int(self): source = Mock(spec_set=Source) fit = self.make_fit(source=source) holder = self.holder charge = self.charge holder._clear_volatile_attrs = Mock() charge._clear_volatile_attrs = Mock() fit.container.add(holder) holder.attributes[Attribute.capacity] = 20.0 charge.attributes[Attribute.volume] = 2.0 self.assertEqual(holder.charge_quantity_max, 10) self.assertEqual(holder.charge_quantity, 10) st_cleans_before = len(fit.stats._clear_volatile_attrs.mock_calls) holder_cleans_before = len(holder._clear_volatile_attrs.mock_calls) charge_cleans_before = len(charge._clear_volatile_attrs.mock_calls) holder.charge_quantity = 26 st_cleans_after = len(fit.stats._clear_volatile_attrs.mock_calls) holder_cleans_after = len(holder._clear_volatile_attrs.mock_calls) charge_cleans_after = len(charge._clear_volatile_attrs.mock_calls) self.assertEqual(st_cleans_after - st_cleans_before, 1) self.assertEqual(holder_cleans_after - holder_cleans_before, 1) self.assertEqual(charge_cleans_after - charge_cleans_before, 1) self.assertEqual(holder.charge_quantity_max, 10) self.assertEqual(holder.charge_quantity, 26) def test_override_set_other(self): source = Mock(spec_set=Source) fit = self.make_fit(source=source) holder = self.holder charge = self.charge holder._clear_volatile_attrs = Mock() charge._clear_volatile_attrs = Mock() fit.container.add(holder) holder.attributes[Attribute.capacity] = 20.0 charge.attributes[Attribute.volume] = 2.0 self.assertEqual(holder.charge_quantity_max, 10) self.assertEqual(holder.charge_quantity, 10) st_cleans_before = len(fit.stats._clear_volatile_attrs.mock_calls) holder_cleans_before = len(holder._clear_volatile_attrs.mock_calls) charge_cleans_before = len(charge._clear_volatile_attrs.mock_calls) self.assertRaises(TypeError, holder.__setattr__, 'charge_quantity', 26.0) st_cleans_after = len(fit.stats._clear_volatile_attrs.mock_calls) holder_cleans_after = len(holder._clear_volatile_attrs.mock_calls) charge_cleans_after = len(charge._clear_volatile_attrs.mock_calls) self.assertEqual(st_cleans_after - st_cleans_before, 0) self.assertEqual(holder_cleans_after - holder_cleans_before, 0) self.assertEqual(charge_cleans_after - charge_cleans_before, 0) self.assertEqual(holder.charge_quantity_max, 10) self.assertEqual(holder.charge_quantity, 10) def test_override_del(self): source = Mock(spec_set=Source) fit = self.make_fit(source=source) holder = self.holder charge = self.charge holder._clear_volatile_attrs = Mock() charge._clear_volatile_attrs = Mock() fit.container.add(holder) holder.attributes[Attribute.capacity] = 20.0 charge.attributes[Attribute.volume] = 2.0 holder.charge_quantity = 26 st_cleans_before = len(fit.stats._clear_volatile_attrs.mock_calls) holder_cleans_before = len(holder._clear_volatile_attrs.mock_calls) charge_cleans_before = len(charge._clear_volatile_attrs.mock_calls) del holder.charge_quantity st_cleans_after = len(fit.stats._clear_volatile_attrs.mock_calls) holder_cleans_after = len(holder._clear_volatile_attrs.mock_calls) charge_cleans_after = len(charge._clear_volatile_attrs.mock_calls) self.assertEqual(st_cleans_after - st_cleans_before, 1) self.assertEqual(holder_cleans_after - holder_cleans_before, 1) self.assertEqual(charge_cleans_after - charge_cleans_before, 1) self.assertEqual(holder.charge_quantity_max, 10) self.assertEqual(holder.charge_quantity, 10)