1010
1111from climada .entity .exposures .black_marble import country_iso_geom , BlackMarble , \
1212_process_land , _get_gdp , _get_income_group , fill_econ_indicators , add_sea , \
13- _set_econ_indicators
13+ _set_econ_indicators , _fill_admin1_geom , _filter_admin1
1414from climada .entity .exposures .nightlight import NOAA_BORDER , NOAA_RESOLUTION_DEG
1515from climada .util .constants import ONE_LAT_KM
1616from climada .util .coordinates import coord_on_land
1919 category = 'cultural' , name = 'admin_0_countries' )
2020SHP_FILE = shapereader .Reader (SHP_FN )
2121
22+ ADM1_FILE = shapereader .natural_earth (resolution = '10m' ,
23+ category = 'cultural' ,
24+ name = 'admin_1_states_provinces' )
25+ ADM1_FILE = shapereader .Reader (ADM1_FILE )
26+
2227class TestCountryIso (unittest .TestCase ):
2328 """Test country_iso function."""
2429
@@ -30,10 +35,10 @@ def test_che_kos_pass(self):
3035 self .assertEqual (len (iso_name ), len (country_name ))
3136 self .assertTrue ('CHE' in iso_name )
3237 self .assertTrue ('KOS' in iso_name )
33- self .assertEqual (iso_name ['CHE' ][0 ], 93 )
38+ self .assertEqual (iso_name ['CHE' ][0 ], 41 )
3439 self .assertEqual (iso_name ['CHE' ][1 ], 'Switzerland' )
3540 self .assertIsInstance (iso_name ['CHE' ][2 ], shapely .geometry .multipolygon .MultiPolygon )
36- self .assertEqual (iso_name ['KOS' ][0 ], 66 )
41+ self .assertEqual (iso_name ['KOS' ][0 ], 252 )
3742 self .assertEqual (iso_name ['KOS' ][1 ], 'Kosovo' )
3843 self .assertIsInstance (iso_name ['KOS' ][2 ], shapely .geometry .multipolygon .MultiPolygon )
3944
@@ -43,7 +48,7 @@ def test_haiti_pass(self):
4348 iso_name , _ = country_iso_geom (country_name , SHP_FILE )
4449
4550 self .assertEqual (len (iso_name ), len (country_name ))
46- self .assertEqual (iso_name ['HTI' ][0 ], 113 )
51+ self .assertEqual (iso_name ['HTI' ][0 ], 100 )
4752 self .assertEqual (iso_name ['HTI' ][1 ], 'Haiti' )
4853 self .assertIsInstance (iso_name ['HTI' ][2 ], shapely .geometry .multipolygon .MultiPolygon )
4954
@@ -59,7 +64,7 @@ def test_bolivia_pass(self):
5964 iso_name , _ = country_iso_geom (country_name , SHP_FILE )
6065
6166 self .assertEqual (len (iso_name ), len (country_name ))
62- self .assertEqual (iso_name ['BOL' ][0 ], 4 )
67+ self .assertEqual (iso_name ['BOL' ][0 ], 31 )
6368 self .assertEqual (iso_name ['BOL' ][1 ], 'Bolivia' )
6469 self .assertIsInstance (iso_name ['BOL' ][2 ], shapely .geometry .multipolygon .MultiPolygon )
6570
@@ -69,6 +74,67 @@ def test_korea_pass(self):
6974 with self .assertRaises (ValueError ):
7075 country_iso_geom (country_name , SHP_FILE )
7176
77+ class TestProvinces (unittest .TestCase ):
78+ """Tst black marble with admin1."""
79+ def test_fill_admin1_geom_pass (self ):
80+ """Test function _fill_admin1_geom pass."""
81+ iso3 = 'ESP'
82+ admin1_rec = list (ADM1_FILE .records ())
83+
84+ prov_list = ['Barcelona' ]
85+ res_bcn = _fill_admin1_geom (iso3 , admin1_rec , prov_list )
86+ self .assertEqual (len (res_bcn ), 1 )
87+ self .assertIsInstance (res_bcn [0 ], shapely .geometry .multipolygon .MultiPolygon )
88+
89+ prov_list = ['Barcelona' , 'Tarragona' ]
90+ res_bcn = _fill_admin1_geom (iso3 , admin1_rec , prov_list )
91+ self .assertEqual (len (res_bcn ), 2 )
92+ self .assertIsInstance (res_bcn [0 ], shapely .geometry .multipolygon .MultiPolygon )
93+ self .assertIsInstance (res_bcn [1 ], shapely .geometry .multipolygon .MultiPolygon )
94+
95+ def test_fill_admin1_geom_fail (self ):
96+ """Test function _fill_admin1_geom fail."""
97+ iso3 = 'CHE'
98+ admin1_rec = list (ADM1_FILE .records ())
99+
100+ prov_list = ['Barcelona' ]
101+ with self .assertRaises (ValueError ):
102+ with self .assertLogs ('climada.entity.exposures.black_marble' , level = 'ERROR' ) as cm :
103+ _fill_admin1_geom (iso3 , admin1_rec , prov_list )
104+ self .assertIn ('Barcelona not found. Possible provinces of CHE are: ' , cm .output [0 ])
105+
106+ def test_country_iso_geom_pass (self ):
107+ """Test country_iso_geom pass."""
108+ countries = {'Switzerland' : []}
109+ _ , cntry_admin1 = country_iso_geom (countries , SHP_FILE )
110+ self .assertEqual (cntry_admin1 , {'CHE' : []})
111+
112+ countries = ['Switzerland' ]
113+ _ , cntry_admin1 = country_iso_geom (countries , SHP_FILE )
114+ self .assertEqual (cntry_admin1 , {'CHE' : []})
115+ self .assertIsInstance (countries , list )
116+
117+ countries = {'Switzerland' : 'Zürich' }
118+ _ , cntry_admin1 = country_iso_geom (countries , SHP_FILE )
119+ self .assertEqual (len (cntry_admin1 ), 1 )
120+ self .assertIsInstance (cntry_admin1 ['CHE' ][0 ], shapely .geometry .multipolygon .MultiPolygon )
121+
122+ def test_filter_admin1_pass (self ):
123+ """Test _filter_admin1 pass."""
124+ exp_bkmrb = BlackMarble ()
125+ exp_bkmrb .value = np .arange (100 )
126+ exp_bkmrb .coord = np .empty ((100 , 2 ))
127+ exp_bkmrb .coord [:, 0 ] = 41.39
128+ exp_bkmrb .coord [:, 1 ] = np .linspace (0 , 3 , 100 )
129+ admin1_rec = list (ADM1_FILE .records ())
130+ for rec in admin1_rec :
131+ if 'Barcelona' in rec .attributes ['name' ]:
132+ bcn_geom = rec .geometry
133+
134+ _filter_admin1 (exp_bkmrb , bcn_geom )
135+ for coord in exp_bkmrb .coord :
136+ self .assertTrue (bcn_geom .contains (shapely .geometry .Point ([coord [1 ],coord [0 ]])))
137+
72138class TestNightLight (unittest .TestCase ):
73139 """Test nightlight functions."""
74140
@@ -312,4 +378,5 @@ def test_set_econ_indicators_pass(self):
312378TESTS = unittest .TestLoader ().loadTestsFromTestCase (TestEconIndices )
313379TESTS .addTests (unittest .TestLoader ().loadTestsFromTestCase (TestCountryIso ))
314380TESTS .addTests (unittest .TestLoader ().loadTestsFromTestCase (TestNightLight ))
381+ TESTS .addTests (unittest .TestLoader ().loadTestsFromTestCase (TestProvinces ))
315382unittest .TextTestRunner (verbosity = 2 ).run (TESTS )
0 commit comments