Merge pull request #1065 from Ebag333/pytests

pytests
This commit is contained in:
Ryan Holmes
2017-03-25 00:41:02 -04:00
committed by GitHub
16 changed files with 564 additions and 86 deletions

0
_development/__init__.py Normal file
View File

143
_development/helpers.py Normal file
View File

@@ -0,0 +1,143 @@
# noinspection PyPackageRequirements
import pytest
import os
import sys
import threading
from sqlalchemy import MetaData, create_engine
from sqlalchemy.orm import sessionmaker
script_dir = os.path.dirname(os.path.abspath(__file__))
# Add root folder to python paths
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..')))
sys._called_from_test = True
# noinspection PyUnresolvedReferences,PyUnusedLocal
@pytest.fixture
def DBInMemory_test():
def rollback():
with sd_lock:
saveddata_session.rollback()
print("Creating database in memory")
from os.path import realpath, join, dirname, abspath
debug = False
gamedataCache = True
saveddataCache = True
gamedata_version = ""
gamedata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(unicode(__file__))), "..", "eve.db"))
saveddata_connectionstring = 'sqlite:///:memory:'
class ReadOnlyException(Exception):
pass
if callable(gamedata_connectionstring):
gamedata_engine = create_engine("sqlite://", creator=gamedata_connectionstring, echo=debug)
else:
gamedata_engine = create_engine(gamedata_connectionstring, echo=debug)
gamedata_meta = MetaData()
gamedata_meta.bind = gamedata_engine
gamedata_session = sessionmaker(bind=gamedata_engine, autoflush=False, expire_on_commit=False)()
# This should be moved elsewhere, maybe as an actual query. Current, without try-except, it breaks when making a new
# game db because we haven't reached gamedata_meta.create_all()
try:
gamedata_version = gamedata_session.execute(
"SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'client_build'"
).fetchone()[0]
except Exception as e:
print("Missing gamedata version.")
gamedata_version = None
if saveddata_connectionstring is not None:
if callable(saveddata_connectionstring):
saveddata_engine = create_engine(creator=saveddata_connectionstring, echo=debug)
else:
saveddata_engine = create_engine(saveddata_connectionstring, echo=debug)
saveddata_meta = MetaData()
saveddata_meta.bind = saveddata_engine
saveddata_session = sessionmaker(bind=saveddata_engine, autoflush=False, expire_on_commit=False)()
else:
saveddata_meta = None
# Lock controlling any changes introduced to session
sd_lock = threading.Lock()
# Import all the definitions for all our database stuff
# noinspection PyPep8
#from eos.db.gamedata import alphaClones, attribute, category, effect, group, icon, item, marketGroup, metaData, metaGroup, queries, traits, unit
# noinspection PyPep8
#from eos.db.saveddata import booster, cargo, character, crest, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, miscData, module, override, price, queries, skill, targetResists, user
# If using in memory saveddata, you'll want to reflect it so the data structure is good.
if saveddata_connectionstring == "sqlite:///:memory:":
saveddata_meta.create_all()
# Output debug info to help us troubleshoot Travis
print(saveddata_engine)
print(gamedata_engine)
helper = {
#'config': eos.config,
'gamedata_session' : gamedata_session,
'saveddata_session' : saveddata_session,
}
return helper
# noinspection PyUnresolvedReferences,PyUnusedLocal
@pytest.fixture
def DBInMemory():
print("Creating database in memory")
import eos.config
import eos
import eos.db
# Output debug info to help us troubleshoot Travis
print(eos.db.saveddata_engine)
print(eos.db.gamedata_engine)
helper = {
'config': eos.config,
'db' : eos.db,
'gamedata_session' : eos.db.gamedata_session,
'saveddata_session' : eos.db.saveddata_session,
}
return helper
@pytest.fixture
def Gamedata():
print("Building Gamedata")
from eos.gamedata import Item
helper = {
'Item': Item,
}
return helper
@pytest.fixture
def Saveddata():
print("Building Saveddata")
from eos.saveddata.ship import Ship
from eos.saveddata.fit import Fit
from eos.saveddata.character import Character
from eos.saveddata.module import Module, State
from eos.saveddata.citadel import Citadel
helper = {
'Structure': Citadel,
'Ship' : Ship,
'Fit' : Fit,
'Character': Character,
'Module' : Module,
'State' : State,
}
return helper

View File

@@ -0,0 +1,28 @@
import pytest
# noinspection PyPackageRequirements
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
# noinspection PyShadowingNames
@pytest.fixture
def RifterFit(DB, Gamedata, Saveddata):
print("Creating Rifter")
item = DB['gamedata_session'].query(Gamedata['Item']).filter(Gamedata['Item'].name == "Rifter").first()
ship = Saveddata['Ship'](item)
# setup fit
fit = Saveddata['Fit'](ship, "My Rifter Fit")
return fit
# noinspection PyShadowingNames
@pytest.fixture
def KeepstarFit(DB, Gamedata, Saveddata):
print("Creating Keepstar")
item = DB['gamedata_session'].query(Gamedata['Item']).filter(Gamedata['Item'].name == "Keepstar").first()
ship = Saveddata['Structure'](item)
# setup fit
fit = Saveddata['Fit'](ship, "Keepstar Fit")
return fit

View File

@@ -1,14 +1,25 @@
import sys
from os.path import realpath, join, dirname, abspath
from logbook import Logger
import os
istravis = os.environ.get('TRAVIS') == 'true'
pyfalog = Logger(__name__)
debug = False
gamedataCache = True
saveddataCache = True
gamedata_version = ""
gamedata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "eve.db")),
sys.getfilesystemencoding())
saveddata_connectionstring = 'sqlite:///' + unicode(
realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata.db")), sys.getfilesystemencoding())
gamedata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "eve.db")), sys.getfilesystemencoding())
pyfalog.debug("Gamedata connection string: {0}", gamedata_connectionstring)
if istravis is True or hasattr(sys, '_called_from_test'):
# Running in Travis. Run saveddata database in memory.
saveddata_connectionstring = 'sqlite:///:memory:'
else:
saveddata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata.db")), sys.getfilesystemencoding())
pyfalog.debug("Saveddata connection string: {0}", saveddata_connectionstring)
settings = {
"setting1": True

View File

@@ -545,12 +545,10 @@ class Fit(object):
if warfareBuffID == 21: # Skirmish Burst: Interdiction Maneuvers: Tackle Range
groups = ("Stasis Web", "Warp Scrambler")
self.modules.filteredItemBoost(lambda mod: mod.item.group.name in groups, "maxRange", value,
stackingPenalties=True)
self.modules.filteredItemBoost(lambda mod: mod.item.group.name in groups, "maxRange", value, stackingPenalties=True)
if warfareBuffID == 22: # Skirmish Burst: Rapid Deployment: AB/MWD Speed Increase
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Afterburner") or
mod.item.requiresSkill("High Speed Maneuvering"),
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Afterburner") or mod.item.requiresSkill("High Speed Maneuvering"),
"speedFactor", value, stackingPenalties=True)
if warfareBuffID == 23: # Mining Burst: Mining Laser Field Enhancement: Mining/Survey Range
@@ -559,8 +557,7 @@ class Fit(object):
mod.item.requiresSkill("Gas Cloud Harvesting"),
"maxRange", value, stackingPenalties=True)
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("CPU Management"),
"surveyScanRange", value, stackingPenalties=True)
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("CPU Management"), "surveyScanRange", value, stackingPenalties=True)
if warfareBuffID == 24: # Mining Burst: Mining Laser Optimization: Mining Capacitor/Duration
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Mining") or
@@ -574,8 +571,7 @@ class Fit(object):
"duration", value, stackingPenalties=True)
if warfareBuffID == 25: # Mining Burst: Mining Equipment Preservation: Crystal Volatility
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Mining"),
"crystalVolatilityChance", value, stackingPenalties=True)
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Mining"), "crystalVolatilityChance", value, stackingPenalties=True)
if warfareBuffID == 60: # Skirmish Burst: Evasive Maneuvers: Agility
self.ship.boostItemAttr("agility", value, stackingPenalties=True)

View File

@@ -1,6 +1,5 @@
from gui.contextMenu import ContextMenu
import gui.mainFrame
import service
import gui.globalEvents as GE
import wx
from service.settings import ContextMenuSettings

View File

@@ -1,6 +1,5 @@
from gui.contextMenu import ContextMenu
import gui.mainFrame
import service
import gui.globalEvents as GE
import wx
from service.settings import ContextMenuSettings

View File

@@ -29,7 +29,8 @@ pyfalog = Logger(__name__)
class SettingsProvider(object):
BASE_PATH = os.path.join(config.savePath, 'settings')
if config.savePath:
BASE_PATH = os.path.join(config.savePath, 'settings')
settings = {}
_instance = None
@@ -41,13 +42,15 @@ class SettingsProvider(object):
return cls._instance
def __init__(self):
if not os.path.exists(self.BASE_PATH):
os.mkdir(self.BASE_PATH)
if hasattr(self, 'BASE_PATH'):
if not os.path.exists(self.BASE_PATH):
os.mkdir(self.BASE_PATH)
def getSettings(self, area, defaults=None):
s = self.settings.get(area)
if s is None:
if s is None and hasattr(self, 'BASE_PATH'):
p = os.path.join(self.BASE_PATH, area)
if not os.path.exists(p):
@@ -71,6 +74,8 @@ class SettingsProvider(object):
info[item] = defaults[item]
self.settings[area] = s = Settings(p, info)
else:
s = None
return s

View File

@@ -1,9 +0,0 @@
from gui.aboutData import versionString, licenses, developers, credits, description
def test_aboutData():
assert versionString.__len__() > 0
assert licenses.__len__() > 0
assert developers.__len__() > 0
assert credits.__len__() > 0
assert description.__len__() > 0

View File

@@ -0,0 +1,17 @@
# Add root folder to python paths
# This must be done on every test in order to pass in Travis
import os
import sys
script_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..', '..')))
# noinspection PyPackageRequirements
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
from _development.helpers_fits import RifterFit, KeepstarFit
def test_race(DB, RifterFit, KeepstarFit):
"""
Test race code
"""
assert RifterFit.ship.item.race == 'minmatar'
assert KeepstarFit.ship.item.race == 'upwell'

View File

@@ -0,0 +1,50 @@
# Add root folder to python paths
# This must be done on every test in order to pass in Travis
import math
import os
import sys
script_dir = os.path.dirname(os.path.abspath(__file__))
script_dir = os.path.realpath(os.path.join(script_dir, '..', '..', '..'))
print script_dir
sys.path.append(script_dir)
# noinspection PyPackageRequirements
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
from _development.helpers_fits import RifterFit
def test_multiply_stacking_penalties(DB, Saveddata, RifterFit):
"""
Tests the stacking penalties under multiply
"""
char0 = Saveddata['Character'].getAll0()
RifterFit.character = char0
starting_em_resist = RifterFit.ship.getModifiedItemAttr("shieldEmDamageResonance")
mod = Saveddata['Module'](DB['db'].getItem("EM Ward Amplifier II"))
item_modifer = mod.item.getAttribute("emDamageResistanceBonus")
RifterFit.calculateModifiedAttributes()
for _ in range(10):
if _ == 0:
# First run we have no modules, se don't try and calculate them.
calculated_resist = RifterFit.ship.getModifiedItemAttr("shieldEmDamageResonance")
else:
# Calculate what our next resist should be
# Denominator: [math.exp((i / 2.67) ** 2.0) for i in xrange(8)]
current_effectiveness = 1 / math.exp(((_ - 1) / 2.67) ** 2.0)
new_item_modifier = 1 + ((item_modifer * current_effectiveness) / 100)
calculated_resist = (em_resist * new_item_modifier)
# Add another resist module to our fit.
RifterFit.modules.append(mod)
# Modify our fit so that Eos generates new numbers for us.
RifterFit.clear()
RifterFit.calculateModifiedAttributes()
em_resist = RifterFit.ship.getModifiedItemAttr("shieldEmDamageResonance")
assert em_resist == calculated_resist
# print(str(em_resist) + "==" + str(calculated_resist))

View File

@@ -0,0 +1,19 @@
# Add root folder to python paths
# This must be done on every test in order to pass in Travis
import os
import sys
script_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..', '..')))
from gui.aboutData import versionString, licenses, developers, credits, description
def test_aboutData():
"""
Simple test to validate all about data exists
"""
assert versionString.__len__() > 0
assert licenses.__len__() > 0
assert developers.__len__() > 0
assert credits.__len__() > 0
assert description.__len__() > 0

View File

@@ -1,9 +1,16 @@
# Add root folder to python paths
# This must be done on every test in order to pass in Travis
import os
import sys
script_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..', '..')))
from service.attribute import Attribute
def test_attribute():
"""
We don't really have much to test here, to throw a generic attribute at it and validate we get the expected results
We don't really have much to test here, so throw a generic attribute at it and validate we get the expected results
:return:
"""

View File

@@ -0,0 +1,36 @@
# Add root folder to python paths
# This must be done on every test in order to pass in Travis
import os
import sys
script_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..', '..')))
# noinspection PyPackageRequirements
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
# noinspection PyPackageRequirements
from _development.helpers_fits import RifterFit, KeepstarFit
from service.fit import Fit
# Fake import wx
from types import ModuleType
wx = ModuleType("fake_module")
sys.modules[wx.__name__] = wx
def test_getAllFits(DB, RifterFit, KeepstarFit):
assert len(Fit.getAllFits()) == 0
DB['db'].save(RifterFit)
assert len(Fit.getAllFits()) == 1
DB['db'].save(KeepstarFit)
assert len(Fit.getAllFits()) == 2
# Cleanup after ourselves
DB['db'].remove(RifterFit)
DB['db'].remove(KeepstarFit)
def test_getFitsWithShip_RifterFit(DB, RifterFit):
DB['db'].save(RifterFit)
assert Fit.getFitsWithShip(587)[0][1] == 'My Rifter Fit'
DB['db'].remove(RifterFit)

View File

@@ -1,58 +0,0 @@
"""import tests."""
import os
import sys
# import importlib
# noinspection PyPackageRequirements
# import pytest
script_dir = os.path.dirname(os.path.abspath(__file__))
# Add root to python paths, this allows us to import submodules
sys.path.append(os.path.realpath(os.path.join(script_dir, '..')))
# noinspection PyPep8
import service
# noinspection PyPep8
import gui
# noinspection PyPep8
import eos
# noinspection PyPep8
import utils
def test_packages():
assert service
assert gui
assert eos
assert utils
def service_modules():
for root, folders, files in os.walk("service"):
for file_ in files:
if file_.endswith(".py") and not file_.startswith("_"):
mod_name = "{}.{}".format(
root.replace("/", "."),
file_.split(".py")[0],
)
yield mod_name
def eos_modules():
for root, folders, files in os.walk("eos"):
for file_ in files:
if file_.endswith(".py") and not file_.startswith("_"):
mod_name = "{}.{}".format(
root.replace("/", "."),
file_.split(".py")[0],
)
yield mod_name
# TODO: Disable walk through Eos paths until eos.types is killed. eos.types causes the import to break
'''
@pytest.mark.parametrize("mod_name", eos_modules())
def test_eos_imports(mod_name):
assert importlib.import_module(mod_name)
'''

View File

@@ -0,0 +1,235 @@
# Add root folder to python paths
# This must be done on every test in order to pass in Travis
import os
import sys
script_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..')))
# noinspection PyPackageRequirements
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
from _development.helpers_fits import RifterFit
# noinspection PyShadowingNames
def test_rifter_empty_char0(DB, Saveddata, RifterFit):
"""
We test an empty ship because if we use this as a base for testing our V skills,
and CCP ever fucks with the base states, all our derived stats will be wrong.
"""
char0 = Saveddata['Character'].getAll0()
RifterFit.character = char0
RifterFit.calculateModifiedAttributes()
assert RifterFit.ship.getModifiedItemAttr("agility") == 3.2
assert RifterFit.ship.getModifiedItemAttr("armorEmDamageResonance") == 0.4
assert RifterFit.ship.getModifiedItemAttr("armorExplosiveDamageResonance") == 0.9
assert RifterFit.ship.getModifiedItemAttr("armorHP") == 450.0
assert RifterFit.ship.getModifiedItemAttr("armorKineticDamageResonance") == 0.75
assert RifterFit.ship.getModifiedItemAttr("armorThermalDamageResonance") == 0.65
assert RifterFit.ship.getModifiedItemAttr("armorUniformity") == 0.75
assert RifterFit.ship.getModifiedItemAttr("baseWarpSpeed") == 1.0
assert RifterFit.ship.getModifiedItemAttr("capacitorCapacity") == 250.0
assert RifterFit.ship.getModifiedItemAttr("capacity") == 140.0
assert RifterFit.ship.getModifiedItemAttr("cpuLoad") == 0.0
assert RifterFit.ship.getModifiedItemAttr("cpuOutput") == 130.0
assert RifterFit.ship.getModifiedItemAttr("damage") == 0.0
assert RifterFit.ship.getModifiedItemAttr("droneBandwidth") == 0.0
assert RifterFit.ship.getModifiedItemAttr("droneCapacity") == 0.0
assert RifterFit.ship.getModifiedItemAttr("emDamageResonance") == 0.67
assert RifterFit.ship.getModifiedItemAttr("explosiveDamageResonance") == 0.67
assert RifterFit.ship.getModifiedItemAttr("fwLpKill") == 25.0
assert RifterFit.ship.getModifiedItemAttr("gfxBoosterID") == 397.0
assert RifterFit.ship.getModifiedItemAttr("heatAttenuationHi") == 0.63
assert RifterFit.ship.getModifiedItemAttr("heatAttenuationLow") == 0.5
assert RifterFit.ship.getModifiedItemAttr("heatAttenuationMed") == 0.5
assert RifterFit.ship.getModifiedItemAttr("heatCapacityHi") == 100.0
assert RifterFit.ship.getModifiedItemAttr("heatCapacityLow") == 100.0
assert RifterFit.ship.getModifiedItemAttr("heatCapacityMed") == 100.0
assert RifterFit.ship.getModifiedItemAttr("heatDissipationRateHi") == 0.01
assert RifterFit.ship.getModifiedItemAttr("heatDissipationRateLow") == 0.01
assert RifterFit.ship.getModifiedItemAttr("heatDissipationRateMed") == 0.01
assert RifterFit.ship.getModifiedItemAttr("heatGenerationMultiplier") == 1.0
assert RifterFit.ship.getModifiedItemAttr("hiSlots") == 4.0
assert RifterFit.ship.getModifiedItemAttr("hp") == 350.0
assert RifterFit.ship.getModifiedItemAttr("hullEmDamageResonance") == 1.0
assert RifterFit.ship.getModifiedItemAttr("hullExplosiveDamageResonance") == 1.0
assert RifterFit.ship.getModifiedItemAttr("hullKineticDamageResonance") == 1.0
assert RifterFit.ship.getModifiedItemAttr("hullThermalDamageResonance") == 1.0
assert RifterFit.ship.getModifiedItemAttr("kineticDamageResonance") == 0.67
assert RifterFit.ship.getModifiedItemAttr("launcherSlotsLeft") == 2.0
assert RifterFit.ship.getModifiedItemAttr("lowSlots") == 3.0
assert RifterFit.ship.getModifiedItemAttr("mainColor") == 16777215.0
assert RifterFit.ship.getModifiedItemAttr("mass") == 1067000.0
assert RifterFit.ship.getModifiedItemAttr("maxDirectionalVelocity") == 3000.0
assert RifterFit.ship.getModifiedItemAttr("maxLockedTargets") == 4.0
assert RifterFit.ship.getModifiedItemAttr("maxPassengers") == 2.0
assert RifterFit.ship.getModifiedItemAttr("maxTargetRange") == 22500.0
assert RifterFit.ship.getModifiedItemAttr("maxVelocity") == 365.0
assert RifterFit.ship.getModifiedItemAttr("medSlots") == 3.0
assert RifterFit.ship.getModifiedItemAttr("metaLevel") == 0.0
assert RifterFit.ship.getModifiedItemAttr("minTargetVelDmgMultiplier") == 0.05
assert RifterFit.ship.getModifiedItemAttr("powerLoad") == 0.0
assert RifterFit.ship.getModifiedItemAttr("powerOutput") == 41.0
assert RifterFit.ship.getModifiedItemAttr("powerToSpeed") == 1.0
assert RifterFit.ship.getModifiedItemAttr("propulsionGraphicID") == 397.0
assert RifterFit.ship.getModifiedItemAttr("radius") == 31.0
assert RifterFit.ship.getModifiedItemAttr("rechargeRate") == 125000.0
assert RifterFit.ship.getModifiedItemAttr("requiredSkill1") == 3329.0
assert RifterFit.ship.getModifiedItemAttr("requiredSkill1Level") == 1.0
assert RifterFit.ship.getModifiedItemAttr("rigSize") == 1.0
assert RifterFit.ship.getModifiedItemAttr("rigSlots") == 3.0
assert RifterFit.ship.getModifiedItemAttr("scanGravimetricStrength") == 0.0
assert RifterFit.ship.getModifiedItemAttr("scanLadarStrength") == 8.0
assert RifterFit.ship.getModifiedItemAttr("scanMagnetometricStrength") == 0.0
assert RifterFit.ship.getModifiedItemAttr("scanRadarStrength") == 0.0
assert RifterFit.ship.getModifiedItemAttr("scanResolution") == 660.0
assert RifterFit.ship.getModifiedItemAttr("scanSpeed") == 1500.0
assert RifterFit.ship.getModifiedItemAttr("shieldCapacity") == 450.0
assert RifterFit.ship.getModifiedItemAttr("shieldEmDamageResonance") == 1.0
assert RifterFit.ship.getModifiedItemAttr("shieldExplosiveDamageResonance") == 0.5
assert RifterFit.ship.getModifiedItemAttr("shieldKineticDamageResonance") == 0.6
assert RifterFit.ship.getModifiedItemAttr("shieldRechargeRate") == 625000.0
assert RifterFit.ship.getModifiedItemAttr("shieldThermalDamageResonance") == 0.8
assert RifterFit.ship.getModifiedItemAttr("shieldUniformity") == 0.75
assert RifterFit.ship.getModifiedItemAttr("shipBonusMF") == 5.0
assert RifterFit.ship.getModifiedItemAttr("shipBonusMF2") == 10.0
assert RifterFit.ship.getModifiedItemAttr("shipScanResistance") == 0.0
assert RifterFit.ship.getModifiedItemAttr("signatureRadius") == 35.0
assert RifterFit.ship.getModifiedItemAttr("structureUniformity") == 1.0
assert RifterFit.ship.getModifiedItemAttr("techLevel") == 1.0
assert RifterFit.ship.getModifiedItemAttr("thermalDamageResonance") == 0.67
assert RifterFit.ship.getModifiedItemAttr("turretSlotsLeft") == 3.0
assert RifterFit.ship.getModifiedItemAttr("typeColorScheme") == 11342.0
assert RifterFit.ship.getModifiedItemAttr("uniformity") == 1.0
assert RifterFit.ship.getModifiedItemAttr("upgradeCapacity") == 400.0
assert RifterFit.ship.getModifiedItemAttr("upgradeSlotsLeft") == 3.0
assert RifterFit.ship.getModifiedItemAttr("volume") == 27289.0
assert RifterFit.ship.getModifiedItemAttr("warpCapacitorNeed") == 2.24e-06
assert RifterFit.ship.getModifiedItemAttr("warpFactor") == 0.0
assert RifterFit.ship.getModifiedItemAttr("warpSpeedMultiplier") == 5.0
# noinspection PyShadowingNames
def test_rifter_empty_char5(DB, Saveddata, RifterFit):
"""
Test char skills applying to a ship
"""
char5 = Saveddata['Character'].getAll5()
RifterFit.character = char5
RifterFit.calculateModifiedAttributes()
assert RifterFit.ship.getModifiedItemAttr("agility") == 2.16
assert RifterFit.ship.getModifiedItemAttr("armorEmDamageResonance") == 0.4
assert RifterFit.ship.getModifiedItemAttr("armorExplosiveDamageResonance") == 0.9
assert RifterFit.ship.getModifiedItemAttr("armorHP") == 562.5
assert RifterFit.ship.getModifiedItemAttr("armorKineticDamageResonance") == 0.75
assert RifterFit.ship.getModifiedItemAttr("armorThermalDamageResonance") == 0.65
assert RifterFit.ship.getModifiedItemAttr("armorUniformity") == 0.75
assert RifterFit.ship.getModifiedItemAttr("baseWarpSpeed") == 1.0
assert RifterFit.ship.getModifiedItemAttr("capacitorCapacity") == 312.5
assert RifterFit.ship.getModifiedItemAttr("capacity") == 140.0
assert RifterFit.ship.getModifiedItemAttr("cpuLoad") == 0.0
assert RifterFit.ship.getModifiedItemAttr("cpuOutput") == 162.5
assert RifterFit.ship.getModifiedItemAttr("damage") == 0.0
assert RifterFit.ship.getModifiedItemAttr("droneBandwidth") == 0.0
assert RifterFit.ship.getModifiedItemAttr("droneCapacity") == 0.0
assert RifterFit.ship.getModifiedItemAttr("emDamageResonance") == 0.67
assert RifterFit.ship.getModifiedItemAttr("explosiveDamageResonance") == 0.67
assert RifterFit.ship.getModifiedItemAttr("fwLpKill") == 25.0
assert RifterFit.ship.getModifiedItemAttr("gfxBoosterID") == 397.0
assert RifterFit.ship.getModifiedItemAttr("heatAttenuationHi") == 0.63
assert RifterFit.ship.getModifiedItemAttr("heatAttenuationLow") == 0.5
assert RifterFit.ship.getModifiedItemAttr("heatAttenuationMed") == 0.5
assert RifterFit.ship.getModifiedItemAttr("heatCapacityHi") == 100.0
assert RifterFit.ship.getModifiedItemAttr("heatCapacityLow") == 100.0
assert RifterFit.ship.getModifiedItemAttr("heatCapacityMed") == 100.0
assert RifterFit.ship.getModifiedItemAttr("heatDissipationRateHi") == 0.01
assert RifterFit.ship.getModifiedItemAttr("heatDissipationRateLow") == 0.01
assert RifterFit.ship.getModifiedItemAttr("heatDissipationRateMed") == 0.01
assert RifterFit.ship.getModifiedItemAttr("heatGenerationMultiplier") == 1.0
assert RifterFit.ship.getModifiedItemAttr("hiSlots") == 4.0
assert RifterFit.ship.getModifiedItemAttr("hp") == 437.5
assert RifterFit.ship.getModifiedItemAttr("hullEmDamageResonance") == 1.0
assert RifterFit.ship.getModifiedItemAttr("hullExplosiveDamageResonance") == 1.0
assert RifterFit.ship.getModifiedItemAttr("hullKineticDamageResonance") == 1.0
assert RifterFit.ship.getModifiedItemAttr("hullThermalDamageResonance") == 1.0
assert RifterFit.ship.getModifiedItemAttr("kineticDamageResonance") == 0.67
assert RifterFit.ship.getModifiedItemAttr("launcherSlotsLeft") == 2.0
assert RifterFit.ship.getModifiedItemAttr("lowSlots") == 3.0
assert RifterFit.ship.getModifiedItemAttr("mainColor") == 16777215.0
assert RifterFit.ship.getModifiedItemAttr("mass") == 1067000.0
assert RifterFit.ship.getModifiedItemAttr("maxDirectionalVelocity") == 3000.0
assert RifterFit.ship.getModifiedItemAttr("maxLockedTargets") == 4.0
assert RifterFit.ship.getModifiedItemAttr("maxPassengers") == 2.0
assert RifterFit.ship.getModifiedItemAttr("maxTargetRange") == 28125.0
assert RifterFit.ship.getModifiedItemAttr("maxVelocity") == 456.25
assert RifterFit.ship.getModifiedItemAttr("medSlots") == 3.0
assert RifterFit.ship.getModifiedItemAttr("metaLevel") == 0.0
assert RifterFit.ship.getModifiedItemAttr("minTargetVelDmgMultiplier") == 0.05
assert RifterFit.ship.getModifiedItemAttr("powerLoad") == 0.0
assert RifterFit.ship.getModifiedItemAttr("powerOutput") == 51.25
assert RifterFit.ship.getModifiedItemAttr("powerToSpeed") == 1.0
assert RifterFit.ship.getModifiedItemAttr("propulsionGraphicID") == 397.0
assert RifterFit.ship.getModifiedItemAttr("radius") == 31.0
assert RifterFit.ship.getModifiedItemAttr("rechargeRate") == 93750.0
assert RifterFit.ship.getModifiedItemAttr("requiredSkill1") == 3329.0
assert RifterFit.ship.getModifiedItemAttr("requiredSkill1Level") == 1.0
assert RifterFit.ship.getModifiedItemAttr("rigSize") == 1.0
assert RifterFit.ship.getModifiedItemAttr("rigSlots") == 3.0
assert RifterFit.ship.getModifiedItemAttr("scanGravimetricStrength") == 0.0
assert RifterFit.ship.getModifiedItemAttr("scanLadarStrength") == 9.6
assert RifterFit.ship.getModifiedItemAttr("scanMagnetometricStrength") == 0.0
assert RifterFit.ship.getModifiedItemAttr("scanRadarStrength") == 0.0
assert RifterFit.ship.getModifiedItemAttr("scanResolution") == 825.0
assert RifterFit.ship.getModifiedItemAttr("scanSpeed") == 1500.0
assert RifterFit.ship.getModifiedItemAttr("shieldCapacity") == 562.5
assert RifterFit.ship.getModifiedItemAttr("shieldEmDamageResonance") == 1.0
assert RifterFit.ship.getModifiedItemAttr("shieldExplosiveDamageResonance") == 0.5
assert RifterFit.ship.getModifiedItemAttr("shieldKineticDamageResonance") == 0.6
assert RifterFit.ship.getModifiedItemAttr("shieldRechargeRate") == 468750.0
assert RifterFit.ship.getModifiedItemAttr("shieldThermalDamageResonance") == 0.8
assert RifterFit.ship.getModifiedItemAttr("shieldUniformity") == 1
assert RifterFit.ship.getModifiedItemAttr("shipBonusMF") == 5.0
assert RifterFit.ship.getModifiedItemAttr("shipBonusMF2") == 10.0
assert RifterFit.ship.getModifiedItemAttr("shipScanResistance") == 0.0
assert RifterFit.ship.getModifiedItemAttr("signatureRadius") == 35.0
assert RifterFit.ship.getModifiedItemAttr("structureUniformity") == 1.0
assert RifterFit.ship.getModifiedItemAttr("techLevel") == 1.0
assert RifterFit.ship.getModifiedItemAttr("thermalDamageResonance") == 0.67
assert RifterFit.ship.getModifiedItemAttr("turretSlotsLeft") == 3.0
assert RifterFit.ship.getModifiedItemAttr("typeColorScheme") == 11342.0
assert RifterFit.ship.getModifiedItemAttr("uniformity") == 1.0
assert RifterFit.ship.getModifiedItemAttr("upgradeCapacity") == 400.0
assert RifterFit.ship.getModifiedItemAttr("upgradeSlotsLeft") == 3.0
assert RifterFit.ship.getModifiedItemAttr("volume") == 27289.0
assert RifterFit.ship.getModifiedItemAttr("warpCapacitorNeed") == 1.12e-06
assert RifterFit.ship.getModifiedItemAttr("warpFactor") == 0.0
assert RifterFit.ship.getModifiedItemAttr("warpSpeedMultiplier") == 5.0
# noinspection PyShadowingNames
def test_rifter_coprocessor(DB, Saveddata, RifterFit):
char5 = Saveddata['Character'].getAll5()
char0 = Saveddata['Character'].getAll0()
RifterFit.character = char0
mod = Saveddata['Module'](DB['db'].getItem("Co-Processor II"))
mod.state = Saveddata['State'].OFFLINE
RifterFit.modules.append(mod)
assert RifterFit.ship.getModifiedItemAttr("cpuOutput") == 130
RifterFit.calculateModifiedAttributes()
assert RifterFit.ship.getModifiedItemAttr("cpuOutput") == 130
mod.state = Saveddata['State'].ONLINE
RifterFit.clear()
RifterFit.calculateModifiedAttributes()
assert RifterFit.ship.getModifiedItemAttr("cpuOutput") == 143
RifterFit.character = char5
RifterFit.clear()
RifterFit.calculateModifiedAttributes()
assert RifterFit.ship.getModifiedItemAttr("cpuOutput") == 178.75