Source code for safe.impact_functions.test_real_impact_functions
"""Works with real library impact functions rather than test examples
"""
import unittest
from safe.impact_functions.core import get_admissible_plugins
from safe.impact_functions.core import requirements_collect
[docs]class Test_real_plugins(unittest.TestCase):
"""Tests of Risiko calculations
"""
[docs] def test_filtering_of_impact_functions(self):
"""Impact functions are filtered correctly
"""
# Check empty call returns all
P = get_admissible_plugins([])
#print
#for p in P:
# print p, P[p]
# List the known impact function names
# based on their class names - not their titles
msg = 'Available impact functions are: %s' % str(P.keys())
#assert 'Earthquake Guidelines Function' in P, msg
assert 'Padang Earthquake Building Damage Function' in P, msg
# Added by Tim to replace WB (see below)
assert 'Flood Building Impact Function' in P, msg
# Tim commented out W B Flood Evacuation Function - its in experimental
#assert 'W B Flood Evacuation Function' in P, msg
#assert 'W B Flood Evacuation Function' in P, msg
#assert 'Tephra Building Impact Function' in P, msg
#assert 'Tephra Population Impact Function' in P, msg
#assert 'Flood Road Impact Function' in P, msg
assert 'I T B Earthquake Building Damage Function' in P, msg
assert 'I T B Fatality Function' in P, msg
assert 'Categorised Hazard Building Impact Function' in P, msg
assert 'Flood Evacuation Function' in P, msg
# This one should get 2 earthquake building impact functions
D1 = {'category': 'hazard', 'subcategory': 'earthquake', 'unit': 'MMI'}
D2 = {'category': 'exposure', 'datatype': 'itb',
'subcategory': 'structure'}
# Add layertype
D1['layertype'] = 'raster'
D2['layertype'] = 'vector'
P = get_admissible_plugins([D1, D2])
msg = 'Expected: len(P) >= 2, Got: len(P) is %i' % len(P)
assert len(P) >= 1, msg # Depending on other tests there could be more
#assert 'Earthquake Guidelines Function' in P
assert 'Padang Earthquake Building Damage Function' in P
# This one should get 3 flood population impact functions
D1 = {'category': 'hazard', 'subcategory': 'flood', 'unit': 'm'}
D2 = {'category': 'exposure', 'subcategory': 'population'}
# Add layertype
D1['layertype'] = 'raster'
D2['layertype'] = 'raster'
P = get_admissible_plugins([D1, D2])
assert len(P) >= 1 # Depending on other tests there could be more
#assert 'W B Flood Evacuation Function' in P
# Try form where only one dictionary is passed
# This one gets all the flood related impact functions
# Try to get general inundation building impact function
f_name = 'Flood Building Impact Function'
P = get_admissible_plugins(D1)
assert len(P) >= 2
#assert 'W B Flood Evacuation Function' in P
assert f_name in P
#assert 'Flood Road Impact Function' in P
D1 = {'category': 'hazard', 'subcategory': 'tsunami'}
D2 = {'category': 'exposure', 'subcategory': 'structure'}
# Add layertype
#D1['layertype'] = 'raster' # Not required for flood building impact
D2['layertype'] = 'vector'
P = get_admissible_plugins([D1, D2])
msg = 'Expected name "%s" in P: %s' % (f_name, P)
assert f_name in P, msg
# Get requirements from expected function
P_all = get_admissible_plugins()
assert P[f_name] == P_all[f_name]
requirelines = requirements_collect(P[f_name])
for i, D in enumerate([D1, D2]):
for key in D:
msg = 'Key %s was not found in %s' % (key, requirelines[i])
assert key in requirelines[i], msg
msg = 'Val %s was not found in %s' % (D[key], requirelines[i])
assert D[key] in requirelines[i], msg
if __name__ == '__main__':
suite = unittest.makeSuite(Test_real_plugins, 'test')
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)