130 lines
5.8 KiB
Python
130 lines
5.8 KiB
Python
import unittest
|
|
from unittest.mock import MagicMock
|
|
from nose.tools import eq_
|
|
from numpy import array
|
|
from numpy.testing import assert_almost_equal
|
|
from helix.calculators.ballast_calculator import BallastCalculator
|
|
from helix.calculators.summary_values_calculator import SummaryValuesCalculator
|
|
from helix.constants.anchor_type import AnchorType
|
|
from helix.constants.module_type_constants.dual_tilt_96_cell_constants import DualTilt96CellConstants
|
|
from helix.constants.panel_type import PanelType
|
|
from helix.constants.system_type import SystemType
|
|
from helix.models.panel import Panel
|
|
from helix.models.subarray import Subarray
|
|
|
|
|
|
class SummaryValuesTest(unittest.TestCase):
|
|
def setUp(self):
|
|
self.user_values = MagicMock()
|
|
self.user_values.anchor_type.return_value = AnchorType.OMG_PowerGrip
|
|
self.user_values.max_system_pressure.return_value = 100
|
|
self.user_values.module_system_constants.return_value = DualTilt96CellConstants()
|
|
self.user_values.system_type.return_value = SystemType.dualTilt
|
|
|
|
self.c_p_matrix = array([[0.784136, 0.697451, 0.684466, 0.546005],
|
|
[0.594876, 0.524444, 0.513894, 0.401395],
|
|
[0.368824, 0.324879, 0.318296, 0.248104],
|
|
[0.206095, 0.182617, 0.179101, 0.141601],
|
|
[0.060000, 0.050000, 0.052000, 0.039000]])
|
|
self.q_z = 37.72825742
|
|
|
|
self.subject = SummaryValuesCalculator(self.user_values)
|
|
self.ballast_calculator = BallastCalculator(self.user_values)
|
|
|
|
def test_summary_values(self):
|
|
panels = [
|
|
Panel(id=1, ballast=1, wind_anchors=2, pressure=12.89, wind_zone=0, panel_type=PanelType.Corner),
|
|
Panel(id=2, ballast=5, wind_anchors=0, pressure=11.22, wind_zone=1, panel_type=PanelType.NorthSouth),
|
|
Panel(id=3, ballast=0, wind_anchors=4, pressure=2.02, wind_zone=2, panel_type=PanelType.EastWest),
|
|
Panel(id=4, ballast=2, wind_anchors=1, pressure=3.36, wind_zone=3, panel_type=PanelType.Middle),
|
|
Panel(id=5, ballast=0, wind_anchors=0, pressure=20.83, wind_zone=4, panel_type=PanelType.Corner),
|
|
]
|
|
|
|
subarrays = [
|
|
Subarray(subarray_number=0, start_row=0, size=5, required_seismic_anchors=0)
|
|
]
|
|
|
|
seismic_interval = 10
|
|
|
|
result = self.subject.summary_values(panels, subarrays, self.c_p_matrix, self.q_z, seismic_interval, self.ballast_calculator)
|
|
|
|
expected = [
|
|
{'label': 'Total System Weight (lbs)', 'value': 1943},
|
|
{'label': 'Max PSF', 'value': 20.83},
|
|
{'label': 'Avg PSF', 'value': 10.06},
|
|
{'label': 'Total Anchors', 'value': 7},
|
|
{'label': 'Total Ballast', 'value': 8},
|
|
{'label': 'Max Possible System Weight', 'value': 1563.0},
|
|
{'label': 'Max System Weight Ballast Block', 'value': 16},
|
|
{'label': 'Seismic Anchor Max. Spacing', 'value': seismic_interval}
|
|
]
|
|
eq_(result, expected)
|
|
|
|
def test_documentation_summary_values(self):
|
|
panels = [
|
|
Panel(id=1, ballast=1, wind_anchors=2, pressure=12.89, wind_zone=0, panel_type=PanelType.Corner),
|
|
Panel(id=2, ballast=5, wind_anchors=0, pressure=11.22, wind_zone=1, panel_type=PanelType.NorthSouth),
|
|
Panel(id=3, ballast=0, wind_anchors=4, pressure=2.02, wind_zone=2, panel_type=PanelType.EastWest),
|
|
Panel(id=4, ballast=2, wind_anchors=1, pressure=3.36, wind_zone=3, panel_type=PanelType.Middle),
|
|
Panel(id=5, ballast=0, wind_anchors=0, pressure=20.83, wind_zone=4, panel_type=PanelType.Corner),
|
|
]
|
|
|
|
subarrays = [
|
|
Subarray(subarray_number=0, start_row=0, size=5, required_seismic_anchors=0)
|
|
]
|
|
|
|
seismic_interval = 10
|
|
|
|
result = self.subject.documentation_summary_values(panels, subarrays, self.c_p_matrix, self.q_z, seismic_interval, self.ballast_calculator)
|
|
|
|
expected = {
|
|
'total_system_weight': 1943,
|
|
'max_psf': 20.83,
|
|
'ave_psf': 10.06,
|
|
'total_anchors': 7,
|
|
'total_ballast': 8,
|
|
'max_possible_system_weight': 1563.0,
|
|
'max_system_weight_ballast_block': 16,
|
|
'seismic_anchor_max_spacing': 10
|
|
}
|
|
|
|
eq_(result, expected)
|
|
|
|
def test_system_weight_and_pressure(self):
|
|
panels = [
|
|
Panel(id=1, pressure=12.89),
|
|
Panel(id=2, pressure=11.22),
|
|
Panel(id=3, pressure=2.02),
|
|
Panel(id=4, pressure=3.36),
|
|
Panel(id=5, pressure=20.83),
|
|
]
|
|
assert_almost_equal(self.subject.system_weight_and_pressure(panels), (1943.1261538, 10.064), decimal=6)
|
|
|
|
def test_find_max_system_weight(self):
|
|
panels = [
|
|
Panel(id=1, wind_zone=0, panel_type=PanelType.Corner),
|
|
Panel(id=2, wind_zone=1, panel_type=PanelType.NorthSouth),
|
|
Panel(id=3, wind_zone=2, panel_type=PanelType.EastWest),
|
|
Panel(id=4, wind_zone=3, panel_type=PanelType.Middle),
|
|
Panel(id=5, wind_zone=4, panel_type=PanelType.Corner),
|
|
]
|
|
|
|
result = self.subject.find_max_system_weight(panels, self.c_p_matrix, self.q_z, self.ballast_calculator)
|
|
|
|
assert_almost_equal(result, (1563, 16), decimal=0)
|
|
|
|
def test_find_max_system_weight_does_not_modify_panels_list(self):
|
|
panels = [
|
|
Panel(id=1, wind_zone=0, panel_type=PanelType.Corner),
|
|
Panel(id=2, wind_zone=1, panel_type=PanelType.NorthSouth),
|
|
Panel(id=3, wind_zone=2, panel_type=PanelType.EastWest),
|
|
Panel(id=4, wind_zone=3, panel_type=PanelType.Middle),
|
|
Panel(id=5, wind_zone=4, panel_type=PanelType.Corner),
|
|
]
|
|
|
|
original_panels = list(panels)
|
|
|
|
self.subject.find_max_system_weight(panels, self.c_p_matrix, self.q_z, self.ballast_calculator)
|
|
|
|
eq_(panels, original_panels)
|