Coverage for test/unit/elements/aggregation/test_aggregation.py: 98%
85 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-12 17:09 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-12 17:09 +0000
1import unittest
2from typing import List, Tuple
4import networkx as nx
6import bim2sim.elements.aggregation
7import bim2sim.elements.aggregation.hvac_aggregations
8from bim2sim.elements.mapping.attribute import Attribute, multi_calc
9from bim2sim.elements.base_elements import ProductBased
10from bim2sim.elements import aggregation
11from bim2sim.elements import hvac_elements as hvac
12from bim2sim.elements.hvac_elements import HVACPort
13from bim2sim.elements.graphs.hvac_graph import HvacGraph
14from test.unit.elements.helper import SetupHelperHVAC
17class SampleElement(ProductBased):
18 attr1 = Attribute()
19 attr2 = Attribute()
20 attr3 = Attribute()
23class SampleElementAggregation(
24 bim2sim.elements.aggregation.AggregationMixin, SampleElement):
26 def _calc_attr1(self, name):
27 total = 0
28 for e in self.elements:
29 total += e.attr1
30 return total / len(self.elements)
31 attr1 = SampleElement.attr1.to_aggregation(_calc_attr1)
33 @multi_calc
34 def _calc_multi(self):
35 return {
36 'attr2': 2,
37 'attr3': 3
38 }
39 attr2 = SampleElement.attr2.to_aggregation(_calc_multi)
40 attr3 = SampleElement.attr3.to_aggregation(_calc_multi)
43class TestAggregation(unittest.TestCase):
44 """Test abstract Aggregation"""
46 def test_instantiation(self):
47 sample1 = SampleElement(attr1=5)
48 sample2 = SampleElement(attr1=15)
50 agg = SampleElementAggregation([sample1, sample2])
52 self.assertIsInstance(agg, SampleElement)
53 self.assertEqual(10, agg.attr1)
54 self.assertEqual(2, agg.attr2)
55 self.assertEqual(3, agg.attr3)
58# --- domain Aggregations ---
60class SampleHVACElement(hvac.HVACProduct):
61 attr1 = Attribute()
62 attr2 = Attribute()
63 attr3 = Attribute()
66class SampleHVACElementAggregation(
67 bim2sim.elements.aggregation.hvac_aggregations.HVACAggregationMixin, SampleHVACElement):
69 @classmethod
70 def find_matches(cls, graph: HvacGraph
71 ) -> Tuple[List[nx.Graph], List[dict]]:
72 return [graph], [{}]
74 @classmethod
75 def get_edge_ports(cls, graph) -> List[HVACPort]:
76 return []
78 def _calc_attr1(self, name):
79 total = 0
80 for e in self.elements:
81 total += e.attr1
82 return total / len(self.elements)
83 attr1 = SampleHVACElement.attr1.to_aggregation(_calc_attr1)
85 @multi_calc
86 def _calc_multi(self):
87 return {
88 'attr2': 2,
89 'attr3': 3
90 }
91 attr2 = SampleHVACElement.attr2.to_aggregation(_calc_multi)
92 attr3 = SampleHVACElement.attr3.to_aggregation(_calc_multi)
95class AggregationHelper(SetupHelperHVAC):
97 def get_setup_sample1(self):
98 """get consumer circuit made of 2 parallel pumps (equal size),
99 space heater and pipes"""
100 flags = {}
101 with self.flag_manager(flags):
102 # generator circuit
103 eles = [self.element_generator(
104 SampleHVACElement, attr1=10 * (i+1)) for i in range(3)]
106 # connect
107 self.connect_strait(eles)
109 flags['connect'] = [eles[0], eles[-1]]
110 graph = HvacGraph(eles)
111 return graph, flags
114class TestHVACAggregation(unittest.TestCase):
115 helper = None
117 @classmethod
118 def setUpClass(cls):
119 cls.helper = AggregationHelper()
121 def tearDown(self) -> None:
122 self.helper.reset()
124 def test_instantiation(self):
125 setup, flags = self.helper.get_setup_sample1()
126 matches, metas = SampleHVACElementAggregation.find_matches(setup)
127 agg = SampleHVACElementAggregation(setup, matches[0], **metas[0])
129 self.assertIsInstance(agg, SampleHVACElement)
130 self.assertEqual(20, agg.attr1)
131 self.assertEqual(2, agg.attr2)
132 self.assertEqual(3, agg.attr3)
135if __name__ == '__main__':
136 unittest.main()