11import pytest
2+ import pandas as pd
3+ import numpy as np
24from windpowerlib import WindFarm , WindTurbine
5+ from windpowerlib .tools import WindpowerlibUserWarning
36
47
58class TestWindFarm :
@@ -13,18 +16,39 @@ def setup_class(self):
1316 'turbine_type' : 'V90/2000' ,
1417 'nominal_power' : 2e6 }
1518
16- def test_initialization (self ):
17- """simple initialization"""
18- test_farm = { 'wind_turbine_fleet' : [
19+ def test_initialization_list (self ):
20+ """test simple initialization with wind turbine fleet list """
21+ wind_turbine_fleet = [
1922 {'wind_turbine' : WindTurbine (** self .test_turbine ),
2023 'number_of_turbines' : 3 },
2124 {'wind_turbine' : WindTurbine (** self .test_turbine_2 ),
22- 'number_of_turbines' : 2 }]}
23- windfarm = WindFarm (** test_farm )
24- assert windfarm .nominal_power == 3 * 4.2e6 + 2 * 2e6
25+ 'number_of_turbines' : 2 }]
26+ windfarm = WindFarm (wind_turbine_fleet = wind_turbine_fleet )
27+ assert 3 * 4.2e6 + 2 * 2e6 == windfarm .nominal_power
28+
29+ def test_initialization_list_2 (self ):
30+ """test simple initialization with wind turbine fleet list where
31+ once number of turbines and once total capacity is provided"""
32+ wind_turbine_fleet = [
33+ {'wind_turbine' : WindTurbine (** self .test_turbine ),
34+ 'number_of_turbines' : 3 },
35+ {'wind_turbine' : WindTurbine (** self .test_turbine_2 ),
36+ 'total_capacity' : 2 * 2e6 }]
37+ windfarm = WindFarm (wind_turbine_fleet = wind_turbine_fleet )
38+ assert 3 * 4.2e6 + 2 * 2e6 == windfarm .nominal_power
39+
40+ def test_initialization_dataframe (self ):
41+ """test simple initialization with wind turbine fleet dataframe"""
42+ wind_turbine_fleet = pd .DataFrame (
43+ data = {'wind_turbine' : [WindTurbine (** self .test_turbine ),
44+ WindTurbine (** self .test_turbine_2 )],
45+ 'number_of_turbines' : [3 , 2 ]})
46+ windfarm = WindFarm (wind_turbine_fleet = wind_turbine_fleet )
47+ assert 3 * 4.2e6 + 2 * 2e6 == windfarm .nominal_power
2548
2649 def test_initialization_2 (self ):
27- """WindTurbine in wind_turbine_fleet not initialized"""
50+ """test catching error when WindTurbine in wind_turbine_fleet
51+ not initialized"""
2852 test_farm = {'wind_turbine_fleet' : [
2953 {'wind_turbine' : None ,
3054 'number_of_turbines' : 3 }]}
@@ -33,28 +57,39 @@ def test_initialization_2(self):
3357 WindFarm (** test_farm )
3458
3559 def test_initialization_3 (self ):
36- """wind_turbine not specified in wind_turbine_fleet"""
37- test_farm = {'wind_turbine_fleet' : [
38- {'wind_turbines' : None ,
39- 'number_of_turbines' : 3 }]}
40- msg = 'Missing wind_turbine key in wind turbine'
60+ """test catching error when wind_turbine not specified in
61+ wind_turbine_fleet"""
62+ wind_turbine_fleet = pd .DataFrame (
63+ data = {'wind_turbines' : [WindTurbine (** self .test_turbine ),
64+ WindTurbine (** self .test_turbine_2 )],
65+ 'number_of_turbines' : [3 , 2 ]})
66+ msg = 'Missing wind_turbine key/column in wind_turbine_fleet'
4167 with pytest .raises (ValueError , match = msg ):
42- WindFarm (** test_farm )
68+ WindFarm (wind_turbine_fleet = wind_turbine_fleet )
4369
44- def test_initialization_4 (self ):
45- """deduce number_of_turbines from total_capacity"""
46- total_capacity = 3e6
47- test_farm = {'wind_turbine_fleet' : [
48- {'wind_turbine' : WindTurbine (** self .test_turbine_2 ),
49- 'total_capacity' : total_capacity }]}
50- windfarm = WindFarm (** test_farm )
51- number_of_turbines = total_capacity / \
52- self .test_turbine_2 ['nominal_power' ]
53- assert number_of_turbines == windfarm .wind_turbine_fleet [0 ][
54- 'number_of_turbines' ]
70+ def test_initialization_4 (self , recwarn ):
71+ """test overwriting and raising warning when number_of_turbines and
72+ total_capacity in wind turbine fleet do not fit"""
73+ wt1 = WindTurbine (** self .test_turbine )
74+ wt2 = WindTurbine (** self .test_turbine_2 )
75+ wind_turbine_fleet = pd .DataFrame (
76+ data = {'wind_turbine' : [wt1 , wt2 ],
77+ 'number_of_turbines' : [3 , 2 ],
78+ 'total_capacity' : [3 , np .nan ]},
79+ index = [0 , 1 ])
80+ windfarm = WindFarm (wind_turbine_fleet = wind_turbine_fleet )
81+ total_cap_wt1_expected = \
82+ wt1 .nominal_power * wind_turbine_fleet .loc [0 , 'number_of_turbines' ]
83+ assert windfarm .wind_turbine_fleet .loc [0 , 'total_capacity' ] == \
84+ total_cap_wt1_expected
85+ total_cap_wt2_expected = \
86+ wt2 .nominal_power * wind_turbine_fleet .loc [1 , 'number_of_turbines' ]
87+ assert windfarm .wind_turbine_fleet .loc [1 , 'total_capacity' ] == \
88+ total_cap_wt2_expected
89+ assert recwarn .pop (WindpowerlibUserWarning )
5590
5691 def test_initialization_5 (self ):
57- """deducing number_of_turbines from total_capacity fails """
92+ """test catching error when number of turbines cannot be deduced """
5893 wt = WindTurbine (** self .test_turbine )
5994 wt .nominal_power = None
6095 test_farm = {'wind_turbine_fleet' : [
@@ -65,11 +100,12 @@ def test_initialization_5(self):
65100 WindFarm (** test_farm )
66101
67102 def test_initialization_6 (self ):
68- """number_of_turbines and total_capacity not given"""
103+ """test catching error when neither number_of_turbines nor
104+ total_capacity is provided"""
69105 test_farm = {'wind_turbine_fleet' : [
70106 {'wind_turbine' : WindTurbine (** self .test_turbine ),
71107 'number_of_turbine' : 3e6 }]}
72- msg = 'Please provide `number_of_turbines` or `total_capacity` '
108+ msg = 'Number of turbines of type '
73109 with pytest .raises (ValueError , match = msg ):
74110 WindFarm (** test_farm )
75111
@@ -84,3 +120,10 @@ def test_mean_hub_height(self):
84120 assert 97.265 == pytest .approx (
85121 windfarm .mean_hub_height ().hub_height , 1e-3 )
86122
123+ def test_repr (self ):
124+ """Test string representation of WindFarm"""
125+ test_fleet = [{'wind_turbine' : WindTurbine (** self .test_turbine ),
126+ 'number_of_turbines' : 2 }]
127+ assert 'E-126/4200' in repr (WindFarm (wind_turbine_fleet = test_fleet ))
128+
129+
0 commit comments