diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index feb22dcbc..8d529247b 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -16,6 +16,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -43,6 +55,10 @@
+
+
+
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index be2a46a1e..62c6717d7 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -108,7 +108,7 @@ to prevent the test from timing out while you step through the code:
* Add new classes to corresponding service translator test. [```test/services/.../translator```](test/services)
* Add the required creators to:
- [```pb_creators.py```](test/streaming/get/pb_creators.py)
- - [```cim_creators.py```](test/cim/cim_creators.py)
+ - [```fill_fields.py```](test/cim/fill_fields.py)
- If a relationship involving a branch class has been introduced. Add an entry in SAMPLE SET to ensure the correct leaf class is created for testing.
* Add test for each new comparator to [test/services/...](test/services) package.
* [network](test/services/network/test_network_service_comparator.py)
diff --git a/changelog.md b/changelog.md
index 779a70e1e..51bfe6e6b 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,16 +1,34 @@
# Zepben Python SDK
## [1.3.0] - UNRELEASED
### Breaking Changes
-* None.
+* Updated `SetDirection` to correctly use the `@singledispatchmethod` registration `run` instead of the old `run_terminal`. Simply replace your `run_terminal`
+ call with `run`.
+* `EquipmentTreeBuilder.roots` is now a `dict` keyed by the `start_item` rather than a `Generator`. This allows better lookup of root items when you are looking
+ for an explicit items tree.
+* Renamed `PanDemandResponseFunction` constructor argument `appliances` -> `appliance` to match the class property.
+* Deprecated the following side-hustle shadowy names for `PowerSystemResource.asset_info`, just use `asset_info` directly:
+ * `Conductor.wire_info`
+ * `CurrentTransformer.current_transformer_info`
+ * `PotentialTransformer.potential_transformer_info`
+ * `PowerTransformer.power_transformer_info`
+ * `ProtectionRelayFunction.relay_info`
+ * `ShuntCompensator.shunt_compensator_info`
+ * `Switch.switch_info`
### New Features
* None.
### Enhancements
-* None.
+* Added sequence unpacking support for `UnresolvedReference` and `ObjectDifference`.
+* `SetDirection.run` now supports `ConductingEquipment`.
+* Fixed types on all overrides for `PowerSystemResource.asset_info`, removing the need to shadow them with type specific variants.
+* You can now pass a list of `TransformerEndRatedS` to the `PowerTransformerEnd` constructor via the `ratings` argument.
+* Updated all `Callable` type signatures for callables with unused return values to accept `Any` instead of `None`. The return is still unused, but requiring
+ `None` raises types errors if anything is actually returned.
### Fixes
-* None.
+* Fixed the packing and unpacking of timestamps for `Agreement.validity_interval` in gRPC messages. Fix also ensures all other timestamps correctly support
+ `None` when optional.
### Notes
* None.
@@ -23,7 +41,8 @@
* `MeasurementValue.time_stamp`
* `RelayInfo.curve_setting`
* `RelayInfo.reclose_fast`
-* Removed `TracedPhases`. `Terminal.normalPhases` and `Terminal.currentPhases` should be used instead of `Terminal.tracedPhases` going forward. (missed in 0.48.0)
+* Removed `TracedPhases`. `Terminal.normalPhases` and `Terminal.currentPhases` should be used instead of `Terminal.tracedPhases` going forward. (missed in
+ 0.48.0)
### New Features
* Added the following new CIM classes:
@@ -58,7 +77,8 @@
* Added `AcLineSegment.wire_info_for_phase(phase: SinglePhaseKind)` to retrieve the `WireInfo` associated with a given phase of a conductor.
### Enhancements
-* * `BaseService.contains` has been been expanded to support objects in addition to mRIDs.
+*
+ * `BaseService.contains` has been been expanded to support objects in addition to mRIDs.
* `Agreement` now supports `validity_interval`, the date and time interval the agreement is valid (from going into effect to termination).
* `StreetDetail` now supports extension `building_number`, the number of the building.
* `TownDetail` now supports `country`, the name of the country.
@@ -66,7 +86,7 @@
### Fixes
* Reordered the feeder equipment and direction assignment on database read to prevent parallel feeders from tracing back into the zone substation.
-* `NetworkDatabaseTables`, `CustomerDatabaseTables`, `DiagramDatabaseTables` and `BaseEntryWriter` can now be imported from `zepben.ewb` and are officially
+* `NetworkDatabaseTables`, `CustomerDatabaseTables`, `DiagramDatabaseTables` and `BaseEntryWriter` can now be imported from `zepben.ewb` and are officially
regarded as public.
### Notes
diff --git a/src/zepben/ewb/database/paths/local_ewb_data_file_paths.py b/src/zepben/ewb/database/paths/local_ewb_data_file_paths.py
index 01ffa9be6..d5fb2d225 100644
--- a/src/zepben/ewb/database/paths/local_ewb_data_file_paths.py
+++ b/src/zepben/ewb/database/paths/local_ewb_data_file_paths.py
@@ -7,7 +7,7 @@
from datetime import date
from pathlib import Path
-from typing import Callable, Generator, Union
+from typing import Callable, Generator, Union, Any
from zepben.ewb import require
from zepben.ewb.database.paths.ewb_data_file_paths import EwbDataFilePaths
@@ -20,7 +20,7 @@ def __init__(
self,
base_dir: Union[Path, str],
create_path: bool = False,
- create_directories_func: Callable[[Path], None] = lambda it: it.mkdir(parents=True),
+ create_directories_func: Callable[[Path], Any] = lambda it: it.mkdir(parents=True),
is_directory: Callable[[Path], bool] = Path.is_dir,
exists: Callable[[Path], bool] = Path.exists,
list_files: Callable[[Path], Generator[Path, None, None]] = Path.iterdir,
diff --git a/src/zepben/ewb/database/sqlite/common/base_collection_writer.py b/src/zepben/ewb/database/sqlite/common/base_collection_writer.py
index 69f96a792..6eea5d268 100644
--- a/src/zepben/ewb/database/sqlite/common/base_collection_writer.py
+++ b/src/zepben/ewb/database/sqlite/common/base_collection_writer.py
@@ -7,7 +7,7 @@
import logging
from abc import ABC, abstractmethod
-from typing import Callable, TypeVar, Iterable
+from typing import Callable, TypeVar, Iterable, Any
from zepben.ewb.database.sqlite.extensions.prepared_statement import SqlException
@@ -35,7 +35,7 @@ def save(self) -> bool:
"""
pass
- def _save_each(self, items: Iterable[T], saver: Callable[[T], bool], on_save_failure: Callable[[T, Exception], None]) -> bool:
+ def _save_each(self, items: Iterable[T], saver: Callable[[T], bool], on_save_failure: Callable[[T, Exception], Any]) -> bool:
"""
Save each of the [items] to the database.
@@ -56,7 +56,7 @@ def _save_each(self, items: Iterable[T], saver: Callable[[T], bool], on_save_fai
return status
@staticmethod
- def _validate_save(it: T, saver: [[T], bool], on_save_failure: [[Exception], None]) -> bool:
+ def _validate_save(it: T, saver: Callable[[T], bool], on_save_failure: Callable[[Exception], Any]) -> bool:
"""
Validate that a save actually works, and convert all exceptions into failures with a callback.
diff --git a/src/zepben/ewb/database/sqlite/common/base_database_tables.py b/src/zepben/ewb/database/sqlite/common/base_database_tables.py
index 1969988e0..4c67ad06f 100644
--- a/src/zepben/ewb/database/sqlite/common/base_database_tables.py
+++ b/src/zepben/ewb/database/sqlite/common/base_database_tables.py
@@ -7,7 +7,7 @@
from abc import ABC
from sqlite3 import Connection, Cursor, ProgrammingError
-from typing import Dict, TypeVar, Type, Generator, Callable, Optional
+from typing import Dict, TypeVar, Type, Generator, Callable, Optional, Any
from zepben.ewb.database.sqlite.extensions.prepared_statement import PreparedStatement
from zepben.ewb.database.sqlite.tables.exceptions import MissingTableConfigException
@@ -90,7 +90,7 @@ def get_insert(self, type_: Type[TSqliteTable]) -> PreparedStatement:
except TypeError:
raise MissingTableConfigException("INTERNAL ERROR: Statements have not been prepared. You must call `prepare_insert_statements` first.")
- def for_each_table(self, action: Callable[[SqliteTable], None]):
+ def for_each_table(self, action: Callable[[SqliteTable], Any]):
"""
Call the `action` on each table.
diff --git a/src/zepben/ewb/database/sqlite/extensions/prepared_statement.py b/src/zepben/ewb/database/sqlite/extensions/prepared_statement.py
index 9eac19d03..6250bed08 100644
--- a/src/zepben/ewb/database/sqlite/extensions/prepared_statement.py
+++ b/src/zepben/ewb/database/sqlite/extensions/prepared_statement.py
@@ -82,7 +82,7 @@ def add_ratio(self, numerator_index: int, denominator_index: int, value: Optiona
self.add_value(numerator_index, value.numerator)
self.add_value(denominator_index, value.denominator)
- def try_execute_single_update(self, on_error: Optional[Callable[[Exception], None]] = None) -> bool:
+ def try_execute_single_update(self, on_error: Optional[Callable[[Exception], Any]] = None) -> bool:
"""
Execute an update on the database with the given `query`.
Failures will be logged as warnings.
diff --git a/src/zepben/ewb/database/sqlite/network/network_cim_writer.py b/src/zepben/ewb/database/sqlite/network/network_cim_writer.py
index 1be1c5f68..34a0cdbdd 100644
--- a/src/zepben/ewb/database/sqlite/network/network_cim_writer.py
+++ b/src/zepben/ewb/database/sqlite/network/network_cim_writer.py
@@ -1251,7 +1251,7 @@ def save_current_transformer(self, current_transformer: CurrentTransformer) -> b
table = self._database_tables.get_table(TableCurrentTransformers)
insert = self._database_tables.get_insert(TableCurrentTransformers)
- insert.add_value(table.current_transformer_info_mrid.query_index, self._mrid_or_none(current_transformer.current_transformer_info))
+ insert.add_value(table.current_transformer_info_mrid.query_index, self._mrid_or_none(current_transformer.asset_info))
insert.add_value(table.core_burden.query_index, current_transformer.core_burden)
return self._save_sensor(table, insert, current_transformer, "current transformer")
@@ -1280,7 +1280,7 @@ def save_potential_transformer(self, potential_transformer: PotentialTransformer
table = self._database_tables.get_table(TablePotentialTransformers)
insert = self._database_tables.get_insert(TablePotentialTransformers)
- insert.add_value(table.potential_transformer_info_mrid.query_index, self._mrid_or_none(potential_transformer.potential_transformer_info))
+ insert.add_value(table.potential_transformer_info_mrid.query_index, self._mrid_or_none(potential_transformer.asset_info))
insert.add_value(table.type.query_index, potential_transformer.type.short_name)
return self._save_sensor(table, insert, potential_transformer, "potential transformer")
@@ -1805,7 +1805,7 @@ def _save_conductor(self, table: TableConductors, insert: PreparedStatement, con
insert.add_value(table.length.query_index, conductor.length)
insert.add_value(table.design_temperature.query_index, conductor.design_temperature)
insert.add_value(table.design_rating.query_index, conductor.design_rating)
- insert.add_value(table.wire_info_mrid.query_index, self._mrid_or_none(conductor.wire_info))
+ insert.add_value(table.wire_info_mrid.query_index, self._mrid_or_none(conductor.asset_info))
return self._save_conducting_equipment(table, insert, conductor, description)
@@ -2243,7 +2243,7 @@ def save_power_transformer(self, power_transformer: PowerTransformer) -> bool:
insert.add_value(table.transformer_utilisation.query_index, power_transformer.transformer_utilisation)
insert.add_value(table.construction_kind.query_index, power_transformer.construction_kind.short_name)
insert.add_value(table.function.query_index, power_transformer.function.short_name)
- insert.add_value(table.power_transformer_info_mrid.query_index, self._mrid_or_none(power_transformer.power_transformer_info))
+ insert.add_value(table.power_transformer_info_mrid.query_index, self._mrid_or_none(power_transformer.asset_info))
return self._save_conducting_equipment(table, insert, power_transformer, "power transformer")
@@ -2440,7 +2440,7 @@ def _save_switch(self, table: TableSwitches, insert: PreparedStatement, switch:
# noinspection PyProtectedMember
insert.add_value(table.open.query_index, switch._open)
insert.add_value(table.rated_current.query_index, switch.rated_current)
- insert.add_value(table.switch_info_mrid.query_index, self._mrid_or_none(switch.switch_info))
+ insert.add_value(table.switch_info_mrid.query_index, self._mrid_or_none(switch.asset_info))
return self._save_conducting_equipment(table, insert, switch, description)
diff --git a/src/zepben/ewb/model/cim/extensions/iec61968/assetinfo/relay_info.py b/src/zepben/ewb/model/cim/extensions/iec61968/assetinfo/relay_info.py
index 6895b5208..1e8bd4be7 100644
--- a/src/zepben/ewb/model/cim/extensions/iec61968/assetinfo/relay_info.py
+++ b/src/zepben/ewb/model/cim/extensions/iec61968/assetinfo/relay_info.py
@@ -7,7 +7,7 @@
__all__ = ["RelayInfo"]
-from typing import Optional, List, Generator, Callable
+from typing import Optional, List, Generator, Callable, Any
from zepben.ewb.model.cim.extensions.zbex import zbex
from zepben.ewb.model.cim.iec61968.assets.asset_info import AssetInfo
@@ -57,7 +57,7 @@ def get_delay(self, index: int) -> float:
else:
raise IndexError(index)
- def for_each_delay(self, action: Callable[[int, float], None]):
+ def for_each_delay(self, action: Callable[[int, float], Any]):
"""
Call the `action` on each delay in the `reclose_delays` collection
diff --git a/src/zepben/ewb/model/cim/extensions/iec61968/metering/pan_demand_reponse_function.py b/src/zepben/ewb/model/cim/extensions/iec61968/metering/pan_demand_reponse_function.py
index 6207f67b0..929360de9 100644
--- a/src/zepben/ewb/model/cim/extensions/iec61968/metering/pan_demand_reponse_function.py
+++ b/src/zepben/ewb/model/cim/extensions/iec61968/metering/pan_demand_reponse_function.py
@@ -25,10 +25,10 @@ class PanDemandResponseFunction(EndDeviceFunction):
_appliance_bitmask: Optional[int] = None
- def __init__(self, appliances: Union[int, ControlledAppliance] = None, **kwargs):
+ def __init__(self, appliance: Union[int, ControlledAppliance] = None, **kwargs):
super(PanDemandResponseFunction, self).__init__(**kwargs)
- if appliances is not None:
- self.appliance = appliances
+ if appliance is not None:
+ self.appliance = appliance
@property
def appliance(self) -> Optional[ControlledAppliance]:
diff --git a/src/zepben/ewb/model/cim/extensions/iec61970/base/feeder/lv_substation.py b/src/zepben/ewb/model/cim/extensions/iec61970/base/feeder/lv_substation.py
index 7055eea73..aca708ff4 100644
--- a/src/zepben/ewb/model/cim/extensions/iec61970/base/feeder/lv_substation.py
+++ b/src/zepben/ewb/model/cim/extensions/iec61970/base/feeder/lv_substation.py
@@ -28,6 +28,24 @@ class LvSubstation(EquipmentContainer):
_current_energizing_feeders_by_id: dict[str | None, 'Feeder'] | None = None
_normal_energized_lv_feeders_by_id: dict[str | None, LvFeeder] | None = None
+ def __init__(
+ self,
+ normal_energizing_feeders: list['Feeder'] | None = None,
+ current_energizing_feeders: list['Feeder'] | None = None,
+ normal_energized_lv_feeders: list[LvFeeder] | None = None,
+ **kwargs
+ ):
+ super(LvSubstation, self).__init__(**kwargs)
+ if normal_energizing_feeders:
+ for lv_feeder in normal_energizing_feeders:
+ self.add_normal_energizing_feeder(lv_feeder)
+ if current_energizing_feeders:
+ for lv_feeder in current_energizing_feeders:
+ self.add_current_energizing_feeder(lv_feeder)
+ if normal_energized_lv_feeders:
+ for lv_feeder in normal_energized_lv_feeders:
+ self.add_normal_energized_lv_feeder(lv_feeder)
+
@zbex
@property
def normal_energizing_feeders(self) -> Generator["Feeder", None, None]:
diff --git a/src/zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_function.py b/src/zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_function.py
index da57a5a21..a8dceeb0c 100644
--- a/src/zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_function.py
+++ b/src/zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_function.py
@@ -7,7 +7,13 @@
__all__ = ["ProtectionRelayFunction"]
-from typing import Optional, List, Generator, Iterable, Callable, TYPE_CHECKING
+import sys
+import warnings
+from typing import Optional, List, Generator, Iterable, Callable, TYPE_CHECKING, Any
+if sys.version_info >= (3, 13):
+ from warnings import deprecated
+else:
+ from typing_extensions import deprecated
from zepben.ewb.model.cim.extensions.iec61970.base.protection.power_direction_kind import PowerDirectionKind
from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_kind import ProtectionKind
@@ -30,6 +36,8 @@ class ProtectionRelayFunction(PowerSystemResource):
A function that a relay implements to protect equipment.
"""
+ asset_info: Optional[RelayInfo] = None
+
model: Optional[str] = None
"""[ZBEX] The protection equipment type name(manufacturer information)."""
@@ -58,13 +66,16 @@ class ProtectionRelayFunction(PowerSystemResource):
_thresholds: Optional[List[RelaySetting]] = None
- def __init__(self,
- sensors: Iterable[Sensor] = None,
- protected_switches: Iterable[ProtectedSwitch] = None,
- schemes: Iterable[ProtectionRelayScheme] = None,
- time_limits: Iterable[float] = None,
- thresholds: Iterable[RelaySetting] = None,
- relay_info: RelayInfo = None, **kwargs):
+ def __init__(
+ self,
+ sensors: Iterable[Sensor] = None,
+ protected_switches: Iterable[ProtectedSwitch] = None,
+ schemes: Iterable[ProtectionRelayScheme] = None,
+ time_limits: Iterable[float] = None,
+ thresholds: Iterable[RelaySetting] = None,
+ relay_info: RelayInfo | None = None,
+ **kwargs
+ ):
super(ProtectionRelayFunction, self).__init__(**kwargs)
if sensors is not None:
@@ -83,14 +94,17 @@ def __init__(self,
for threshold in thresholds:
self.add_threshold(threshold)
if relay_info is not None:
- self.relay_info = relay_info
+ warnings.warn("relay_info is deprecated, use asset_info instead.")
+ self.asset_info = relay_info
@property
+ @deprecated("use asset_info instead.")
def relay_info(self):
"""Datasheet information for this CurrentRelay"""
return self.asset_info
@relay_info.setter
+ @deprecated("use asset_info instead.")
def relay_info(self, relay_info: Optional[RelayInfo]):
self.asset_info = relay_info
@@ -103,7 +117,7 @@ def thresholds(self) -> Generator[RelaySetting, None, None]:
"""
return ngen(self._thresholds)
- def for_each_threshold(self, action: Callable[[int, RelaySetting], None]):
+ def for_each_threshold(self, action: Callable[[int, RelaySetting], Any]):
"""
Call the `action` on each :class:`RelaySetting` in the `thresholds` collection
@@ -191,7 +205,7 @@ def time_limits(self) -> Generator[float, None, None]:
"""
return ngen(self._time_limits)
- def for_each_time_limit(self, action: Callable[[int, float], None]):
+ def for_each_time_limit(self, action: Callable[[int, float], Any]):
"""
Call the `action` on each time limit in the `time_limits` collection
diff --git a/src/zepben/ewb/model/cim/iec61968/common/location.py b/src/zepben/ewb/model/cim/iec61968/common/location.py
index dfc372cc4..20a8e39de 100644
--- a/src/zepben/ewb/model/cim/iec61968/common/location.py
+++ b/src/zepben/ewb/model/cim/iec61968/common/location.py
@@ -7,7 +7,7 @@
__all__ = ["Location"]
-from typing import List, Optional, Generator, Callable
+from typing import List, Optional, Generator, Callable, Any
from zepben.ewb.model.cim.iec61968.common.position_point import PositionPoint
from zepben.ewb.model.cim.iec61968.common.street_address import StreetAddress
@@ -61,7 +61,7 @@ def get_point(self, sequence_number: int) -> PositionPoint:
def __getitem__(self, item):
return self.get_point(item)
- def for_each_point(self, action: Callable[[int, PositionPoint], None]):
+ def for_each_point(self, action: Callable[[int, PositionPoint], Any]):
"""
Call the `action` on each :class:`PositionPoint` in the `points` collection
diff --git a/src/zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/current_transformer.py b/src/zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/current_transformer.py
index 8e259e339..439a0e3eb 100644
--- a/src/zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/current_transformer.py
+++ b/src/zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/current_transformer.py
@@ -5,7 +5,12 @@
__all__ = ["CurrentTransformer"]
+import sys
from typing import Optional, TYPE_CHECKING
+if sys.version_info >= (3, 13):
+ from warnings import deprecated
+else:
+ from typing_extensions import deprecated
from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.sensor import Sensor
@@ -20,15 +25,19 @@ class CurrentTransformer(Sensor):
A typical secondary current rating would be 5A.
"""
+ asset_info: 'CurrentTransformerInfo | None' = None
+
core_burden: Optional[int] = None
"""Power burden of the CT core in watts."""
@property
+ @deprecated("use asset_info instead.")
def current_transformer_info(self) -> Optional['CurrentTransformerInfo']:
"""The `CurrentTransformerInfo` for this `CurrentTransformer`"""
return self.asset_info
@current_transformer_info.setter
+ @deprecated("use asset_info instead.")
def current_transformer_info(self, cti: Optional['CurrentTransformerInfo']):
"""
Set the `CurrentTransformerInfo` for this `CurrentTransformer`
diff --git a/src/zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer.py b/src/zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer.py
index 222c3ce25..d7a6b7a91 100644
--- a/src/zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer.py
+++ b/src/zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer.py
@@ -5,7 +5,12 @@
__all__ = ["PotentialTransformer"]
+import sys
from typing import Optional, TYPE_CHECKING
+if sys.version_info >= (3, 13):
+ from warnings import deprecated
+else:
+ from typing_extensions import deprecated
from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.potential_transformer_kind import PotentialTransformerKind
from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.sensor import Sensor
@@ -21,15 +26,19 @@ class PotentialTransformer(Sensor):
sometimes auxiliary substation supply. A typical secondary voltage rating would be 120V.
"""
+ asset_info: 'PotentialTransformerInfo | None' = None
+
type: PotentialTransformerKind = PotentialTransformerKind.UNKNOWN
"""Potential transformer construction type."""
@property
+ @deprecated("use asset_info instead.")
def potential_transformer_info(self) -> Optional['PotentialTransformerInfo']:
"""The `PotentialTransformerInfo` for this `PotentialTransformer`"""
return self.asset_info
@potential_transformer_info.setter
+ @deprecated("use asset_info instead.")
def potential_transformer_info(self, vti: Optional['PotentialTransformerInfo']):
"""
Set the `PotentialTransformerInfo` for this `PotentialTransformer`
diff --git a/src/zepben/ewb/model/cim/iec61970/base/core/name_type.py b/src/zepben/ewb/model/cim/iec61970/base/core/name_type.py
index 63f8bf61a..d09339456 100644
--- a/src/zepben/ewb/model/cim/iec61970/base/core/name_type.py
+++ b/src/zepben/ewb/model/cim/iec61970/base/core/name_type.py
@@ -7,7 +7,7 @@
__all__ = ["NameType"]
-from typing import Dict, List, Generator, overload, TYPE_CHECKING, Callable, Optional
+from typing import Dict, List, Generator, overload, TYPE_CHECKING, Callable, Optional, Any
from zepben.ewb.dataclassy import dataclass
from zepben.ewb.model.cim.iec61970.base.core.name import Name
@@ -184,7 +184,7 @@ def clear_names(self) -> NameType:
self._names_multi_index = dict()
return self
- def _get_or_create_name(self, name: str, identified_object: IdentifiedObject, update_index: Callable[[Name], None]) -> Name:
+ def _get_or_create_name(self, name: str, identified_object: IdentifiedObject, update_index: Callable[[Name], Any]) -> Name:
#
# NOTE: In Python, we can add names directly into the names collection of an object, so there is a chance that we just need to update the index rather
# than create a new Name class
diff --git a/src/zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object.py b/src/zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object.py
index c7f2582b0..a32fec4f6 100644
--- a/src/zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object.py
+++ b/src/zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object.py
@@ -7,7 +7,7 @@
__all__ = ["DiagramObject"]
-from typing import Optional, List, Generator, Callable, TYPE_CHECKING
+from typing import Optional, List, Generator, Callable, TYPE_CHECKING, Any
from zepben.ewb.model.cim.iec61970.base.core.identified_object import IdentifiedObject
from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object_point import DiagramObjectPoint
@@ -87,7 +87,7 @@ def get_point(self, sequence_number: int) -> DiagramObjectPoint:
def __getitem__(self, item: int) -> DiagramObjectPoint:
return self.get_point(item)
- def for_each_point(self, action: Callable[[int, DiagramObjectPoint], None]):
+ def for_each_point(self, action: Callable[[int, DiagramObjectPoint], Any]):
"""
Call the `action` on each :class:`DiagramObjectPoint` in the `points` collection
diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/ac_line_segment.py b/src/zepben/ewb/model/cim/iec61970/base/wires/ac_line_segment.py
index 28fa68d50..0081f3c28 100644
--- a/src/zepben/ewb/model/cim/iec61970/base/wires/ac_line_segment.py
+++ b/src/zepben/ewb/model/cim/iec61970/base/wires/ac_line_segment.py
@@ -7,11 +7,10 @@
__all__ = ["AcLineSegment"]
-from functools import singledispatchmethod
-from typing import Optional, List, Generator, TYPE_CHECKING
+from typing import Optional, Generator, TYPE_CHECKING
-from zepben.ewb.model.cim.iec61970.base.wires.conductor import Conductor
from zepben.ewb.model.cim.iec61970.base.wires.ac_line_segment_phase import AcLineSegmentPhase
+from zepben.ewb.model.cim.iec61970.base.wires.conductor import Conductor
from zepben.ewb.model.cim.iec61970.base.wires.single_phase_kind import SinglePhaseKind
from zepben.ewb.util import nlen, ngen, get_by_mrid, safe_remove, require
@@ -42,7 +41,7 @@ class AcLineSegment(Conductor):
per_length_impedance: 'PerLengthImpedance | None' = None
"""A `zepben.ewb.model.cim.iec61970.base.wires.PerLengthImpedance` describing this AcLineSegment"""
- _cuts: list['Cut'] | None= None
+ _cuts: list['Cut'] | None = None
_clamps: list['Clamp'] | None = None
_phases: list['AcLineSegmentPhase'] | None = None
@@ -198,8 +197,10 @@ def _validate_cut(self, cut: 'Cut') -> bool:
if not cut.ac_line_segment:
cut.ac_line_segment = self
- require(cut.ac_line_segment is self,
- lambda: f"Cut {cut} references another AcLineSegment {cut.ac_line_segment}, expected {str(self)}.")
+ require(
+ cut.ac_line_segment is self,
+ lambda: f"Cut {cut} references another AcLineSegment {cut.ac_line_segment}, expected {str(self)}.",
+ )
return False
def _validate_clamp(self, clamp: 'Clamp') -> bool:
@@ -216,12 +217,14 @@ def _validate_clamp(self, clamp: 'Clamp') -> bool:
if not clamp.ac_line_segment:
clamp.ac_line_segment = self
- require(clamp.ac_line_segment is self,
- lambda: f"Clamp {clamp} references another AcLineSegment {clamp.ac_line_segment}, expected {str(self)}.")
+ require(
+ clamp.ac_line_segment is self,
+ lambda: f"Clamp {clamp} references another AcLineSegment {clamp.ac_line_segment}, expected {str(self)}.",
+ )
return False
@property
- def phases(self) -> Generator['Phase', None, None]:
+ def phases(self) -> Generator['AcLineSegmentPhase', None, None]:
"""
The individual phase models for this AcLineSegment. The returned collection is read only.
"""
@@ -300,4 +303,4 @@ def wire_info_for_phase(self, phase: SinglePhaseKind) -> 'WireInfo | None':
for it in self._phases:
if it.phase == phase:
return it.asset_info
- return self.wire_info
+ return self.asset_info
diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/conductor.py b/src/zepben/ewb/model/cim/iec61970/base/wires/conductor.py
index eddeaae6f..7300379eb 100644
--- a/src/zepben/ewb/model/cim/iec61970/base/wires/conductor.py
+++ b/src/zepben/ewb/model/cim/iec61970/base/wires/conductor.py
@@ -5,10 +5,15 @@
__all__ = ["Conductor"]
+import sys
from typing import Optional, TYPE_CHECKING
+if sys.version_info >= (3, 13):
+ from warnings import deprecated
+else:
+ from typing_extensions import deprecated
-from zepben.ewb.model.cim.iec61970.base.core.conducting_equipment import ConductingEquipment
from zepben.ewb.model.cim.iec61968.assetinfo.cable_info import CableInfo
+from zepben.ewb.model.cim.iec61970.base.core.conducting_equipment import ConductingEquipment
if TYPE_CHECKING:
from zepben.ewb.model.cim.iec61968.assetinfo.wire_info import WireInfo
@@ -20,6 +25,8 @@ class Conductor(ConductingEquipment):
system, used to carry current between points in the power system.
"""
+ asset_info: 'WireInfo | None' = None
+
length: Optional[float] = None
"""Segment length for calculating line section capabilities."""
@@ -30,11 +37,13 @@ class Conductor(ConductingEquipment):
"""[ZBEX] The current rating in Amperes at the specified design temperature that can be used without the conductor breaching physical network"""
@property
+ @deprecated("use asset_info instead.")
def wire_info(self):
"""The `WireInfo` for this `Conductor`"""
return self.asset_info
@wire_info.setter
+ @deprecated("use asset_info instead.")
def wire_info(self, wi: Optional['WireInfo']):
"""
Set the `WireInfo` for this `Conductor`
@@ -46,4 +55,4 @@ def is_underground(self):
"""
:return: True if this `Conductor` is underground.
"""
- return isinstance(self.wire_info, CableInfo)
+ return isinstance(self.asset_info, CableInfo)
diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/power_transformer.py b/src/zepben/ewb/model/cim/iec61970/base/wires/power_transformer.py
index 3a14ebca4..5fa1ea9eb 100644
--- a/src/zepben/ewb/model/cim/iec61970/base/wires/power_transformer.py
+++ b/src/zepben/ewb/model/cim/iec61970/base/wires/power_transformer.py
@@ -7,7 +7,12 @@
__all__ = ["PowerTransformer"]
+import sys
from typing import List, Optional, Generator, TYPE_CHECKING
+if sys.version_info >= (3, 13):
+ from warnings import deprecated
+else:
+ from typing_extensions import deprecated
from zepben.ewb.model.cim.extensions.iec61970.base.wires.vector_group import VectorGroup
from zepben.ewb.model.cim.iec61968.infiec61968.infassetinfo.transformer_construction_kind import TransformerConstructionKind
@@ -37,9 +42,10 @@ class PowerTransformer(ConductingEquipment):
Attributes -
vector_group : `zepben.protobuf.cim.iec61970.base.wires.VectorGroup` of the transformer for protective relaying.
power_transformer_ends :
-
-
"""
+
+ asset_info: PowerTransformerInfo | None = None
+
vector_group: VectorGroup = VectorGroup.UNKNOWN
"""
Vector group of the transformer for protective relaying, e.g., Dyn1. For unbalanced transformers, this may not be simply
@@ -98,11 +104,13 @@ def ends(self) -> Generator[PowerTransformerEnd, None, None]:
return ngen(self._power_transformer_ends)
@property
+ @deprecated("use asset_info instead.")
def power_transformer_info(self) -> Optional[PowerTransformerInfo]:
"""The `PowerTransformerInfo` for this `PowerTransformer`"""
return self.asset_info
@power_transformer_info.setter
+ @deprecated("use asset_info instead.")
def power_transformer_info(self, pti: Optional[PowerTransformerInfo]):
"""
Set the `PowerTransformerInfo` for this `PowerTransformer`
@@ -212,6 +220,8 @@ def _validate_end(self, end: PowerTransformerEnd) -> bool:
if not end.power_transformer:
end.power_transformer = self
- require(end.power_transformer is self,
- lambda: f"PowerTransformerEnd {end} references another PowerTransformer {end.power_transformer}, expected {str(self)}.")
+ require(
+ end.power_transformer is self,
+ lambda: f"PowerTransformerEnd {end} references another PowerTransformer {end.power_transformer}, expected {str(self)}.",
+ )
return False
diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/power_transformer_end.py b/src/zepben/ewb/model/cim/iec61970/base/wires/power_transformer_end.py
index b3105e427..799867a4f 100644
--- a/src/zepben/ewb/model/cim/iec61970/base/wires/power_transformer_end.py
+++ b/src/zepben/ewb/model/cim/iec61970/base/wires/power_transformer_end.py
@@ -84,7 +84,7 @@ class PowerTransformerEnd(TransformerEnd):
Should not be used directly, instead use add_rating and get_rating functions.
"""
- def __init__(self, power_transformer: PowerTransformer = None, rated_s: int = None, **kwargs):
+ def __init__(self, power_transformer: PowerTransformer = None, rated_s: int = None, ratings: list[TransformerEndRatedS] = None, **kwargs):
super(PowerTransformerEnd, self).__init__(**kwargs)
if power_transformer:
self.power_transformer = power_transformer
@@ -102,6 +102,9 @@ def __init__(self, power_transformer: PowerTransformer = None, rated_s: int = No
if self._rated_s is not None:
self.rated_s = self._rated_s
self._rated_s = None
+ if ratings:
+ for rating in ratings:
+ self.add_rating(rating.rated_s, rating.cooling_type)
@property
def power_transformer(self):
@@ -125,8 +128,8 @@ def rated_s(self) -> Optional[int]:
Normal apparent power rating. The attribute shall be a positive value. For a two-winding transformer the values for the high and low voltage sides
shall be identical.
"""
- if self._s_ratings:
- return self._s_ratings[0].rated_s if len(self._s_ratings) > 0 else None
+ if self._s_ratings and len(self._s_ratings) > 0:
+ return self._s_ratings[0].rated_s
return None
@rated_s.setter
diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/regulating_control.py b/src/zepben/ewb/model/cim/iec61970/base/wires/regulating_control.py
index 1fedb0064..26d5a58a6 100644
--- a/src/zepben/ewb/model/cim/iec61970/base/wires/regulating_control.py
+++ b/src/zepben/ewb/model/cim/iec61970/base/wires/regulating_control.py
@@ -46,13 +46,13 @@ class RegulatingControl(PowerSystemResource):
discrete: Optional[bool] = None
"""The regulation is performed in a discrete mode. This applies to equipment with discrete controls, e.g. tap changers and shunt compensators."""
- mode: [RegulatingControlModeKind] = RegulatingControlModeKind.UNKNOWN
+ mode: RegulatingControlModeKind = RegulatingControlModeKind.UNKNOWN
"""
The regulating control mode presently available. This specification allows for determining the kind of regulation without need for obtaining the
units from a schedule.
"""
- monitored_phase: [PhaseCode] = PhaseCode.NONE
+ monitored_phase: PhaseCode = PhaseCode.NONE
"""Phase voltage controlling this regulator, measured at regulator location."""
target_deadband: Optional[float] = None
diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py b/src/zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py
index a80e8da0b..2a1916225 100644
--- a/src/zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py
+++ b/src/zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py
@@ -5,7 +5,12 @@
__all__ = ["ShuntCompensator"]
+import sys
from typing import Optional, TYPE_CHECKING
+if sys.version_info >= (3, 13):
+ from warnings import deprecated
+else:
+ from typing_extensions import deprecated
from zepben.ewb.model.cim.iec61970.base.wires.phase_shunt_connection_kind import PhaseShuntConnectionKind
from zepben.ewb.model.cim.iec61970.base.wires.regulating_cond_eq import RegulatingCondEq
@@ -36,22 +41,23 @@ class ShuntCompensator(RegulatingCondEq):
For `NonlinearShuntCompensator`s shall only be set to one of the NonlinearShuntCompensatorPoint.sectionNumber. There is no interpolation between
NonlinearShuntCompensatorPoint-s.
"""
- grounded: Optional[bool] = None
- nom_u: Optional[int] = None
+ asset_info: 'ShuntCompensatorInfo | None' = None
+ grounded: Optional[bool] = None
+ nom_u: Optional[int] = None
phase_connection: PhaseShuntConnectionKind = PhaseShuntConnectionKind.UNKNOWN
-
grounding_terminal: 'Terminal | None' = None
-
sections: Optional[float] = None
@property
+ @deprecated("use asset_info instead.")
def shunt_compensator_info(self) -> Optional['ShuntCompensatorInfo']:
"""The `ShuntCompensatorInfo` for this `ShuntCompensator`"""
return self.asset_info
@shunt_compensator_info.setter
+ @deprecated("use asset_info instead.")
def shunt_compensator_info(self, sci: Optional['ShuntCompensatorInfo']):
"""
Set the `ShuntCompensatorInfo` for this `ShuntCompensator`
diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/switch.py b/src/zepben/ewb/model/cim/iec61970/base/wires/switch.py
index 9935071fa..c34c80eaa 100644
--- a/src/zepben/ewb/model/cim/iec61970/base/wires/switch.py
+++ b/src/zepben/ewb/model/cim/iec61970/base/wires/switch.py
@@ -7,7 +7,12 @@
__all__ = ["Switch"]
+import sys
from typing import Optional, TYPE_CHECKING
+if sys.version_info >= (3, 13):
+ from warnings import deprecated
+else:
+ from typing_extensions import deprecated
from zepben.ewb.model.cim.iec61970.base.core.conducting_equipment import ConductingEquipment
from zepben.ewb.model.cim.iec61970.base.wires.single_phase_kind import SinglePhaseKind
@@ -45,6 +50,8 @@ class Switch(ConductingEquipment):
value for each phase of the switch.
"""
+ asset_info: SwitchInfo | None = None
+
rated_current: Optional[float] = None
"""The maximum continuous current carrying capacity in amps governed by the device material and construction. The attribute shall be a positive value."""
@@ -56,11 +63,13 @@ class Switch(ConductingEquipment):
is expected to match with the Switch.normalOpen."""
@property
+ @deprecated("use asset_info instead.")
def switch_info(self) -> Optional[SwitchInfo]:
"""Datasheet information for this Switch."""
return self.asset_info
@switch_info.setter
+ @deprecated("use asset_info instead.")
def switch_info(self, si: Optional[SwitchInfo]):
"""
Set the :class:`SwitchInfo` for this :class:`Switch`
diff --git a/src/zepben/ewb/services/common/base_service_comparator.py b/src/zepben/ewb/services/common/base_service_comparator.py
index 90fdcec06..e6d6b7f9f 100644
--- a/src/zepben/ewb/services/common/base_service_comparator.py
+++ b/src/zepben/ewb/services/common/base_service_comparator.py
@@ -43,6 +43,7 @@ def _find_comparisons_for_type(type_of: Type):
for base_of in type_of.__bases__:
_find_comparisons_for_type(base_of)
+ # noinspection PyTypeHints
self._compare_by_type: Dict[Type, Callable[[Any, T, T], ObjectDifference]] = {}
_find_comparisons_for_type(type(self))
@@ -219,7 +220,7 @@ def _add_if_different(diff: ObjectDifference, name: str, difference: Optional[Di
diff.differences[name] = difference
@staticmethod
- def _calculate_values_diff(prop: Union[MemberDescriptorType, property], diff: ObjectDifference, to_comparable: Callable[[property], Any] = (lambda it: it)) -> Optional[ValueDifference]:
+ def _calculate_values_diff(prop: Union[MemberDescriptorType, property], diff: ObjectDifference, to_comparable: Callable[[R], Any] = (lambda it: it)) -> Optional[ValueDifference]:
if isinstance(prop, property):
s_val = getattr(diff.source, prop.fget.__name__) if diff.source else None
t_val = getattr(diff.target, prop.fget.__name__) if diff.target else None
diff --git a/src/zepben/ewb/services/common/difference.py b/src/zepben/ewb/services/common/difference.py
index 0e0e865a4..ad7a1e633 100644
--- a/src/zepben/ewb/services/common/difference.py
+++ b/src/zepben/ewb/services/common/difference.py
@@ -3,7 +3,7 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from dataclasses import dataclass, field
-from typing import Optional, Any, List, Dict, TypeVar
+from typing import Optional, Any, List, Dict, TypeVar, Generic
from zepben.ewb import IdentifiedObject
@@ -29,11 +29,14 @@ class CollectionDifference(Difference):
@dataclass()
-class ObjectDifference(Difference):
- source: IdentifiedObject
- target: IdentifiedObject
+class ObjectDifference(Difference, Generic[T]):
+ source: T
+ target: T
differences: Dict[str, Difference] = field(default_factory=dict)
+ def __str__(self):
+ return f"source: {str(self.source)}, target: {str(self.target)}, diff: {self.differences}"
+
@dataclass()
class ReferenceDifference(Difference):
diff --git a/src/zepben/ewb/services/common/enum_mapper.py b/src/zepben/ewb/services/common/enum_mapper.py
index d92b5170f..cd3a2a4f1 100644
--- a/src/zepben/ewb/services/common/enum_mapper.py
+++ b/src/zepben/ewb/services/common/enum_mapper.py
@@ -10,7 +10,6 @@
from typing import Type, TypeVar, Generic
from google.protobuf.descriptor import EnumValueDescriptor
-# noinspection PyPackageRequirements
from google.protobuf.internal.enum_type_wrapper import EnumTypeWrapper
TCimEnum = TypeVar("TCimEnum", bound=Enum)
diff --git a/src/zepben/ewb/services/common/meta/metadata_translations.py b/src/zepben/ewb/services/common/meta/metadata_translations.py
index ffbfad074..34526952b 100644
--- a/src/zepben/ewb/services/common/meta/metadata_translations.py
+++ b/src/zepben/ewb/services/common/meta/metadata_translations.py
@@ -3,21 +3,18 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-# noinspection PyPackageRequirements,PyUnresolvedReferences
from google.protobuf.timestamp_pb2 import Timestamp as PBTimestamp
from zepben.protobuf.metadata.metadata_data_pb2 import DataSource as PBDataSource
from zepben.protobuf.metadata.metadata_data_pb2 import ServiceInfo as PBServiceInfo
-from zepben.ewb import DataSource, ServiceInfo
+from zepben.ewb import DataSource, ServiceInfo, datetime_to_timestamp
def data_source_to_pb(ds: DataSource) -> PBDataSource:
- ts = PBTimestamp()
- ts.FromDatetime(ds.timestamp)
return PBDataSource(
source=ds.source,
version=ds.version,
- timestamp=ts
+ timestamp=datetime_to_timestamp(ds.timestamp)
)
diff --git a/src/zepben/ewb/services/common/reference_resolvers.py b/src/zepben/ewb/services/common/reference_resolvers.py
index 285f35dc1..c30cd53a2 100644
--- a/src/zepben/ewb/services/common/reference_resolvers.py
+++ b/src/zepben/ewb/services/common/reference_resolvers.py
@@ -26,9 +26,11 @@
"psw_to_prf_resolver", "prf_to_sen_resolver", "sen_to_prf_resolver", "prf_to_prscheme_resolver", "prscheme_to_prf_resolver",
"prscheme_to_prsystem_resolver", "battery_unit_to_battery_control_resolver", "ed_to_edf_resolver", "prsystem_to_prscheme_resolver", "fuse_to_prf_resolver",
"sm_to_rcc_resolver", "feeder_to_celvf_resolver", "lvfeeder_to_cef_resolver", "acls_to_cut_resolver", "cut_to_acls_resolver", "acls_to_clamp_resolver",
- "clamp_to_acls_resolver", "asset_to_psr_resolver", "psr_to_asset_resolver"]
+ "clamp_to_acls_resolver", "asset_to_psr_resolver", "psr_to_asset_resolver", "acls_to_acls_phase_resolver", "acls_phase_to_acls_resolver",
+ "acls_phase_to_wire_info_resolver", "shunt_compensator_to_terminal_resolver", "lvs_to_nelvf_resolver", "lvf_to_nelvs_resolver", "lvs_to_nef_resolver",
+ "lvs_to_cef_resolver", "feeder_to_nelvs_resolver", "feeder_to_celvs_resolver", ]
-from typing import Callable, Optional
+from typing import Callable, Optional, Any
from zepben.ewb.dataclassy import dataclass
from zepben.ewb.model.cim.extensions.iec61968.assetinfo.relay_info import RelayInfo
@@ -123,7 +125,7 @@
class ReferenceResolver(object):
from_class: type
to_class: type
- resolve: Callable[[IdentifiedObject, IdentifiedObject], None]
+ resolve: Callable[[IdentifiedObject, IdentifiedObject], Any]
def __eq__(self, other):
return self.from_class is other.from_class and self.to_class is other.to_class and self.resolve is other.resolve
@@ -188,6 +190,9 @@ def __ne__(self, other: UnresolvedReference):
def __hash__(self):
return hash((type(self), self.from_ref.mrid, self.to_mrid, self.resolver))
+ def __getitem__(self, item):
+ return (self.from_ref, self.to_mrid, self.resolver, self.reverse_resolver)[item]
+
def _resolve_ce_term(ce, t):
t.conducting_equipment = ce
diff --git a/src/zepben/ewb/services/common/resolver.py b/src/zepben/ewb/services/common/resolver.py
index 1b685c464..1dc55b436 100644
--- a/src/zepben/ewb/services/common/resolver.py
+++ b/src/zepben/ewb/services/common/resolver.py
@@ -317,7 +317,7 @@ def normal_energized_lv_feeders(other: Feeder | LvSubstation) -> BoundReferenceR
return BoundReferenceResolver(other, feeder_to_nelvf_resolver, lvfeeder_to_nef_resolver)
elif isinstance(other, LvSubstation):
# noinspection PyArgumentList
- return BoundReferenceResolver(other, lvs_to_nef_resolver, lvf_to_nelvs_resolver)
+ return BoundReferenceResolver(other, lvs_to_nelvf_resolver, lvf_to_nelvs_resolver)
else:
raise TypeError(f'unsupported type {type(other)}')
diff --git a/src/zepben/ewb/services/common/translator/base_cim2proto.py b/src/zepben/ewb/services/common/translator/base_cim2proto.py
index 33812d78a..e340484af 100644
--- a/src/zepben/ewb/services/common/translator/base_cim2proto.py
+++ b/src/zepben/ewb/services/common/translator/base_cim2proto.py
@@ -8,8 +8,6 @@
import inspect
from typing import ParamSpec, TypeVar, Callable
-# noinspection PyPackageRequirements,PyUnresolvedReferences
-from google.protobuf.timestamp_pb2 import Timestamp as PBTimestamp
from google.protobuf.struct_pb2 import NullValue
from zepben.protobuf.cim.iec61968.common.Document_pb2 import Document as PBDocument
from zepben.protobuf.cim.iec61968.common.OrganisationRole_pb2 import OrganisationRole as PBOrganisationRole
@@ -18,6 +16,7 @@
from zepben.protobuf.cim.iec61970.base.core.NameType_pb2 import NameType as PBNameType
from zepben.protobuf.cim.iec61970.base.core.Name_pb2 import Name as PBName
+from zepben.ewb import datetime_to_timestamp
from zepben.ewb.model.cim.iec61968.common.document import Document
from zepben.ewb.model.cim.iec61968.common.organisation import Organisation
from zepben.ewb.model.cim.iec61968.common.organisation_role import OrganisationRole
@@ -50,15 +49,10 @@ def set_or_null(**kwargs):
@bind_to_pb
def document_to_pb(cim: Document) -> PBDocument:
- timestamp = None
- if cim.created_date_time:
- timestamp = PBTimestamp()
- timestamp.FromDatetime(cim.created_date_time)
-
return PBDocument(
io=identified_object_to_pb(cim),
**set_or_null(
- createdDateTime=timestamp,
+ createdDateTime=datetime_to_timestamp(cim.created_date_time),
title=cim.title,
authorName=cim.author_name,
type=cim.type,
diff --git a/src/zepben/ewb/services/common/translator/base_proto2cim.py b/src/zepben/ewb/services/common/translator/base_proto2cim.py
index 1befde536..f25c0900f 100644
--- a/src/zepben/ewb/services/common/translator/base_proto2cim.py
+++ b/src/zepben/ewb/services/common/translator/base_proto2cim.py
@@ -6,7 +6,7 @@
from __future__ import annotations
__all__ = ["identified_object_to_cim", "document_to_cim", "organisation_to_cim", "organisation_role_to_cim",
- "BaseProtoToCim", "add_to_network_or_none", "bind_to_cim"]
+ "BaseProtoToCim", "add_to_network_or_none", "bind_to_cim", "get_nullable"]
import functools
import inspect
@@ -15,7 +15,6 @@
from google.protobuf.message import Message
from typing_extensions import ParamSpec
-# noinspection PyPackageRequirements
from zepben.protobuf.cim.iec61968.common.Document_pb2 import Document as PBDocument
from zepben.protobuf.cim.iec61968.common.OrganisationRole_pb2 import OrganisationRole as PBOrganisationRole
from zepben.protobuf.cim.iec61968.common.Organisation_pb2 import Organisation as PBOrganisation
diff --git a/src/zepben/ewb/services/common/translator/util.py b/src/zepben/ewb/services/common/translator/util.py
index b17305e71..c8e003393 100644
--- a/src/zepben/ewb/services/common/translator/util.py
+++ b/src/zepben/ewb/services/common/translator/util.py
@@ -10,8 +10,6 @@
from typing import Optional, Dict
-# noinspection PyPackageRequirements
-# noinspection PyUnresolvedReferences
# pylint: disable=import-error
from google.protobuf.struct_pb2 import NullValue
diff --git a/src/zepben/ewb/services/customer/translator/customer_cim2proto.py b/src/zepben/ewb/services/customer/translator/customer_cim2proto.py
index dfb225d0a..422195b86 100644
--- a/src/zepben/ewb/services/customer/translator/customer_cim2proto.py
+++ b/src/zepben/ewb/services/customer/translator/customer_cim2proto.py
@@ -12,13 +12,13 @@
from zepben.protobuf.cim.iec61968.customers.Tariff_pb2 import Tariff as PBTariff
from zepben.protobuf.cim.iec61970.base.domain.DateTimeInterval_pb2 import DateTimeInterval as PBDateTimeInterval
+from zepben.ewb import datetime_to_timestamp
from zepben.ewb.model.cim.iec61968.common.agreement import Agreement
from zepben.ewb.model.cim.iec61968.customers.customer import Customer
from zepben.ewb.model.cim.iec61968.customers.customer_agreement import CustomerAgreement
from zepben.ewb.model.cim.iec61968.customers.pricing_structure import PricingStructure
from zepben.ewb.model.cim.iec61968.customers.tariff import Tariff
from zepben.ewb.model.cim.iec61970.base.domain.date_time_interval import DateTimeInterval
-
from zepben.ewb.services.common.translator.base_cim2proto import document_to_pb, organisation_role_to_pb, set_or_null, bind_to_pb
from zepben.ewb.services.common.translator.util import mrid_or_empty
# noinspection PyProtectedMember
@@ -87,6 +87,7 @@ def pricing_structure_to_pb(cim: PricingStructure) -> PBPricingStructure:
def tariff_to_pb(cim: Tariff) -> PBTariff:
return PBTariff(doc=document_to_pb(cim))
+
########################
# IEC61970 Base Domain #
########################
@@ -99,7 +100,12 @@ def date_time_interval_to_pb(cim: DateTimeInterval) -> PBDateTimeInterval | None
:param cim: The :class:`DateTimeInterval` to convert.
:return: the new protobuf object for fluent use.
"""
- if cim:
- return DateTimeInterval(
- **set_or_null(start=cim.start, end=cim.end),
- )
\ No newline at end of file
+ if not cim:
+ return None
+
+ return PBDateTimeInterval(
+ **set_or_null(
+ start=datetime_to_timestamp(cim.start),
+ end=datetime_to_timestamp(cim.end)
+ ),
+ )
diff --git a/src/zepben/ewb/services/customer/translator/customer_proto2cim.py b/src/zepben/ewb/services/customer/translator/customer_proto2cim.py
index 685f879a4..a3feafe6b 100644
--- a/src/zepben/ewb/services/customer/translator/customer_proto2cim.py
+++ b/src/zepben/ewb/services/customer/translator/customer_proto2cim.py
@@ -36,7 +36,7 @@
@bind_to_cim
def agreement_to_cim(pb: PBAgreement, cim: Agreement, service: CustomerService):
if vi := get_nullable(pb, 'validityInterval'):
- cim.validity_interval=(date_time_interval_to_cim(vi, service))
+ cim.validity_interval=(date_time_interval_to_cim(vi))
document_to_cim(
pb.doc, cim, service
@@ -102,8 +102,8 @@ def tariff_to_cim(pb: PBTariff, service: CustomerService) -> Optional[Tariff]:
########################
@bind_to_cim
-def date_time_interval_to_cim(pb: PBDateTimeInterval, service: CustomerService) -> Optional[DateTimeInterval]:
+def date_time_interval_to_cim(pb: PBDateTimeInterval) -> Optional[DateTimeInterval]:
return DateTimeInterval(
- start=get_nullable(pb, 'start'),
- end=get_nullable(pb, 'end'),
- )
\ No newline at end of file
+ start=sdt.ToDatetime() if (sdt := get_nullable(pb, "start")) else None,
+ end=edt.ToDatetime() if (edt := get_nullable(pb, "end")) else None,
+ )
diff --git a/src/zepben/ewb/services/measurement/translator/measurement_cim2proto.py b/src/zepben/ewb/services/measurement/translator/measurement_cim2proto.py
index bc39ed97a..cd232dec4 100644
--- a/src/zepben/ewb/services/measurement/translator/measurement_cim2proto.py
+++ b/src/zepben/ewb/services/measurement/translator/measurement_cim2proto.py
@@ -5,7 +5,6 @@
__all__ = ["analog_value_to_pb", "accumulator_value_to_pb", "discrete_value_to_pb", "measurement_value_to_pb"]
-# noinspection PyPackageRequirements,PyUnresolvedReferences
from google.protobuf.timestamp_pb2 import Timestamp
from zepben.protobuf.cim.iec61970.base.meas.AccumulatorValue_pb2 import AccumulatorValue as PBAccumulatorValue
from zepben.protobuf.cim.iec61970.base.meas.AnalogValue_pb2 import AnalogValue as PBAnalogValue
diff --git a/src/zepben/ewb/services/network/network_service_comparator.py b/src/zepben/ewb/services/network/network_service_comparator.py
index c9fa7e591..ad1fe6aae 100644
--- a/src/zepben/ewb/services/network/network_service_comparator.py
+++ b/src/zepben/ewb/services/network/network_service_comparator.py
@@ -7,7 +7,6 @@
from zepben.ewb import BatteryControl, PanDemandResponseFunction, StaticVarCompensator
from zepben.ewb.model.cim.extensions.iec61968.assetinfo.relay_info import RelayInfo
-from zepben.ewb.model.cim.extensions.iec61968.common.contact_details import ContactDetails
from zepben.ewb.model.cim.extensions.iec61970.base.core.hv_customer import HvCustomer
from zepben.ewb.model.cim.extensions.iec61970.base.core.site import Site
from zepben.ewb.model.cim.extensions.iec61970.base.feeder.loop import Loop
@@ -288,7 +287,6 @@ def _compare_protection_relay_function(self, diff: ObjectDifference) -> ObjectDi
ProtectionRelayFunction.sensors,
ProtectionRelayFunction.schemes,
)
- self._compare_id_references(diff, ProtectionRelayFunction.relay_info)
return self._compare_power_system_resource(diff)
@@ -637,7 +635,6 @@ def _compare_current_transformer(self, source: CurrentTransformer, target: Curre
diff = ObjectDifference(source, target)
self._compare_values(diff, CurrentTransformer.core_burden)
- self._compare_id_references(diff, CurrentTransformer.current_transformer_info)
return self._compare_sensor(diff)
@@ -648,7 +645,6 @@ def _compare_potential_transformer(self, source: PotentialTransformer, target: P
diff = ObjectDifference(source, target)
self._compare_values(diff, PotentialTransformer.type)
- self._compare_id_references(diff, PotentialTransformer.potential_transformer_info)
return self._compare_sensor(diff)
@@ -936,7 +932,6 @@ def _compare_clamp(self, source: Clamp, target: Clamp) -> ObjectDifference:
def _compare_conductor(self, diff: ObjectDifference) -> ObjectDifference:
self._compare_floats(diff, Conductor.length, Conductor.design_rating)
self._compare_values(diff, Conductor.design_temperature)
- self._compare_id_references(diff, Conductor.wire_info)
return self._compare_conducting_equipment(diff)
@@ -1161,7 +1156,6 @@ def _compare_power_transformer(self, source: PowerTransformer, target: PowerTran
self._compare_indexed_id_reference_collections(diff, PowerTransformer.ends)
self._compare_values(diff, PowerTransformer.vector_group, PowerTransformer.construction_kind, PowerTransformer.function)
self._compare_floats(diff, PowerTransformer.transformer_utilisation)
- self._compare_id_references(diff, PowerTransformer.power_transformer_info)
return self._compare_conducting_equipment(diff)
@@ -1256,7 +1250,6 @@ def _compare_series_compensator(self, source: SeriesCompensator, target: SeriesC
def _compare_shunt_compensator(self, diff: ObjectDifference) -> ObjectDifference:
self._compare_values(diff, ShuntCompensator.grounded, ShuntCompensator.nom_u, ShuntCompensator.phase_connection)
self._compare_floats(diff, ShuntCompensator.sections)
- self._compare_id_references(diff, ShuntCompensator.shunt_compensator_info)
self._compare_id_references(diff, ShuntCompensator.grounding_terminal)
return self._compare_regulating_cond_eq(diff)
@@ -1277,7 +1270,6 @@ def _compare_switch(self, diff: ObjectDifference) -> ObjectDifference:
self._compare_floats(diff, Switch.rated_current)
self._add_if_different(diff, "isNormallyOpen", self._compare_open_status(diff, lambda it, phase: it.is_normally_open(phase)))
self._add_if_different(diff, "isOpen", self._compare_open_status(diff, lambda it, phase: it.is_open()))
- self._compare_id_references(diff, Switch.switch_info)
return self._compare_conducting_equipment(diff)
diff --git a/src/zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_connected.py b/src/zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_connected.py
index 838ceaef8..90f216cc4 100644
--- a/src/zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_connected.py
+++ b/src/zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_connected.py
@@ -5,7 +5,7 @@
__all__ = ["TerminalConnectivityConnected"]
-from typing import List, Iterable, Optional, Set, Dict, Callable
+from typing import List, Iterable, Optional, Set, Dict, Callable, Any
from zepben.ewb import Terminal, PhaseCode, SinglePhaseKind, Switch
from zepben.ewb.services.network.tracing.connectivity.connectivity_result import ConnectivityResult
@@ -99,7 +99,7 @@ def add_to_from(from_phase, to_phase):
return nominal_phase_paths
- def _add_xy_phase_paths(self, terminal: Terminal, add_path: Callable[[SinglePhaseKind, SinglePhaseKind], None]):
+ def _add_xy_phase_paths(self, terminal: Terminal, add_path: Callable[[SinglePhaseKind, SinglePhaseKind], Any]):
"""
val xyPhases = cn.terminals.associateWith { it.findXyPhases() }.filterValues { it.isNotNone() }
val primaryPhases = cn.terminals.associateWith { it.findPrimaryPhases() }.filterValues { it.isNotNone() }
diff --git a/src/zepben/ewb/services/network/tracing/feeder/set_direction.py b/src/zepben/ewb/services/network/tracing/feeder/set_direction.py
index 265b002fb..c0817e7ad 100644
--- a/src/zepben/ewb/services/network/tracing/feeder/set_direction.py
+++ b/src/zepben/ewb/services/network/tracing/feeder/set_direction.py
@@ -11,6 +11,7 @@
from logging import Logger
from typing import Optional, TYPE_CHECKING, Type
+from zepben.ewb.model.cim.iec61970.base.core.conducting_equipment import ConductingEquipment
from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
from zepben.ewb.model.cim.iec61970.base.core.terminal import Terminal
from zepben.ewb.model.cim.iec61970.base.wires.busbar_section import BusbarSection
@@ -26,7 +27,7 @@
from zepben.ewb.services.network.tracing.traversal.weighted_priority_queue import WeightedPriorityQueue
if TYPE_CHECKING:
- from zepben.ewb import NetworkService, Switch, ConductingEquipment
+ from zepben.ewb import NetworkService, Switch
class SetDirection:
@@ -134,16 +135,17 @@ async def run(self, network: NetworkService, network_state_operators: Type[Netwo
for terminal in (f.normal_head_terminal for f in network.objects(Feeder) if f.normal_head_terminal):
if (head_terminal := terminal.conducting_equipment) is not None:
if not network_state_operators.is_open(head_terminal, None):
- await self.run_terminal(terminal, network_state_operators)
+ await self.run(terminal, network_state_operators)
- @run.register
- async def run_terminal(self, terminal: Terminal, network_state_operators: Type[NetworkStateOperators] = NetworkStateOperators.NORMAL):
+ @run.register(Terminal)
+ @run.register(ConductingEquipment)
+ async def _(self, start: Terminal | ConductingEquipment, network_state_operators: Type[NetworkStateOperators] = NetworkStateOperators.NORMAL):
"""
Apply [FeederDirection.DOWNSTREAM] from the [terminal].
- :param terminal: The terminal to start applying feeder direction from.
- :param network_state_operators: The `NetworkStateOperators` to be used when setting feeder direction
+ :param start: The ``Terminal`` or ``ConductingEquipment`` to start applying feeder direction from.
+ :param network_state_operators: The ``NetworkStateOperators`` to be used when setting feeder direction
"""
return await (self._create_traversal(network_state_operators)
- .run(terminal, FeederDirection.DOWNSTREAM, can_stop_on_start_item=False))
+ .run(start, FeederDirection.DOWNSTREAM, can_stop_on_start_item=False))
diff --git a/src/zepben/ewb/services/network/tracing/networktrace/actions/equipment_tree_builder.py b/src/zepben/ewb/services/network/tracing/networktrace/actions/equipment_tree_builder.py
index 217e7ff09..607feba20 100644
--- a/src/zepben/ewb/services/network/tracing/networktrace/actions/equipment_tree_builder.py
+++ b/src/zepben/ewb/services/network/tracing/networktrace/actions/equipment_tree_builder.py
@@ -37,15 +37,11 @@ class EquipmentTreeBuilder(StepActionWithContextValue):
def __init__(self, calculate_leaves: bool = False):
super().__init__(key=str(uuid.uuid4()))
- self._roots: dict[ConductingEquipment, EquipmentTreeNode] = {}
+ self.roots: dict[ConductingEquipment, EquipmentTreeNode] = {}
self._leaves: set[EquipmentTreeNode] = set()
self._calculate_leaves = calculate_leaves
- @property
- def roots(self) -> Generator[TreeNode[ConductingEquipment], None, None]:
- return (r for r in self._roots.values())
-
def recurse_nodes(self) -> Generator[TreeNode[ConductingEquipment], None, None]:
"""
Returns a generator that will yield every node in the tree structure.
@@ -55,7 +51,7 @@ def recurse(node: TreeNode[ConductingEquipment]):
for child in node.children:
yield from recurse(child)
- for root in self._roots.values():
+ for root in self.roots.values():
yield from recurse(root)
@property
@@ -69,10 +65,10 @@ def leaves(self) -> set[EquipmentTreeNode]:
return set(self._leaves)
def compute_initial_value(self, item: NetworkTraceStep[Any]) -> EquipmentTreeNode:
- node = self._roots.get(item.path.to_equipment)
+ node = self.roots.get(item.path.to_equipment)
if node is None:
node = TreeNode(item.path.to_equipment, None)
- self._roots[item.path.to_equipment] = node
+ self.roots[item.path.to_equipment] = node
return node
def compute_next_value(
@@ -101,4 +97,4 @@ def _process_leaf(self, current_node: TreeNode[ConductingEquipment]):
self._leaves.discard(current_node.parent) # this nodes parent now has a child, it's not a leaf anymore
def clear(self):
- self._roots.clear()
+ self.roots.clear()
diff --git a/src/zepben/ewb/services/network/tracing/networktrace/conditions/conditions.py b/src/zepben/ewb/services/network/tracing/networktrace/conditions/conditions.py
index 8280f94d0..a99254fc7 100644
--- a/src/zepben/ewb/services/network/tracing/networktrace/conditions/conditions.py
+++ b/src/zepben/ewb/services/network/tracing/networktrace/conditions/conditions.py
@@ -22,47 +22,47 @@
from zepben.ewb.services.network.tracing.traversal.stop_condition import StopCondition
from zepben.ewb import ConductingEquipment, NetworkStateOperators
- DSLLambda = Callable[[NetworkStateOperators], QueueCondition[NetworkTraceStep[T]]]
+ DSLLambda = Callable[[Type[NetworkStateOperators]], QueueCondition[NetworkTraceStep[T]]]
def upstream() -> DSLLambda:
"""
- Creates a [NetworkTrace] condition that will cause tracing a feeder upstream (towards the head terminal).
- This uses [FeederDirectionStateOperations.get_direction] receiver instance method within the condition.
+ Creates a `NetworkTrace` condition that will cause tracing a feeder upstream (towards the head terminal).
+ This uses `FeederDirectionStateOperations.get_direction` receiver instance method within the condition.
- :return: [NetworkTraceQueueCondition] that results in upstream tracing.
+ :return: `NetworkTraceQueueCondition` that results in upstream tracing.
"""
return lambda state_operator: state_operator.with_direction(FeederDirection.UPSTREAM)
def downstream() -> DSLLambda:
"""
- Creates a [NetworkTrace] condition that will cause tracing a feeder downstream (away from the head terminal).
- This uses [FeederDirectionStateOperations.get_direction] receiver instance method within the condition.
+ Creates a `NetworkTrace` condition that will cause tracing a feeder downstream (away from the head terminal).
+ This uses `FeederDirectionStateOperations.get_direction` receiver instance method within the condition.
- :return: [NetworkTraceQueueCondition] that results in downstream tracing.
+ :return: `NetworkTraceQueueCondition` that results in downstream tracing.
"""
return lambda state_operator: state_operator.with_direction(FeederDirection.DOWNSTREAM)
def with_direction(direction: FeederDirection) -> DSLLambda:
"""
- Creates a [NetworkTrace] condition that will cause tracing only terminals with directions that match [direction].
- This uses [FeederDirectionStateOperations.get_direction] receiver instance method within the condition.
+ Creates a `NetworkTrace` condition that will cause tracing only terminals with directions that match `direction`.
+ This uses `FeederDirectionStateOperations.get_direction` receiver instance method within the condition.
- :return: [NetworkTraceQueueCondition] that results in upstream tracing.
+ :return: `NetworkTraceQueueCondition` that results in upstream tracing.
"""
return lambda state_operator: DirectionCondition(direction, state_operator)
def limit_equipment_steps(limit: int, equipment_type: Type[ConductingEquipment] = None) -> StopCondition[NetworkTraceStep[T]]:
"""
- Creates a [NetworkTrace] condition that stops tracing a path once a specified number of equipment steps have been reached.
+ Creates a `NetworkTrace` condition that stops tracing a path once a specified number of equipment steps have been reached.
:param limit: The maximum number of equipment steps allowed before stopping.
:param equipment_type: The class of the equipment type to track against the limit
- :return: A [NetworkTraceStopCondition] that stops tracing the path once the step limit is reached.
+ :return: A `NetworkTraceStopCondition` that stops tracing the path once the step limit is reached.
"""
if equipment_type is not None:
return EquipmentTypeStepLimitCondition(limit, equipment_type)
diff --git a/src/zepben/ewb/services/network/tracing/phases/set_phases.py b/src/zepben/ewb/services/network/tracing/phases/set_phases.py
index 08445e2f1..7bb0f2f08 100644
--- a/src/zepben/ewb/services/network/tracing/phases/set_phases.py
+++ b/src/zepben/ewb/services/network/tracing/phases/set_phases.py
@@ -9,7 +9,7 @@
from collections.abc import Sequence
from functools import singledispatchmethod
-from typing import Union, Set, Iterable, List, Type, TYPE_CHECKING, Optional, Callable
+from typing import Union, Set, Iterable, List, Type, TYPE_CHECKING, Optional, Callable, Any
from zepben.ewb import PhaseStatus, add_neutral
from zepben.ewb.exceptions import TracingException, PhaseException
@@ -399,7 +399,7 @@ def _try_set_phase(
to_terminal: Terminal,
to_phases: PhaseStatus,
to_: SinglePhaseKind,
- on_success: Callable[[], None]
+ on_success: Callable[[], Any]
):
try:
if phase != SinglePhaseKind.NONE and to_phases.__setitem__(to_, phase):
@@ -417,7 +417,7 @@ def _try_add_phase(
to_phases: PhaseStatus,
to_: SinglePhaseKind,
allow_suspect_flow: bool,
- on_success: Callable[[], None]
+ on_success: Callable[[], Any]
):
# The phases that can be added are ABCN and Y, so for all cases other than Y we can just use the added phase. For
# Y we need to look at what the phases on the other side of the transformer are to determine what has been added.
diff --git a/src/zepben/ewb/services/network/tracing/traversal/step_action.py b/src/zepben/ewb/services/network/tracing/traversal/step_action.py
index 33bf187c8..e803ec428 100644
--- a/src/zepben/ewb/services/network/tracing/traversal/step_action.py
+++ b/src/zepben/ewb/services/network/tracing/traversal/step_action.py
@@ -6,7 +6,7 @@
__all__ = ['StepAction', 'StepActionWithContextValue', 'StepActionFunc']
from abc import abstractmethod
-from typing import TypeVar, Generic, Callable, final
+from typing import TypeVar, Generic, Callable, final, Any
from zepben.ewb.services.network.tracing.traversal.context_value_computer import ContextValueComputer
from zepben.ewb.services.network.tracing.traversal.step_context import StepContext
@@ -14,7 +14,7 @@
T = TypeVar('T')
U = TypeVar('U')
-StepActionFunc = Callable[[T, StepContext], None]
+StepActionFunc = Callable[[T, StepContext], Any]
class StepAction(Generic[T]):
diff --git a/src/zepben/ewb/services/network/tracing/traversal/traversal.py b/src/zepben/ewb/services/network/tracing/traversal/traversal.py
index 4f6a12fbe..22fda4b86 100644
--- a/src/zepben/ewb/services/network/tracing/traversal/traversal.py
+++ b/src/zepben/ewb/services/network/tracing/traversal/traversal.py
@@ -210,7 +210,7 @@ def add_condition(self, condition: ConditionTypes) -> D:
:return: this traversal instance.
"""
- if callable(condition): # Callable[[NetworkTraceStep[T], StepContext], None]
+ if callable(condition): # Callable[[NetworkTraceStep[T], StepContext], Any]
if len(inspect.getfullargspec(condition).args) == 2:
return self.add_stop_condition(condition)
elif len(inspect.getfullargspec(condition).args) == 4:
diff --git a/src/zepben/ewb/services/network/translator/network_cim2proto.py b/src/zepben/ewb/services/network/translator/network_cim2proto.py
index a13a5fec9..97e3f5ed4 100644
--- a/src/zepben/ewb/services/network/translator/network_cim2proto.py
+++ b/src/zepben/ewb/services/network/translator/network_cim2proto.py
@@ -30,8 +30,6 @@
from typing import Any, Optional
-# noinspection PyPackageRequirements,PyUnresolvedReferences
-from google.protobuf.timestamp_pb2 import Timestamp as PBTimestamp
from zepben.protobuf.cim.extensions.iec61968.assetinfo.RelayInfo_pb2 import RelayInfo as PBRelayInfo
from zepben.protobuf.cim.extensions.iec61968.common.ContactDetails_pb2 import ContactDetails as PBContactDetails
from zepben.protobuf.cim.extensions.iec61968.metering.PanDemandResponseFunction_pb2 import PanDemandResponseFunction as PBPanDemandResponseFunction
@@ -174,6 +172,7 @@
from zepben.protobuf.cim.iec61970.base.wires.TransformerStarImpedance_pb2 import TransformerStarImpedance as PBTransformerStarImpedance
from zepben.protobuf.cim.iec61970.infiec61970.feeder.Circuit_pb2 import Circuit as PBCircuit
+from zepben.ewb import datetime_to_timestamp
from zepben.ewb.model.cim.extensions.iec61968.assetinfo.relay_info import *
from zepben.ewb.model.cim.extensions.iec61968.common.contact_details import ContactDetails
from zepben.ewb.model.cim.extensions.iec61968.metering.pan_demand_reponse_function import *
@@ -1082,10 +1081,6 @@ def curve_data_to_pb(cim: CurveData) -> PBCurveData:
def equipment_to_pb(cim: Equipment, include_asset_info: bool = False) -> PBEquipment:
- ts = None
- if cim.commissioned_date:
- ts = PBTimestamp()
- ts.FromDatetime(cim.commissioned_date)
return PBEquipment(
psr=power_system_resource_to_pb(cim, include_asset_info),
inService=cim.in_service,
@@ -1095,7 +1090,7 @@ def equipment_to_pb(cim: Equipment, include_asset_info: bool = False) -> PBEquip
operationalRestrictionMRIDs=[str(io.mrid) for io in cim.operational_restrictions],
currentContainerMRIDs=[str(io.mrid) for io in cim.current_containers],
**set_or_null(
- commissionedDate=ts
+ commissionedDate=datetime_to_timestamp(cim.commissioned_date)
),
)
diff --git a/src/zepben/ewb/streaming/get/network_consumer.py b/src/zepben/ewb/streaming/get/network_consumer.py
index 221d46471..63b526e23 100644
--- a/src/zepben/ewb/streaming/get/network_consumer.py
+++ b/src/zepben/ewb/streaming/get/network_consumer.py
@@ -73,6 +73,7 @@ class NetworkResult:
network_service: Optional[NetworkService]
failed: Set[str] = set()
+
@dataclass(slots=True)
class GetNetworkHierarchyConfig:
include_geographical_regions: bool = True
@@ -147,7 +148,7 @@ async def get_equipment_for_container(
container: Union[str, EquipmentContainer],
include_energizing_containers: IncludedEnergizingContainers = IncludedEnergizingContainers.NONE,
include_energized_containers: IncludedEnergizedContainers = IncludedEnergizedContainers.NONE,
- network_state: NetworkState = NetworkState.NORMAL
+ network_state: NetworkState = NetworkState.NORMAL,
) -> GrpcResult[MultiObjectResult]:
"""
Retrieve the :class:`Equipment` for the :class:`EquipmentContainer` represented by `container`
@@ -175,7 +176,7 @@ async def get_equipment_for_containers(
containers: Iterable[str],
include_energizing_containers: IncludedEnergizingContainers = IncludedEnergizingContainers.NONE,
include_energized_containers: IncludedEnergizedContainers = IncludedEnergizedContainers.NONE,
- network_state: NetworkState = NetworkState.NORMAL
+ network_state: NetworkState = NetworkState.NORMAL,
):
"""
Retrieve the :class:`Equipment` for the :class:`EquipmentContainer`'s represented in `containers`
@@ -198,7 +199,7 @@ async def get_equipment_for_containers(
"""
return await self._get_equipment_for_containers(containers, include_energizing_containers, include_energized_containers, network_state)
- async def get_equipment_for_restriction(self, restriction: [str, OperationalRestriction]) -> GrpcResult[MultiObjectResult]:
+ async def get_equipment_for_restriction(self, restriction: str | OperationalRestriction) -> GrpcResult[MultiObjectResult]:
"""
Retrieve the :class:`Equipment` for the :class:`OperationalRestriction` represented by `restriction`
@@ -218,7 +219,7 @@ async def get_equipment_for_restriction(self, restriction: [str, OperationalRest
"""
return await self._get_equipment_for_restriction(restriction)
- async def get_terminals_for_connectivity_node(self, node: [str, ConnectivityNode]) -> GrpcResult[MultiObjectResult]:
+ async def get_terminals_for_connectivity_node(self, node: str | ConnectivityNode) -> GrpcResult[MultiObjectResult]:
"""
Retrieve the :class:`Terminal`s for the :class:`ConnectivityNode` represented by `node`
@@ -238,7 +239,6 @@ async def get_terminals_for_connectivity_node(self, node: [str, ConnectivityNode
"""
return await self._get_terminals_for_connectivity_node(node)
-
@overload
async def get_network_hierarchy(
self,
@@ -250,14 +250,15 @@ async def get_network_hierarchy(
include_loops: bool = None,
include_lv_substations: bool = None,
include_lv_feeders: bool = None,
- ) -> GrpcResult[NetworkHierarchy]: ...
+ ) -> GrpcResult[NetworkHierarchy]:
+ ...
@overload
- async def get_network_hierarchy(self, **kwargs) -> GrpcResult[NetworkHierarchy]: ...
- # This method needs to exist as @overload requires 2 decorated methods and 1 functional method.
-
async def get_network_hierarchy(self, **kwargs) -> GrpcResult[NetworkHierarchy]:
+ # This method needs to exist as @overload requires 2 decorated methods and 1 functional method.
+ ...
+ async def get_network_hierarchy(self, **kwargs) -> GrpcResult[NetworkHierarchy]:
"""
Retrieve the network hierarchy
@@ -286,7 +287,7 @@ async def get_equipment_container(
expected_class: type = EquipmentContainer,
include_energizing_containers: IncludedEnergizingContainers = IncludedEnergizingContainers.NONE,
include_energized_containers: IncludedEnergizedContainers = IncludedEnergizedContainers.NONE,
- network_state: NetworkState = NetworkState.NORMAL
+ network_state: NetworkState = NetworkState.NORMAL,
) -> GrpcResult[MultiObjectResult]:
"""
Retrieve the equipment container network for the specified `mrid` and store the results in the `service`.
@@ -364,10 +365,10 @@ async def _get_equipment_for_container(
container: Union[str, EquipmentContainer],
include_energizing_containers: IncludedEnergizingContainers = IncludedEnergizingContainers.NONE,
include_energized_containers: IncludedEnergizedContainers = IncludedEnergizedContainers.NONE,
- network_state: NetworkState = NetworkState.NORMAL
+ network_state: NetworkState = NetworkState.NORMAL,
) -> GrpcResult[MultiObjectResult]:
return await self._handle_multi_object_rpc(
- lambda: self._process_equipment_for_container(container, include_energizing_containers, include_energized_containers, network_state)
+ lambda: self._process_equipment_for_container(container, include_energizing_containers, include_energized_containers, network_state),
)
async def _get_equipment_for_containers(
@@ -375,16 +376,16 @@ async def _get_equipment_for_containers(
containers: Iterable[str],
include_energizing_containers: IncludedEnergizingContainers = IncludedEnergizingContainers.NONE,
include_energized_containers: IncludedEnergizedContainers = IncludedEnergizedContainers.NONE,
- network_state: NetworkState = NetworkState.NORMAL
+ network_state: NetworkState = NetworkState.NORMAL,
) -> GrpcResult[MultiObjectResult]:
return await self._handle_multi_object_rpc(
- lambda: self._process_equipment_for_containers(containers, include_energizing_containers, include_energized_containers, network_state)
+ lambda: self._process_equipment_for_containers(containers, include_energizing_containers, include_energized_containers, network_state),
)
- async def _get_equipment_for_restriction(self, restriction: [str, OperationalRestriction]) -> GrpcResult[MultiObjectResult]:
+ async def _get_equipment_for_restriction(self, restriction: str | OperationalRestriction) -> GrpcResult[MultiObjectResult]:
return await self._handle_multi_object_rpc(lambda: self._process_equipment_for_restriction(restriction))
- async def _get_terminals_for_connectivity_node(self, node: [str, ConnectivityNode]) -> GrpcResult[MultiObjectResult]:
+ async def _get_terminals_for_connectivity_node(self, node: str | ConnectivityNode) -> GrpcResult[MultiObjectResult]:
return await self._handle_multi_object_rpc(lambda: self._process_terminals_for_connectivity_node(node))
async def _get_network_hierarchy(self, config: GetNetworkHierarchyConfig = GetNetworkHierarchyConfig()) -> GrpcResult[NetworkHierarchy]:
@@ -399,7 +400,7 @@ async def _get_equipment_container(
expected_class: type = EquipmentContainer,
include_energizing_containers: IncludedEnergizingContainers = IncludedEnergizingContainers.NONE,
include_energized_containers: IncludedEnergizedContainers = IncludedEnergizedContainers.NONE,
- network_state: NetworkState = NetworkState.NORMAL
+ network_state: NetworkState = NetworkState.NORMAL,
) -> GrpcResult[MultiObjectResult]:
async def get_additional(it: EquipmentContainer, mor: MultiObjectResult) -> Optional[GrpcResult[MultiObjectResult]]:
result = await self._get_equipment_for_container(it, include_energizing_containers, include_energized_containers, network_state)
@@ -488,13 +489,13 @@ async def _process_equipment_for_container(
self, it: Union[str, EquipmentContainer],
include_energizing_containers: IncludedEnergizingContainers,
include_energized_containers: IncludedEnergizedContainers,
- network_state: NetworkState = NetworkState.NORMAL
+ network_state: NetworkState = NetworkState.NORMAL,
) -> AsyncGenerator[IdentifiedObject, None]:
async for response in self._process_equipment_for_containers(
[it.mrid if isinstance(it, EquipmentContainer) else it],
include_energizing_containers,
include_energized_containers,
- network_state
+ network_state,
):
yield response
@@ -503,7 +504,7 @@ async def _process_equipment_for_containers(
mrids: Iterable[str],
include_energizing_containers: IncludedEnergizingContainers,
include_energized_containers: IncludedEnergizedContainers,
- network_state: NetworkState = NetworkState.NORMAL
+ network_state: NetworkState = NetworkState.NORMAL,
) -> AsyncGenerator[IdentifiedObject, None]:
request = GetEquipmentForContainersRequest()
request.includeEnergizingContainers = _map_include_energizing_containers.to_pb(include_energizing_containers)
@@ -514,16 +515,20 @@ async def _process_equipment_for_containers(
for nio in response.identifiedObjects:
yield self._extract_identified_object("network", nio, _nio_type_to_cim)
- async def _process_equipment_for_restriction(self,
- it: Union[str, OperationalRestriction]) -> AsyncGenerator[IdentifiedObject, None]:
+ async def _process_equipment_for_restriction(
+ self,
+ it: Union[str, OperationalRestriction],
+ ) -> AsyncGenerator[IdentifiedObject, None]:
mrid = it.mrid if isinstance(it, OperationalRestriction) else it
responses = self._stub.getEquipmentForRestriction(GetEquipmentForRestrictionRequest(mrid=mrid), timeout=self.timeout)
async for response in responses:
for nio in response.identifiedObjects:
yield self._extract_identified_object("network", nio, _nio_type_to_cim)
- async def _process_terminals_for_connectivity_node(self,
- it: Union[str, ConnectivityNode]) -> AsyncGenerator[IdentifiedObject, None]:
+ async def _process_terminals_for_connectivity_node(
+ self,
+ it: Union[str, ConnectivityNode],
+ ) -> AsyncGenerator[IdentifiedObject, None]:
mrid = it.mrid if isinstance(it, ConnectivityNode) else it
responses = self._stub.getTerminalsForNode(GetTerminalsForNodeRequest(mrid=mrid), timeout=self.timeout)
async for response in responses:
@@ -569,11 +574,12 @@ async def rpc():
return await self.try_rpc(rpc)
- async def _get_with_references(self,
- mrid: str,
- expected_class: type(Generic[CIM_IO]),
- get_additional: Callable[[Generic[CIM_IO], MultiObjectResult], Awaitable[Optional[GrpcResult[MultiObjectResult]]]]
- ) -> GrpcResult[MultiObjectResult]:
+ async def _get_with_references(
+ self,
+ mrid: str,
+ expected_class: type[CIM_IO],
+ get_additional: Callable[[CIM_IO, MultiObjectResult], Awaitable[Optional[GrpcResult[MultiObjectResult]]]],
+ ) -> GrpcResult[MultiObjectResult]:
if not self.__network_hierarchy:
response = await self._get_network_hierarchy()
if response.was_failure:
@@ -641,7 +647,7 @@ async def _resolve_references(self, mor: MultiObjectResult) -> Optional[GrpcResu
return None
- def _to_map(self, objects: Iterable[Generic[PB_IO]], class_: type(Generic[CIM_IO])) -> Dict[str, CIM_IO]:
+ def _to_map(self, objects: Iterable[PB_IO], class_: type[Generic[CIM_IO]]) -> Dict[str, CIM_IO]:
result = {}
for pb in objects:
@@ -666,10 +672,10 @@ def get_equipment_for_container(
container: Union[str, EquipmentContainer],
include_energizing_containers: IncludedEnergizingContainers = IncludedEnergizingContainers.NONE,
include_energized_containers: IncludedEnergizedContainers = IncludedEnergizedContainers.NONE,
- network_state: NetworkState = NetworkState.NORMAL
+ network_state: NetworkState = NetworkState.NORMAL,
) -> GrpcResult[MultiObjectResult]:
return get_event_loop().run_until_complete(
- super().get_equipment_for_container(container, include_energizing_containers, include_energized_containers, network_state)
+ super().get_equipment_for_container(container, include_energizing_containers, include_energized_containers, network_state),
)
def get_equipment_for_containers(
@@ -677,10 +683,10 @@ def get_equipment_for_containers(
containers: Iterable[str],
include_energizing_containers: IncludedEnergizingContainers = IncludedEnergizingContainers.NONE,
include_energized_containers: IncludedEnergizedContainers = IncludedEnergizedContainers.NONE,
- network_state: NetworkState = NetworkState.NORMAL
+ network_state: NetworkState = NetworkState.NORMAL,
) -> GrpcResult[MultiObjectResult]:
return get_event_loop().run_until_complete(
- super().get_equipment_for_containers(containers, include_energizing_containers, include_energized_containers, network_state)
+ super().get_equipment_for_containers(containers, include_energizing_containers, include_energized_containers, network_state),
)
def get_equipment_for_restriction(self, mrid: str) -> GrpcResult[MultiObjectResult]:
@@ -702,10 +708,10 @@ def get_equipment_container(
expected_class: type = EquipmentContainer,
include_energizing_containers: IncludedEnergizingContainers = IncludedEnergizingContainers.NONE,
include_energized_containers: IncludedEnergizedContainers = IncludedEnergizedContainers.NONE,
- network_state: NetworkState = NetworkState.NORMAL
+ network_state: NetworkState = NetworkState.NORMAL,
) -> GrpcResult[MultiObjectResult]:
return get_event_loop().run_until_complete(
- super().get_equipment_container(mrid, expected_class, include_energizing_containers, include_energized_containers, network_state)
+ super().get_equipment_container(mrid, expected_class, include_energizing_containers, include_energized_containers, network_state),
)
def get_equipment_for_loop(self, loop: Union[str, Loop], network_state: NetworkState = NetworkState.NORMAL) -> GrpcResult[MultiObjectResult]:
diff --git a/src/zepben/ewb/streaming/get/query_network_state_service.py b/src/zepben/ewb/streaming/get/query_network_state_service.py
index 6d339d5d0..37b8ee17b 100644
--- a/src/zepben/ewb/streaming/get/query_network_state_service.py
+++ b/src/zepben/ewb/streaming/get/query_network_state_service.py
@@ -6,7 +6,7 @@
__all__ = ["QueryNetworkStateService"]
from datetime import datetime
-from typing import Callable, AsyncGenerator, Optional
+from typing import Callable, AsyncGenerator, Optional, Any
from google.protobuf import empty_pb2
from zepben.protobuf.ns.network_state_pb2_grpc import QueryNetworkStateServiceServicer
@@ -35,8 +35,8 @@ class QueryNetworkStateService(QueryNetworkStateServiceServicer):
def __init__(
self,
on_get_current_states: Callable[[datetime, datetime], AsyncGenerator[CurrentStateEventBatch, None]],
- on_current_states_status: Callable[[SetCurrentStatesStatus], None],
- on_processing_error: Callable[[str, Optional[Exception]], None]
+ on_current_states_status: Callable[[SetCurrentStatesStatus], Any],
+ on_processing_error: Callable[[str, Optional[Exception]], Any]
):
self.on_get_current_states = on_get_current_states
self.on_current_states_status = on_current_states_status
diff --git a/src/zepben/ewb/streaming/grpc/grpc.py b/src/zepben/ewb/streaming/grpc/grpc.py
index bb13182d0..fe06cc242 100644
--- a/src/zepben/ewb/streaming/grpc/grpc.py
+++ b/src/zepben/ewb/streaming/grpc/grpc.py
@@ -7,7 +7,7 @@
__all__ = ["GrpcResult", "GrpcClient"]
-from typing import TypeVar, Generic, Callable, List, Union, Coroutine
+from typing import TypeVar, Generic, Callable, List, Union, Coroutine, Any
from zepben.ewb.dataclassy import dataclass
@@ -43,7 +43,7 @@ def was_failure(self):
def was_error_unhandled(self):
return not self.was_error_handled
- def on_success(self, handler: Callable[[T], None]) -> GrpcResult[T]:
+ def on_success(self, handler: Callable[[T], Any]) -> GrpcResult[T]:
"""Calls `handler` with the `result` if this `was_successful`"""
if self.was_successful:
handler(self.result)
@@ -55,13 +55,13 @@ def on_error(self, handler: Callable[[Exception, bool], GrpcResult[T]]) -> GrpcR
return handler(self.result, self.was_error_handled)
return self
- def on_handled_error(self, handler: Callable[[Exception], None]) -> GrpcResult[T]:
+ def on_handled_error(self, handler: Callable[[Exception], Any]) -> GrpcResult[T]:
"""Calls `handler` with the `thrown` exception if `self.was_failure` only if `self.was_error_handled`."""
if self.was_failure and self.was_error_handled:
handler(self.result)
return self
- def on_unhandled_error(self, handler: Callable[[Exception], None]) -> GrpcResult[T]:
+ def on_unhandled_error(self, handler: Callable[[Exception], Any]) -> GrpcResult[T]:
"""Calls `handler` with the `thrown` exception if `self.was_failure` only if not `self.was_error_handled`."""
if self.was_failure and not self.was_error_handled:
handler(self.result)
diff --git a/src/zepben/ewb/testing/test_network_builder.py b/src/zepben/ewb/testing/test_network_builder.py
index 790dcb663..6e73c0d2c 100644
--- a/src/zepben/ewb/testing/test_network_builder.py
+++ b/src/zepben/ewb/testing/test_network_builder.py
@@ -3,7 +3,7 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from logging import Logger
-from typing import Optional, Callable, List, Union, Type, TypeVar, Protocol, Iterable
+from typing import Optional, Callable, List, Union, Type, TypeVar, Protocol, Iterable, Any
from zepben.ewb import (ConductingEquipment, NetworkService, PhaseCode, EnergySource, AcLineSegment, Breaker, Terminal, LvFeeder,
PowerTransformer, EnergyConsumer, PowerElectronicsConnection, Clamp, Cut, Substation)
@@ -55,7 +55,7 @@ def from_source(
self,
nominal_phases: PhaseCode = PhaseCode.ABC,
mrid: Optional[str] = None,
- action: Callable[[EnergySource], None] = null_action
+ action: Callable[[EnergySource], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Start a new network island from an `EnergySource`, updating the network pointer to the new `EnergySource`.
@@ -76,7 +76,7 @@ def to_source(
nominal_phases: PhaseCode = PhaseCode.ABC,
mrid: Optional[str] = None,
connectivity_node_mrid: Optional[str] = None,
- action: Callable[[EnergySource], None] = null_action
+ action: Callable[[EnergySource], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Add a new `EnergySource` to the network and connect it to the current network pointer, updating the network pointer to the new `EnergySource`.
@@ -99,7 +99,7 @@ def from_acls(
self,
nominal_phases: PhaseCode = PhaseCode.ABC,
mrid: Optional[str] = None,
- action: Callable[[AcLineSegment], None] = null_action
+ action: Callable[[AcLineSegment], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Start a new network island from an `AcLineSegment`, updating the network pointer to the new `AcLineSegment`.
@@ -120,7 +120,7 @@ def to_acls(
nominal_phases: PhaseCode = PhaseCode.ABC,
mrid: Optional[str] = None,
connectivity_node_mrid: Optional[str] = None,
- action: Callable[[AcLineSegment], None] = null_action
+ action: Callable[[AcLineSegment], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Add a new `AcLineSegment` to the network and connect it to the current network pointer, updating the network pointer to the new `AcLineSegment`.
@@ -145,7 +145,7 @@ def from_breaker(
is_normally_open: bool = False,
is_open: Optional[bool] = None,
mrid: Optional[str] = None,
- action: Callable[[Breaker], None] = null_action
+ action: Callable[[Breaker], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Start a new network island from a `Breaker`, updating the network pointer to the new `Breaker`.
@@ -170,7 +170,7 @@ def to_breaker(
is_open: Optional[bool] = None,
mrid: Optional[str] = None,
connectivity_node_mrid: Optional[str] = None,
- action: Callable[[Breaker], None] = null_action
+ action: Callable[[Breaker], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Add a new `Breaker` to the network and connect it to the current network pointer, updating the network pointer to the new `Breaker`.
@@ -196,7 +196,7 @@ def from_junction(
nominal_phases: PhaseCode = PhaseCode.ABC,
num_terminals: Optional[int] = None,
mrid: Optional[str] = None,
- action: Callable[[Junction], None] = null_action
+ action: Callable[[Junction], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Start a new network island from a `Junction`, updating the network pointer to the new `Junction`.
@@ -219,7 +219,7 @@ def to_junction(
num_terminals: Optional[int] = None,
mrid: Optional[str] = None,
connectivity_node_mrid: Optional[str] = None,
- action: Callable[[Junction], None] = null_action
+ action: Callable[[Junction], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Add a new `Junction` to the network and connect it to the current network pointer, updating the network pointer to the new `Junction`.
@@ -245,7 +245,7 @@ def to_power_electronics_connection(
num_terminals: Optional[int] = None,
mrid: Optional[str] = None,
connectivity_node_mrid: Optional[str] = None,
- action: Callable[[PowerElectronicsConnection], None] = null_action
+ action: Callable[[PowerElectronicsConnection], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Add a new `PowerElectronicsConnection` to the network and connect it to the current network pointer, updating the network pointer to the new
@@ -269,9 +269,9 @@ def to_power_electronics_connection(
def from_power_transformer(
self,
nominal_phases: Optional[List[PhaseCode]] = None,
- end_actions: Optional[List[Callable[[PowerTransformerEnd], None]]] = None,
+ end_actions: Optional[List[Callable[[PowerTransformerEnd], Any]]] = None,
mrid: Optional[str] = None,
- action: Callable[[PowerTransformer], None] = null_action
+ action: Callable[[PowerTransformer], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Start a new network island from a `PowerTransformer`, updating the network pointer to the new `PowerTransformer`.
@@ -294,10 +294,10 @@ def from_power_transformer(
def to_power_transformer(
self,
nominal_phases: Optional[List[PhaseCode]] = None,
- end_actions: Optional[List[Callable[[PowerTransformerEnd], None]]] = None,
+ end_actions: Optional[List[Callable[[PowerTransformerEnd], Any]]] = None,
mrid: Optional[str] = None,
connectivity_node_mrid: Optional[str] = None,
- action: Callable[[PowerTransformer], None] = null_action
+ action: Callable[[PowerTransformer], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Add a new `PowerTransformer` to the network and connect it to the current network pointer, updating the network pointer to the new `PowerTransformer`.
@@ -326,7 +326,7 @@ def to_energy_consumer(
nominal_phases: PhaseCode = PhaseCode.ABC,
mrid: Optional[str] = None,
connectivity_node_mrid: Optional[str] = None,
- action: Callable[[EnergyConsumer], None] = null_action
+ action: Callable[[EnergyConsumer], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Add a new `EnergyConsumer` to the network and connect it to the current network pointer, updating the network pointer to the new
@@ -350,7 +350,7 @@ def from_busbar_section(
self,
nominal_phases: PhaseCode = PhaseCode.ABC,
mrid: str = None,
- action: Callable[[BusbarSection], None] = null_action
+ action: Callable[[BusbarSection], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Start a new network island from a `BusbarSection`, updating the network pointer to the new `BusbarSection`.
@@ -371,7 +371,7 @@ def to_busbar_section(
nominal_phases: PhaseCode = PhaseCode.ABC,
mrid: str = None,
connectivity_node_mrid: Optional[str] = None,
- action: Callable[[BusbarSection], None] = null_action
+ action: Callable[[BusbarSection], Any] = null_action
) -> 'TestNetworkBuilder':
"""
@@ -397,7 +397,7 @@ def from_other(
nominal_phases: PhaseCode = PhaseCode.ABC,
num_terminals: Optional[int] = None,
mrid: Optional[str] = None,
- action: Callable[[SubclassesConductingEquipment], None] = null_action,
+ action: Callable[[SubclassesConductingEquipment], Any] = null_action,
default_mrid_prefix: Optional[str] = None
) -> 'TestNetworkBuilder':
"""
@@ -427,7 +427,7 @@ def to_other(
num_terminals: Optional[int] = None,
mrid: Optional[str] = None,
connectivity_node_mrid: Optional[str] = None,
- action: Callable[[SubclassesConductingEquipment], None] = null_action,
+ action: Callable[[SubclassesConductingEquipment], Any] = null_action,
default_mrid_prefix: Optional[str] = None
) -> 'TestNetworkBuilder':
"""
@@ -459,7 +459,7 @@ def with_clamp(
mrid: Optional[str] = None,
length_from_terminal_1: float = None,
nominal_phases: PhaseCode = PhaseCode.ABC,
- action: Callable[[Clamp], None] = null_action
+ action: Callable[[Clamp], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Create a clamp on the current network pointer (must be an `AcLineSegment`) without moving the current network pointer.
@@ -490,7 +490,7 @@ def with_cut(
is_normally_open: bool = True,
is_open: bool = None,
nominal_phases: PhaseCode = PhaseCode.ABC,
- action: Callable[[Cut], None] = null_action
+ action: Callable[[Cut], Any] = null_action
) -> 'TestNetworkBuilder':
"""
Create a cut on the current network pointer (must be an `AcLineSegment`) without moving the current network pointer.
@@ -677,8 +677,8 @@ async def build(self, apply_directions_from_sources: bool = True, debug_logger:
if apply_directions_from_sources:
for es in self.network.objects(EnergySource):
for terminal in es.terminals:
- await Tracing.set_direction(debug_logger=debug_logger).run_terminal(terminal, network_state_operators=NetworkStateOperators.NORMAL)
- await Tracing.set_direction(debug_logger=debug_logger).run_terminal(terminal, network_state_operators=NetworkStateOperators.CURRENT)
+ await Tracing.set_direction(debug_logger=debug_logger).run(terminal, network_state_operators=NetworkStateOperators.NORMAL)
+ await Tracing.set_direction(debug_logger=debug_logger).run(terminal, network_state_operators=NetworkStateOperators.CURRENT)
await Tracing.assign_equipment_to_feeders(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.NORMAL)
await Tracing.assign_equipment_to_lv_feeders(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.NORMAL)
diff --git a/src/zepben/ewb/util.py b/src/zepben/ewb/util.py
index 2740714b7..bc09ebf57 100644
--- a/src/zepben/ewb/util.py
+++ b/src/zepben/ewb/util.py
@@ -186,7 +186,10 @@ def __get__(self, cls, owner: T) -> T:
return classmethod(self.fget).__get__(None, owner)()
-def datetime_to_timestamp(date_time: datetime) -> PBTimestamp:
+def datetime_to_timestamp(date_time: Optional[datetime]) -> Optional[PBTimestamp]:
+ if date_time is None:
+ return None
+
timestamp = PBTimestamp()
timestamp.FromDatetime(date_time)
return timestamp
diff --git a/test/cim/cim_creators.py b/test/cim/cim_creators.py
deleted file mode 100644
index 736fdec02..000000000
--- a/test/cim/cim_creators.py
+++ /dev/null
@@ -1,1966 +0,0 @@
-# Copyright 2024 Zeppelin Bend Pty Ltd
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-
-__all__ = ['create_cable_info', 'create_no_load_test', 'create_open_circuit_test', 'create_overhead_wire_info', 'create_power_transformer_info',
- 'create_short_circuit_test', 'create_series_compensator', 'create_shunt_compensator_info', 'create_switch_info', 'create_transformer_end_info',
- 'create_transformer_tank_info', 'create_transformer_test', 'create_wire_info', 'sampled_wire_material_kind', 'create_asset', 'create_asset_info',
- 'create_asset_container', 'create_asset_organisation_role', 'create_asset_owner', 'create_pole', 'create_streetlight',
- 'sampled_streetlight_lamp_kind', 'create_structure', 'create_agreement', 'create_document', 'create_location', 'create_organisation',
- 'create_organisation_role', 'create_position_point', 'create_street_address', 'create_street_detail', 'create_town_detail', 'create_customer',
- 'create_customer_agreement', 'sampled_customer_kind', 'create_pricing_structure', 'create_tariffs', 'create_relay_info',
- 'create_current_transformer_info', 'create_potential_transformer_info', 'create_ratio', 'create_end_device', 'create_meter', 'create_usage_point',
- 'create_operational_restriction', 'create_auxiliary_equipment', 'create_current_transformer', 'create_fault_indicator',
- 'create_potential_transformer', 'create_sensor', 'create_ac_dc_terminal', 'create_base_voltage', 'create_conducting_equipment',
- 'create_connectivity_node', 'create_connectivity_node_container', 'create_equipment', 'create_equipment_container', 'create_feeder',
- 'create_geographical_region', 'create_identified_object', 'create_name', 'create_name_type', 'sampled_phase_code', 'create_power_system_resource',
- 'create_site', 'create_sub_geographical_region', 'create_substation', 'create_terminal', 'create_equivalent_branch', 'create_equivalent_equipment',
- 'create_diagram', 'create_diagram_object', 'create_diagram_object_point', 'create_accumulator', 'create_accumulator_value', 'create_analog',
- 'create_analog_value', 'create_control', 'create_discrete', 'create_discrete_value', 'create_io_point', 'create_measurement', 'sampled_unit_symbol',
- 'create_current_relay', 'create_distance_relay', 'create_protection_relay_function', 'create_protection_relay_scheme', 'create_voltage_relay',
- 'create_protection_relay_system', 'create_remote_control', 'create_remote_point', 'create_remote_source', 'sampled_battery_state_kind',
- 'create_battery_unit', 'create_photo_voltaic_unit', 'create_power_electronics_unit', 'create_power_electronics_wind_unit', 'create_ac_line_segment',
- 'create_breaker', 'create_busbar_section', 'create_conductor', 'create_connector', 'create_disconnector', 'create_energy_consumer',
- 'create_energy_connection', 'create_energy_consumer_phase', 'create_energy_source', 'create_energy_source_phase', 'create_fuse', 'create_ground',
- 'create_ground_disconnector', 'create_jumper', 'create_junction', 'create_line', 'create_linear_shunt_compensator', 'create_load_break_switch',
- 'create_per_length_impedance', 'create_per_length_line_parameter', 'create_per_length_sequence_impedance', 'sampled_phase_shunt_connection_kind',
- 'create_power_electronics_connection', 'create_power_electronics_connection_phase', 'create_power_transformer', 'create_power_transformer_end',
- 'create_protected_switch', 'create_ratio_tap_changer', 'create_recloser', 'create_regulating_cond_eq', 'create_shunt_compensator',
- 'sampled_single_phase_kind', 'create_switch', 'create_tap_changer', 'create_transformer_end', 'create_transformer_star_impedance',
- 'sampled_vector_group', 'sampled_winding_connection', 'create_circuit', 'create_loop', 'create_lv_feeder', "create_ev_charging_unit",
- 'traced_phases', 'sampled_wire_info', 'sampled_conducting_equipment', 'sampled_equipment', 'sampled_equipment_container', 'sampled_hvlv_feeder',
- 'sampled_measurement', 'sampled_protected_switches', 'create_tap_changer_control', 'MIN_32_BIT_INTEGER', 'MAX_32_BIT_INTEGER',
- 'MAX_32_BIT_UNSIGNED_INTEGER', 'MAX_64_BIT_INTEGER', 'MIN_64_BIT_INTEGER', 'TEXT_MAX_SIZE', 'FLOAT_MIN', 'FLOAT_MAX', 'MAX_END_NUMBER',
- 'MAX_SEQUENCE_NUMBER', 'MIN_SEQUENCE_NUMBER', 'ALPHANUM', 'boolean_or_none', 'create_grounding_impedance', 'create_petersen_coil',
- 'create_reactive_capability_curve', 'create_synchronous_machine', 'create_earth_fault_compensator', 'create_curve', 'create_curve_data',
- 'create_rotating_machine', 'sampled_curves', 'create_pan_demand_response_function', 'create_battery_control', 'create_asset_function',
- 'create_end_device_function', 'create_static_var_compensator', 'create_per_length_phase_impedance', 'create_phase_impedance_data', 'create_clamp',
- 'create_cut', 'sampled_transformer_construction_kind', 'sampled_transformer_function_kind', 'create_controlled_appliance',
- 'sampled_end_device_function_kind', 'sampled_potential_transformer_kind', 'sampled_diagram_style', 'sampled_orientation_kind',
- 'create_measurement_value', 'sampled_regulating_control_mode_kind', 'sampled_svc_control_mode', 'sampled_synchronous_machine_kind',
- 'sampled_power_direction_kind', 'sampled_protection_kind', 'create_relay_setting', 'sampled_battery_control_mode', 'sampled_transformer_cooling_type'
- ]
-
-from datetime import datetime
-from random import choice
-
-from streaming.get.pb_creators import lists, floats
-from util import mrid_strategy
-# @formatter:off
-
-# This must be above hypothesis.strategies to avoid conflicting import with zepben.ewb.util.none
-from zepben.ewb import *
-
-from hypothesis.strategies import builds, text, integers, sampled_from, booleans, uuids, datetimes, one_of, none
-from zepben.ewb.model.cim.extensions.iec61970.base.feeder.lv_substation import LvSubstation
-from zepben.ewb.model.cim.iec61968.assetinfo.wire_insulation_kind import WireInsulationKind
-from zepben.ewb.model.cim.iec61970.base.wires.ac_line_segment_phase import AcLineSegmentPhase
-from zepben.ewb.services.common.resolver import normal_energizing_lv_substations
-
-# @formatter:on
-
-# WARNING!! # THIS IS A WORK IN PROGRESS AND MANY FUNCTIONS ARE LIKELY BROKEN
-
-MIN_32_BIT_INTEGER = -2147483647 # _UNKNOWN_INT = -2147483648
-MAX_32_BIT_INTEGER = 2147483647
-MAX_32_BIT_UNSIGNED_INTEGER = 4294967294 # _UNKNOWN_UINT = 4294967295
-MAX_64_BIT_INTEGER = 9223372036854775807
-MIN_64_BIT_INTEGER = -9223372036854775807 # _UNKNOWN_LONG = -9223372036854775808
-TEXT_MAX_SIZE = 6
-FLOAT_MIN = -100.0
-FLOAT_MAX = 1000.0
-MAX_END_NUMBER = 3
-MAX_SEQUENCE_NUMBER = 40
-MIN_SEQUENCE_NUMBER = 1
-ALPHANUM = "abcdefghijbklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
-
-
-##################################
-# Extensions IEC61968 Asset Info #
-##################################
-
-def create_relay_info(include_runtime: bool = True):
- return builds(
- RelayInfo,
- **create_asset_info(include_runtime),
- curve_setting=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
- reclose_delays=lists(floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- reclose_fast=boolean_or_none()
- )
-
-
-##############################
-# Extensions IEC61968 Common #
-##############################
-
-def create_contact_details():
- return builds(
- ContactDetails,
- id=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE, min_size=1),
- contact_address=create_street_address(),
- contact_type=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- first_name=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- last_name=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- preferred_contact_method=sampled_from(ContactMethodType),
- is_primary=one_of(none(), booleans()),
- business_name=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- phone_numbers=one_of(none(), lists(create_telephone_number())),
- electronic_addresses=one_of(none(), lists(create_electronic_address())),
- )
-
-################################
-# Extensions IEC61968 Metering #
-################################
-
-def create_pan_demand_response_function(include_runtime: bool = True):
- return builds(
- PanDemandResponseFunction,
- **create_end_device_function(include_runtime),
- kind=sampled_from(EndDeviceFunctionKind),
- appliances=integers(min_value=0, max_value=4095)
- )
-
-
-#################################
-# Extensions IEC61970 Base Core #
-#################################
-
-def create_hv_customer(include_runtime: bool = True):
- return builds(Site, **create_equipment_container(include_runtime))
-
-def create_site(include_runtime: bool = True):
- return builds(Site, **create_equipment_container(include_runtime))
-
-
-###################################
-# Extensions IEC61970 Base Feeder #
-###################################
-
-def create_loop(include_runtime: bool = True):
- return builds(
- Loop,
- **create_identified_object(include_runtime),
- circuits=lists(builds(Circuit, **create_identified_object(include_runtime)), max_size=2),
- substations=lists(builds(Substation, **create_identified_object(include_runtime)), max_size=2),
- energizing_substations=lists(builds(Substation, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-def create_lv_feeder(include_runtime: bool = True):
- runtime = {
- "normal_energizing_feeders": lists(builds(Feeder, **create_identified_object(include_runtime)), max_size=2),
- "current_equipment": lists(sampled_equipment(include_runtime), max_size=2),
- "current_energizing_feeders": lists(builds(Feeder, **create_identified_object(include_runtime)), max_size=2),
- "normal_energizing_lv_substation": builds(LvSubstation, **create_identified_object(include_runtime)),
- } if include_runtime else {}
-
- return builds(
- LvFeeder,
- # Only include equipment if we are processing runtime as we don't write equipment to the database for LvFeeder.
- **create_equipment_container(include_runtime, add_equipment=include_runtime),
- normal_head_terminal=builds(Terminal, **create_identified_object(include_runtime)),
- **runtime
- )
-
-
-def create_lv_substation(include_runtime: bool = True):
- runtime = {
- "normal_energizing_feeders": lists(builds(Feeder, **create_identified_object(include_runtime)), max_size=2),
- "current_energizing_feeders": lists(builds(Feeder, **create_identified_object(include_runtime)), max_size=2),
- "current_equipment": lists(sampled_equipment(include_runtime), max_size=2),
- "normal_energized_lv_feeder": builds(LvFeeder, **create_identified_object(include_runtime)),
- }
-
- return builds(
- LvSubstation,
- **create_equipment_container(include_runtime, add_equipment=include_runtime),
- )
-
-
-##################################################
-# Extensions IEC61970 Base Generation Production #
-##################################################
-
-def create_ev_charging_unit(include_runtime: bool = True):
- return builds(EvChargingUnit, **create_power_electronics_unit(include_runtime))
-
-
-#######################################
-# Extensions IEC61970 Base Protection #
-#######################################
-
-def create_directional_current_relay(include_runtime: bool = True):
- return builds(
- DirectionalCurrentRelay,
- **create_protection_relay_function(include_runtime),
- directional_characteristic_angle=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- polarizing_quantity_type=sampled_from(PolarizingQuantityType),
- relay_element_phase=sampled_from(PhaseCode),
- minimum_pickup_current=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- current_limit_1=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- inverse_time_flag=boolean_or_none(),
- time_delay_1=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- )
-
-
-def create_distance_relay(include_runtime: bool = True):
- return builds(
- DistanceRelay,
- **create_protection_relay_function(include_runtime),
- backward_blind=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- backward_reach=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- backward_reactance=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- forward_blind=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- forward_reach=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- forward_reactance=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- operation_phase_angle1=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- operation_phase_angle2=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- operation_phase_angle3=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
- )
-
-
-def sampled_power_direction_kind():
- return sampled_from(PowerDirectionKind)
-
-
-def sampled_protection_kind():
- return sampled_from(ProtectionKind)
-
-
-def create_protection_relay_function(include_runtime: bool = True):
- return {
- **create_power_system_resource(include_runtime),
- "model": text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
- "reclosing": boolean_or_none(),
- "relay_delay_time": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "protection_kind": sampled_protection_kind(),
- "directable": boolean_or_none(),
- "power_direction": sampled_power_direction_kind(),
- "sensors": lists(builds(CurrentTransformer, mrid=mrid_strategy), max_size=2),
- "protected_switches": lists(builds(Breaker, mrid=mrid_strategy), max_size=2),
- "schemes": lists(builds(ProtectionRelayScheme, mrid=mrid_strategy), max_size=2),
- "time_limits": lists(floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), min_size=4, max_size=4),
- "thresholds": lists(create_relay_setting(), min_size=4, max_size=4),
- "relay_info": builds(RelayInfo, mrid=mrid_strategy)
- }
-
-
-def create_protection_relay_scheme(include_runtime: bool = True):
- return builds(
- ProtectionRelayScheme,
- **create_identified_object(include_runtime),
- system=builds(ProtectionRelaySystem, mrid=mrid_strategy),
- functions=lists(builds(CurrentRelay, mrid=mrid_strategy))
- )
-
-
-def create_protection_relay_system(include_runtime: bool = True):
- return builds(
- ProtectionRelaySystem,
- **create_equipment(include_runtime),
- protection_kind=sampled_protection_kind(),
- schemes=lists(builds(ProtectionRelayScheme, mrid=mrid_strategy))
- )
-
-
-def create_relay_setting():
- return builds(
- RelaySetting,
- unit_symbol=sampled_unit_symbol(),
- value=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- name=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- )
-
-
-def create_voltage_relay(include_runtime: bool = True):
- return builds(
- VoltageRelay,
- **create_protection_relay_function(include_runtime),
- )
-
-
-##################################
-# Extensions IEC61970 Base Wires #
-##################################
-
-def create_battery_control(include_runtime: bool = True):
- return builds(
- BatteryControl,
- **create_regulating_control(include_runtime),
- charging_rate=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- discharging_rate=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- reserve_percent=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- control_mode=sampled_battery_control_mode()
- )
-
-
-def sampled_battery_control_mode():
- return sampled_from(BatteryControlMode)
-
-
-def sampled_transformer_cooling_type():
- return sampled_from(TransformerCoolingType)
-
-
-def create_power_transformer_end_with_ratings(ratings: List[TransformerEndRatedS], **kwargs):
- # This is needed as we purposely made it so you can't build a transformer end with multiple ratings through constructor
- pte = PowerTransformerEnd(**kwargs)
- if ratings:
- for rating in ratings:
- pte.add_transformer_end_rated_s(rating)
- return pte
-
-
-def sampled_vector_group():
- return sampled_from(VectorGroup)
-
-
-#######################
-# IEC61968 Asset Info #
-#######################
-
-
-def create_cable_info(include_runtime: bool = True):
- return builds(CableInfo, **create_wire_info(include_runtime))
-
-
-def create_no_load_test(include_runtime: bool = True):
- return builds(
- NoLoadTest,
- **create_transformer_test(include_runtime),
- energised_end_voltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- exciting_current=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- exciting_current_zero=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- loss=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- loss_zero=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
- )
-
-
-def create_open_circuit_test(include_runtime: bool = True):
- return builds(
- OpenCircuitTest,
- **create_transformer_test(include_runtime),
- energised_end_step=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- energised_end_voltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- open_end_step=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- open_end_voltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- phase_shift=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_overhead_wire_info(include_runtime: bool = True):
- return builds(OverheadWireInfo, **create_wire_info(include_runtime))
-
-
-def create_power_transformer_info(include_runtime: bool = True):
- return builds(
- PowerTransformerInfo,
- **create_asset_info(include_runtime),
- transformer_tank_infos=lists(builds(TransformerTankInfo, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-def create_short_circuit_test(include_runtime: bool = True):
- return builds(
- ShortCircuitTest,
- **create_transformer_test(include_runtime),
- current=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- energised_end_step=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- grounded_end_step=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- leakage_impedance=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- leakage_impedance_zero=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- loss=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- loss_zero=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- power=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- voltage=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- voltage_ohmic_part=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_shunt_compensator_info(include_runtime: bool = True):
- return builds(
- ShuntCompensatorInfo,
- **create_asset_info(include_runtime),
- max_power_loss=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- rated_current=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- rated_reactive_power=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- rated_voltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- )
-
-
-def create_switch_info(include_runtime: bool = True):
- return builds(
- SwitchInfo,
- **create_asset_info(include_runtime),
- rated_interrupting_time=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_transformer_end_info(include_runtime: bool = True):
- return builds(
- TransformerEndInfo,
- **create_asset_info(include_runtime),
- connection_kind=sampled_winding_connection(),
- emergency_s=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- end_number=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- insulation_u=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- phase_angle_clock=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- rated_s=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- rated_u=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- short_term_s=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- transformer_tank_info=builds(TransformerTankInfo, **create_identified_object(include_runtime)),
- transformer_star_impedance=builds(TransformerStarImpedance, **create_identified_object(include_runtime)),
- energised_end_no_load_tests=builds(NoLoadTest, **create_identified_object(include_runtime)),
- energised_end_short_circuit_tests=builds(ShortCircuitTest, **create_identified_object(include_runtime)),
- grounded_end_short_circuit_tests=builds(ShortCircuitTest, **create_identified_object(include_runtime)),
- open_end_open_circuit_tests=builds(OpenCircuitTest, **create_identified_object(include_runtime)),
- energised_end_open_circuit_tests=builds(OpenCircuitTest, **create_identified_object(include_runtime)),
- )
-
-
-def create_transformer_tank_info(include_runtime: bool = True):
- return builds(
- TransformerTankInfo,
- **create_asset_info(include_runtime),
- power_transformer_info=builds(PowerTransformerInfo, **create_identified_object(include_runtime)),
- transformer_end_infos=lists(builds(TransformerEndInfo, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-def create_transformer_test(include_runtime: bool):
- return {
- **create_identified_object(include_runtime),
- "base_power": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "temperature": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- }
-
-
-def create_wire_info(include_runtime: bool):
- return {
- **create_asset_info(include_runtime),
- "rated_current": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "material": sampled_wire_material_kind(),
- "size_description": one_of(none(), text(alphabet=ALPHANUM)),
- "strand_count": one_of(none(), text(alphabet=ALPHANUM)),
- "core_strand_count": one_of(none(), text(alphabet=ALPHANUM)),
- "insulated": booleans(),
- "insulation_material": sampled_wire_insulation_kind(),
- "insulation_thickness": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- }
-
-
-def sampled_wire_material_kind():
- return sampled_from(WireMaterialKind)
-
-
-def sampled_wire_insulation_kind():
- return sampled_from(WireInsulationKind)
-
-
-###################
-# IEC61968 Assets #
-###################
-
-
-def create_asset(include_runtime: bool):
- return {
- **create_identified_object(include_runtime),
- "location": builds(Location, **create_identified_object(include_runtime)),
- "organisation_roles": lists(builds(AssetOwner, **create_identified_object(include_runtime)), max_size=2),
- "power_system_resources": lists(builds(Junction, **create_identified_object(include_runtime)), max_size=2)
- }
-
-
-def create_asset_container(include_runtime: bool):
- return {**create_asset(include_runtime)}
-
-
-def create_asset_function(include_runtime: bool):
- return {**create_identified_object(include_runtime)}
-
-
-def create_asset_info(include_runtime: bool):
- return {**create_identified_object(include_runtime)}
-
-
-def create_asset_organisation_role(include_runtime: bool):
- return {**create_organisation_role(include_runtime)}
-
-
-def create_asset_owner(include_runtime: bool = True):
- return builds(AssetOwner, **create_asset_organisation_role(include_runtime))
-
-
-def create_streetlight(include_runtime: bool = True):
- return builds(
- Streetlight,
- **create_asset(include_runtime),
- pole=builds(Pole, **create_identified_object(include_runtime)),
- light_rating=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), # Capping unsigned int to 32-bit int range to avoid issues with Python 3.7 testing.
- lamp_kind=sampled_streetlight_lamp_kind()
- )
-
-
-def create_structure(include_runtime: bool):
- return {**create_asset_container(include_runtime)}
-
-
-###################
-# IEC61968 Common #
-###################
-
-
-def create_agreement(include_runtime: bool):
- return {**create_document(include_runtime)}
-
-
-def create_document(include_runtime: bool):
- return {
- **create_identified_object(include_runtime),
- "title": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "created_date_time": datetimes(min_value=datetime(1970, 1, 2)),
- "author_name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "type": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "status": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "comment": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- }
-
-
-def create_electronic_address():
- return builds(
- ElectronicAddress,
- email1=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- is_primary=one_of(none(), booleans()),
- description=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- )
-
-
-def create_location(include_runtime: bool = True):
- return builds(
- Location,
- **create_identified_object(include_runtime),
- main_address=create_street_address(),
- position_points=lists(create_position_point(), max_size=4)
- )
-
-
-def create_organisation(include_runtime: bool = True):
- return builds(Organisation, **create_identified_object(include_runtime))
-
-
-def create_organisation_role(include_runtime: bool):
- return {
- **create_identified_object(include_runtime),
- "organisation": builds(Organisation, **create_identified_object(include_runtime))
- }
-
-
-def create_position_point():
- return builds(
- PositionPoint,
- x_position=floats(min_value=-180.0, max_value=180.0),
- y_position=floats(min_value=-90.0, max_value=90.0)
- )
-
-
-def create_street_address():
- return builds(
- StreetAddress,
- postal_code=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- town_detail=create_town_detail(),
- po_box=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- street_detail=create_street_detail()
- )
-
-
-def create_street_detail():
- return builds(
- StreetDetail,
- building_name=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- floor_identification=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- name=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- number=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- suite_number=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- type=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- display_address=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- building_number=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE))
- )
-
-
-def create_telephone_number():
- return builds(
- TelephoneNumber,
- area_code=text(alphabet=ALPHANUM, max_size=3),
- city_code=one_of(none(), text(alphabet=ALPHANUM, max_size=2)),
- dial_out=one_of(none(), text(alphabet=ALPHANUM, max_size=3)),
- extension=one_of(none(), text(alphabet=ALPHANUM, max_size=4)),
- international_prefix=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- local_number=one_of(none(), text(alphabet=ALPHANUM, max_size=8)),
- is_primary=one_of(none(), booleans()),
- description=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- )
-
-
-def create_town_detail():
- return builds(
- TownDetail,
- name=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- state_or_province=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- country=one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- )
-
-
-######################
-# IEC61968 Customers #
-######################
-
-
-def create_customer(include_runtime: bool = True):
- return builds(
- Customer,
- **create_organisation_role(include_runtime),
- kind=sampled_customer_kind(),
- # We can't use blank strings as it breaks some of the tests due to protobuf conversions dropping the blanks for None.
- special_need=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
- customer_agreements=lists(builds(CustomerAgreement, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-def create_customer_agreement(include_runtime: bool = True):
- return builds(
- CustomerAgreement,
- **create_agreement(include_runtime),
- customer=builds(Customer, **create_identified_object(include_runtime)),
- pricing_structures=lists(builds(PricingStructure, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-def sampled_customer_kind():
- return sampled_from(CustomerKind)
-
-
-def create_pricing_structure(include_runtime: bool = True):
- return builds(
- PricingStructure,
- **create_document(include_runtime),
- tariffs=lists(builds(Tariff, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-def create_tariffs(include_runtime: bool = True):
- return builds(Tariff, **create_document(include_runtime))
-
-
-#####################################
-# IEC61968 InfIEC61968 InfAssetInfo #
-#####################################
-
-def create_current_transformer_info(include_runtime: bool = True):
- return builds(
- CurrentTransformerInfo,
- **create_asset_info(include_runtime),
- accuracy_class=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
- accuracy_limit=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- core_count=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- ct_class=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
- knee_point_voltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- max_ratio=create_ratio(),
- nominal_ratio=create_ratio(),
- primary_ratio=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- rated_current=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- secondary_fls_rating=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- secondary_ratio=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- usage=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE)
- )
-
-
-def create_potential_transformer_info(include_runtime: bool = True):
- return builds(
- PotentialTransformerInfo,
- **create_asset_info(include_runtime),
- accuracy_class=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
- nominal_ratio=create_ratio(),
- primary_ratio=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- pt_class=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
- rated_voltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- secondary_ratio=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def sampled_transformer_construction_kind():
- return sampled_from(TransformerConstructionKind)
-
-
-def sampled_transformer_function_kind():
- return sampled_from(TransformerFunctionKind)
-
-
-##################################
-# IEC61968 InfIEC61968 InfAssets #
-##################################
-
-
-def create_pole(include_runtime: bool = True):
- return builds(
- Pole,
- **create_structure(include_runtime),
- streetlights=lists(builds(Streetlight, **create_identified_object(include_runtime)), max_size=2),
- classification=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- )
-
-
-def sampled_streetlight_lamp_kind():
- return sampled_from(StreetlightLampKind)
-
-
-##################################
-# IEC61968 InfIEC61968 InfCommon #
-##################################
-
-
-def create_ratio():
- return builds(
- Ratio,
- numerator=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- denominator=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-#####################
-# IEC61968 Metering #
-#####################
-
-
-def create_controlled_appliance():
- return builds(
- ControlledAppliance,
- appliances=sampled_from(Appliance)
- )
-
-
-def create_end_device(include_runtime: bool):
- return {
- **create_asset_container(include_runtime),
- "usage_points": lists(builds(UsagePoint, **create_identified_object(include_runtime)), max_size=2),
- "customer_mrid": text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
- "service_location": builds(Location, **create_identified_object(include_runtime)),
- "functions": lists(sampled_end_device_function(include_runtime), max_size=2)
- }
-
-
-def create_end_device_function(include_runtime: bool):
- return {
- **create_asset_function(include_runtime),
- "enabled": booleans()
- }
-
-
-def sampled_end_device_function_kind():
- return sampled_from(EndDeviceFunctionKind)
-
-
-def create_meter(include_runtime: bool = True):
- return builds(Meter, **create_end_device(include_runtime))
-
-
-def create_usage_point(include_runtime: bool = True):
- return builds(
- UsagePoint,
- **create_identified_object(include_runtime),
- usage_point_location=builds(Location, **create_identified_object(include_runtime)),
- is_virtual=booleans(),
- connection_category=text(alphabet=ALPHANUM, min_size=2, max_size=TEXT_MAX_SIZE),
- rated_power=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- approved_inverter_capacity=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- equipment=lists(builds(EnergyConsumer, **create_identified_object(include_runtime)), max_size=2),
- end_devices=lists(builds(Meter, **create_identified_object(include_runtime)), max_size=2),
- contacts=lists(create_contact_details(), max_size=2)
- )
-
-
-#######################
-# IEC61968 Operations #
-#######################
-
-
-def create_operational_restriction(include_runtime: bool = True):
- return builds(
- OperationalRestriction,
- **create_document(include_runtime),
- equipment=lists(builds(PowerTransformer, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-#####################################
-# IEC61970 Base Auxiliary Equipment #
-#####################################
-
-def create_auxiliary_equipment(include_runtime: bool):
- return {
- **create_equipment(include_runtime),
- "terminal": builds(Terminal, **create_identified_object(include_runtime))
- }
-
-
-def create_current_transformer(include_runtime: bool = True):
- return builds(
- CurrentTransformer,
- **create_sensor(include_runtime),
- asset_info=builds(CurrentTransformerInfo, **create_identified_object(include_runtime)),
- core_burden=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
- )
-
-
-def create_fault_indicator(include_runtime: bool = True):
- return builds(FaultIndicator, **create_auxiliary_equipment(include_runtime))
-
-
-def create_potential_transformer(include_runtime: bool = True):
- return builds(
- PotentialTransformer,
- **create_sensor(include_runtime),
- asset_info=builds(PotentialTransformerInfo, **create_identified_object(include_runtime)),
- type=sampled_from(PotentialTransformerKind)
- )
-
-
-def sampled_potential_transformer_kind():
- return sampled_from(PotentialTransformerKind)
-
-
-def create_sensor(include_runtime: bool = True):
- return {
- **create_auxiliary_equipment(include_runtime),
- "relay_functions": lists(builds(CurrentRelay, mrid=mrid_strategy), max_size=10)
- }
-
-
-######################
-# IEC61970 Base Core #
-######################
-
-
-def create_ac_dc_terminal(include_runtime: bool):
- return {**create_identified_object(include_runtime)}
-
-
-def create_base_voltage(include_runtime: bool = True):
- return builds(
- BaseVoltage,
- **create_identified_object(include_runtime),
- nominal_voltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
- )
-
-
-def create_conducting_equipment(include_runtime: bool):
- return {
- **create_equipment(include_runtime),
- "base_voltage": builds(BaseVoltage, **create_identified_object(include_runtime)),
- "terminals": lists(builds(Terminal, **create_identified_object(include_runtime)), max_size=3)
- }
-
-
-def create_connectivity_node(include_runtime: bool = True):
- return builds(
- ConnectivityNode,
- **create_identified_object(include_runtime),
- terminals=lists(builds(Terminal, **create_identified_object(include_runtime)), max_size=10)
- )
-
-
-def create_connectivity_node_container(include_runtime: bool):
- return {**create_power_system_resource(include_runtime)}
-
-
-def create_curve(include_runtime: bool):
- return {
- **create_identified_object(include_runtime),
- "data": lists(create_curve_data(), max_size=4, unique_by=lambda it: it.x_value)
- }
-
-
-def create_curve_data():
- return builds(
- CurveData,
- x_value=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- y1_value=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- y2_value=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- y3_value=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
- )
-
-
-def create_equipment(include_runtime: bool):
- runtime = {
- "current_containers": lists(sampled_hvlv_feeder(include_runtime), max_size=2)
- } if include_runtime else {}
-
- return {
- **create_power_system_resource(include_runtime),
- "in_service": booleans(),
- "normally_in_service": booleans(),
- "equipment_containers": lists(sampled_equipment_container(include_runtime), max_size=2),
- "usage_points": lists(builds(UsagePoint, **create_identified_object(include_runtime)), max_size=2),
- "operational_restrictions": lists(builds(OperationalRestriction, **create_identified_object(include_runtime)), max_size=2),
- "commissioned_date": datetimes(min_value=datetime(1970, 1, 2)),
- **runtime
- }
-
-
-def create_equipment_container(include_runtime: bool, add_equipment: bool = True):
- equipment = {
- "equipment": lists(sampled_equipment(include_runtime), max_size=30)
- } if add_equipment else {}
-
- return {
- **create_connectivity_node_container(include_runtime),
- **equipment
- }
-
-
-def create_feeder(include_runtime: bool = True):
- runtime = {
- "normal_energized_lv_feeders": lists(builds(LvFeeder, **create_identified_object(include_runtime)), max_size=2),
- "current_energized_lv_feeders": lists(builds(LvFeeder, **create_identified_object(include_runtime)), max_size=2),
- "normal_energized_lv_substations": lists(builds(LvSubstation, **create_identified_object(include_runtime)), max_size=2),
- "current_energized_lv_substations": lists(builds(LvSubstation, **create_identified_object(include_runtime)), max_size=2),
- "current_equipment": lists(sampled_equipment(include_runtime), max_size=2),
- } if include_runtime else {}
-
- return builds(
- Feeder,
- # Only include equipment if we are processing runtime as we don't write equipment to the database for Feeder.
- **create_equipment_container(include_runtime, add_equipment=include_runtime),
- normal_head_terminal=builds(Terminal, **create_identified_object(include_runtime)),
- normal_energizing_substation=builds(Substation, **create_identified_object(include_runtime)),
- **runtime
- )
-
-
-def create_geographical_region(include_runtime: bool = True):
- return builds(
- GeographicalRegion,
- **create_identified_object(include_runtime),
- sub_geographical_regions=lists(builds(SubGeographicalRegion, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-# noinspection PyUnusedLocal
-def create_identified_object(include_runtime: bool):
- return {
- "mrid": uuids(version=4).map(lambda x: str(x)),
- "name": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- "description": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- "names": one_of(none(), lists(builds(Name, text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), create_name_type()), max_size=2, unique_by=lambda it: it.name))
- }
-
-
-def create_name(include_runtime: bool = True):
- return builds(
- Name,
- name=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- type=create_name_type(),
- identified_object=sampled_equipment(include_runtime)
- )
-
-
-def create_name_type():
- return builds(
- NameType,
- name=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- description=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- )
-
-
-def sampled_phase_code():
- return sampled_from(PhaseCode)
-
-
-def create_power_system_resource(include_runtime: bool):
- #
- # NOTE: We do not create the asset_info here, create it where it is actually used.
- #
- return {
- **create_identified_object(include_runtime),
- "location": create_location(),
- "num_controls": integers(min_value=0, max_value=MAX_64_BIT_INTEGER),
- "assets": lists(builds(Pole, **create_identified_object(include_runtime)), max_size=2)
- }
-
-
-def create_sub_geographical_region(include_runtime: bool = True):
- return builds(
- SubGeographicalRegion,
- **create_identified_object(include_runtime),
- geographical_region=builds(GeographicalRegion, **create_identified_object(include_runtime)),
- substations=lists(builds(Substation, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-def create_substation(include_runtime: bool = True):
- return builds(
- Substation,
- **create_equipment_container(include_runtime),
- sub_geographical_region=builds(SubGeographicalRegion, **create_identified_object(include_runtime)),
- normal_energized_feeders=lists(builds(Feeder, **create_identified_object(include_runtime)), max_size=2),
- loops=lists(builds(Loop, **create_identified_object(include_runtime)), max_size=2),
- energized_loops=lists(builds(Loop, **create_identified_object(include_runtime)), max_size=2),
- circuits=lists(builds(Circuit, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-def create_terminal(include_runtime: bool = True):
- runtime = {
- } if include_runtime else {}
- return builds(
- Terminal,
- **create_ac_dc_terminal(include_runtime),
- conducting_equipment=sampled_conducting_equipment(include_runtime),
- connectivity_node=builds(ConnectivityNode, **create_identified_object(include_runtime)),
- phases=sampled_phase_code(),
- sequence_number=integers(min_value=MIN_SEQUENCE_NUMBER, max_value=MAX_SEQUENCE_NUMBER),
- **runtime
- )
-
-
-################################
-# IEC61970 Base Diagram Layout #
-################################
-
-
-def create_diagram(include_runtime: bool = True):
- return builds(
- Diagram,
- **create_identified_object(include_runtime),
- diagram_style=sampled_diagram_style(),
- orientation_kind=sampled_orientation_kind(),
- diagram_objects=lists(builds(DiagramObject, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-def create_diagram_object(include_runtime: bool = True):
- return builds(
- DiagramObject,
- **create_identified_object(include_runtime),
- diagram=builds(Diagram, **create_identified_object(include_runtime)),
- identified_object_mrid=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
- style=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
- rotation=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- diagram_object_points=lists(create_diagram_object_point(), max_size=2)
- )
-
-
-def create_diagram_object_point():
- return builds(
- DiagramObjectPoint,
- x_position=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- y_position=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def sampled_diagram_style():
- return sampled_from(DiagramStyle)
-
-
-def sampled_orientation_kind():
- return sampled_from(OrientationKind)
-
-
-########################
-# IEC61970 Base Domain #
-########################
-
-def sampled_unit_symbol():
- return sampled_from(UnitSymbol)
-
-
-#############################
-# IEC61970 Base Equivalents #
-#############################
-
-
-def create_equivalent_branch(include_runtime: bool = True):
- return builds(
- EquivalentBranch,
- **create_equivalent_equipment(include_runtime),
- negative_r12=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- negative_r21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- negative_x12=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- negative_x21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- positive_r12=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- positive_r21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- positive_x12=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- positive_x21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- zero_r12=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- zero_r21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- zero_x12=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- zero_x21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_equivalent_equipment(include_runtime: bool):
- return {**create_conducting_equipment(include_runtime)}
-
-
-#######################################
-# IEC61970 Base Generation Production #
-#######################################
-
-def sampled_battery_state_kind():
- return sampled_from(BatteryStateKind)
-
-
-def create_battery_unit(include_runtime: bool = True):
- return builds(
- BatteryUnit,
- **create_power_electronics_unit(include_runtime),
- battery_state=sampled_battery_state_kind(),
- rated_e=integers(min_value=MIN_64_BIT_INTEGER, max_value=MAX_64_BIT_INTEGER),
- stored_e=integers(min_value=MIN_64_BIT_INTEGER, max_value=MAX_64_BIT_INTEGER),
- controls=lists(builds(BatteryControl, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-def create_photo_voltaic_unit(include_runtime: bool = True):
- return builds(PhotoVoltaicUnit, **create_power_electronics_unit(include_runtime))
-
-
-def create_power_electronics_unit(include_runtime: bool):
- return {
- **create_equipment(include_runtime),
- "power_electronics_connection": builds(PowerElectronicsConnection, **create_identified_object(include_runtime)),
- "max_p": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "min_p": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
- }
-
-
-def create_power_electronics_wind_unit(include_runtime: bool = True):
- return builds(PowerElectronicsWindUnit, **create_power_electronics_unit(include_runtime))
-
-
-######################
-# IEC61970 Base Meas #
-######################
-
-
-def create_accumulator(include_runtime: bool = True):
- return builds(Accumulator, **create_measurement(include_runtime))
-
-
-def create_accumulator_value():
- return builds(
- AccumulatorValue,
- **create_measurement_value(),
- value=integers(min_value=MIN_64_BIT_INTEGER, max_value=MAX_64_BIT_INTEGER)
- )
-
-
-def create_analog(include_runtime: bool = True):
- return builds(
- Analog,
- **create_measurement(include_runtime),
- positive_flow_in=booleans()
- )
-
-
-def create_analog_value():
- return builds(
- AnalogValue,
- **create_measurement_value(),
- value=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_control(include_runtime: bool = True):
- return builds(
- Control,
- **create_io_point(include_runtime),
- power_system_resource_mrid=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
- remote_control=builds(RemoteControl, **create_identified_object(include_runtime))
- )
-
-
-def create_discrete(include_runtime: bool = True):
- return builds(Discrete, **create_measurement(include_runtime))
-
-
-def create_discrete_value():
- return builds(
- DiscreteValue,
- **create_measurement_value(),
- value=integers(min_value=MIN_64_BIT_INTEGER, max_value=MAX_64_BIT_INTEGER)
- )
-
-
-def create_io_point(include_runtime: bool):
- return {**create_identified_object(include_runtime)}
-
-
-def create_measurement(include_runtime: bool):
- return {
- **create_identified_object(include_runtime),
- "remote_source": builds(RemoteSource, **create_identified_object(include_runtime)),
- "power_system_resource_mrid": uuids(version=4).map(lambda x: str(x)),
- "terminal_mrid": uuids(version=4).map(lambda x: str(x)),
- "phases": sampled_phase_code(),
- "unit_symbol": sampled_unit_symbol()
- }
-
-
-# noinspection PyUnusedLocal
-def create_measurement_value():
- return {
- # "time_stamp": ...
- }
-
-
-############################
-# IEC61970 Base Protection #
-############################
-
-
-def create_current_relay(include_runtime: bool = True):
- return builds(
- CurrentRelay,
- **create_protection_relay_function(include_runtime),
- current_limit_1=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- inverse_time_flag=boolean_or_none(),
- time_delay_1=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-#######################
-# IEC61970 Base Scada #
-#######################
-
-def create_remote_control(include_runtime: bool = True):
- return builds(
- RemoteControl,
- **create_remote_point(include_runtime),
- control=builds(Control, **create_identified_object(include_runtime))
- )
-
-
-def create_remote_point(include_runtime: bool):
- return {**create_identified_object(include_runtime)}
-
-
-def create_remote_source(include_runtime: bool = True):
- return builds(
- RemoteSource,
- **create_remote_point(include_runtime),
- measurement=sampled_measurement(include_runtime)
- )
-
-
-#######################
-# IEC61970 Base Wires #
-#######################
-
-
-def create_ac_line_segment(include_runtime: bool = True):
- args = create_conductor(include_runtime)
- args["terminals"] = lists(builds(Terminal, **create_identified_object(include_runtime)), max_size=2)
- return builds(
- AcLineSegment,
- **args,
- per_length_impedance=builds(PerLengthSequenceImpedance, **create_identified_object(include_runtime)),
- )
-
-def create_ac_line_segment_phase(include_runtime: bool = True):
- return builds(
- AcLineSegmentPhase,
- **create_power_system_resource(include_runtime),
- ac_line_segment=builds(AcLineSegment, **create_identified_object(include_runtime)),
- phase=sampled_single_phase_kind(),
- sequence_number=integers(min_value=MIN_SEQUENCE_NUMBER, max_value=MAX_SEQUENCE_NUMBER),
- )
-
-
-def create_breaker(include_runtime: bool = True):
- return builds(
- Breaker,
- **create_protected_switch(include_runtime),
- in_transit_time=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_busbar_section(include_runtime: bool = True):
- # Monkey patch the args to set terminals to 1, as busbars only have 1 terminal.
- args = create_connector(include_runtime)
- args["terminals"] = lists(builds(Terminal, **create_identified_object(include_runtime)), max_size=1)
- return builds(BusbarSection, **args)
-
-
-def create_clamp(include_runtime: bool = True):
- args = create_conducting_equipment(include_runtime)
- args["terminals"] = lists(builds(Terminal, **create_identified_object(include_runtime)), max_size=1)
- return builds(
- Clamp,
- **args,
- length_from_terminal_1=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- ac_line_segment=builds(AcLineSegment, **create_identified_object(include_runtime))
- )
-
-
-def create_conductor(include_runtime: bool):
- return {
- **create_conducting_equipment(include_runtime),
- "asset_info": sampled_wire_info(include_runtime),
- "length": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "design_temperature": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "design_rating": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- }
-
-
-def create_connector(include_runtime: bool):
- return {**create_conducting_equipment(include_runtime)}
-
-
-def create_cut(include_runtime: bool = True):
- args = create_switch(include_runtime)
- args["terminals"] = lists(builds(Terminal, **create_identified_object(include_runtime)), max_size=2)
- return builds(
- Cut,
- **args,
- length_from_terminal_1=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- ac_line_segment=builds(AcLineSegment, **create_identified_object(include_runtime)),
- )
-
-
-def create_disconnector(include_runtime: bool = True):
- return builds(Disconnector, **create_switch(include_runtime))
-
-
-def create_earth_fault_compensator(include_runtime: bool):
- return {
- **create_conducting_equipment(include_runtime),
- "r": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
- }
-
-
-def create_energy_connection(include_runtime: bool):
- return {**create_conducting_equipment(include_runtime)}
-
-
-def create_energy_consumer(include_runtime: bool = True):
- return builds(
- EnergyConsumer,
- **create_energy_connection(include_runtime),
- energy_consumer_phases=lists(
- builds(
- EnergyConsumerPhase,
- **create_identified_object(include_runtime),
- phase=sampled_single_phase_kind()
- ),
- max_size=2
- ),
- customer_count=integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- grounded=booleans(),
- p=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- p_fixed=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- phase_connection=sampled_phase_shunt_connection_kind(),
- q=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- q_fixed=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_energy_consumer_phase(include_runtime: bool = True):
- return builds(
- EnergyConsumerPhase,
- **create_power_system_resource(include_runtime),
- energy_consumer=builds(EnergyConsumer, **create_identified_object(include_runtime)),
- phase=sampled_single_phase_kind(),
- p=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- p_fixed=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- q=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- q_fixed=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_energy_source(include_runtime: bool = True):
- return builds(
- EnergySource,
- **create_energy_connection(include_runtime),
- energy_source_phases=lists(
- builds(
- EnergySourcePhase,
- **create_identified_object(include_runtime),
- phase=sampled_single_phase_kind()
- ),
- max_size=2),
- active_power=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- reactive_power=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- voltage_angle=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- voltage_magnitude=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- p_max=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- p_min=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- rn=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- xn=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- is_external_grid=booleans(),
- r_min=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- rn_min=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0_min=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x_min=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- xn_min=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0_min=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r_max=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- rn_max=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0_max=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x_max=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- xn_max=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0_max=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_energy_source_phase(include_runtime: bool = True):
- return builds(
- EnergySourcePhase,
- **create_power_system_resource(include_runtime),
- energy_source=builds(EnergySource, **create_identified_object(include_runtime)),
- phase=sampled_single_phase_kind()
- )
-
-
-def create_fuse(include_runtime: bool = True):
- return builds(
- Fuse,
- **create_switch(include_runtime),
- function=builds(DistanceRelay, mrid=mrid_strategy)
- )
-
-
-def create_ground(include_runtime: bool = True):
- return builds(
- Ground,
- **create_conducting_equipment(include_runtime)
- )
-
-
-def create_ground_disconnector(include_runtime: bool = True):
- return builds(
- GroundDisconnector,
- **create_switch(include_runtime)
- )
-
-
-def create_grounding_impedance(include_runtime: bool = True):
- return builds(
- GroundingImpedance,
- **create_earth_fault_compensator(include_runtime),
- x=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
- )
-
-
-def create_jumper(include_runtime: bool = True):
- return builds(Jumper, **create_switch(include_runtime))
-
-
-def create_junction(include_runtime: bool = True):
- return builds(Junction, **create_connector(include_runtime))
-
-
-def create_line(include_runtime: bool):
- return {**create_equipment_container(include_runtime)}
-
-
-def create_linear_shunt_compensator(include_runtime: bool = True):
- return builds(
- LinearShuntCompensator,
- **create_shunt_compensator(include_runtime),
- b0_per_section=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- b_per_section=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- g0_per_section=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- g_per_section=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_load_break_switch(include_runtime: bool = True):
- return builds(LoadBreakSwitch, **create_protected_switch(include_runtime))
-
-
-def create_per_length_impedance(include_runtime: bool):
- return {**create_per_length_line_parameter(include_runtime)}
-
-
-def create_per_length_line_parameter(include_runtime: bool):
- return {**create_identified_object(include_runtime)}
-
-
-def create_per_length_phase_impedance(include_runtime: bool = True):
- return builds(
- PerLengthPhaseImpedance,
- data=lists(create_phase_impedance_data(), max_size=4, unique_by=(lambda it: it.from_phase, lambda it: it.to_phase)),
- **create_per_length_impedance(include_runtime),
- )
-
-
-def create_per_length_sequence_impedance(include_runtime: bool = True):
- return builds(
- PerLengthSequenceImpedance,
- **create_per_length_impedance(include_runtime),
- r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- bch=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- gch=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- b0ch=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- g0ch=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_petersen_coil(include_runtime: bool = True):
- return builds(
- PetersenCoil,
- **create_earth_fault_compensator(include_runtime),
- x_ground_nominal=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
- )
-
-
-def create_phase_impedance_data():
- return builds(
- PhaseImpedanceData,
- from_phase=sampled_from(SinglePhaseKind),
- to_phase=sampled_from(SinglePhaseKind),
- b=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- g=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- r=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- x=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
- )
-
-
-def sampled_phase_shunt_connection_kind():
- return sampled_from(PhaseShuntConnectionKind)
-
-
-def create_power_electronics_connection(include_runtime: bool = True):
- return builds(
- PowerElectronicsConnection,
- **create_regulating_cond_eq(include_runtime),
- power_electronics_units=lists(builds(BatteryUnit, **create_identified_object(include_runtime)), max_size=2),
- power_electronics_connection_phases=lists(builds(PowerElectronicsConnectionPhase, **create_identified_object(include_runtime)), max_size=2),
- max_i_fault=integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- max_q=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- min_q=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- p=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- q=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- rated_s=integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- rated_u=integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- inverter_standard=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
- sustain_op_overvolt_limit=integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- stop_at_over_freq=floats(min_value=51.0, max_value=52.0),
- stop_at_under_freq=floats(min_value=47.0, max_value=49.0),
- inv_volt_watt_resp_mode=boolean_or_none(),
- inv_watt_resp_v1=integers(min_value=200, max_value=300),
- inv_watt_resp_v2=integers(min_value=216, max_value=230),
- inv_watt_resp_v3=integers(min_value=235, max_value=255),
- inv_watt_resp_v4=integers(min_value=244, max_value=265),
- inv_watt_resp_p_at_v1=floats(min_value=0.0, max_value=1.0),
- inv_watt_resp_p_at_v2=floats(min_value=0.0, max_value=1.0),
- inv_watt_resp_p_at_v3=floats(min_value=0.0, max_value=1.0),
- inv_watt_resp_p_at_v4=floats(min_value=0.0, max_value=0.12300000339746475),
- inv_volt_var_resp_mode=boolean_or_none(),
- inv_var_resp_v1=integers(min_value=200, max_value=300),
- inv_var_resp_v2=integers(min_value=200, max_value=300),
- inv_var_resp_v3=integers(min_value=200, max_value=300),
- inv_var_resp_v4=integers(min_value=200, max_value=300),
- inv_var_resp_q_at_v1=floats(min_value=0.0, max_value=0.5120000243186951),
- inv_var_resp_q_at_v2=floats(min_value=-1.0, max_value=1.0),
- inv_var_resp_q_at_v3=floats(min_value=-1.0, max_value=1.0),
- inv_var_resp_q_at_v4=floats(min_value=-0.5120000243186951, max_value=0.0),
- inv_reactive_power_mode=boolean_or_none(),
- inv_fix_reactive_power=floats(min_value=-1.0, max_value=1.0),
- )
-
-
-def create_power_electronics_connection_phase(include_runtime: bool = True):
- return builds(
- PowerElectronicsConnectionPhase,
- **create_power_system_resource(include_runtime),
- power_electronics_connection=builds(PowerElectronicsConnection, **create_identified_object(include_runtime)),
- phase=sampled_single_phase_kind(),
- p=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- q=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_power_transformer(include_runtime: bool = True):
- return builds(
- PowerTransformer,
- **create_conducting_equipment(include_runtime),
- asset_info=builds(PowerTransformerInfo, **create_identified_object(include_runtime)),
- power_transformer_ends=lists(builds(PowerTransformerEnd, **create_identified_object(include_runtime)), max_size=2),
- vector_group=sampled_vector_group(),
- transformer_utilisation=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def create_power_transformer_end(include_runtime: bool = True):
- return builds(
- create_power_transformer_end_with_ratings,
- **create_transformer_end(include_runtime),
- power_transformer=builds(PowerTransformer, **create_identified_object(include_runtime)),
- # rated_s=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- rated_u=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- connection_kind=sampled_winding_connection(),
- b=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- b0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- g=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- g0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- phase_angle_clock=integers(min_value=0, max_value=11),
- ratings=lists(builds(
- TransformerEndRatedS,
- cooling_type=sampled_transformer_cooling_type(),
- rated_s=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
- ), max_size=11, unique_by=lambda it: it.cooling_type)
- )
-
-
-def create_protected_switch(include_runtime: bool):
- return {
- **create_switch(include_runtime),
- "breaking_capacity": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "relay_functions": lists(builds(CurrentRelay, mrid=mrid_strategy), max_size=2)
- }
-
-
-def create_ratio_tap_changer(include_runtime: bool = True):
- return builds(
- RatioTapChanger,
- **create_tap_changer(include_runtime),
- transformer_end=builds(PowerTransformerEnd, **create_identified_object(include_runtime)),
- step_voltage_increment=floats(min_value=0.0, max_value=1.0)
- )
-
-
-def create_reactive_capability_curve(include_runtime: bool = True):
- return builds(
- ReactiveCapabilityCurve,
- **create_curve(include_runtime)
- )
-
-
-def create_recloser(include_runtime: bool = True):
- return builds(Recloser, **create_protected_switch(include_runtime))
-
-
-def create_regulating_cond_eq(include_runtime: bool):
- return {
- **create_energy_connection(include_runtime),
- "control_enabled": one_of(none(), booleans()),
- "regulating_control": builds(TapChangerControl, **create_identified_object(include_runtime)),
- }
-
-
-def create_regulating_control(include_runtime: bool):
- return {
- **create_power_system_resource(include_runtime),
- "discrete": boolean_or_none(),
- "mode": sampled_from(RegulatingControlModeKind),
- "monitored_phase": sampled_phase_code(),
- "target_deadband": floats(min_value=0.0, max_value=FLOAT_MAX),
- "target_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "enabled": boolean_or_none(),
- "max_allowed_target_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "min_allowed_target_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "rated_current": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "terminal": builds(Terminal, **create_identified_object(include_runtime)),
- "ct_primary": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "min_target_deadband": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "regulating_conducting_equipment": lists(builds(PowerElectronicsConnection, **create_identified_object(include_runtime)))
- }
-
-
-def sampled_regulating_control_mode_kind():
- return sampled_from(RegulatingControlModeKind)
-
-
-def create_rotating_machine(include_runtime: bool):
- return {
- **create_regulating_cond_eq(include_runtime),
- "rated_power_factor": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "rated_s": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "rated_u": one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)),
- "p": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "q": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
- }
-
-
-def create_series_compensator(include_runtime: bool = True):
- return builds(
- SeriesCompensator,
- **create_conducting_equipment(include_runtime),
- r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- varistor_rated_current=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- varistor_voltage_threshold=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- )
-
-
-def create_shunt_compensator(include_runtime: bool):
- return {
- **create_regulating_cond_eq(include_runtime),
- "asset_info": builds(ShuntCompensatorInfo, **create_identified_object(include_runtime)),
- "grounded": booleans(),
- "nom_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "phase_connection": sampled_phase_shunt_connection_kind(),
- "sections": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "grounding_terminal": builds(Terminal, **create_identified_object(include_runtime)),
- }
-
-
-def sampled_single_phase_kind():
- return sampled_from(SinglePhaseKind)
-
-
-def create_static_var_compensator(include_runtime: bool = True):
- return builds(
- StaticVarCompensator,
- **create_regulating_cond_eq(include_runtime),
- capacitive_rating=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- inductive_rating=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- q=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- svc_control_mode=sampled_svc_control_mode(),
- voltage_set_point=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- )
-
-
-def sampled_svc_control_mode():
- return sampled_from(SVCControlMode)
-
-
-def create_switch(include_runtime: bool):
- return {
- **create_conducting_equipment(include_runtime),
- "rated_current": floats(min_value=1, max_value=FLOAT_MAX),
- # NOTE: These are not currently encoded properly in protobuf so we can only use all or none.
- "_normally_open": sampled_from([0, 15]),
- "_open": sampled_from([0, 15])
- # "_normally_open": integers(min_value=0, max_value=15),
- # "_open": integers(min_value=0, max_value=15)
- }
-
-
-def create_synchronous_machine(include_runtime: bool = True):
- return builds(
- SynchronousMachine,
- **create_rotating_machine(include_runtime),
- curves=one_of(none(), lists(builds(ReactiveCapabilityCurve, **create_identified_object(include_runtime)), max_size=2)),
- base_q=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- condenser_p=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)),
- earthing=one_of(none(), booleans()),
- earthing_star_point_r=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- earthing_star_point_x=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- ikk=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- max_q=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- max_u=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)),
- min_q=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- min_u=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)),
- mu=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- r=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- r0=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- r2=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- sat_direct_subtrans_x=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- sat_direct_sync_x=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- sat_direct_trans_x=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- x0=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- x2=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- type=sampled_synchronous_machine_kind(),
- operating_mode=sampled_synchronous_machine_kind()
- )
-
-
-def sampled_synchronous_machine_kind():
- return sampled_from(SynchronousMachineKind)
-
-
-def create_tap_changer(include_runtime: bool):
- return {
- **create_power_system_resource(include_runtime),
- "high_step": integers(min_value=10, max_value=15),
- "low_step": integers(min_value=0, max_value=2),
- "step": floats(min_value=2.0, max_value=10.0),
- "neutral_step": integers(min_value=2, max_value=10),
- "neutral_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "normal_step": integers(min_value=2, max_value=10),
- "control_enabled": booleans(),
- "tap_changer_control": builds(TapChangerControl, **create_identified_object(include_runtime))
- }
-
-
-def create_tap_changer_control(include_runtime: bool = True):
- return builds(
- TapChangerControl,
- **create_regulating_control(include_runtime),
- limit_voltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- line_drop_compensation=boolean_or_none(),
- line_drop_r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- line_drop_x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- reverse_line_drop_r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- reverse_line_drop_x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- forward_ldc_blocking=boolean_or_none(),
- time_delay=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- co_generation_enabled=boolean_or_none()
- )
-
-
-def create_transformer_end(include_runtime: bool):
- return {
- **create_identified_object(include_runtime),
- "terminal": builds(Terminal, **create_identified_object(include_runtime)),
- "base_voltage": builds(BaseVoltage, **create_identified_object(include_runtime)),
- "ratio_tap_changer": builds(RatioTapChanger, **create_identified_object(include_runtime)),
- "end_number": integers(min_value=MIN_SEQUENCE_NUMBER, max_value=MAX_END_NUMBER),
- "grounded": booleans(),
- "r_ground": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x_ground": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "star_impedance": builds(TransformerStarImpedance, **create_identified_object(include_runtime))
- }
-
-
-def create_transformer_star_impedance(include_runtime: bool = True):
- return builds(
- TransformerStarImpedance,
- **create_identified_object(include_runtime),
- r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- transformer_end_info=builds(TransformerEndInfo, **create_identified_object(include_runtime))
- )
-
-
-def sampled_winding_connection():
- return sampled_from(WindingConnection)
-
-
-###############################
-# IEC61970 InfIEC61970 Feeder #
-###############################
-
-
-def create_circuit(include_runtime: bool = True):
- return builds(
- Circuit,
- **create_line(include_runtime),
- loop=builds(Loop, **create_identified_object(include_runtime)),
- end_terminals=lists(builds(Terminal, **create_identified_object(include_runtime)), max_size=2),
- end_substations=lists(builds(Substation, **create_identified_object(include_runtime)), max_size=2)
- )
-
-
-#########
-# MODEL #
-#########
-
-
-def traced_phases():
- return builds(
- TracedPhases,
- normal_status=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- current_status=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
- )
-
-
-def boolean_or_none():
- return sampled_from([False, True, None])
-
-
-###############
-# SAMPLE SETS #
-###############
-
-
-def sampled_wire_info(include_runtime: bool):
- return choice([
- builds(OverheadWireInfo, **create_identified_object(include_runtime)),
- builds(CableInfo, **create_identified_object(include_runtime)),
- ])
-
-
-def sampled_conducting_equipment(include_runtime: bool):
- return choice([
- # Don't add EnergySource to this list as it's used in SetPhases to start tracing, which will cause test_schema_terminal to fail.
- builds(AcLineSegment, **create_identified_object(include_runtime)),
- builds(PowerTransformer, **create_identified_object(include_runtime)),
- builds(Breaker, **create_identified_object(include_runtime)),
- builds(Disconnector, **create_identified_object(include_runtime)),
- builds(EnergyConsumer, **create_identified_object(include_runtime)),
- ])
-
-
-def sampled_curves(include_runtime: bool):
- return choice([
- builds(ReactiveCapabilityCurve, **create_identified_object(include_runtime))
- ])
-
-
-def sampled_end_device_function(include_runtime: bool):
- return choice([
- # Don't add EnergySource to this list as it's used in SetPhases to start tracing, which will cause test_schema_terminal to fail.
- builds(PanDemandResponseFunction, **create_identified_object(include_runtime))
- ])
-
-
-def sampled_equipment(include_runtime: bool):
- return choice([
- builds(AcLineSegment, **create_identified_object(include_runtime)),
- builds(PowerTransformer, **create_identified_object(include_runtime)),
- builds(Breaker, **create_identified_object(include_runtime)),
- builds(Disconnector, **create_identified_object(include_runtime)),
- builds(EnergyConsumer, **create_identified_object(include_runtime)),
- builds(EnergySource, **create_identified_object(include_runtime)),
- builds(FaultIndicator, **create_identified_object(include_runtime))
- ])
-
-
-def sampled_equipment_container(include_runtime: bool):
- available_containers = [
- builds(Site, **create_identified_object(include_runtime)),
- builds(Circuit, **create_identified_object(include_runtime)),
- builds(Substation, **create_identified_object(include_runtime))
- ]
-
- if include_runtime:
- available_containers.append(builds(Feeder, **create_identified_object(include_runtime)))
-
- return choice(available_containers)
-
-
-def sampled_hvlv_feeder(include_runtime: bool):
- return choice([
- builds(Feeder, **create_identified_object(include_runtime)),
- builds(LvFeeder, **create_identified_object(include_runtime))
- ])
-
-
-def sampled_measurement(include_runtime: bool):
- return choice([
- builds(Accumulator, **create_identified_object(include_runtime)),
- builds(Analog, **create_identified_object(include_runtime)),
- builds(Discrete, **create_identified_object(include_runtime)),
- ])
-
-
-def sampled_protected_switches(include_runtime: bool):
- return choice([
- builds(Breaker, **create_identified_object(include_runtime)),
- builds(LoadBreakSwitch, **create_identified_object(include_runtime)),
- builds(Recloser, **create_identified_object(include_runtime))
- ])
diff --git a/test/cim/enum_validator.py b/test/cim/enum_validator.py
index 02f5b2fbf..d77c9a7cd 100644
--- a/test/cim/enum_validator.py
+++ b/test/cim/enum_validator.py
@@ -5,7 +5,6 @@
from enum import Enum
from typing import Type, Tuple
-# noinspection PyPackageRequirements
from google.protobuf.internal.enum_type_wrapper import EnumTypeWrapper
# noinspection PyProtectedMember
diff --git a/test/cim/extensions/iec61968/common/test_contact_details.py b/test/cim/extensions/iec61968/common/test_contact_details.py
index fdad61453..d215a9d2c 100644
--- a/test/cim/extensions/iec61968/common/test_contact_details.py
+++ b/test/cim/extensions/iec61968/common/test_contact_details.py
@@ -3,28 +3,13 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, text, sampled_from, booleans
+from hypothesis.strategies import text, sampled_from, booleans
-from cim.cim_creators import ALPHANUM
+from cim.fill_fields import ALPHANUM, contact_details_kwargs
from cim.private_collection_validator import validate_unordered_other, DuplicateBehaviour
-from streaming.get.pb_creators import lists
+from util import assert_or_empty
from zepben.ewb import ContactMethodType, TelephoneNumber, ElectronicAddress, ContactDetails
-
-contact_details_kwargs = {
- "id": text(alphabet=ALPHANUM),
- "contact_address": text(alphabet=ALPHANUM),
- "contact_type": text(alphabet=ALPHANUM),
- "first_name": text(alphabet=ALPHANUM),
- "last_name": text(alphabet=ALPHANUM),
- "preferred_contact_method": sampled_from(ContactMethodType),
- "is_primary": booleans(),
- "business_name": text(alphabet=ALPHANUM),
- "phone_numbers": lists(builds(TelephoneNumber)),
- "electronic_addresses": lists(builds(ElectronicAddress)),
-}
-
-
contact_details_args = [
text(alphabet=ALPHANUM),
text(alphabet=ALPHANUM),
@@ -53,7 +38,7 @@ def test_contact_details_constructor_default():
assert not list(c.electronic_addresses)
-@given(**contact_details_kwargs)
+@given(**contact_details_kwargs())
def test_contact_details_constructor_kwargs(
id,
contact_address,
@@ -86,8 +71,8 @@ def test_contact_details_constructor_kwargs(
assert c.preferred_contact_method == preferred_contact_method
assert c.is_primary == is_primary
assert c.business_name == business_name
- assert list(c.phone_numbers) == phone_numbers
- assert list(c.electronic_addresses) == electronic_addresses
+ assert_or_empty(c.phone_numbers, phone_numbers)
+ assert_or_empty(c.electronic_addresses, electronic_addresses)
def test_contact_details_constructor_args():
@@ -104,6 +89,7 @@ def test_contact_details_constructor_args():
assert list(c.phone_numbers) == contact_details_args[-2]
assert list(c.electronic_addresses) == contact_details_args[-1]
+
def test_phone_number_collection():
def get_phone_number(it: ContactDetails, number: str):
for tn in it.phone_numbers:
@@ -111,9 +97,11 @@ def get_phone_number(it: ContactDetails, number: str):
return tn
raise KeyError(number)
+ # ContactDetails isn't an IdentifiedObject, but it has an `id` as its first arg, so it works (just with lots of type errors).
+ # noinspection PyTypeChecker
validate_unordered_other(
ContactDetails,
- lambda it: TelephoneNumber(local_number=it),
+ lambda it: TelephoneNumber(local_number=str(it)),
ContactDetails.phone_numbers,
ContactDetails.num_phone_numbers,
get_phone_number,
@@ -124,6 +112,7 @@ def get_phone_number(it: ContactDetails, number: str):
duplicate_behaviour=DuplicateBehaviour.SUPPORTED
)
+
def test_electronic_address_collection():
def get_electronic_address(it: ContactDetails, number: str):
for tn in it.electronic_addresses:
@@ -131,6 +120,8 @@ def get_electronic_address(it: ContactDetails, number: str):
return tn
raise KeyError(number)
+ # ContactDetails isn't an IdentifiedObject, but it has an `id` as its first arg, so it works (just with lots of type errors).
+ # noinspection PyTypeChecker
validate_unordered_other(
ContactDetails,
lambda it: ElectronicAddress(email1=it),
diff --git a/test/cim/extensions/iec61968/metering/test_pan_demand_response_function.py b/test/cim/extensions/iec61968/metering/test_pan_demand_response_function.py
index 34a84e9ba..01a0c74e2 100644
--- a/test/cim/extensions/iec61968/metering/test_pan_demand_response_function.py
+++ b/test/cim/extensions/iec61968/metering/test_pan_demand_response_function.py
@@ -2,22 +2,16 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from pytest import raises
from hypothesis import given
-from hypothesis.strategies import sampled_from, lists, builds
+from pytest import raises
-from cim.iec61968.metering.test_end_device_function import end_device_function_kwargs, end_device_function_args, \
+from cim.fill_fields import pan_demand_response_function_kwargs
+from cim.iec61968.metering.test_end_device_function import end_device_function_args, \
verify_end_device_function_constructor_default, verify_end_device_function_constructor_args
from test.cim.iec61968.metering.test_end_device_function import verify_end_device_function_constructor_kwargs
from zepben.ewb import PanDemandResponseFunction, ControlledAppliance, Appliance, generate_id
from zepben.ewb.model.cim.iec61968.metering.end_device_function_kind import EndDeviceFunctionKind
-pan_demand_response_function_kwargs = {
- **end_device_function_kwargs,
- "kind": sampled_from(EndDeviceFunctionKind),
- "appliance": builds(ControlledAppliance, appliances=lists(sampled_from(Appliance), max_size=4, min_size=1, unique=True))
-}
-
pan_demand_response_function_args = [*end_device_function_args, EndDeviceFunctionKind.demandResponse, Appliance.IRRIGATION_PUMP]
@@ -30,13 +24,13 @@ def test_pan_demand_response_function_constructor_default():
assert pdrf.appliance is None
-@given(**pan_demand_response_function_kwargs)
+@given(**pan_demand_response_function_kwargs())
def test_pan_demand_response_function_constructor_kwargs(kind, appliance, **kwargs):
- pdrf = PanDemandResponseFunction(kind=kind, appliances=appliance, **kwargs)
+ pdrf = PanDemandResponseFunction(kind=kind, appliance=appliance, **kwargs)
verify_end_device_function_constructor_kwargs(pdrf, **kwargs)
assert pdrf.kind == kind
- assert pdrf.appliance == appliance
+ assert pdrf.appliance.bitmask == appliance
def test_pan_demand_response_function_constructor_args():
@@ -50,7 +44,7 @@ def test_pan_demand_response_function_constructor_args():
def test_constructor_with_controlled_appliance():
ca = ControlledAppliance([Appliance.SMART_APPLIANCE, Appliance.IRRIGATION_PUMP])
- pdrf = PanDemandResponseFunction(mrid=generate_id(), appliances=ca)
+ pdrf = PanDemandResponseFunction(mrid=generate_id(), appliance=ca)
assert pdrf.appliance == ca
diff --git a/test/cim/extensions/iec61970/base/core/test_hv_customer.py b/test/cim/extensions/iec61970/base/core/test_hv_customer.py
index 96db55404..81bf4c7c9 100644
--- a/test/cim/extensions/iec61970/base/core/test_hv_customer.py
+++ b/test/cim/extensions/iec61970/base/core/test_hv_customer.py
@@ -4,12 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
+from cim.fill_fields import hv_customer_kwargs
from cim.iec61970.base.core.test_equipment_container import verify_equipment_container_constructor_default, verify_equipment_container_constructor_kwargs, \
- verify_equipment_container_constructor_args, equipment_container_kwargs, equipment_container_args
+ verify_equipment_container_constructor_args, equipment_container_args
from zepben.ewb import generate_id
from zepben.ewb.model.cim.extensions.iec61970.base.core.hv_customer import HvCustomer
-hv_customer_kwargs = equipment_container_kwargs
hv_customer_args = equipment_container_args
@@ -17,7 +17,7 @@ def test_hv_customer_constructor_default():
verify_equipment_container_constructor_default(HvCustomer(mrid=generate_id()))
-@given(**hv_customer_kwargs)
+@given(**hv_customer_kwargs())
def test_hv_customer_constructor_kwargs(**kwargs):
verify_equipment_container_constructor_kwargs(HvCustomer(**kwargs), **kwargs)
diff --git a/test/cim/extensions/iec61970/base/core/test_site.py b/test/cim/extensions/iec61970/base/core/test_site.py
index 1f451abd1..a18f219e3 100644
--- a/test/cim/extensions/iec61970/base/core/test_site.py
+++ b/test/cim/extensions/iec61970/base/core/test_site.py
@@ -5,11 +5,11 @@
import pytest
from hypothesis import given
-from cim.iec61970.base.core.test_equipment_container import equipment_container_kwargs, verify_equipment_container_constructor_default, \
+from cim.fill_fields import site_kwargs
+from cim.iec61970.base.core.test_equipment_container import verify_equipment_container_constructor_default, \
verify_equipment_container_constructor_kwargs, verify_equipment_container_constructor_args, equipment_container_args
from zepben.ewb import Site, TestNetworkBuilder, Equipment, AssignToLvFeeders, LvFeeder, NetworkStateOperators, generate_id
-site_kwargs = equipment_container_kwargs
site_args = equipment_container_args
@@ -17,7 +17,7 @@ def test_site_constructor_default():
verify_equipment_container_constructor_default(Site(mrid=generate_id()))
-@given(**site_kwargs)
+@given(**site_kwargs())
def test_site_constructor_kwargs(**kwargs):
verify_equipment_container_constructor_kwargs(Site(**kwargs), **kwargs)
@@ -25,6 +25,7 @@ def test_site_constructor_kwargs(**kwargs):
def test_site_constructor_args():
verify_equipment_container_constructor_args(Site(*site_args))
+
@pytest.mark.asyncio
async def test_find_lv_feeders_excludes_open_switches():
#
diff --git a/test/cim/extensions/iec61970/base/feeder/test_loop.py b/test/cim/extensions/iec61970/base/feeder/test_loop.py
index 043b3d8ac..2eed87888 100644
--- a/test/cim/extensions/iec61970/base/feeder/test_loop.py
+++ b/test/cim/extensions/iec61970/base/feeder/test_loop.py
@@ -3,21 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, lists
-
-from util import mrid_strategy
-from zepben.ewb import Loop, Circuit, Substation, generate_id
+from cim.fill_fields import loop_kwargs
from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, verify_identified_object_constructor_kwargs, \
- verify_identified_object_constructor_args, identified_object_kwargs, identified_object_args
+ verify_identified_object_constructor_args, identified_object_args
from cim.private_collection_validator import validate_unordered
-
-loop_kwargs = {
- **identified_object_kwargs,
- "circuits": lists(builds(Circuit, mrid=mrid_strategy)),
- "substations": lists(builds(Substation, mrid=mrid_strategy)),
- "energizing_substations": lists(builds(Substation, mrid=mrid_strategy))
-}
+from zepben.ewb import Loop, Circuit, Substation, generate_id
loop_args = [*identified_object_args, [Circuit(mrid=generate_id())], [Substation(mrid=generate_id())], [Substation(mrid=generate_id())]]
@@ -31,7 +22,7 @@ def test_loop_constructor_default():
assert not list(loop.energizing_substations)
-@given(**loop_kwargs)
+@given(**loop_kwargs())
def test_loop_constructor_kwargs(circuits, substations, energizing_substations, **kwargs):
loop = Loop(
circuits=circuits,
diff --git a/test/cim/extensions/iec61970/base/feeder/test_lv_feeder.py b/test/cim/extensions/iec61970/base/feeder/test_lv_feeder.py
index cb541b8af..3786c4c35 100644
--- a/test/cim/extensions/iec61970/base/feeder/test_lv_feeder.py
+++ b/test/cim/extensions/iec61970/base/feeder/test_lv_feeder.py
@@ -3,26 +3,15 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, lists
-from util import mrid_strategy
+from cim.fill_fields import lv_feeder_kwargs
+from cim.iec61970.base.core.test_equipment_container import verify_equipment_container_constructor_default, \
+ verify_equipment_container_constructor_kwargs, verify_equipment_container_constructor_args, equipment_container_args
+from cim.private_collection_validator import validate_unordered
from zepben.ewb import Terminal, Equipment, LvFeeder, generate_id
from zepben.ewb.model.cim.extensions.iec61970.base.feeder.lv_substation import LvSubstation
from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
-from cim.iec61970.base.core.test_equipment_container import equipment_container_kwargs, verify_equipment_container_constructor_default, \
- verify_equipment_container_constructor_kwargs, verify_equipment_container_constructor_args, equipment_container_args
-from cim.private_collection_validator import validate_unordered
-
-lv_feeder_kwargs = {
- **equipment_container_kwargs,
- "normal_head_terminal": builds(Terminal, mrid=mrid_strategy),
- "normal_energizing_feeders": lists(builds(Feeder, mrid=mrid_strategy), max_size=2),
- "current_equipment": lists(builds(Equipment, mrid=mrid_strategy), max_size=2),
- "current_energizing_feeders": lists(builds(Feeder, mrid=mrid_strategy), max_size=2),
- "normal_energizing_lv_substation": builds(LvSubstation, mrid=mrid_strategy),
-}
-
lv_feeder_args = [
*equipment_container_args,
Terminal(mrid=generate_id()),
@@ -44,7 +33,7 @@ def test_lv_feeder_constructor_default():
assert lvf.normal_energizing_lv_substation is None
-@given(**lv_feeder_kwargs)
+@given(**lv_feeder_kwargs())
def test_lv_feeder_constructor_kwargs(
normal_head_terminal,
normal_energizing_feeders,
diff --git a/test/cim/extensions/iec61970/base/feeder/test_lv_substation.py b/test/cim/extensions/iec61970/base/feeder/test_lv_substation.py
index 66147ce9d..0cfc201af 100644
--- a/test/cim/extensions/iec61970/base/feeder/test_lv_substation.py
+++ b/test/cim/extensions/iec61970/base/feeder/test_lv_substation.py
@@ -4,13 +4,14 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from cim.iec61970.base.core.test_equipment_container import equipment_container_kwargs, equipment_container_args, \
+from cim.fill_fields import lv_substation_kwargs
+from cim.iec61970.base.core.test_equipment_container import equipment_container_args, \
verify_equipment_container_constructor_default, verify_equipment_container_constructor_kwargs, verify_equipment_container_constructor_args
from cim.private_collection_validator import validate_unordered
+from util import assert_or_empty
from zepben.ewb import generate_id, LvFeeder, Feeder, Terminal, PowerTransformer, Fuse
from zepben.ewb.model.cim.extensions.iec61970.base.feeder.lv_substation import LvSubstation
-lv_substation_kwargs = equipment_container_kwargs
lv_substation_args = equipment_container_args
@@ -18,9 +19,25 @@ def test_lv_substation_constructor_default():
verify_equipment_container_constructor_default(LvSubstation(mrid=generate_id()))
-@given(**lv_substation_kwargs)
-def test_lv_substation_constructor_kwargs(**kwargs):
- verify_equipment_container_constructor_kwargs(LvSubstation(**kwargs), **kwargs)
+@given(**lv_substation_kwargs())
+def test_lv_substation_constructor_kwargs(
+ normal_energizing_feeders,
+ current_energizing_feeders,
+ normal_energized_lv_feeders,
+ **kwargs
+):
+ lv_sub = LvSubstation(
+ normal_energizing_feeders=normal_energizing_feeders,
+ current_energizing_feeders=current_energizing_feeders,
+ normal_energized_lv_feeders=normal_energized_lv_feeders,
+ **kwargs
+ )
+
+ verify_equipment_container_constructor_kwargs(lv_sub, **kwargs)
+
+ assert_or_empty(lv_sub.normal_energizing_feeders, normal_energizing_feeders)
+ assert_or_empty(lv_sub.current_energizing_feeders, current_energizing_feeders)
+ assert_or_empty(lv_sub.normal_energized_lv_feeders, normal_energized_lv_feeders)
def test_lv_substation_constructor_args():
diff --git a/test/cim/extensions/iec61970/base/protection/test_directional_current_relay.py b/test/cim/extensions/iec61970/base/protection/test_directional_current_relay.py
index 8c7fae8ba..cadcf8247 100644
--- a/test/cim/extensions/iec61970/base/protection/test_directional_current_relay.py
+++ b/test/cim/extensions/iec61970/base/protection/test_directional_current_relay.py
@@ -3,26 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import sampled_from, booleans
-from cim.iec61970.base.protection.test_protection_relay_function import protection_relay_function_kwargs, protection_relay_function_args, \
+from cim.fill_fields import directional_current_relay_kwargs
+from cim.iec61970.base.protection.test_protection_relay_function import protection_relay_function_args, \
verify_protection_relay_function_constructor_default, verify_protection_relay_function_constructor_args, verify_protection_relay_function_constructor_kwargs
-from streaming.get.pb_creators import floats, FLOAT_MIN, FLOAT_MAX
from zepben.ewb import PolarizingQuantityType, PhaseCode, generate_id, DirectionalCurrentRelay
-
-directional_current_relay_kwargs = {
- **protection_relay_function_kwargs,
- 'directional_characteristic_angle': floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- 'polarizing_quantity_type': sampled_from(PolarizingQuantityType),
- 'relay_element_phase': sampled_from(PhaseCode),
- 'minimum_pickup_current': floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- 'current_limit_1': floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- 'inverse_time_flag': booleans(),
- 'time_delay_1': floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
-}
-
-
directional_current_relay_args = [
*protection_relay_function_args,
1.1,
@@ -48,7 +34,7 @@ def test_directional_current_relay_constructor_default():
assert dcr.time_delay_1 is None
-@given(**directional_current_relay_kwargs)
+@given(**directional_current_relay_kwargs())
def test_directional_current_relay_constructor_kwargs(
directional_characteristic_angle,
polarizing_quantity_type,
diff --git a/test/cim/extensions/iec61970/base/wires/test_battery_control.py b/test/cim/extensions/iec61970/base/wires/test_battery_control.py
index c3852101b..3848b6daa 100644
--- a/test/cim/extensions/iec61970/base/wires/test_battery_control.py
+++ b/test/cim/extensions/iec61970/base/wires/test_battery_control.py
@@ -3,21 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats, sampled_from
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-from cim.iec61970.base.wires.test_regulating_control import regulating_control_kwargs, regulating_control_args, verify_regulating_control_constructor_default, \
+from cim.fill_fields import battery_control_kwargs
+from cim.iec61970.base.wires.test_regulating_control import regulating_control_args, verify_regulating_control_constructor_default, \
verify_regulating_control_constructor_kwargs, verify_regulating_control_constructor_args
from zepben.ewb import BatteryControl, BatteryControlMode, generate_id
-battery_control_kwargs = {
- **regulating_control_kwargs,
- "charging_rate": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "discharging_rate": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "reserve_percent": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "control_mode": sampled_from(BatteryControlMode),
-}
-
battery_control_args = [*regulating_control_args, 1.1, 2.2, 3.3, BatteryControlMode.time]
@@ -32,7 +23,7 @@ def test_battery_control_constructor_default():
assert bc.control_mode is BatteryControlMode.UNKNOWN
-@given(**battery_control_kwargs)
+@given(**battery_control_kwargs())
def test_battery_control_constructor_kwargs(charging_rate, discharging_rate, reserve_percent, control_mode, **kwargs):
bc = BatteryControl(
charging_rate=charging_rate,
diff --git a/test/cim/fill_fields.py b/test/cim/fill_fields.py
new file mode 100644
index 000000000..43ae4b012
--- /dev/null
+++ b/test/cim/fill_fields.py
@@ -0,0 +1,2460 @@
+# Copyright 2024 Zeppelin Bend Pty Ltd
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+__all__ = [
+ 'MIN_32_BIT_INTEGER', 'MAX_32_BIT_INTEGER', 'MAX_32_BIT_UNSIGNED_INTEGER', 'MAX_64_BIT_INTEGER', 'MIN_64_BIT_INTEGER', 'TEXT_MAX_SIZE', 'FLOAT_MIN',
+ 'FLOAT_MAX', 'MAX_END_NUMBER', 'MAX_SEQUENCE_NUMBER', 'MIN_SEQUENCE_NUMBER', 'ALPHANUM', 'create_relay_info', 'relay_info_kwargs', 'create_contact_details',
+ 'contact_details_kwargs', 'create_pan_demand_response_function', 'pan_demand_response_function_kwargs', 'create_hv_customer', 'hv_customer_kwargs',
+ 'create_site', 'site_kwargs', 'create_loop', 'loop_kwargs', 'create_lv_feeder', 'lv_feeder_kwargs', 'create_lv_substation', 'lv_substation_kwargs',
+ 'create_ev_charging_unit', 'ev_charging_unit_kwargs', 'create_directional_current_relay', 'directional_current_relay_kwargs', 'create_distance_relay',
+ 'distance_relay_kwargs', 'sampled_power_direction_kind', 'sampled_protection_kind', 'protection_relay_function_kwargs', 'create_protection_relay_scheme',
+ 'protection_relay_scheme_kwargs', 'create_protection_relay_system', 'protection_relay_system_kwargs', 'create_relay_setting', 'relay_setting_kwargs',
+ 'create_voltage_relay', 'voltage_relay_kwargs', 'create_battery_control', 'battery_control_kwargs', 'sampled_battery_control_mode',
+ 'sampled_transformer_cooling_type', 'create_power_transformer_end_with_ratings', 'sampled_vector_group', 'create_cable_info', 'cable_info_kwargs',
+ 'create_no_load_test', 'no_load_test_kwargs', 'create_open_circuit_test', 'open_circuit_test_kwargs', 'create_overhead_wire_info',
+ 'overhead_wire_info_kwargs', 'create_power_transformer_info', 'power_transformer_info_kwargs', 'create_short_circuit_test', 'short_circuit_test_kwargs',
+ 'create_shunt_compensator_info', 'shunt_compensator_info_kwargs', 'create_switch_info', 'switch_info_kwargs', 'create_transformer_end_info',
+ 'transformer_end_info_kwargs', 'create_transformer_tank_info', 'transformer_tank_info_kwargs', 'transformer_test_kwargs', 'wire_info_kwargs',
+ 'sampled_wire_material_kind', 'sampled_wire_insulation_kind', 'asset_kwargs', 'asset_container_kwargs', 'asset_function_kwargs', 'asset_info_kwargs',
+ 'asset_organisation_role_kwargs', 'create_asset_owner', 'asset_owner_kwargs', 'create_streetlight', 'streetlight_kwargs', 'structure_kwargs',
+ 'agreement_kwargs', 'document_kwargs', 'create_electronic_address', 'electronic_address_kwargs', 'create_location', 'location_kwargs',
+ 'create_organisation', 'organisation_kwargs', 'organisation_role_kwargs', 'create_position_point', 'position_point_kwargs', 'create_street_address',
+ 'street_address_kwargs', 'create_street_detail', 'street_detail_kwargs', 'create_telephone_number', 'telephone_number_kwargs', 'create_town_detail',
+ 'town_detail_kwargs', 'create_customer', 'customer_kwargs', 'create_customer_agreement', 'customer_agreement_kwargs', 'sampled_customer_kind',
+ 'create_pricing_structure', 'pricing_structure_kwargs', 'create_tariff', 'tariff_kwargs', 'create_current_transformer_info',
+ 'current_transformer_info_kwargs', 'create_potential_transformer_info', 'potential_transformer_info_kwargs', 'sampled_transformer_construction_kind',
+ 'sampled_transformer_function_kind', 'create_pole', 'pole_kwargs', 'sampled_streetlight_lamp_kind', 'create_ratio', 'ratio_kwargs',
+ 'create_controlled_appliance', 'controlled_appliance_kwargs', 'end_device_kwargs', 'end_device_function_kwargs', 'sampled_end_device_function_kind',
+ 'create_meter', 'meter_kwargs', 'create_usage_point', 'usage_point_kwargs', 'create_operational_restriction', 'operational_restriction_kwargs',
+ 'auxiliary_equipment_kwargs', 'create_current_transformer', 'current_transformer_kwargs', 'create_fault_indicator', 'fault_indicator_kwargs',
+ 'create_potential_transformer', 'potential_transformer_kwargs', 'sampled_potential_transformer_kind', 'sensor_kwargs', 'ac_dc_terminal_kwargs',
+ 'create_base_voltage', 'base_voltage_kwargs', 'conducting_equipment_kwargs', 'create_connectivity_node', 'connectivity_node_kwargs',
+ 'connectivity_node_container_kwargs', 'curve_kwargs', 'create_curve_data', 'curve_data_kwargs', 'equipment_kwargs', 'equipment_container_kwargs',
+ 'create_feeder', 'feeder_kwargs', 'create_geographical_region', 'geographical_region_kwargs', 'identified_object_kwargs', 'create_name', 'name_kwargs',
+ 'create_name_type', 'name_type_kwargs', 'sampled_phase_code', 'power_system_resource_kwargs', 'create_sub_geographical_region',
+ 'sub_geographical_region_kwargs', 'create_substation', 'substation_kwargs', 'create_terminal', 'terminal_kwargs', 'create_diagram', 'diagram_kwargs',
+ 'create_diagram_object', 'diagram_object_kwargs', 'create_diagram_object_point', 'diagram_object_point_kwargs', 'sampled_diagram_style',
+ 'sampled_orientation_kind', 'sampled_unit_symbol', 'create_equivalent_branch', 'equivalent_branch_kwargs', 'equivalent_equipment_kwargs',
+ 'sampled_battery_state_kind', 'create_battery_unit', 'battery_unit_kwargs', 'create_photo_voltaic_unit', 'photo_voltaic_unit_kwargs',
+ 'power_electronics_unit_kwargs', 'create_power_electronics_wind_unit', 'power_electronics_wind_unit_kwargs', 'create_accumulator', 'accumulator_kwargs',
+ 'create_accumulator_value', 'accumulator_value_kwargs', 'create_analog', 'analog_kwargs', 'create_analog_value', 'analog_value_kwargs', 'create_control',
+ 'control_kwargs', 'create_discrete', 'discrete_kwargs', 'create_discrete_value', 'discrete_value_kwargs', 'io_point_kwargs', 'measurement_kwargs',
+ 'measurement_value_kwargs', 'create_current_relay', 'current_relay_kwargs', 'create_remote_control', 'remote_control_kwargs', 'remote_point_kwargs',
+ 'create_remote_source', 'remote_source_kwargs', 'create_ac_line_segment', 'ac_line_segment_kwargs', 'create_ac_line_segment_phase',
+ 'ac_line_segment_phase_kwargs', 'create_breaker', 'breaker_kwargs', 'create_busbar_section', 'busbar_section_kwargs', 'create_clamp', 'clamp_kwargs',
+ 'conductor_kwargs', 'connector_kwargs', 'create_cut', 'cut_kwargs', 'create_disconnector', 'disconnector_kwargs', 'earth_fault_compensator_kwargs',
+ 'energy_connection_kwargs', 'create_energy_consumer', 'energy_consumer_kwargs', 'create_energy_consumer_phase', 'energy_consumer_phase_kwargs',
+ 'create_energy_source', 'energy_source_kwargs', 'create_energy_source_phase', 'energy_source_phase_kwargs', 'create_fuse', 'fuse_kwargs', 'create_ground',
+ 'ground_kwargs', 'create_ground_disconnector', 'ground_disconnector_kwargs', 'create_grounding_impedance', 'grounding_impedance_kwargs', 'create_jumper',
+ 'jumper_kwargs', 'create_junction', 'junction_kwargs', 'line_kwargs', 'create_linear_shunt_compensator', 'linear_shunt_compensator_kwargs',
+ 'create_load_break_switch', 'load_break_switch_kwargs', 'per_length_impedance_kwargs', 'per_length_line_parameter_kwargs',
+ 'create_per_length_phase_impedance', 'per_length_phase_impedance_kwargs', 'create_per_length_sequence_impedance', 'per_length_sequence_impedance_kwargs',
+ 'create_petersen_coil', 'petersen_coil_kwargs', 'create_phase_impedance_data', 'phase_impedance_data_kwargs', 'sampled_phase_shunt_connection_kind',
+ 'create_power_electronics_connection', 'power_electronics_connection_kwargs', 'create_power_electronics_connection_phase',
+ 'power_electronics_connection_phase_kwargs', 'create_power_transformer', 'power_transformer_kwargs', 'create_power_transformer_end',
+ 'power_transformer_end_kwargs', 'protected_switch_kwargs', 'create_ratio_tap_changer', 'ratio_tap_changer_kwargs', 'create_reactive_capability_curve',
+ 'reactive_capability_curve_kwargs', 'create_recloser', 'recloser_kwargs', 'regulating_cond_eq_kwargs', 'regulating_control_kwargs',
+ 'sampled_regulating_control_mode_kind', 'rotating_machine_kwargs', 'create_series_compensator', 'series_compensator_kwargs', 'shunt_compensator_kwargs',
+ 'sampled_single_phase_kind', 'create_static_var_compensator', 'static_var_compensator_kwargs', 'sampled_svc_control_mode', 'switch_kwargs',
+ 'create_synchronous_machine', 'synchronous_machine_kwargs', 'sampled_synchronous_machine_kind', 'tap_changer_kwargs', 'create_tap_changer_control',
+ 'tap_changer_control_kwargs', 'transformer_end_kwargs', 'create_transformer_star_impedance', 'transformer_star_impedance_kwargs',
+ 'sampled_winding_connection', 'create_circuit', 'circuit_kwargs', 'sampled_wire_info', 'sampled_conducting_equipment', 'sampled_curves',
+ 'sampled_end_device_function', 'sampled_equipment', 'sampled_equipment_container', 'sampled_hv_lv_feeder', 'sampled_measurement',
+ 'sampled_protected_switches'
+]
+
+from datetime import datetime
+from random import choice
+
+from util import mrid_strategy
+# @formatter:off
+
+# This must be above hypothesis.strategies to avoid conflicting import with zepben.ewb.util.none
+from zepben.ewb import *
+
+from hypothesis.strategies import builds, text, integers, sampled_from, booleans, uuids, datetimes, one_of, none, just, \
+ lists as hypo_lists, floats as hypo_floats
+
+from zepben.ewb.model.cim.extensions.iec61970.base.feeder.lv_substation import LvSubstation
+from zepben.ewb.model.cim.iec61968.assetinfo.wire_insulation_kind import WireInsulationKind
+from zepben.ewb.model.cim.iec61970.base.domain.date_time_interval import DateTimeInterval
+from zepben.ewb.model.cim.iec61970.base.wires.ac_line_segment_phase import AcLineSegmentPhase
+
+# @formatter:on
+
+MIN_32_BIT_INTEGER = -2147483647 # _UNKNOWN_INT = -2147483648
+MAX_32_BIT_INTEGER = 2147483647
+MAX_32_BIT_UNSIGNED_INTEGER = 4294967294 # _UNKNOWN_UINT = 4294967295
+MAX_64_BIT_INTEGER = 9223372036854775807
+MIN_64_BIT_INTEGER = -9223372036854775807 # _UNKNOWN_LONG = -9223372036854775808
+TEXT_MAX_SIZE = 6
+FLOAT_MIN = -100.0
+FLOAT_MAX = 1000.0
+MAX_END_NUMBER = 3
+MAX_SEQUENCE_NUMBER = 40
+MIN_SEQUENCE_NUMBER = 1
+ALPHANUM = "abcdefghijbklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
+
+
+def floats(*args, **kwargs):
+ kwargs.update({"width": 32})
+ return hypo_floats(*args, **kwargs)
+
+
+def lists(*args, **kwargs):
+ if kwargs.get("min_size") == 1:
+ raise ValueError("min_size = 1 is not required as its the default. please dont make messy code.")
+ kwargs.update({"min_size": 1})
+ return hypo_lists(*args, **kwargs)
+
+
+##################################
+# Extensions IEC61968 Asset Info #
+##################################
+
+def create_relay_info(include_runtime: bool = True):
+ return builds(RelayInfo, **relay_info_kwargs(include_runtime))
+
+
+def relay_info_kwargs(include_runtime: bool = True):
+ return {
+ **asset_info_kwargs(include_runtime),
+ "curve_setting": text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
+ "reclose_delays": lists(floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "reclose_fast": one_of(none(), booleans()),
+ }
+
+
+##############################
+# Extensions IEC61968 Common #
+##############################
+
+def create_contact_details():
+ return builds(ContactDetails, **contact_details_kwargs())
+
+
+def contact_details_kwargs():
+ return {
+ "id": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE, min_size=1),
+ "contact_address": create_street_address(),
+ "contact_type": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "first_name": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "last_name": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "preferred_contact_method": sampled_from(ContactMethodType),
+ "is_primary": one_of(none(), booleans()),
+ "business_name": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "phone_numbers": one_of(none(), lists(create_telephone_number())),
+ "electronic_addresses": one_of(none(), lists(create_electronic_address())),
+ }
+
+
+################################
+# Extensions IEC61968 Metering #
+################################
+
+def create_pan_demand_response_function(include_runtime: bool = True):
+ return builds(PanDemandResponseFunction, **pan_demand_response_function_kwargs(include_runtime))
+
+
+def pan_demand_response_function_kwargs(include_runtime: bool = True):
+ return {
+ **end_device_function_kwargs(include_runtime),
+ "kind": sampled_from(EndDeviceFunctionKind),
+ "appliance": integers(min_value=0, max_value=4095),
+ }
+
+
+#################################
+# Extensions IEC61970 Base Core #
+#################################
+
+def create_hv_customer(include_runtime: bool = True):
+ return builds(Site, **hv_customer_kwargs(include_runtime))
+
+
+def hv_customer_kwargs(include_runtime: bool = True):
+ return {
+ **equipment_container_kwargs(include_runtime),
+ }
+
+
+def create_site(include_runtime: bool = True):
+ return builds(Site, **site_kwargs(include_runtime))
+
+
+def site_kwargs(include_runtime: bool = True):
+ return {
+ **equipment_container_kwargs(include_runtime),
+ }
+
+
+###################################
+# Extensions IEC61970 Base Feeder #
+###################################
+
+def create_loop(include_runtime: bool = True):
+ return builds(Loop, **loop_kwargs(include_runtime))
+
+
+def loop_kwargs(include_runtime: bool = True):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "circuits": lists(builds(Circuit, **identified_object_kwargs(include_runtime)), max_size=2),
+ "substations": lists(builds(Substation, **identified_object_kwargs(include_runtime)), max_size=2),
+ "energizing_substations": lists(builds(Substation, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+def create_lv_feeder(include_runtime: bool = True):
+ return builds(LvFeeder, **lv_feeder_kwargs(include_runtime))
+
+
+def lv_feeder_kwargs(include_runtime: bool = True):
+ runtime = {
+ "normal_energizing_feeders": lists(builds(Feeder, **identified_object_kwargs(include_runtime)), max_size=2),
+ "current_equipment": lists(sampled_equipment(include_runtime), max_size=2),
+ "current_energizing_feeders": lists(builds(Feeder, **identified_object_kwargs(include_runtime)), max_size=2),
+ "normal_energizing_lv_substation": builds(LvSubstation, **identified_object_kwargs(include_runtime)),
+ } if include_runtime else {}
+
+ return {
+ # Only include equipment if we are processing runtime as we don't write equipment to the database for LvFeeder.
+ **equipment_container_kwargs(include_runtime, add_equipment=include_runtime),
+ "normal_head_terminal": builds(Terminal, **identified_object_kwargs(include_runtime)),
+ **runtime,
+ }
+
+
+def create_lv_substation(include_runtime: bool = True):
+ return builds(LvSubstation, **lv_substation_kwargs(include_runtime))
+
+
+def lv_substation_kwargs(include_runtime: bool = True):
+ runtime = {
+ "normal_energizing_feeders": one_of(none(), lists(builds(Feeder, **identified_object_kwargs(include_runtime)), max_size=2)),
+ "current_energizing_feeders": one_of(none(), lists(builds(Feeder, **identified_object_kwargs(include_runtime)), max_size=2)),
+ "normal_energized_lv_feeders": one_of(none(), lists(builds(LvFeeder, **identified_object_kwargs(include_runtime)))),
+ } if include_runtime else {}
+
+ return {
+ **equipment_container_kwargs(include_runtime, add_equipment=include_runtime),
+ **runtime,
+ }
+
+
+##################################################
+# Extensions IEC61970 Base Generation Production #
+##################################################
+
+def create_ev_charging_unit(include_runtime: bool = True):
+ return builds(EvChargingUnit, **ev_charging_unit_kwargs(include_runtime))
+
+
+def ev_charging_unit_kwargs(include_runtime: bool = True):
+ return {
+ **power_electronics_unit_kwargs(include_runtime),
+ }
+
+
+#######################################
+# Extensions IEC61970 Base Protection #
+#######################################
+
+def create_directional_current_relay(include_runtime: bool = True):
+ return builds(DirectionalCurrentRelay, **directional_current_relay_kwargs(include_runtime))
+
+
+def directional_current_relay_kwargs(include_runtime: bool = True):
+ return {
+ **protection_relay_function_kwargs(include_runtime),
+ "directional_characteristic_angle": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "polarizing_quantity_type": sampled_from(PolarizingQuantityType),
+ "relay_element_phase": sampled_from(PhaseCode),
+ "minimum_pickup_current": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "current_limit_1": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "inverse_time_flag": one_of(none(), booleans()),
+ "time_delay_1": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ }
+
+
+def create_distance_relay(include_runtime: bool = True):
+ return builds(DistanceRelay, **distance_relay_kwargs(include_runtime))
+
+
+def distance_relay_kwargs(include_runtime: bool = True):
+ return {
+ **protection_relay_function_kwargs(include_runtime),
+ "backward_blind": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "backward_reach": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "backward_reactance": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "forward_blind": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "forward_reach": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "forward_reactance": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "operation_phase_angle1": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "operation_phase_angle2": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "operation_phase_angle3": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ }
+
+
+def sampled_power_direction_kind():
+ return sampled_from(PowerDirectionKind)
+
+
+def sampled_protection_kind():
+ return sampled_from(ProtectionKind)
+
+
+def protection_relay_function_kwargs(include_runtime: bool = True):
+ return {
+ **power_system_resource_kwargs(include_runtime),
+ "model": text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
+ "reclosing": one_of(none(), booleans()),
+ "relay_delay_time": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "protection_kind": sampled_protection_kind(),
+ "directable": one_of(none(), booleans()),
+ "power_direction": sampled_power_direction_kind(),
+ "sensors": lists(builds(CurrentTransformer, mrid=mrid_strategy), max_size=2),
+ "protected_switches": lists(builds(Breaker, mrid=mrid_strategy), max_size=2),
+ "schemes": lists(builds(ProtectionRelayScheme, mrid=mrid_strategy), max_size=2),
+ "time_limits": lists(floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), min_size=4, max_size=4),
+ "thresholds": lists(create_relay_setting(), min_size=4, max_size=4),
+ "asset_info": builds(RelayInfo, mrid=mrid_strategy),
+ }
+
+
+def create_protection_relay_scheme(include_runtime: bool = True):
+ return builds(ProtectionRelayScheme, **protection_relay_scheme_kwargs(include_runtime))
+
+
+def protection_relay_scheme_kwargs(include_runtime: bool = True):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "system": builds(ProtectionRelaySystem, mrid=mrid_strategy),
+ "functions": lists(builds(CurrentRelay, mrid=mrid_strategy)),
+ }
+
+
+def create_protection_relay_system(include_runtime: bool = True):
+ return builds(ProtectionRelaySystem, **protection_relay_system_kwargs(include_runtime))
+
+
+def protection_relay_system_kwargs(include_runtime: bool = True):
+ return {
+ **equipment_kwargs(include_runtime),
+ "protection_kind": sampled_protection_kind(),
+ "schemes": lists(builds(ProtectionRelayScheme, mrid=mrid_strategy)),
+ }
+
+
+def create_relay_setting():
+ return builds(RelaySetting, **relay_setting_kwargs())
+
+
+def relay_setting_kwargs():
+ return {
+ "unit_symbol": sampled_unit_symbol(),
+ "value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
+ }
+
+
+def create_voltage_relay(include_runtime: bool = True):
+ return builds(VoltageRelay, **voltage_relay_kwargs(include_runtime))
+
+
+def voltage_relay_kwargs(include_runtime: bool = True):
+ return {
+ **protection_relay_function_kwargs(include_runtime),
+ }
+
+
+##################################
+# Extensions IEC61970 Base Wires #
+##################################
+
+def create_battery_control(include_runtime: bool = True):
+ return builds(BatteryControl, **battery_control_kwargs(include_runtime))
+
+
+def battery_control_kwargs(include_runtime: bool = True):
+ return {
+ **regulating_control_kwargs(include_runtime),
+ "charging_rate": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "discharging_rate": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "reserve_percent": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "control_mode": sampled_battery_control_mode(),
+ }
+
+
+def sampled_battery_control_mode():
+ return sampled_from(BatteryControlMode)
+
+
+def sampled_transformer_cooling_type():
+ return sampled_from(TransformerCoolingType)
+
+
+def create_power_transformer_end_with_ratings(ratings: List[TransformerEndRatedS], **kwargs):
+ # This is needed as we purposely made it so you can't build a transformer end with multiple ratings through constructor
+ pte = PowerTransformerEnd(**kwargs)
+ if ratings:
+ for rating in ratings:
+ pte.add_transformer_end_rated_s(rating)
+ return pte
+
+
+def sampled_vector_group():
+ return sampled_from(VectorGroup)
+
+
+#######################
+# IEC61968 Asset Info #
+#######################
+
+
+def create_cable_info(include_runtime: bool = True):
+ return builds(CableInfo, **cable_info_kwargs(include_runtime))
+
+
+def cable_info_kwargs(include_runtime: bool = True):
+ return {
+ **wire_info_kwargs(include_runtime),
+ }
+
+
+def create_no_load_test(include_runtime: bool = True):
+ return builds(NoLoadTest, **no_load_test_kwargs(include_runtime))
+
+
+def no_load_test_kwargs(include_runtime: bool = True):
+ return {
+ **transformer_test_kwargs(include_runtime),
+ "energised_end_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "exciting_current": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "exciting_current_zero": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "loss": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "loss_zero": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ }
+
+
+def create_open_circuit_test(include_runtime: bool = True):
+ return builds(OpenCircuitTest, **open_circuit_test_kwargs(include_runtime))
+
+
+def open_circuit_test_kwargs(include_runtime: bool = True):
+ return {
+ **transformer_test_kwargs(include_runtime),
+ "energised_end_step": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "energised_end_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "open_end_step": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "open_end_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "phase_shift": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def create_overhead_wire_info(include_runtime: bool = True):
+ return builds(OverheadWireInfo, **overhead_wire_info_kwargs(include_runtime))
+
+
+def overhead_wire_info_kwargs(include_runtime: bool = True):
+ return {
+ **wire_info_kwargs(include_runtime),
+ }
+
+
+def create_power_transformer_info(include_runtime: bool = True):
+ return builds(PowerTransformerInfo, **power_transformer_info_kwargs(include_runtime))
+
+
+def power_transformer_info_kwargs(include_runtime: bool = True):
+ return {
+ **asset_info_kwargs(include_runtime),
+ "transformer_tank_infos": lists(builds(TransformerTankInfo, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+def create_short_circuit_test(include_runtime: bool = True):
+ return builds(ShortCircuitTest, **short_circuit_test_kwargs(include_runtime))
+
+
+def short_circuit_test_kwargs(include_runtime: bool = True):
+ return {
+ **transformer_test_kwargs(include_runtime),
+ "current": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "energised_end_step": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "grounded_end_step": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "leakage_impedance": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "leakage_impedance_zero": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "loss": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "loss_zero": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "power": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "voltage": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "voltage_ohmic_part": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def create_shunt_compensator_info(include_runtime: bool = True):
+ return builds(ShuntCompensatorInfo, **shunt_compensator_info_kwargs(include_runtime))
+
+
+def shunt_compensator_info_kwargs(include_runtime: bool = True):
+ return {
+ **asset_info_kwargs(include_runtime),
+ "max_power_loss": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "rated_current": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "rated_reactive_power": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "rated_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ }
+
+
+def create_switch_info(include_runtime: bool = True):
+ return builds(SwitchInfo, **switch_info_kwargs(include_runtime))
+
+
+def switch_info_kwargs(include_runtime: bool = True):
+ return {
+ **asset_info_kwargs(include_runtime),
+ "rated_interrupting_time": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def create_transformer_end_info(include_runtime: bool = True):
+ return builds(TransformerEndInfo, **transformer_end_info_kwargs(include_runtime))
+
+
+def transformer_end_info_kwargs(include_runtime: bool = True):
+ return {
+ **asset_info_kwargs(include_runtime),
+ "connection_kind": sampled_winding_connection(),
+ "emergency_s": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "end_number": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "insulation_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "phase_angle_clock": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "rated_s": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "rated_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "short_term_s": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "transformer_tank_info": builds(TransformerTankInfo, **identified_object_kwargs(include_runtime)),
+ "transformer_star_impedance": builds(TransformerStarImpedance, **identified_object_kwargs(include_runtime)),
+ "energised_end_no_load_tests": builds(NoLoadTest, **identified_object_kwargs(include_runtime)),
+ "energised_end_short_circuit_tests": builds(ShortCircuitTest, **identified_object_kwargs(include_runtime)),
+ "grounded_end_short_circuit_tests": builds(ShortCircuitTest, **identified_object_kwargs(include_runtime)),
+ "open_end_open_circuit_tests": builds(OpenCircuitTest, **identified_object_kwargs(include_runtime)),
+ "energised_end_open_circuit_tests": builds(OpenCircuitTest, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def create_transformer_tank_info(include_runtime: bool = True):
+ return builds(TransformerTankInfo, **transformer_tank_info_kwargs(include_runtime))
+
+
+def transformer_tank_info_kwargs(include_runtime: bool = True):
+ return {
+ **asset_info_kwargs(include_runtime),
+ "power_transformer_info": builds(PowerTransformerInfo, **identified_object_kwargs(include_runtime)),
+ "transformer_end_infos": lists(builds(TransformerEndInfo, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+def transformer_test_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "base_power": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "temperature": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def wire_info_kwargs(include_runtime: bool):
+ return {
+ **asset_info_kwargs(include_runtime),
+ "rated_current": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "material": sampled_wire_material_kind(),
+ "size_description": one_of(none(), text(alphabet=ALPHANUM)),
+ "strand_count": one_of(none(), text(alphabet=ALPHANUM)),
+ "core_strand_count": one_of(none(), text(alphabet=ALPHANUM)),
+ "insulated": booleans(),
+ "insulation_material": sampled_wire_insulation_kind(),
+ "insulation_thickness": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ }
+
+
+def sampled_wire_material_kind():
+ return sampled_from(WireMaterialKind)
+
+
+def sampled_wire_insulation_kind():
+ return sampled_from(WireInsulationKind)
+
+
+###################
+# IEC61968 Assets #
+###################
+
+
+def asset_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "location": builds(Location, **identified_object_kwargs(include_runtime)),
+ "organisation_roles": lists(builds(AssetOwner, **identified_object_kwargs(include_runtime)), max_size=2),
+ "power_system_resources": lists(builds(Junction, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+def asset_container_kwargs(include_runtime: bool):
+ return {
+ **asset_kwargs(include_runtime),
+ }
+
+
+def asset_function_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ }
+
+
+def asset_info_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ }
+
+
+def asset_organisation_role_kwargs(include_runtime: bool):
+ return {
+ **organisation_role_kwargs(include_runtime),
+ }
+
+
+def create_asset_owner(include_runtime: bool = True):
+ return builds(AssetOwner, **asset_owner_kwargs(include_runtime))
+
+
+def asset_owner_kwargs(include_runtime: bool = True):
+ return {
+ **asset_organisation_role_kwargs(include_runtime),
+ }
+
+
+def create_streetlight(include_runtime: bool = True):
+ return builds(Streetlight, **streetlight_kwargs(include_runtime))
+
+
+def streetlight_kwargs(include_runtime: bool = True):
+ return {
+ **asset_kwargs(include_runtime),
+ "pole": builds(Pole, **identified_object_kwargs(include_runtime)),
+ "light_rating": integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
+ # Capping unsigned int to 32-bit int range to avoid issues with Python 3.7 testing.
+ "lamp_kind": sampled_streetlight_lamp_kind(),
+ }
+
+
+def structure_kwargs(include_runtime: bool):
+ return {
+ **asset_container_kwargs(include_runtime),
+ }
+
+
+###################
+# IEC61968 Common #
+###################
+
+
+def agreement_kwargs(include_runtime: bool):
+ return {
+ **document_kwargs(include_runtime),
+ "validity_interval": datetimes().flatmap(lambda start: builds(DateTimeInterval, start=just(start), end=datetimes(min_value=start))),
+ }
+
+
+def document_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "title": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
+ "created_date_time": datetimes(min_value=datetime(1970, 1, 2)),
+ "author_name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
+ "type": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
+ "status": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
+ "comment": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
+ }
+
+
+def create_electronic_address():
+ return builds(ElectronicAddress, **electronic_address_kwargs())
+
+
+def electronic_address_kwargs():
+ return {
+ "email1": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "is_primary": one_of(none(), booleans()),
+ "description": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ }
+
+
+def create_location(include_runtime: bool = True):
+ return builds(Location, **location_kwargs(include_runtime))
+
+
+def location_kwargs(include_runtime: bool = True):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "main_address": create_street_address(),
+ "position_points": lists(create_position_point(), max_size=4),
+ }
+
+
+def create_organisation(include_runtime: bool = True):
+ return builds(Organisation, **organisation_kwargs(include_runtime))
+
+
+def organisation_kwargs(include_runtime: bool = True):
+ return {
+ **identified_object_kwargs(include_runtime),
+ }
+
+
+def organisation_role_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "organisation": builds(Organisation, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def create_position_point():
+ return builds(PositionPoint, **position_point_kwargs())
+
+
+def position_point_kwargs():
+ return {
+ "x_position": floats(min_value=-180.0, max_value=180.0),
+ "y_position": floats(min_value=-90.0, max_value=90.0),
+ }
+
+
+def create_street_address():
+ return builds(StreetAddress, **street_address_kwargs())
+
+
+def street_address_kwargs():
+ return {
+ "postal_code": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "town_detail": create_town_detail(),
+ "po_box": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "street_detail": create_street_detail(),
+ }
+
+
+def create_street_detail():
+ return builds(StreetDetail, **street_detail_kwargs())
+
+
+def street_detail_kwargs():
+ return {
+ "building_name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
+ "floor_identification": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "name": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "number": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "suite_number": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "type": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "display_address": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "building_number": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ }
+
+
+def create_telephone_number():
+ return builds(TelephoneNumber, **telephone_number_kwargs())
+
+
+def telephone_number_kwargs():
+ return {
+ "area_code": text(alphabet=ALPHANUM, max_size=3),
+ "city_code": one_of(none(), text(alphabet=ALPHANUM, max_size=2)),
+ "country_code": one_of(none(), text(alphabet=ALPHANUM, max_size=2)),
+ "dial_out": one_of(none(), text(alphabet=ALPHANUM, max_size=3)),
+ "extension": one_of(none(), text(alphabet=ALPHANUM, max_size=4)),
+ "international_prefix": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "local_number": one_of(none(), text(alphabet=ALPHANUM, max_size=8)),
+ "is_primary": one_of(none(), booleans()),
+ "description": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ }
+
+
+def create_town_detail():
+ return builds(TownDetail, **town_detail_kwargs())
+
+
+def town_detail_kwargs():
+ return {
+ "name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
+ "state_or_province": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "country": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ }
+
+
+######################
+# IEC61968 Customers #
+######################
+
+
+def create_customer(include_runtime: bool = True):
+ return builds(Customer, **customer_kwargs(include_runtime))
+
+
+def customer_kwargs(include_runtime: bool = True):
+ return {
+ **organisation_role_kwargs(include_runtime),
+ "kind": sampled_customer_kind(),
+ # We can't use blank strings as it breaks some of the tests due to protobuf conversions dropping the blanks for None.
+ "special_need": text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
+ "customer_agreements": lists(builds(CustomerAgreement, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+def create_customer_agreement(include_runtime: bool = True):
+ return builds(CustomerAgreement, **customer_agreement_kwargs(include_runtime))
+
+
+def customer_agreement_kwargs(include_runtime: bool = True):
+ return {
+ **agreement_kwargs(include_runtime),
+ "customer": builds(Customer, **identified_object_kwargs(include_runtime)),
+ "pricing_structures": lists(builds(PricingStructure, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+def sampled_customer_kind():
+ return sampled_from(CustomerKind)
+
+
+def create_pricing_structure(include_runtime: bool = True):
+ return builds(PricingStructure, **pricing_structure_kwargs(include_runtime))
+
+
+def pricing_structure_kwargs(include_runtime: bool = True):
+ return {
+ **document_kwargs(include_runtime),
+ "tariffs": lists(builds(Tariff, **identified_object_kwargs(include_runtime)), max_size=2),
+ "code": text(alphabet=ALPHANUM),
+ }
+
+
+def create_tariff(include_runtime: bool = True):
+ return builds(Tariff, **tariff_kwargs(include_runtime))
+
+
+def tariff_kwargs(include_runtime: bool = True):
+ return {
+ **document_kwargs(include_runtime),
+ }
+
+
+#####################################
+# IEC61968 InfIEC61968 InfAssetInfo #
+#####################################
+
+def create_current_transformer_info(include_runtime: bool = True):
+ return builds(CurrentTransformerInfo, **current_transformer_info_kwargs(include_runtime))
+
+
+def current_transformer_info_kwargs(include_runtime: bool = True):
+ return {
+ **asset_info_kwargs(include_runtime),
+ "accuracy_class": text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
+ "accuracy_limit": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "core_count": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "ct_class": text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
+ "knee_point_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "max_ratio": create_ratio(),
+ "nominal_ratio": create_ratio(),
+ "primary_ratio": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "rated_current": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "secondary_fls_rating": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "secondary_ratio": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "usage": text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
+ }
+
+
+def create_potential_transformer_info(include_runtime: bool = True):
+ return builds(PotentialTransformerInfo, **potential_transformer_info_kwargs(include_runtime))
+
+
+def potential_transformer_info_kwargs(include_runtime: bool = True):
+ return {
+ **asset_info_kwargs(include_runtime),
+ "accuracy_class": text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
+ "nominal_ratio": create_ratio(),
+ "primary_ratio": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "pt_class": text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
+ "rated_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "secondary_ratio": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def sampled_transformer_construction_kind():
+ return sampled_from(TransformerConstructionKind)
+
+
+def sampled_transformer_function_kind():
+ return sampled_from(TransformerFunctionKind)
+
+
+##################################
+# IEC61968 InfIEC61968 InfAssets #
+##################################
+
+
+def create_pole(include_runtime: bool = True):
+ return builds(Pole, **pole_kwargs(include_runtime))
+
+
+def pole_kwargs(include_runtime: bool = True):
+ return {
+ **structure_kwargs(include_runtime),
+ "streetlights": lists(builds(Streetlight, **identified_object_kwargs(include_runtime)), max_size=2),
+ "classification": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
+ }
+
+
+def sampled_streetlight_lamp_kind():
+ return sampled_from(StreetlightLampKind)
+
+
+##################################
+# IEC61968 InfIEC61968 InfCommon #
+##################################
+
+
+def create_ratio():
+ return builds(Ratio, **ratio_kwargs())
+
+
+def ratio_kwargs():
+ return {
+ "numerator": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "denominator": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+#####################
+# IEC61968 Metering #
+#####################
+
+
+def create_controlled_appliance():
+ return builds(ControlledAppliance, **controlled_appliance_kwargs())
+
+
+def controlled_appliance_kwargs():
+ return {
+ "appliances": sampled_from(Appliance),
+ }
+
+
+def end_device_kwargs(include_runtime: bool):
+ return {
+ **asset_container_kwargs(include_runtime),
+ "usage_points": lists(builds(UsagePoint, **identified_object_kwargs(include_runtime)), max_size=2),
+ "customer_mrid": mrid_strategy,
+ "service_location": builds(Location, **identified_object_kwargs(include_runtime)),
+ "functions": lists(sampled_end_device_function(include_runtime), max_size=2),
+ }
+
+
+def end_device_function_kwargs(include_runtime: bool):
+ return {
+ **asset_function_kwargs(include_runtime),
+ "enabled": booleans(),
+ }
+
+
+def sampled_end_device_function_kind():
+ return sampled_from(EndDeviceFunctionKind)
+
+
+def create_meter(include_runtime: bool = True):
+ return builds(Meter, **meter_kwargs(include_runtime))
+
+
+def meter_kwargs(include_runtime: bool = True):
+ return {
+ **end_device_kwargs(include_runtime),
+ }
+
+
+def create_usage_point(include_runtime: bool = True):
+ return builds(UsagePoint, **usage_point_kwargs(include_runtime))
+
+
+def usage_point_kwargs(include_runtime: bool = True):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "usage_point_location": builds(Location, **identified_object_kwargs(include_runtime)),
+ "is_virtual": booleans(),
+ "connection_category": text(alphabet=ALPHANUM, min_size=2, max_size=TEXT_MAX_SIZE),
+ "rated_power": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "approved_inverter_capacity": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "equipment": lists(builds(EnergyConsumer, **identified_object_kwargs(include_runtime)), max_size=2),
+ "end_devices": lists(builds(Meter, **identified_object_kwargs(include_runtime)), max_size=2),
+ "contacts": lists(create_contact_details(), max_size=2),
+ "phase_code": sampled_phase_code(),
+ }
+
+
+#######################
+# IEC61968 Operations #
+#######################
+
+
+def create_operational_restriction(include_runtime: bool = True):
+ return builds(OperationalRestriction, **operational_restriction_kwargs(include_runtime))
+
+
+def operational_restriction_kwargs(include_runtime: bool = True):
+ return {
+ **document_kwargs(include_runtime),
+ "equipment": lists(builds(PowerTransformer, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+#####################################
+# IEC61970 Base Auxiliary Equipment #
+#####################################
+
+def auxiliary_equipment_kwargs(include_runtime: bool):
+ return {
+ **equipment_kwargs(include_runtime),
+ "terminal": builds(Terminal, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def create_current_transformer(include_runtime: bool = True):
+ return builds(CurrentTransformer, **current_transformer_kwargs(include_runtime))
+
+
+def current_transformer_kwargs(include_runtime: bool = True):
+ return {
+ **sensor_kwargs(include_runtime),
+ "asset_info": builds(CurrentTransformerInfo, **identified_object_kwargs(include_runtime)),
+ "core_burden": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ }
+
+
+def create_fault_indicator(include_runtime: bool = True):
+ return builds(FaultIndicator, **fault_indicator_kwargs(include_runtime))
+
+
+def fault_indicator_kwargs(include_runtime: bool = True):
+ return {
+ **auxiliary_equipment_kwargs(include_runtime),
+ }
+
+
+def create_potential_transformer(include_runtime: bool = True):
+ return builds(PotentialTransformer, **potential_transformer_kwargs(include_runtime))
+
+
+def potential_transformer_kwargs(include_runtime: bool = True):
+ return {
+ **sensor_kwargs(include_runtime),
+ "asset_info": builds(PotentialTransformerInfo, **identified_object_kwargs(include_runtime)),
+ "type": sampled_from(PotentialTransformerKind),
+ }
+
+
+def sampled_potential_transformer_kind():
+ return sampled_from(PotentialTransformerKind)
+
+
+def sensor_kwargs(include_runtime: bool = True):
+ return {
+ **auxiliary_equipment_kwargs(include_runtime),
+ "relay_functions": lists(builds(CurrentRelay, mrid=mrid_strategy), max_size=10),
+ }
+
+
+######################
+# IEC61970 Base Core #
+######################
+
+
+def ac_dc_terminal_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ }
+
+
+def create_base_voltage(include_runtime: bool = True):
+ return builds(BaseVoltage, **base_voltage_kwargs(include_runtime))
+
+
+def base_voltage_kwargs(include_runtime: bool = True):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "nominal_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ }
+
+
+def conducting_equipment_kwargs(include_runtime: bool):
+ return {
+ **equipment_kwargs(include_runtime),
+ "base_voltage": builds(BaseVoltage, **identified_object_kwargs(include_runtime)),
+ "terminals": lists(builds(Terminal, **identified_object_kwargs(include_runtime)), max_size=3),
+ }
+
+
+def create_connectivity_node(include_runtime: bool = True):
+ return builds(ConnectivityNode, **connectivity_node_kwargs(include_runtime))
+
+
+def connectivity_node_kwargs(include_runtime: bool = True):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "terminals": lists(builds(Terminal, **identified_object_kwargs(include_runtime)), max_size=10),
+ }
+
+
+def connectivity_node_container_kwargs(include_runtime: bool):
+ return {
+ **power_system_resource_kwargs(include_runtime),
+ }
+
+
+def curve_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "data": lists(create_curve_data(), max_size=4, unique_by=lambda it: it.x_value),
+ }
+
+
+def create_curve_data():
+ return builds(CurveData, **curve_data_kwargs())
+
+
+def curve_data_kwargs():
+ return {
+ "x_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "y1_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "y2_value": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "y3_value": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ }
+
+
+def equipment_kwargs(include_runtime: bool):
+ runtime = {
+ "current_containers": lists(sampled_hv_lv_feeder(include_runtime), max_size=2),
+ } if include_runtime else {}
+
+ return {
+ **power_system_resource_kwargs(include_runtime),
+ "in_service": booleans(),
+ "normally_in_service": booleans(),
+ "equipment_containers": lists(sampled_equipment_container(include_runtime), max_size=2),
+ "usage_points": lists(builds(UsagePoint, **identified_object_kwargs(include_runtime)), max_size=2),
+ "operational_restrictions": lists(builds(OperationalRestriction, **identified_object_kwargs(include_runtime)), max_size=2),
+ "commissioned_date": datetimes(min_value=datetime(1970, 1, 2)),
+ **runtime,
+ }
+
+
+def equipment_container_kwargs(include_runtime: bool, add_equipment: bool = True):
+ equipment = {
+ "equipment": lists(sampled_equipment(include_runtime), max_size=30),
+ } if add_equipment else {}
+
+ return {
+ **connectivity_node_container_kwargs(include_runtime),
+ **equipment,
+ }
+
+
+def create_feeder(include_runtime: bool = True):
+ return builds(Feeder, **feeder_kwargs(include_runtime))
+
+
+def feeder_kwargs(include_runtime: bool = True):
+ runtime = {
+ "normal_energized_lv_feeders": lists(builds(LvFeeder, **identified_object_kwargs(include_runtime)), max_size=2),
+ "current_energized_lv_feeders": lists(builds(LvFeeder, **identified_object_kwargs(include_runtime)), max_size=2),
+ "normal_energized_lv_substations": lists(builds(LvSubstation, **identified_object_kwargs(include_runtime)), max_size=2),
+ "current_energized_lv_substations": lists(builds(LvSubstation, **identified_object_kwargs(include_runtime)), max_size=2),
+ "current_equipment": lists(sampled_equipment(include_runtime), max_size=2),
+ } if include_runtime else {}
+
+ return {
+ # Only include equipment if we are processing runtime as we don't write equipment to the database for Feeder.
+ **equipment_container_kwargs(include_runtime, add_equipment=include_runtime),
+ "normal_head_terminal": builds(Terminal, **identified_object_kwargs(include_runtime)),
+ "normal_energizing_substation": builds(Substation, **identified_object_kwargs(include_runtime)),
+ **runtime,
+ }
+
+
+def create_geographical_region(include_runtime: bool = True):
+ return builds(GeographicalRegion, **geographical_region_kwargs(include_runtime))
+
+
+def geographical_region_kwargs(include_runtime: bool = True):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "sub_geographical_regions": lists(builds(SubGeographicalRegion, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+# noinspection PyUnusedLocal
+def identified_object_kwargs(include_runtime: bool):
+ return {
+ "mrid": uuids(version=4).map(lambda x: str(x)),
+ "name": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "description": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
+ "names": one_of(
+ none(),
+ lists(builds(Name, name=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), type=create_name_type()), max_size=2, unique_by=lambda it: it.name),
+ ),
+ }
+
+
+def create_name(include_runtime: bool = True):
+ return builds(Name, **name_kwargs(include_runtime))
+
+
+def name_kwargs(include_runtime: bool = True):
+ return {
+ "name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
+ "type": create_name_type(),
+ "identified_object": sampled_equipment(include_runtime),
+ }
+
+
+def create_name_type():
+ return builds(NameType, **name_type_kwargs())
+
+
+def name_type_kwargs():
+ return {
+ "name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
+ "description": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
+ }
+
+
+def sampled_phase_code():
+ return sampled_from(PhaseCode)
+
+
+def power_system_resource_kwargs(include_runtime: bool):
+ #
+ # NOTE: We do not create the asset_info here, create it where it is actually used.
+ #
+ return {
+ **identified_object_kwargs(include_runtime),
+ "location": create_location(),
+ "num_controls": integers(min_value=0, max_value=MAX_64_BIT_INTEGER),
+ "assets": lists(builds(Pole, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+def create_sub_geographical_region(include_runtime: bool = True):
+ return builds(SubGeographicalRegion, **sub_geographical_region_kwargs(include_runtime))
+
+
+def sub_geographical_region_kwargs(include_runtime: bool = True):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "geographical_region": builds(GeographicalRegion, **identified_object_kwargs(include_runtime)),
+ "substations": lists(builds(Substation, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+def create_substation(include_runtime: bool = True):
+ return builds(Substation, **substation_kwargs(include_runtime))
+
+
+def substation_kwargs(include_runtime: bool = True):
+ return {
+ **equipment_container_kwargs(include_runtime),
+ "sub_geographical_region": builds(SubGeographicalRegion, **identified_object_kwargs(include_runtime)),
+ "normal_energized_feeders": lists(builds(Feeder, **identified_object_kwargs(include_runtime)), max_size=2),
+ "loops": lists(builds(Loop, **identified_object_kwargs(include_runtime)), max_size=2),
+ "energized_loops": lists(builds(Loop, **identified_object_kwargs(include_runtime)), max_size=2),
+ "circuits": lists(builds(Circuit, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+def create_terminal(include_runtime: bool = True):
+ return builds(Terminal, **terminal_kwargs(include_runtime))
+
+
+def terminal_kwargs(include_runtime: bool = True):
+ runtime = {
+ "normal_feeder_direction": sampled_from(FeederDirection),
+ "current_feeder_direction": sampled_from(FeederDirection),
+ } if include_runtime else {}
+
+ return {
+ **ac_dc_terminal_kwargs(include_runtime),
+ "conducting_equipment": sampled_conducting_equipment(include_runtime),
+ "connectivity_node": builds(ConnectivityNode, **identified_object_kwargs(include_runtime)),
+ "phases": sampled_phase_code(),
+ "sequence_number": integers(min_value=MIN_SEQUENCE_NUMBER, max_value=MAX_SEQUENCE_NUMBER),
+ **runtime,
+ }
+
+
+################################
+# IEC61970 Base Diagram Layout #
+################################
+
+
+def create_diagram(include_runtime: bool = True):
+ return builds(Diagram, **diagram_kwargs(include_runtime))
+
+
+def diagram_kwargs(include_runtime: bool = True):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "diagram_style": sampled_diagram_style(),
+ "orientation_kind": sampled_orientation_kind(),
+ "diagram_objects": lists(builds(DiagramObject, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+def create_diagram_object(include_runtime: bool = True):
+ return builds(DiagramObject, **diagram_object_kwargs(include_runtime))
+
+
+def diagram_object_kwargs(include_runtime: bool = True):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "diagram": builds(Diagram, **identified_object_kwargs(include_runtime)),
+ "identified_object_mrid": mrid_strategy,
+ "style": text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
+ "rotation": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "diagram_object_points": lists(create_diagram_object_point(), max_size=2),
+ }
+
+
+def create_diagram_object_point():
+ return builds(DiagramObjectPoint, **diagram_object_point_kwargs())
+
+
+def diagram_object_point_kwargs():
+ return {
+ "x_position": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "y_position": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def sampled_diagram_style():
+ return sampled_from(DiagramStyle)
+
+
+def sampled_orientation_kind():
+ return sampled_from(OrientationKind)
+
+
+########################
+# IEC61970 Base Domain #
+########################
+
+def sampled_unit_symbol():
+ return sampled_from(UnitSymbol)
+
+
+#############################
+# IEC61970 Base Equivalents #
+#############################
+
+
+def create_equivalent_branch(include_runtime: bool = True):
+ return builds(EquivalentBranch, **equivalent_branch_kwargs(include_runtime))
+
+
+def equivalent_branch_kwargs(include_runtime: bool = True):
+ return {
+ **equivalent_equipment_kwargs(include_runtime),
+ "negative_r12": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "negative_r21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "negative_x12": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "negative_x21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "positive_r12": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "positive_r21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "positive_x12": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "positive_x21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "r21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "zero_r12": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "zero_r21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "zero_x12": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "zero_x21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def equivalent_equipment_kwargs(include_runtime: bool):
+ return {
+ **conducting_equipment_kwargs(include_runtime),
+ }
+
+
+#######################################
+# IEC61970 Base Generation Production #
+#######################################
+
+def sampled_battery_state_kind():
+ return sampled_from(BatteryStateKind)
+
+
+def create_battery_unit(include_runtime: bool = True):
+ return builds(BatteryUnit, **battery_unit_kwargs(include_runtime))
+
+
+def battery_unit_kwargs(include_runtime: bool = True):
+ return {
+ **power_electronics_unit_kwargs(include_runtime),
+ "battery_state": sampled_battery_state_kind(),
+ "rated_e": integers(min_value=MIN_64_BIT_INTEGER, max_value=MAX_64_BIT_INTEGER),
+ "stored_e": integers(min_value=MIN_64_BIT_INTEGER, max_value=MAX_64_BIT_INTEGER),
+ "controls": lists(builds(BatteryControl, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+def create_photo_voltaic_unit(include_runtime: bool = True):
+ return builds(PhotoVoltaicUnit, **photo_voltaic_unit_kwargs(include_runtime))
+
+
+def photo_voltaic_unit_kwargs(include_runtime: bool = True):
+ return {
+ **power_electronics_unit_kwargs(include_runtime),
+ }
+
+
+def power_electronics_unit_kwargs(include_runtime: bool):
+ return {
+ **equipment_kwargs(include_runtime),
+ "power_electronics_connection": builds(PowerElectronicsConnection, **identified_object_kwargs(include_runtime)),
+ "max_p": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "min_p": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ }
+
+
+def create_power_electronics_wind_unit(include_runtime: bool = True):
+ return builds(PowerElectronicsWindUnit, **power_electronics_wind_unit_kwargs(include_runtime))
+
+
+def power_electronics_wind_unit_kwargs(include_runtime: bool = True):
+ return {
+ **power_electronics_unit_kwargs(include_runtime),
+ }
+
+
+######################
+# IEC61970 Base Meas #
+######################
+
+
+def create_accumulator(include_runtime: bool = True):
+ return builds(Accumulator, **accumulator_kwargs(include_runtime))
+
+
+def accumulator_kwargs(include_runtime: bool = True):
+ return {
+ **measurement_kwargs(include_runtime),
+ }
+
+
+def create_accumulator_value():
+ return builds(AccumulatorValue, **accumulator_value_kwargs())
+
+
+def accumulator_value_kwargs():
+ return {
+ **measurement_value_kwargs(),
+ "value": integers(min_value=MIN_64_BIT_INTEGER, max_value=MAX_64_BIT_INTEGER),
+ "accumulator_mrid": mrid_strategy,
+ }
+
+
+def create_analog(include_runtime: bool = True):
+ return builds(Analog, **analog_kwargs(include_runtime))
+
+
+def analog_kwargs(include_runtime: bool = True):
+ return {
+ **measurement_kwargs(include_runtime),
+ "positive_flow_in": booleans(),
+ }
+
+
+def create_analog_value():
+ return builds(AnalogValue, **analog_value_kwargs())
+
+
+def analog_value_kwargs():
+ return {
+ **measurement_value_kwargs(),
+ "value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "analog_mrid": mrid_strategy,
+ }
+
+
+def create_control(include_runtime: bool = True):
+ return builds(Control, **control_kwargs(include_runtime))
+
+
+def control_kwargs(include_runtime: bool = True):
+ return {
+ **io_point_kwargs(include_runtime),
+ "power_system_resource_mrid": mrid_strategy,
+ "remote_control": builds(RemoteControl, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def create_discrete(include_runtime: bool = True):
+ return builds(Discrete, **discrete_kwargs(include_runtime))
+
+
+def discrete_kwargs(include_runtime: bool = True):
+ return {
+ **measurement_kwargs(include_runtime),
+ }
+
+
+def create_discrete_value():
+ return builds(DiscreteValue, **discrete_value_kwargs())
+
+
+def discrete_value_kwargs():
+ return {
+ **measurement_value_kwargs(),
+ "value": integers(min_value=MIN_64_BIT_INTEGER, max_value=MAX_64_BIT_INTEGER),
+ "discrete_mrid": mrid_strategy,
+ }
+
+
+def io_point_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ }
+
+
+def measurement_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "remote_source": builds(RemoteSource, **identified_object_kwargs(include_runtime)),
+ "power_system_resource_mrid": uuids(version=4).map(lambda x: str(x)),
+ "terminal_mrid": uuids(version=4).map(lambda x: str(x)),
+ "phases": sampled_phase_code(),
+ "unit_symbol": sampled_unit_symbol(),
+ }
+
+
+# noinspection PyUnusedLocal
+def measurement_value_kwargs():
+ return {
+ "time_stamp": datetimes(),
+ }
+
+
+############################
+# IEC61970 Base Protection #
+############################
+
+
+def create_current_relay(include_runtime: bool = True):
+ return builds(CurrentRelay, **current_relay_kwargs(include_runtime))
+
+
+def current_relay_kwargs(include_runtime: bool = True):
+ return {
+ **protection_relay_function_kwargs(include_runtime),
+ "current_limit_1": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "inverse_time_flag": one_of(none(), booleans()),
+ "time_delay_1": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+#######################
+# IEC61970 Base Scada #
+#######################
+
+def create_remote_control(include_runtime: bool = True):
+ return builds(RemoteControl, **remote_control_kwargs(include_runtime))
+
+
+def remote_control_kwargs(include_runtime: bool = True):
+ return {
+ **remote_point_kwargs(include_runtime),
+ "control": builds(Control, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def remote_point_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ }
+
+
+def create_remote_source(include_runtime: bool = True):
+ return builds(RemoteSource, **remote_source_kwargs(include_runtime))
+
+
+def remote_source_kwargs(include_runtime: bool = True):
+ return {
+ **remote_point_kwargs(include_runtime),
+ "measurement": sampled_measurement(include_runtime),
+ }
+
+
+#######################
+# IEC61970 Base Wires #
+#######################
+
+
+def create_ac_line_segment(include_runtime: bool = True):
+ return builds(AcLineSegment, **ac_line_segment_kwargs(include_runtime))
+
+
+def ac_line_segment_kwargs(include_runtime: bool = True):
+ args = conductor_kwargs(include_runtime)
+ args["terminals"] = lists(builds(Terminal, **identified_object_kwargs(include_runtime)), max_size=2)
+
+ return {
+ **args,
+ "per_length_impedance": builds(PerLengthSequenceImpedance, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def create_ac_line_segment_phase(include_runtime: bool = True):
+ return builds(AcLineSegmentPhase, **ac_line_segment_phase_kwargs(include_runtime))
+
+
+def ac_line_segment_phase_kwargs(include_runtime: bool = True):
+ return {
+ **power_system_resource_kwargs(include_runtime),
+ "ac_line_segment": builds(AcLineSegment, **identified_object_kwargs(include_runtime)),
+ "phase": sampled_single_phase_kind(),
+ "sequence_number": integers(min_value=MIN_SEQUENCE_NUMBER, max_value=MAX_SEQUENCE_NUMBER),
+ }
+
+
+def create_breaker(include_runtime: bool = True):
+ return builds(Breaker, **breaker_kwargs(include_runtime))
+
+
+def breaker_kwargs(include_runtime: bool = True):
+ return {
+ **protected_switch_kwargs(include_runtime),
+ "in_transit_time": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def create_busbar_section(include_runtime: bool = True):
+ return builds(BusbarSection, **busbar_section_kwargs(include_runtime))
+
+
+def busbar_section_kwargs(include_runtime: bool = True):
+ # Monkey patch the args to set terminals to 1, as busbars only have 1 terminal.
+ args = connector_kwargs(include_runtime)
+ args["terminals"] = lists(builds(Terminal, **identified_object_kwargs(include_runtime)), max_size=1)
+
+ return {
+ **args,
+ }
+
+
+def create_clamp(include_runtime: bool = True):
+ return builds(Clamp, **clamp_kwargs(include_runtime))
+
+
+def clamp_kwargs(include_runtime: bool = True):
+ args = conducting_equipment_kwargs(include_runtime)
+ args["terminals"] = lists(builds(Terminal, **identified_object_kwargs(include_runtime)), max_size=1)
+
+ return {
+ **args,
+ "length_from_terminal_1": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "ac_line_segment": builds(AcLineSegment, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def conductor_kwargs(include_runtime: bool):
+ return {
+ **conducting_equipment_kwargs(include_runtime),
+ "asset_info": sampled_wire_info(include_runtime),
+ "length": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "design_temperature": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "design_rating": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def connector_kwargs(include_runtime: bool):
+ return {
+ **conducting_equipment_kwargs(include_runtime),
+ }
+
+
+def create_cut(include_runtime: bool = True):
+ return builds(Cut, **cut_kwargs(include_runtime))
+
+
+def cut_kwargs(include_runtime: bool = True):
+ args = switch_kwargs(include_runtime)
+ args["terminals"] = lists(builds(Terminal, **identified_object_kwargs(include_runtime)), max_size=2)
+
+ return {
+ **args,
+ "length_from_terminal_1": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "ac_line_segment": builds(AcLineSegment, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def create_disconnector(include_runtime: bool = True):
+ return builds(Disconnector, **disconnector_kwargs(include_runtime))
+
+
+def disconnector_kwargs(include_runtime: bool = True):
+ return {
+ **switch_kwargs(include_runtime),
+ }
+
+
+def earth_fault_compensator_kwargs(include_runtime: bool):
+ return {
+ **conducting_equipment_kwargs(include_runtime),
+ "r": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ }
+
+
+def energy_connection_kwargs(include_runtime: bool):
+ return {
+ **conducting_equipment_kwargs(include_runtime),
+ }
+
+
+def create_energy_consumer(include_runtime: bool = True):
+ return builds(EnergyConsumer, **energy_consumer_kwargs(include_runtime))
+
+
+def energy_consumer_kwargs(include_runtime: bool = True):
+ return {
+ **energy_connection_kwargs(include_runtime),
+ "energy_consumer_phases": lists(
+ builds(
+ EnergyConsumerPhase,
+ **identified_object_kwargs(include_runtime),
+ phase=sampled_single_phase_kind(),
+ ),
+ max_size=2,
+ ),
+ "customer_count": integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
+ "grounded": booleans(),
+ "p": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "p_fixed": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "phase_connection": sampled_phase_shunt_connection_kind(),
+ "q": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "q_fixed": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def create_energy_consumer_phase(include_runtime: bool = True):
+ return builds(EnergyConsumerPhase, **energy_consumer_phase_kwargs(include_runtime))
+
+
+def energy_consumer_phase_kwargs(include_runtime: bool = True):
+ return {
+ **power_system_resource_kwargs(include_runtime),
+ "energy_consumer": builds(EnergyConsumer, **identified_object_kwargs(include_runtime)),
+ "phase": sampled_single_phase_kind(),
+ "p": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "p_fixed": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "q": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "q_fixed": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def create_energy_source(include_runtime: bool = True):
+ return builds(EnergySource, **energy_source_kwargs(include_runtime))
+
+
+def energy_source_kwargs(include_runtime: bool = True):
+ return {
+ **energy_connection_kwargs(include_runtime),
+ "energy_source_phases": lists(
+ builds(
+ EnergySourcePhase,
+ **identified_object_kwargs(include_runtime),
+ phase=sampled_single_phase_kind(),
+ ),
+ max_size=2,
+ ),
+ "active_power": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "reactive_power": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "voltage_angle": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "voltage_magnitude": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "p_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "p_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "r0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "rn": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "xn": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "is_external_grid": booleans(),
+ "r_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "rn_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "r0_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "xn_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x0_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "r_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "rn_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "r0_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "xn_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x0_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def create_energy_source_phase(include_runtime: bool = True):
+ return builds(EnergySourcePhase, **energy_source_phase_kwargs(include_runtime))
+
+
+def energy_source_phase_kwargs(include_runtime: bool = True):
+ return {
+ **power_system_resource_kwargs(include_runtime),
+ "energy_source": builds(EnergySource, **identified_object_kwargs(include_runtime)),
+ "phase": sampled_single_phase_kind(),
+ }
+
+
+def create_fuse(include_runtime: bool = True):
+ return builds(Fuse, **fuse_kwargs(include_runtime))
+
+
+def fuse_kwargs(include_runtime: bool = True):
+ return {
+ **switch_kwargs(include_runtime),
+ "function": builds(DistanceRelay, mrid=mrid_strategy),
+ }
+
+
+def create_ground(include_runtime: bool = True):
+ return builds(Ground, **ground_kwargs(include_runtime))
+
+
+def ground_kwargs(include_runtime: bool = True):
+ return {
+ **conducting_equipment_kwargs(include_runtime),
+ }
+
+
+def create_ground_disconnector(include_runtime: bool = True):
+ return builds(GroundDisconnector, **ground_disconnector_kwargs(include_runtime))
+
+
+def ground_disconnector_kwargs(include_runtime: bool = True):
+ return {
+ **switch_kwargs(include_runtime),
+ }
+
+
+def create_grounding_impedance(include_runtime: bool = True):
+ return builds(GroundingImpedance, **grounding_impedance_kwargs(include_runtime))
+
+
+def grounding_impedance_kwargs(include_runtime: bool = True):
+ return {
+ **earth_fault_compensator_kwargs(include_runtime),
+ "x": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ }
+
+
+def create_jumper(include_runtime: bool = True):
+ return builds(Jumper, **jumper_kwargs(include_runtime))
+
+
+def jumper_kwargs(include_runtime: bool = True):
+ return {
+ **switch_kwargs(include_runtime),
+ }
+
+
+def create_junction(include_runtime: bool = True):
+ return builds(Junction, **junction_kwargs(include_runtime))
+
+
+def junction_kwargs(include_runtime: bool = True):
+ return {
+ **connector_kwargs(include_runtime),
+ }
+
+
+def line_kwargs(include_runtime: bool):
+ return {
+ **equipment_container_kwargs(include_runtime),
+ }
+
+
+def create_linear_shunt_compensator(include_runtime: bool = True):
+ return builds(LinearShuntCompensator, **linear_shunt_compensator_kwargs(include_runtime))
+
+
+def linear_shunt_compensator_kwargs(include_runtime: bool = True):
+ return {
+ **shunt_compensator_kwargs(include_runtime),
+ "b0_per_section": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "b_per_section": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "g0_per_section": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "g_per_section": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def create_load_break_switch(include_runtime: bool = True):
+ return builds(LoadBreakSwitch, **load_break_switch_kwargs(include_runtime))
+
+
+def load_break_switch_kwargs(include_runtime: bool = True):
+ return {
+ **protected_switch_kwargs(include_runtime),
+ }
+
+
+def per_length_impedance_kwargs(include_runtime: bool):
+ return {
+ **per_length_line_parameter_kwargs(include_runtime),
+ }
+
+
+def per_length_line_parameter_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ }
+
+
+def create_per_length_phase_impedance(include_runtime: bool = True):
+ return builds(PerLengthPhaseImpedance, **per_length_phase_impedance_kwargs(include_runtime))
+
+
+def per_length_phase_impedance_kwargs(include_runtime: bool = True):
+ return {
+ **per_length_impedance_kwargs(include_runtime),
+ "data": lists(create_phase_impedance_data(), max_size=4, unique_by=(lambda it: it.from_phase, lambda it: it.to_phase)),
+ }
+
+
+def create_per_length_sequence_impedance(include_runtime: bool = True):
+ return builds(PerLengthSequenceImpedance, **per_length_sequence_impedance_kwargs(include_runtime))
+
+
+def per_length_sequence_impedance_kwargs(include_runtime: bool = True):
+ return {
+ **per_length_impedance_kwargs(include_runtime),
+ "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "r0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "bch": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "gch": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "b0ch": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "g0ch": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def create_petersen_coil(include_runtime: bool = True):
+ return builds(PetersenCoil, **petersen_coil_kwargs(include_runtime))
+
+
+def petersen_coil_kwargs(include_runtime: bool = True):
+ return {
+ **earth_fault_compensator_kwargs(include_runtime),
+ "x_ground_nominal": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ }
+
+
+def create_phase_impedance_data():
+ return builds(PhaseImpedanceData, **phase_impedance_data_kwargs())
+
+
+def phase_impedance_data_kwargs():
+ return {
+ "from_phase": sampled_from(SinglePhaseKind),
+ "to_phase": sampled_from(SinglePhaseKind),
+ "b": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "g": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "r": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "x": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ }
+
+
+def sampled_phase_shunt_connection_kind():
+ return sampled_from(PhaseShuntConnectionKind)
+
+
+def create_power_electronics_connection(include_runtime: bool = True):
+ return builds(PowerElectronicsConnection, **power_electronics_connection_kwargs(include_runtime))
+
+
+def power_electronics_connection_kwargs(include_runtime: bool = True):
+ return {
+ **regulating_cond_eq_kwargs(include_runtime),
+ "power_electronics_units": lists(builds(BatteryUnit, **identified_object_kwargs(include_runtime)), max_size=2),
+ "power_electronics_connection_phases": lists(builds(PowerElectronicsConnectionPhase, **identified_object_kwargs(include_runtime)), max_size=2),
+ "max_i_fault": integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
+ "max_q": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "min_q": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "p": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "q": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "rated_s": integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
+ "rated_u": integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
+ "inverter_standard": text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE),
+ "sustain_op_overvolt_limit": integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
+ "stop_at_over_freq": floats(min_value=51.0, max_value=52.0),
+ "stop_at_under_freq": floats(min_value=47.0, max_value=49.0),
+ "inv_volt_watt_resp_mode": one_of(none(), booleans()),
+ "inv_watt_resp_v1": integers(min_value=200, max_value=300),
+ "inv_watt_resp_v2": integers(min_value=216, max_value=230),
+ "inv_watt_resp_v3": integers(min_value=235, max_value=255),
+ "inv_watt_resp_v4": integers(min_value=244, max_value=265),
+ "inv_watt_resp_p_at_v1": floats(min_value=0.0, max_value=1.0),
+ "inv_watt_resp_p_at_v2": floats(min_value=0.0, max_value=1.0),
+ "inv_watt_resp_p_at_v3": floats(min_value=0.0, max_value=1.0),
+ "inv_watt_resp_p_at_v4": floats(min_value=0.0, max_value=0.12300000339746475),
+ "inv_volt_var_resp_mode": one_of(none(), booleans()),
+ "inv_var_resp_v1": integers(min_value=200, max_value=300),
+ "inv_var_resp_v2": integers(min_value=200, max_value=300),
+ "inv_var_resp_v3": integers(min_value=200, max_value=300),
+ "inv_var_resp_v4": integers(min_value=200, max_value=300),
+ "inv_var_resp_q_at_v1": floats(min_value=0.0, max_value=0.5120000243186951),
+ "inv_var_resp_q_at_v2": floats(min_value=-1.0, max_value=1.0),
+ "inv_var_resp_q_at_v3": floats(min_value=-1.0, max_value=1.0),
+ "inv_var_resp_q_at_v4": floats(min_value=-0.5120000243186951, max_value=0.0),
+ "inv_reactive_power_mode": one_of(none(), booleans()),
+ "inv_fix_reactive_power": floats(min_value=-1.0, max_value=1.0),
+ }
+
+
+def create_power_electronics_connection_phase(include_runtime: bool = True):
+ return builds(PowerElectronicsConnectionPhase, **power_electronics_connection_phase_kwargs(include_runtime))
+
+
+def power_electronics_connection_phase_kwargs(include_runtime: bool = True):
+ return {
+ **power_system_resource_kwargs(include_runtime),
+ "power_electronics_connection": builds(PowerElectronicsConnection, **identified_object_kwargs(include_runtime)),
+ "phase": sampled_single_phase_kind(),
+ "p": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "q": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ }
+
+
+def create_power_transformer(include_runtime: bool = True):
+ return builds(PowerTransformer, **power_transformer_kwargs(include_runtime))
+
+
+def power_transformer_kwargs(include_runtime: bool = True):
+ return {
+ **conducting_equipment_kwargs(include_runtime),
+ "asset_info": builds(PowerTransformerInfo, **identified_object_kwargs(include_runtime)),
+ "power_transformer_ends": lists(builds(PowerTransformerEnd, **identified_object_kwargs(include_runtime)), max_size=2),
+ "vector_group": sampled_vector_group(),
+ "transformer_utilisation": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "construction_kind": sampled_transformer_construction_kind(),
+ "function": sampled_transformer_function_kind(),
+ }
+
+
+def create_power_transformer_end(include_runtime: bool = True):
+ return builds(create_power_transformer_end_with_ratings, **power_transformer_end_kwargs(include_runtime))
+
+
+def power_transformer_end_kwargs(include_runtime: bool = True):
+ return {
+ **transformer_end_kwargs(include_runtime),
+ "power_transformer": builds(PowerTransformer, **identified_object_kwargs(include_runtime)),
+ # rated_s=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "rated_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "r0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "connection_kind": sampled_winding_connection(),
+ "b": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "b0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "g": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "g0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "phase_angle_clock": integers(min_value=0, max_value=11),
+ "ratings": lists(
+ builds(
+ TransformerEndRatedS,
+ cooling_type=sampled_transformer_cooling_type(),
+ rated_s=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ ), max_size=11, unique_by=lambda it: it.cooling_type,
+ ),
+ }
+
+
+def protected_switch_kwargs(include_runtime: bool):
+ return {
+ **switch_kwargs(include_runtime),
+ "breaking_capacity": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "relay_functions": lists(builds(CurrentRelay, mrid=mrid_strategy), max_size=2),
+ }
+
+
+def create_ratio_tap_changer(include_runtime: bool = True):
+ return builds(RatioTapChanger, **ratio_tap_changer_kwargs(include_runtime))
+
+
+def ratio_tap_changer_kwargs(include_runtime: bool = True):
+ return {
+ **tap_changer_kwargs(include_runtime),
+ "transformer_end": builds(PowerTransformerEnd, **identified_object_kwargs(include_runtime)),
+ "step_voltage_increment": floats(min_value=0.0, max_value=1.0),
+ }
+
+
+def create_reactive_capability_curve(include_runtime: bool = True):
+ return builds(ReactiveCapabilityCurve, **reactive_capability_curve_kwargs(include_runtime))
+
+
+def reactive_capability_curve_kwargs(include_runtime: bool = True):
+ return {
+ **curve_kwargs(include_runtime),
+ }
+
+
+def create_recloser(include_runtime: bool = True):
+ return builds(Recloser, **recloser_kwargs(include_runtime))
+
+
+def recloser_kwargs(include_runtime: bool = True):
+ return {
+ **protected_switch_kwargs(include_runtime),
+ }
+
+
+def regulating_cond_eq_kwargs(include_runtime: bool):
+ return {
+ **energy_connection_kwargs(include_runtime),
+ "control_enabled": one_of(none(), booleans()),
+ "regulating_control": builds(TapChangerControl, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def regulating_control_kwargs(include_runtime: bool):
+ return {
+ **power_system_resource_kwargs(include_runtime),
+ "discrete": one_of(none(), booleans()),
+ "mode": sampled_from(RegulatingControlModeKind),
+ "monitored_phase": sampled_phase_code(),
+ "target_deadband": floats(min_value=0.0, max_value=FLOAT_MAX),
+ "target_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "enabled": one_of(none(), booleans()),
+ "max_allowed_target_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "min_allowed_target_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "rated_current": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "terminal": builds(Terminal, **identified_object_kwargs(include_runtime)),
+ "ct_primary": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "min_target_deadband": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "regulating_conducting_equipment": lists(builds(PowerElectronicsConnection, **identified_object_kwargs(include_runtime))),
+ }
+
+
+def sampled_regulating_control_mode_kind():
+ return sampled_from(RegulatingControlModeKind)
+
+
+def rotating_machine_kwargs(include_runtime: bool):
+ return {
+ **regulating_cond_eq_kwargs(include_runtime),
+ "rated_power_factor": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "rated_s": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "rated_u": one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)),
+ "p": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "q": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ }
+
+
+def create_series_compensator(include_runtime: bool = True):
+ return builds(SeriesCompensator, **series_compensator_kwargs(include_runtime))
+
+
+def series_compensator_kwargs(include_runtime: bool = True):
+ return {
+ **conducting_equipment_kwargs(include_runtime),
+ "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "r0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "varistor_rated_current": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "varistor_voltage_threshold": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ }
+
+
+def shunt_compensator_kwargs(include_runtime: bool):
+ return {
+ **regulating_cond_eq_kwargs(include_runtime),
+ "asset_info": builds(ShuntCompensatorInfo, **identified_object_kwargs(include_runtime)),
+ "grounded": booleans(),
+ "nom_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "phase_connection": sampled_phase_shunt_connection_kind(),
+ "sections": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "grounding_terminal": builds(Terminal, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def sampled_single_phase_kind():
+ return sampled_from(SinglePhaseKind)
+
+
+def create_static_var_compensator(include_runtime: bool = True):
+ return builds(StaticVarCompensator, **static_var_compensator_kwargs(include_runtime))
+
+
+def static_var_compensator_kwargs(include_runtime: bool = True):
+ return {
+ **regulating_cond_eq_kwargs(include_runtime),
+ "capacitive_rating": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "inductive_rating": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "q": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "svc_control_mode": sampled_svc_control_mode(),
+ "voltage_set_point": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ }
+
+
+def sampled_svc_control_mode():
+ return sampled_from(SVCControlMode)
+
+
+def switch_kwargs(include_runtime: bool):
+ return {
+ **conducting_equipment_kwargs(include_runtime),
+ "rated_current": floats(min_value=1, max_value=FLOAT_MAX),
+ # NOTE: These are not currently encoded properly in protobuf so we can only use all or none.
+ "_normally_open": sampled_from([0, 15]),
+ "_open": sampled_from([0, 15]),
+ # "_normally_open": integers(min_value=0, max_value=15),
+ # "_open": integers(min_value=0, max_value=15),
+ "asset_info": builds(SwitchInfo, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def create_synchronous_machine(include_runtime: bool = True):
+ return builds(SynchronousMachine, **synchronous_machine_kwargs(include_runtime))
+
+
+def synchronous_machine_kwargs(include_runtime: bool = True):
+ return {
+ **rotating_machine_kwargs(include_runtime),
+ "curves": one_of(none(), lists(builds(ReactiveCapabilityCurve, **identified_object_kwargs(include_runtime)), max_size=2)),
+ "base_q": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "condenser_p": one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)),
+ "earthing": one_of(none(), booleans()),
+ "earthing_star_point_r": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "earthing_star_point_x": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "ikk": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "max_q": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "max_u": one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)),
+ "min_q": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "min_u": one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)),
+ "mu": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "r": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "r0": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "r2": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "sat_direct_subtrans_x": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "sat_direct_sync_x": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "sat_direct_trans_x": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "x0": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "x2": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
+ "type": sampled_synchronous_machine_kind(),
+ "operating_mode": sampled_synchronous_machine_kind(),
+ }
+
+
+def sampled_synchronous_machine_kind():
+ return sampled_from(SynchronousMachineKind)
+
+
+def tap_changer_kwargs(include_runtime: bool):
+ return {
+ **power_system_resource_kwargs(include_runtime),
+ "high_step": integers(min_value=10, max_value=15),
+ "low_step": integers(min_value=0, max_value=2),
+ "step": floats(min_value=2.0, max_value=10.0),
+ "neutral_step": integers(min_value=2, max_value=10),
+ "neutral_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "normal_step": integers(min_value=2, max_value=10),
+ "control_enabled": booleans(),
+ "tap_changer_control": builds(TapChangerControl, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def create_tap_changer_control(include_runtime: bool = True):
+ return builds(TapChangerControl, **tap_changer_control_kwargs(include_runtime))
+
+
+def tap_changer_control_kwargs(include_runtime: bool = True):
+ return {
+ **regulating_control_kwargs(include_runtime),
+ "limit_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
+ "line_drop_compensation": one_of(none(), booleans()),
+ "line_drop_r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "line_drop_x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "reverse_line_drop_r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "reverse_line_drop_x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "forward_ldc_blocking": one_of(none(), booleans()),
+ "time_delay": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "co_generation_enabled": one_of(none(), booleans()),
+ }
+
+
+def transformer_end_kwargs(include_runtime: bool):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "terminal": builds(Terminal, **identified_object_kwargs(include_runtime)),
+ "base_voltage": builds(BaseVoltage, **identified_object_kwargs(include_runtime)),
+ "ratio_tap_changer": builds(RatioTapChanger, **identified_object_kwargs(include_runtime)),
+ "end_number": integers(min_value=MIN_SEQUENCE_NUMBER, max_value=MAX_END_NUMBER),
+ "grounded": booleans(),
+ "r_ground": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x_ground": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "star_impedance": builds(TransformerStarImpedance, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def create_transformer_star_impedance(include_runtime: bool = True):
+ return builds(TransformerStarImpedance, **transformer_star_impedance_kwargs(include_runtime))
+
+
+def transformer_star_impedance_kwargs(include_runtime: bool = True):
+ return {
+ **identified_object_kwargs(include_runtime),
+ "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "r0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "x0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
+ "transformer_end_info": builds(TransformerEndInfo, **identified_object_kwargs(include_runtime)),
+ }
+
+
+def sampled_winding_connection():
+ return sampled_from(WindingConnection)
+
+
+###############################
+# IEC61970 InfIEC61970 Feeder #
+###############################
+
+
+def create_circuit(include_runtime: bool = True):
+ return builds(Circuit, **circuit_kwargs(include_runtime))
+
+
+def circuit_kwargs(include_runtime: bool = True):
+ return {
+ **line_kwargs(include_runtime),
+ "loop": builds(Loop, **identified_object_kwargs(include_runtime)),
+ "end_terminals": lists(builds(Terminal, **identified_object_kwargs(include_runtime)), max_size=2),
+ "end_substations": lists(builds(Substation, **identified_object_kwargs(include_runtime)), max_size=2),
+ }
+
+
+###############
+# SAMPLE SETS #
+###############
+
+
+def sampled_wire_info(include_runtime: bool):
+ return choice(
+ [
+ builds(OverheadWireInfo, **identified_object_kwargs(include_runtime)),
+ builds(CableInfo, **identified_object_kwargs(include_runtime)),
+ ],
+ )
+
+
+def sampled_conducting_equipment(include_runtime: bool):
+ return choice(
+ [
+ # Don't add EnergySource to this list as it's used in SetPhases to start tracing, which will cause test_schema_terminal to fail.
+ builds(AcLineSegment, **identified_object_kwargs(include_runtime)),
+ builds(PowerTransformer, **identified_object_kwargs(include_runtime)),
+ builds(Breaker, **identified_object_kwargs(include_runtime)),
+ builds(Disconnector, **identified_object_kwargs(include_runtime)),
+ builds(EnergyConsumer, **identified_object_kwargs(include_runtime)),
+ ],
+ )
+
+
+def sampled_curves(include_runtime: bool):
+ return choice(
+ [
+ builds(ReactiveCapabilityCurve, **identified_object_kwargs(include_runtime))
+ ],
+ )
+
+
+def sampled_end_device_function(include_runtime: bool):
+ return choice(
+ [
+ # Don't add EnergySource to this list as it's used in SetPhases to start tracing, which will cause test_schema_terminal to fail.
+ builds(PanDemandResponseFunction, **identified_object_kwargs(include_runtime))
+ ],
+ )
+
+
+def sampled_equipment(include_runtime: bool):
+ return choice(
+ [
+ builds(AcLineSegment, **identified_object_kwargs(include_runtime)),
+ builds(PowerTransformer, **identified_object_kwargs(include_runtime)),
+ builds(Breaker, **identified_object_kwargs(include_runtime)),
+ builds(Disconnector, **identified_object_kwargs(include_runtime)),
+ builds(EnergyConsumer, **identified_object_kwargs(include_runtime)),
+ builds(EnergySource, **identified_object_kwargs(include_runtime)),
+ builds(FaultIndicator, **identified_object_kwargs(include_runtime))
+ ],
+ )
+
+
+def sampled_equipment_container(include_runtime: bool):
+ available_containers = [
+ builds(Site, **identified_object_kwargs(include_runtime)),
+ builds(Circuit, **identified_object_kwargs(include_runtime)),
+ builds(Substation, **identified_object_kwargs(include_runtime))
+ ]
+
+ if include_runtime:
+ available_containers.append(builds(Feeder, **identified_object_kwargs(include_runtime)))
+
+ return choice(available_containers)
+
+
+def sampled_hv_lv_feeder(include_runtime: bool):
+ return choice(
+ [
+ builds(Feeder, **identified_object_kwargs(include_runtime)),
+ builds(LvFeeder, **identified_object_kwargs(include_runtime))
+ ],
+ )
+
+
+def sampled_measurement(include_runtime: bool):
+ return choice(
+ [
+ builds(Accumulator, **identified_object_kwargs(include_runtime)),
+ builds(Analog, **identified_object_kwargs(include_runtime)),
+ builds(Discrete, **identified_object_kwargs(include_runtime)),
+ ],
+ )
+
+
+def sampled_protected_switches(include_runtime: bool):
+ return choice(
+ [
+ builds(Breaker, **identified_object_kwargs(include_runtime)),
+ builds(LoadBreakSwitch, **identified_object_kwargs(include_runtime)),
+ builds(Recloser, **identified_object_kwargs(include_runtime))
+ ],
+ )
diff --git a/test/cim/iec61968/assetinfo/test_cable_info.py b/test/cim/iec61968/assetinfo/test_cable_info.py
index 564b9dd9a..e3d5576be 100644
--- a/test/cim/iec61968/assetinfo/test_cable_info.py
+++ b/test/cim/iec61968/assetinfo/test_cable_info.py
@@ -4,12 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from cim.iec61968.assetinfo.test_wire_info import wire_info_kwargs, verify_wire_info_constructor_default, \
+from cim.fill_fields import cable_info_kwargs
+from cim.iec61968.assetinfo.test_wire_info import verify_wire_info_constructor_default, \
verify_wire_info_constructor_kwargs, verify_wire_info_constructor_args, wire_info_args
from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61968.assetinfo.cable_info import CableInfo
-cable_info_kwargs = wire_info_kwargs
cable_info_args = wire_info_args
@@ -17,7 +17,7 @@ def test_cable_info_constructor_default():
verify_wire_info_constructor_default(CableInfo(mrid=generate_id()))
-@given(**cable_info_kwargs)
+@given(**cable_info_kwargs())
def test_cable_info_constructor_kwargs(**kwargs):
verify_wire_info_constructor_kwargs(CableInfo(**kwargs), **kwargs)
diff --git a/test/cim/iec61968/assetinfo/test_no_load_test.py b/test/cim/iec61968/assetinfo/test_no_load_test.py
index e346ffb88..66cf93c74 100644
--- a/test/cim/iec61968/assetinfo/test_no_load_test.py
+++ b/test/cim/iec61968/assetinfo/test_no_load_test.py
@@ -3,21 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import integers, floats
-from zepben.ewb import NoLoadTest, generate_id
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, FLOAT_MIN, FLOAT_MAX
-from cim.iec61968.assetinfo.test_transformer_test import transformer_test_kwargs, verify_transformer_test_constructor_default, \
+from cim.fill_fields import no_load_test_kwargs
+from cim.iec61968.assetinfo.test_transformer_test import verify_transformer_test_constructor_default, \
verify_transformer_test_constructor_kwargs, verify_transformer_test_constructor_args, transformer_test_args
-
-no_load_test_kwargs = {
- **transformer_test_kwargs,
- "energised_end_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "exciting_current": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "exciting_current_zero": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "loss": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "loss_zero": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
-}
+from zepben.ewb import NoLoadTest, generate_id
no_load_test_args = [*transformer_test_args, 1, 2.2, 3.3, 4, 5]
@@ -33,7 +23,7 @@ def test_no_load_test_constructor_default():
assert nlt.loss_zero is None
-@given(**no_load_test_kwargs)
+@given(**no_load_test_kwargs())
def test_no_load_test_constructor_kwargs(energised_end_voltage, exciting_current, exciting_current_zero, loss, loss_zero, **kwargs):
nlt = NoLoadTest(energised_end_voltage=energised_end_voltage,
exciting_current=exciting_current,
diff --git a/test/cim/iec61968/assetinfo/test_open_circuit_test.py b/test/cim/iec61968/assetinfo/test_open_circuit_test.py
index 705af6abc..7d42599d5 100644
--- a/test/cim/iec61968/assetinfo/test_open_circuit_test.py
+++ b/test/cim/iec61968/assetinfo/test_open_circuit_test.py
@@ -3,21 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import integers, floats
-from zepben.ewb import OpenCircuitTest, generate_id
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, FLOAT_MIN, FLOAT_MAX
-from cim.iec61968.assetinfo.test_transformer_test import transformer_test_kwargs, verify_transformer_test_constructor_default, \
+from cim.fill_fields import open_circuit_test_kwargs
+from cim.iec61968.assetinfo.test_transformer_test import verify_transformer_test_constructor_default, \
verify_transformer_test_constructor_kwargs, verify_transformer_test_constructor_args, transformer_test_args
-
-open_circuit_test_kwargs = {
- **transformer_test_kwargs,
- "energised_end_step": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "energised_end_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "open_end_step": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "open_end_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "phase_shift": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
+from zepben.ewb import OpenCircuitTest, generate_id
open_circuit_test_args = [*transformer_test_args, 1, 2, 3, 4, 5.5]
@@ -33,7 +23,7 @@ def test_open_circuit_test_constructor_default():
assert test.phase_shift is None
-@given(**open_circuit_test_kwargs)
+@given(**open_circuit_test_kwargs())
def test_open_circuit_test_constructor_kwargs(energised_end_step, energised_end_voltage, open_end_step, open_end_voltage, phase_shift, **kwargs):
test = OpenCircuitTest(energised_end_step=energised_end_step,
energised_end_voltage=energised_end_voltage,
diff --git a/test/cim/iec61968/assetinfo/test_overhead_wire_info.py b/test/cim/iec61968/assetinfo/test_overhead_wire_info.py
index c86311b06..a68c1300b 100644
--- a/test/cim/iec61968/assetinfo/test_overhead_wire_info.py
+++ b/test/cim/iec61968/assetinfo/test_overhead_wire_info.py
@@ -4,12 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from cim.iec61968.assetinfo.test_wire_info import wire_info_kwargs, verify_wire_info_constructor_default, \
+from cim.fill_fields import overhead_wire_info_kwargs
+from cim.iec61968.assetinfo.test_wire_info import verify_wire_info_constructor_default, \
verify_wire_info_constructor_kwargs, verify_wire_info_constructor_args, wire_info_args
from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61968.assetinfo.overhead_wire_info import OverheadWireInfo
-overhead_wire_info_kwargs = wire_info_kwargs
overhead_wire_info_args = wire_info_args
@@ -17,7 +17,7 @@ def test_overhead_wire_info_constructor_default():
verify_wire_info_constructor_default(OverheadWireInfo(mrid=generate_id()))
-@given(**overhead_wire_info_kwargs)
+@given(**overhead_wire_info_kwargs())
def test_overhead_wire_info_constructor_kwargs(**kwargs):
verify_wire_info_constructor_kwargs(OverheadWireInfo(**kwargs), **kwargs)
diff --git a/test/cim/iec61968/assetinfo/test_power_transformer_info.py b/test/cim/iec61968/assetinfo/test_power_transformer_info.py
index 9da98befd..6aebcdcc9 100644
--- a/test/cim/iec61968/assetinfo/test_power_transformer_info.py
+++ b/test/cim/iec61968/assetinfo/test_power_transformer_info.py
@@ -3,19 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds
-from util import mrid_strategy
-from zepben.ewb import PowerTransformerInfo, TransformerTankInfo, generate_id
-
-from cim.iec61968.assets.test_asset_info import asset_info_kwargs, verify_asset_info_constructor_default, \
+from cim.fill_fields import power_transformer_info_kwargs
+from cim.iec61968.assets.test_asset_info import verify_asset_info_constructor_default, \
verify_asset_info_constructor_kwargs, verify_asset_info_constructor_args, asset_info_args
from cim.private_collection_validator import validate_unordered
-
-power_transformer_info_kwargs = {
- **asset_info_kwargs,
- "transformer_tank_infos": lists(builds(TransformerTankInfo, mrid=mrid_strategy), max_size=2)
-}
+from zepben.ewb import PowerTransformerInfo, TransformerTankInfo, generate_id
power_transformer_info_args = [*asset_info_args, [TransformerTankInfo(mrid=generate_id()), TransformerTankInfo(mrid=generate_id())]]
@@ -27,7 +20,7 @@ def test_power_transformer_info_constructor_default():
assert not list(pti.transformer_tank_infos)
-@given(**power_transformer_info_kwargs)
+@given(**power_transformer_info_kwargs())
def test_power_transformer_info_constructor_kwargs(transformer_tank_infos, **kwargs):
pti = PowerTransformerInfo(transformer_tank_infos=transformer_tank_infos, **kwargs)
diff --git a/test/cim/iec61968/assetinfo/test_short_circuit_test.py b/test/cim/iec61968/assetinfo/test_short_circuit_test.py
index 9193f2b42..87444875e 100644
--- a/test/cim/iec61968/assetinfo/test_short_circuit_test.py
+++ b/test/cim/iec61968/assetinfo/test_short_circuit_test.py
@@ -3,26 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import integers, floats
-from zepben.ewb import ShortCircuitTest, generate_id
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, FLOAT_MIN, FLOAT_MAX
-from cim.iec61968.assetinfo.test_transformer_test import transformer_test_kwargs, verify_transformer_test_constructor_default, \
+from cim.fill_fields import short_circuit_test_kwargs
+from cim.iec61968.assetinfo.test_transformer_test import verify_transformer_test_constructor_default, \
verify_transformer_test_constructor_kwargs, verify_transformer_test_constructor_args, transformer_test_args
-
-short_circuit_test_kwargs = {
- **transformer_test_kwargs,
- "current": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "energised_end_step": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "grounded_end_step": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "leakage_impedance": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "leakage_impedance_zero": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "loss": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "loss_zero": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "power": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "voltage": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "voltage_ohmic_part": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
+from zepben.ewb import ShortCircuitTest, generate_id
short_circuit_test_args = [*transformer_test_args, 1.1, 2, 3, 4.4, 5.5, 6, 7, 8, 9.9, 10.01]
@@ -43,7 +28,7 @@ def test_short_circuit_test_constructor_default():
assert sct.voltage_ohmic_part is None
-@given(**short_circuit_test_kwargs)
+@given(**short_circuit_test_kwargs())
def test_short_circuit_test_constructor_kwargs(current, energised_end_step, grounded_end_step, leakage_impedance, leakage_impedance_zero, loss, loss_zero,
power, voltage, voltage_ohmic_part, **kwargs):
sct = ShortCircuitTest(current=current,
diff --git a/test/cim/iec61968/assetinfo/test_shunt_compensator_info.py b/test/cim/iec61968/assetinfo/test_shunt_compensator_info.py
index e58310146..a6b7809d8 100644
--- a/test/cim/iec61968/assetinfo/test_shunt_compensator_info.py
+++ b/test/cim/iec61968/assetinfo/test_shunt_compensator_info.py
@@ -3,20 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import integers
-from zepben.ewb import ShuntCompensatorInfo, generate_id
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61968.assets.test_asset_info import asset_info_kwargs, asset_info_args, verify_asset_info_constructor_default, \
+from cim.fill_fields import shunt_compensator_info_kwargs
+from cim.iec61968.assets.test_asset_info import asset_info_args, verify_asset_info_constructor_default, \
verify_asset_info_constructor_kwargs, verify_asset_info_constructor_args
-
-shunt_compensator_info_kwargs = {
- **asset_info_kwargs,
- "max_power_loss": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "rated_current": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "rated_reactive_power": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "rated_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
-}
+from zepben.ewb import ShuntCompensatorInfo, generate_id
shunt_compensator_info_args = [*asset_info_args, 1, 2, 3, 4]
@@ -31,7 +22,7 @@ def test_shunt_compensator_info_constructor_default():
assert sci.rated_voltage is None
-@given(**shunt_compensator_info_kwargs)
+@given(**shunt_compensator_info_kwargs())
def test_shunt_compensator_info_constructor_kwargs(max_power_loss, rated_current, rated_reactive_power, rated_voltage, **kwargs):
sci = ShuntCompensatorInfo(max_power_loss=max_power_loss,
rated_current=rated_current,
diff --git a/test/cim/iec61968/assetinfo/test_switch_info.py b/test/cim/iec61968/assetinfo/test_switch_info.py
index 62a7c055a..fe6d1b7c8 100644
--- a/test/cim/iec61968/assetinfo/test_switch_info.py
+++ b/test/cim/iec61968/assetinfo/test_switch_info.py
@@ -3,17 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats
-from zepben.ewb import SwitchInfo, generate_id
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-from cim.iec61968.assets.test_asset_info import asset_info_kwargs, asset_info_args, verify_asset_info_constructor_default, verify_asset_info_constructor_kwargs, \
+from cim.fill_fields import switch_info_kwargs
+from cim.iec61968.assets.test_asset_info import asset_info_args, verify_asset_info_constructor_default, verify_asset_info_constructor_kwargs, \
verify_asset_info_constructor_args
-
-switch_info_kwargs = {
- **asset_info_kwargs,
- "rated_interrupting_time": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
+from zepben.ewb import SwitchInfo, generate_id
switch_info_args = [*asset_info_args, 1.1]
@@ -25,7 +19,7 @@ def test_switch_info_constructor_default():
assert si.rated_interrupting_time is None
-@given(**switch_info_kwargs)
+@given(**switch_info_kwargs())
def test_switch_info_constructor_kwargs(rated_interrupting_time, **kwargs):
si = SwitchInfo(
rated_interrupting_time=rated_interrupting_time,
diff --git a/test/cim/iec61968/assetinfo/test_transformer_end_info.py b/test/cim/iec61968/assetinfo/test_transformer_end_info.py
index 2fa974ad5..e4d7149c0 100644
--- a/test/cim/iec61968/assetinfo/test_transformer_end_info.py
+++ b/test/cim/iec61968/assetinfo/test_transformer_end_info.py
@@ -5,35 +5,13 @@
from unittest.mock import patch
from hypothesis import given
-from hypothesis.strategies import integers, floats
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, FLOAT_MIN, FLOAT_MAX, sampled_winding_connection, create_transformer_tank_info, \
- create_transformer_star_impedance, create_no_load_test, create_short_circuit_test, create_open_circuit_test
-from cim.iec61968.assets.test_asset_info import asset_info_kwargs, verify_asset_info_constructor_default, verify_asset_info_constructor_kwargs, \
+from cim.fill_fields import transformer_end_info_kwargs
+from cim.iec61968.assets.test_asset_info import verify_asset_info_constructor_default, verify_asset_info_constructor_kwargs, \
verify_asset_info_constructor_args, asset_info_args
from zepben.ewb import TransformerEndInfo, WindingConnection, TransformerStarImpedance, TransformerTankInfo, ResistanceReactance, NoLoadTest, \
ShortCircuitTest, OpenCircuitTest, generate_id
-transformer_end_info_kwargs = {
- **asset_info_kwargs,
- "connection_kind": sampled_winding_connection(),
- "emergency_s": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "end_number": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "insulation_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "phase_angle_clock": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "rated_s": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "rated_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "short_term_s": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "transformer_tank_info": create_transformer_tank_info(),
- "transformer_star_impedance": create_transformer_star_impedance(),
- "energised_end_no_load_tests": create_no_load_test(),
- "energised_end_short_circuit_tests": create_short_circuit_test(),
- "grounded_end_short_circuit_tests": create_short_circuit_test(),
- "open_end_open_circuit_tests": create_open_circuit_test(),
- "energised_end_open_circuit_tests": create_open_circuit_test(),
-}
-
transformer_end_info_args = [
*asset_info_args,
WindingConnection.UNKNOWN,
@@ -77,7 +55,7 @@ def test_transformer_end_info_constructor_default():
assert tei.energised_end_open_circuit_tests is None
-@given(**transformer_end_info_kwargs)
+@given(**transformer_end_info_kwargs())
def test_transformer_end_info_constructor_kwargs(connection_kind, emergency_s, end_number, insulation_u, phase_angle_clock, r, rated_s, rated_u, short_term_s,
transformer_tank_info, transformer_star_impedance, energised_end_no_load_tests,
energised_end_short_circuit_tests, grounded_end_short_circuit_tests, open_end_open_circuit_tests,
diff --git a/test/cim/iec61968/assetinfo/test_transformer_tank_info.py b/test/cim/iec61968/assetinfo/test_transformer_tank_info.py
index 47f96c9b8..a8148eb0d 100644
--- a/test/cim/iec61968/assetinfo/test_transformer_tank_info.py
+++ b/test/cim/iec61968/assetinfo/test_transformer_tank_info.py
@@ -4,22 +4,15 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds
-from util import mrid_strategy
-from zepben.ewb import TransformerTankInfo, TransformerEndInfo, PowerTransformerInfo, generate_id
-
-from cim.iec61968.assets.test_asset_info import asset_info_kwargs, verify_asset_info_constructor_default, \
+from cim.fill_fields import transformer_tank_info_kwargs
+from cim.iec61968.assets.test_asset_info import verify_asset_info_constructor_default, \
verify_asset_info_constructor_kwargs, verify_asset_info_constructor_args, asset_info_args
from cim.private_collection_validator import validate_unordered
+from zepben.ewb import TransformerTankInfo, TransformerEndInfo, PowerTransformerInfo, generate_id
-transformer_tank_info_kwargs = {
- **asset_info_kwargs,
- "power_transformer_info": builds(PowerTransformerInfo, mrid=mrid_strategy),
- "transformer_end_infos": lists(builds(TransformerEndInfo, mrid=mrid_strategy), max_size=2)
-}
-
-transformer_tank_info_args = [*asset_info_args, PowerTransformerInfo(mrid=generate_id()), [TransformerEndInfo(mrid=generate_id()), TransformerEndInfo(mrid=generate_id())]]
+transformer_tank_info_args = [*asset_info_args, PowerTransformerInfo(mrid=generate_id()),
+ [TransformerEndInfo(mrid=generate_id()), TransformerEndInfo(mrid=generate_id())]]
def test_transformer_tank_info_constructor_default():
@@ -29,7 +22,7 @@ def test_transformer_tank_info_constructor_default():
assert not list(tti.transformer_end_infos)
-@given(**transformer_tank_info_kwargs)
+@given(**transformer_tank_info_kwargs())
def test_transformer_tank_info_constructor_kwargs(power_transformer_info, transformer_end_infos, **kwargs):
tti = TransformerTankInfo(power_transformer_info=power_transformer_info, transformer_end_infos=transformer_end_infos, **kwargs)
diff --git a/test/cim/iec61968/assetinfo/test_transformer_test.py b/test/cim/iec61968/assetinfo/test_transformer_test.py
index bf5d1eebd..ced416f9b 100644
--- a/test/cim/iec61968/assetinfo/test_transformer_test.py
+++ b/test/cim/iec61968/assetinfo/test_transformer_test.py
@@ -2,18 +2,9 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import integers, floats
-from zepben.ewb import TransformerTest
-
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, FLOAT_MIN, FLOAT_MAX
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
-
-transformer_test_kwargs = {
- **identified_object_kwargs,
- "base_power": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "temperature": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
+from zepben.ewb import TransformerTest
transformer_test_args = [*identified_object_args, 1, 2.2]
diff --git a/test/cim/iec61968/assetinfo/test_wire_info.py b/test/cim/iec61968/assetinfo/test_wire_info.py
index 1ad8bd213..a2444e55b 100644
--- a/test/cim/iec61968/assetinfo/test_wire_info.py
+++ b/test/cim/iec61968/assetinfo/test_wire_info.py
@@ -2,28 +2,12 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import integers, sampled_from, one_of, none, text, booleans
-from streaming.get.pb_creators import floats
-from zepben.ewb import WireInfo, WireMaterialKind
-
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, ALPHANUM, FLOAT_MIN, FLOAT_MAX, sampled_wire_insulation_kind
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
+from zepben.ewb import WireInfo, WireMaterialKind
from zepben.ewb.model.cim.iec61968.assetinfo.wire_insulation_kind import WireInsulationKind
-wire_info_kwargs = {
- **identified_object_kwargs,
- "rated_current": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "material": sampled_from(WireMaterialKind),
- "size_description": one_of(none(), text(alphabet=ALPHANUM)),
- "strand_count": one_of(none(), text(alphabet=ALPHANUM)),
- "core_strand_count": one_of(none(), text(alphabet=ALPHANUM)),
- "insulated": booleans(),
- "insulation_material": sampled_wire_insulation_kind(),
- "insulation_thickness": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
-}
-
wire_info_args = [*identified_object_args, 1, WireMaterialKind.acsr, "6.7", "8", "4", True, WireInsulationKind.doubleWireArmour, 1.2]
diff --git a/test/cim/iec61968/assets/test_asset.py b/test/cim/iec61968/assets/test_asset.py
index 7aac37787..2fcd15a3b 100644
--- a/test/cim/iec61968/assets/test_asset.py
+++ b/test/cim/iec61968/assets/test_asset.py
@@ -3,21 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import builds, lists
-
-from util import mrid_strategy
-from zepben.ewb import Asset, Location, AssetOrganisationRole, PowerSystemResource, generate_id
-
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from cim.private_collection_validator import validate_unordered
-
-asset_kwargs = {
- **identified_object_kwargs,
- "location": builds(Location, mrid=mrid_strategy),
- "organisation_roles": lists(builds(AssetOrganisationRole, mrid=mrid_strategy), max_size=2),
- "power_system_resources": lists(builds(PowerSystemResource, mrid=mrid_strategy), max_size=2)
-}
+from zepben.ewb import Asset, Location, AssetOrganisationRole, PowerSystemResource, generate_id
asset_args = [*identified_object_args, Location(mrid=generate_id()), [AssetOrganisationRole(mrid=generate_id())], [PowerSystemResource(mrid=generate_id())]]
diff --git a/test/cim/iec61968/assets/test_asset_container.py b/test/cim/iec61968/assets/test_asset_container.py
index 4aed04e91..d813137e5 100644
--- a/test/cim/iec61968/assets/test_asset_container.py
+++ b/test/cim/iec61968/assets/test_asset_container.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61968.assets.test_asset import asset_kwargs, verify_asset_constructor_default, \
+from cim.iec61968.assets.test_asset import verify_asset_constructor_default, \
verify_asset_constructor_kwargs, verify_asset_constructor_args, asset_args
from zepben.ewb.model.cim.iec61968.assets.asset_container import AssetContainer
-asset_container_kwargs = asset_kwargs
asset_container_args = asset_args
diff --git a/test/cim/iec61968/assets/test_asset_function.py b/test/cim/iec61968/assets/test_asset_function.py
index 0879bea53..b696c5f38 100644
--- a/test/cim/iec61968/assets/test_asset_function.py
+++ b/test/cim/iec61968/assets/test_asset_function.py
@@ -4,10 +4,9 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from test.cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, verify_identified_object_constructor_kwargs, \
- verify_identified_object_constructor_args, identified_object_kwargs, identified_object_args
+ verify_identified_object_constructor_args, identified_object_args
from zepben.ewb.model.cim.iec61968.assets.asset_function import AssetFunction
-asset_function_kwargs = identified_object_kwargs
asset_function_args = identified_object_args
diff --git a/test/cim/iec61968/assets/test_asset_info.py b/test/cim/iec61968/assets/test_asset_info.py
index f7edb48af..9d813c400 100644
--- a/test/cim/iec61968/assets/test_asset_info.py
+++ b/test/cim/iec61968/assets/test_asset_info.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from zepben.ewb import AssetInfo
-asset_info_kwargs = identified_object_kwargs
asset_info_args = identified_object_args
diff --git a/test/cim/iec61968/assets/test_asset_organisation_role.py b/test/cim/iec61968/assets/test_asset_organisation_role.py
index d242419b9..b6c589b97 100644
--- a/test/cim/iec61968/assets/test_asset_organisation_role.py
+++ b/test/cim/iec61968/assets/test_asset_organisation_role.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61968.common.test_organisation_role import organisation_role_kwargs, verify_organisation_role_constructor_default, \
+from cim.iec61968.common.test_organisation_role import verify_organisation_role_constructor_default, \
verify_organisation_role_constructor_kwargs, verify_organisation_role_constructor_args, organisation_role_args
from zepben.ewb import AssetOrganisationRole
-asset_organisation_role_kwargs = organisation_role_kwargs
asset_organisation_role_args = organisation_role_args
diff --git a/test/cim/iec61968/assets/test_asset_owner.py b/test/cim/iec61968/assets/test_asset_owner.py
index 4ebce4906..035105221 100644
--- a/test/cim/iec61968/assets/test_asset_owner.py
+++ b/test/cim/iec61968/assets/test_asset_owner.py
@@ -4,12 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from cim.iec61968.assets.test_asset_organisation_role import asset_organisation_role_kwargs, verify_asset_organisation_role_constructor_default, \
+from cim.fill_fields import asset_owner_kwargs
+from cim.iec61968.assets.test_asset_organisation_role import verify_asset_organisation_role_constructor_default, \
verify_asset_organisation_role_constructor_kwargs, verify_asset_organisation_role_constructor_args, asset_organisation_role_args
from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61968.assets.asset_owner import AssetOwner
-asset_owner_kwargs = asset_organisation_role_kwargs
asset_owner_args = asset_organisation_role_args
@@ -17,7 +17,7 @@ def test_asset_owner_constructor_default():
verify_asset_organisation_role_constructor_default(AssetOwner(mrid=generate_id()))
-@given(**asset_owner_kwargs)
+@given(**asset_owner_kwargs())
def test_asset_owner_constructor_kwargs(**kwargs):
verify_asset_organisation_role_constructor_kwargs(AssetOwner(**kwargs), **kwargs)
diff --git a/test/cim/iec61968/assets/test_pole.py b/test/cim/iec61968/assets/test_pole.py
index eea178705..86e7ad657 100644
--- a/test/cim/iec61968/assets/test_pole.py
+++ b/test/cim/iec61968/assets/test_pole.py
@@ -3,21 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import text, lists, builds
-from util import mrid_strategy
-from zepben.ewb import Pole, Streetlight, generate_id
-
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE
-from cim.iec61968.assets.test_structure import structure_kwargs, verify_structure_constructor_default, \
+from cim.fill_fields import pole_kwargs
+from cim.iec61968.assets.test_structure import verify_structure_constructor_default, \
verify_structure_constructor_kwargs, verify_structure_constructor_args, structure_args
from cim.private_collection_validator import validate_unordered
-
-pole_kwargs = {
- **structure_kwargs,
- "classification": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "streetlights": lists(builds(Streetlight, mrid=mrid_strategy), max_size=2)
-}
+from zepben.ewb import Pole, Streetlight, generate_id
pole_args = [*structure_args, "a", [Streetlight(mrid=generate_id())]]
@@ -30,7 +21,7 @@ def test_pole_constructor_default():
assert not list(p.streetlights)
-@given(**pole_kwargs)
+@given(**pole_kwargs())
def test_pole_constructor_kwargs(classification, streetlights, **kwargs):
p = Pole(classification=classification,
streetlights=streetlights,
@@ -54,7 +45,7 @@ def test_pole_constructor_args():
def test_streetlights_collection():
validate_unordered(
Pole,
- lambda mrid: Streetlight(mrid),
+ Streetlight,
Pole.streetlights,
Pole.num_streetlights,
Pole.get_streetlight,
diff --git a/test/cim/iec61968/assets/test_streelight.py b/test/cim/iec61968/assets/test_streelight.py
index bbdb60605..dcf2af55d 100644
--- a/test/cim/iec61968/assets/test_streelight.py
+++ b/test/cim/iec61968/assets/test_streelight.py
@@ -3,23 +3,13 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, sampled_from, integers
-from util import mrid_strategy
+from cim.fill_fields import streetlight_kwargs
+from cim.iec61968.assets.test_asset import verify_asset_constructor_default, \
+ verify_asset_constructor_kwargs, verify_asset_constructor_args, asset_args
from zepben.ewb import Streetlight, Pole, generate_id
from zepben.ewb.model.cim.iec61968.infiec61968.infassets.streetlight_lamp_kind import StreetlightLampKind
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61968.assets.test_asset import asset_kwargs, verify_asset_constructor_default, \
- verify_asset_constructor_kwargs, verify_asset_constructor_args, asset_args
-
-streetlight_kwargs = {
- **asset_kwargs,
- "pole": builds(Pole, mrid=mrid_strategy),
- "light_rating": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "lamp_kind": sampled_from(StreetlightLampKind)
-}
-
streetlight_args = [*asset_args, Pole(mrid=generate_id()), 1, StreetlightLampKind.HIGH_PRESSURE_SODIUM]
@@ -32,7 +22,7 @@ def test_streetlight_constructor_default():
assert p.lamp_kind == StreetlightLampKind.UNKNOWN
-@given(**streetlight_kwargs)
+@given(**streetlight_kwargs())
def test_streetlight_constructor_kwargs(pole, light_rating, lamp_kind, **kwargs):
p = Streetlight(pole=pole,
light_rating=light_rating,
diff --git a/test/cim/iec61968/assets/test_structure.py b/test/cim/iec61968/assets/test_structure.py
index dec95d0cc..b0a87dd54 100644
--- a/test/cim/iec61968/assets/test_structure.py
+++ b/test/cim/iec61968/assets/test_structure.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61968.assets.test_asset_container import asset_container_kwargs, verify_asset_container_constructor_default, \
+from cim.iec61968.assets.test_asset_container import verify_asset_container_constructor_default, \
verify_asset_container_constructor_kwargs, verify_asset_container_constructor_args, asset_container_args
from zepben.ewb import Structure
-structure_kwargs = asset_container_kwargs
structure_args = asset_container_args
diff --git a/test/cim/iec61968/common/test_agreement.py b/test/cim/iec61968/common/test_agreement.py
index 54693b2dc..b7b8db022 100644
--- a/test/cim/iec61968/common/test_agreement.py
+++ b/test/cim/iec61968/common/test_agreement.py
@@ -6,19 +6,13 @@
from hypothesis.strategies import builds, datetimes, none
-from cim.iec61968.common.test_document import document_kwargs, verify_document_constructor_default, \
+from cim.iec61968.common.test_document import verify_document_constructor_default, \
verify_document_constructor_kwargs, verify_document_constructor_args, document_args
from zepben.ewb.model.cim.iec61968.common.agreement import Agreement
from zepben.ewb.model.cim.iec61970.base.domain.date_time_interval import DateTimeInterval
-
MIN_MAX = datetime.datetime(2020, 1, 1)
-agreement_kwargs = {
- **document_kwargs,
- 'validity_interval': builds(DateTimeInterval, start=datetimes(max_value=MIN_MAX) , end=none()),
-}
-
agreement_args = [*document_args, builds(DateTimeInterval, start=datetimes(max_value=MIN_MAX), end=none())]
diff --git a/test/cim/iec61968/common/test_document.py b/test/cim/iec61968/common/test_document.py
index 3f5f57a3d..4fccf8c39 100644
--- a/test/cim/iec61968/common/test_document.py
+++ b/test/cim/iec61968/common/test_document.py
@@ -4,22 +4,9 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from datetime import datetime
-from hypothesis.strategies import text, datetimes
-from zepben.ewb import Document
-
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
-
-document_kwargs = {
- **identified_object_kwargs,
- "title": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "created_date_time": datetimes(),
- "author_name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "type": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "status": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "comment": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
-}
+from zepben.ewb import Document
document_args = [*identified_object_args, "a", datetime(2021, 1, 1), "b", "c", "d", "e"]
diff --git a/test/cim/iec61968/common/test_electronic_address.py b/test/cim/iec61968/common/test_electronic_address.py
index fd824560e..e223272c6 100644
--- a/test/cim/iec61968/common/test_electronic_address.py
+++ b/test/cim/iec61968/common/test_electronic_address.py
@@ -3,19 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import booleans, text
-from cim.cim_creators import ALPHANUM
+from cim.fill_fields import electronic_address_kwargs
from zepben.ewb import ElectronicAddress
-
-electronic_address_kwargs = {
- 'is_primary': booleans(),
- 'description': text(alphabet=ALPHANUM),
- 'email1': text(alphabet=ALPHANUM),
-}
-
-
electronic_address_args = ['email1', False, 'descript']
@@ -27,7 +18,7 @@ def test_electronic_address_constructor_default():
assert e.email1 is None
-@given(**electronic_address_kwargs)
+@given(**electronic_address_kwargs())
def test_electronic_address_constructor_kwargs(is_primary, description, email1):
e = ElectronicAddress(is_primary=is_primary, description=description, email1=email1)
diff --git a/test/cim/iec61968/common/test_location.py b/test/cim/iec61968/common/test_location.py
index 5d8ced813..5038d4acb 100644
--- a/test/cim/iec61968/common/test_location.py
+++ b/test/cim/iec61968/common/test_location.py
@@ -3,21 +3,14 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds
-from zepben.ewb import Location, generate_id
-from zepben.ewb.model.cim.iec61968.common.street_address import StreetAddress
-from zepben.ewb.model.cim.iec61968.common.position_point import PositionPoint
-from cim.cim_creators import create_position_point
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.fill_fields import location_kwargs
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from cim.private_collection_validator import validate_ordered_other
-
-location_kwargs = {
- **identified_object_kwargs,
- "main_address": builds(StreetAddress),
- "position_points": lists(create_position_point(), max_size=2),
-}
+from zepben.ewb import Location, generate_id
+from zepben.ewb.model.cim.iec61968.common.position_point import PositionPoint
+from zepben.ewb.model.cim.iec61968.common.street_address import StreetAddress
location_args = [*identified_object_args, StreetAddress(), [PositionPoint(1.1, 2.2)]]
@@ -30,7 +23,7 @@ def test_location_constructor_default():
assert not list(loc.points)
-@given(**location_kwargs)
+@given(**location_kwargs())
def test_location_constructor_kwargs(main_address, position_points, **kwargs):
loc = Location(main_address=main_address, position_points=position_points, **kwargs)
diff --git a/test/cim/iec61968/common/test_organisation_role.py b/test/cim/iec61968/common/test_organisation_role.py
index 44206cb79..e51b119d6 100644
--- a/test/cim/iec61968/common/test_organisation_role.py
+++ b/test/cim/iec61968/common/test_organisation_role.py
@@ -3,18 +3,9 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import builds
-
-from util import mrid_strategy
-from zepben.ewb import OrganisationRole, Organisation, generate_id
-
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
-
-organisation_role_kwargs = {
- **identified_object_kwargs,
- "organisation": builds(Organisation, mrid=mrid_strategy)
-}
+from zepben.ewb import OrganisationRole, Organisation, generate_id
organisation_role_args = [*identified_object_args, Organisation(mrid=generate_id())]
diff --git a/test/cim/iec61968/common/test_position_point.py b/test/cim/iec61968/common/test_position_point.py
index 4a88bbce3..3495e0b98 100644
--- a/test/cim/iec61968/common/test_position_point.py
+++ b/test/cim/iec61968/common/test_position_point.py
@@ -3,14 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats
from pytest import raises
-from zepben.ewb.model.cim.iec61968.common.position_point import PositionPoint
-position_point_kwargs = {
- "x_position": floats(min_value=-180, max_value=180),
- "y_position": floats(min_value=-90, max_value=90)
-}
+from cim.fill_fields import position_point_kwargs
+from zepben.ewb.model.cim.iec61968.common.position_point import PositionPoint
position_point_args = [1.1, 2.2]
@@ -30,7 +26,7 @@ def test_position_point_constructor_default():
PositionPoint(y_position=2.0)
-@given(**position_point_kwargs)
+@given(**position_point_kwargs())
def test_position_point_constructor_kwargs(x_position, y_position, **kwargs):
assert not kwargs
diff --git a/test/cim/iec61968/common/test_street_address.py b/test/cim/iec61968/common/test_street_address.py
index f009e405f..424b93234 100644
--- a/test/cim/iec61968/common/test_street_address.py
+++ b/test/cim/iec61968/common/test_street_address.py
@@ -4,23 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, text, one_of, none
-from cim.iec61968.common.test_street_detail import street_detail_kwargs
-from cim.iec61968.common.test_town_detail import town_detail_kwargs
+from cim.fill_fields import street_address_kwargs
from zepben.ewb.model.cim.iec61968.common.street_address import StreetAddress
from zepben.ewb.model.cim.iec61968.common.street_detail import StreetDetail
from zepben.ewb.model.cim.iec61968.common.town_detail import TownDetail
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE
-
-street_address_kwargs = {
- "postal_code": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "town_detail": one_of(none(), builds(TownDetail, **town_detail_kwargs)),
- "po_box": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "street_detail": one_of(none(), builds(StreetDetail, **street_detail_kwargs)),
-}
-
street_address_args = ["a", TownDetail(), "b", StreetDetail()]
@@ -31,7 +20,7 @@ def test_street_address_constructor_default():
assert not sa.town_detail
-@given(**street_address_kwargs)
+@given(**street_address_kwargs())
def test_street_address_constructor_kwargs(postal_code, town_detail, po_box, street_detail, **kwargs):
assert not kwargs
diff --git a/test/cim/iec61968/common/test_street_detail.py b/test/cim/iec61968/common/test_street_detail.py
index 0e2fd8059..ff754d112 100644
--- a/test/cim/iec61968/common/test_street_detail.py
+++ b/test/cim/iec61968/common/test_street_detail.py
@@ -4,20 +4,9 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import text
-from zepben.ewb.model.cim.iec61968.common.street_detail import StreetDetail
-
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE
-street_detail_kwargs = {
- "building_name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "floor_identification": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "number": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "suite_number": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "type": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "display_address": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
-}
+from cim.fill_fields import street_detail_kwargs
+from zepben.ewb.model.cim.iec61968.common.street_detail import StreetDetail
street_detail_args = ["a", "b", "c", "d", "e", "f", "g"]
@@ -34,8 +23,8 @@ def test_street_detail_constructor_default():
assert sd.display_address is None
-@given(**street_detail_kwargs)
-def test_street_detail_constructor_kwargs(building_name, floor_identification, name, number, suite_number, type, display_address, **kwargs):
+@given(**street_detail_kwargs())
+def test_street_detail_constructor_kwargs(building_number, building_name, floor_identification, name, number, suite_number, type, display_address, **kwargs):
assert not kwargs
sd = StreetDetail(
@@ -45,7 +34,8 @@ def test_street_detail_constructor_kwargs(building_name, floor_identification, n
number=number,
suite_number=suite_number,
type=type,
- display_address=display_address
+ display_address=display_address,
+ building_number=building_number,
)
assert sd.building_name == building_name
@@ -55,6 +45,7 @@ def test_street_detail_constructor_kwargs(building_name, floor_identification, n
assert sd.suite_number == suite_number
assert sd.type == type
assert sd.display_address == display_address
+ assert sd.building_number == building_number
def test_street_detail_constructor_args():
diff --git a/test/cim/iec61968/common/test_telephone_number.py b/test/cim/iec61968/common/test_telephone_number.py
index df031fc12..785cdbe56 100644
--- a/test/cim/iec61968/common/test_telephone_number.py
+++ b/test/cim/iec61968/common/test_telephone_number.py
@@ -3,25 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import text
-from cim.cim_creators import ALPHANUM
+from cim.fill_fields import telephone_number_kwargs
from zepben.ewb import TelephoneNumber
-
-telephone_number_kwargs = {
- 'area_code': text(alphabet=ALPHANUM),
- 'city_code': text(alphabet=ALPHANUM),
- 'country_code': text(alphabet=ALPHANUM),
- 'dial_out': text(alphabet=ALPHANUM),
- 'extension': text(alphabet=ALPHANUM),
- 'international_prefix': text(alphabet=ALPHANUM),
- 'local_number': text(alphabet=ALPHANUM),
- 'is_primary': text(alphabet=ALPHANUM),
- 'description': text(alphabet=ALPHANUM),
-}
-
-
telephone_number_args = ['area_code', 'city_code', 'country_code', 'dial_out', 'extension',
'international_prefix', 'itu_phone', None, 'local_number',
'is_primary', 'description']
@@ -43,7 +28,7 @@ def test_telephone_number_constructor_default():
assert t.description is None
-@given(**telephone_number_kwargs)
+@given(**telephone_number_kwargs())
def test_telephone_number_constructor_kwargs(
area_code,
city_code,
@@ -67,7 +52,6 @@ def test_telephone_number_constructor_kwargs(
description=description
)
-
assert t.area_code == area_code
assert t.city_code == city_code
assert t.country_code == country_code
diff --git a/test/cim/iec61968/common/test_town_detail.py b/test/cim/iec61968/common/test_town_detail.py
index 820a8d55a..37b7e06e0 100644
--- a/test/cim/iec61968/common/test_town_detail.py
+++ b/test/cim/iec61968/common/test_town_detail.py
@@ -4,16 +4,9 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import text
-from zepben.ewb.model.cim.iec61968.common.town_detail import TownDetail
-
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE
-town_detail_kwargs = {
- "name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "state_or_province": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "country": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
-}
+from cim.fill_fields import town_detail_kwargs
+from zepben.ewb.model.cim.iec61968.common.town_detail import TownDetail
town_detail_args = ["a", "b", "c"]
@@ -26,7 +19,7 @@ def test_town_detail_constructor_default():
assert td.country is None
-@given(**town_detail_kwargs)
+@given(**town_detail_kwargs())
def test_town_detail_constructor_kwargs(name, state_or_province, country, **kwargs):
assert not kwargs
diff --git a/test/cim/iec61968/customers/test_customer.py b/test/cim/iec61968/customers/test_customer.py
index 9b4be5ee4..0b0651c5f 100644
--- a/test/cim/iec61968/customers/test_customer.py
+++ b/test/cim/iec61968/customers/test_customer.py
@@ -4,23 +4,13 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds, sampled_from, text
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE
-from util import mrid_strategy
-from zepben.ewb import Customer, CustomerKind, CustomerAgreement, generate_id
-
-from cim.iec61968.common.test_organisation_role import organisation_role_kwargs, verify_organisation_role_constructor_default, \
+from cim.fill_fields import customer_kwargs
+from cim.iec61968.common.test_organisation_role import verify_organisation_role_constructor_default, \
verify_organisation_role_constructor_kwargs, \
verify_organisation_role_constructor_args, organisation_role_args
from cim.private_collection_validator import validate_unordered
-
-customer_kwargs = {
- **organisation_role_kwargs,
- "kind": sampled_from(CustomerKind),
- "special_need": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "customer_agreements": lists(builds(CustomerAgreement, mrid=mrid_strategy), max_size=2)
-}
+from zepben.ewb import Customer, CustomerKind, CustomerAgreement, generate_id
customer_args = [*organisation_role_args, CustomerKind.residential, "special", [CustomerAgreement(mrid=generate_id())]]
@@ -34,7 +24,7 @@ def test_customer_constructor_default():
assert not list(c.agreements)
-@given(**customer_kwargs)
+@given(**customer_kwargs())
def test_customer_constructor_kwargs(kind, special_need, customer_agreements, **kwargs):
c = Customer(
kind=kind,
@@ -63,7 +53,7 @@ def test_customer_constructor_args():
def test_customer_agreements_collection():
validate_unordered(
Customer,
- lambda mrid: CustomerAgreement(mrid),
+ CustomerAgreement,
Customer.agreements,
Customer.num_agreements,
Customer.get_agreement,
diff --git a/test/cim/iec61968/customers/test_customer_agreement.py b/test/cim/iec61968/customers/test_customer_agreement.py
index dbeb5006a..c86ed1599 100644
--- a/test/cim/iec61968/customers/test_customer_agreement.py
+++ b/test/cim/iec61968/customers/test_customer_agreement.py
@@ -4,20 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds
-from util import mrid_strategy
-from zepben.ewb import CustomerAgreement, Customer, PricingStructure, generate_id
-
-from cim.iec61968.common.test_agreement import agreement_kwargs, verify_agreement_constructor_default, verify_agreement_constructor_kwargs, \
+from cim.fill_fields import customer_agreement_kwargs
+from cim.iec61968.common.test_agreement import verify_agreement_constructor_default, verify_agreement_constructor_kwargs, \
verify_agreement_constructor_args, agreement_args
from cim.private_collection_validator import validate_unordered
-
-customer_agreement_kwargs = {
- **agreement_kwargs,
- "customer": builds(Customer, mrid=mrid_strategy),
- "pricing_structures": lists(builds(PricingStructure, mrid=mrid_strategy), max_size=2)
-}
+from zepben.ewb import CustomerAgreement, Customer, PricingStructure, generate_id
customer_agreement_args = [*agreement_args, Customer(mrid=generate_id()), [PricingStructure(mrid=generate_id())]]
@@ -30,7 +22,7 @@ def test_customer_agreement_constructor_default():
assert not list(ca.pricing_structures)
-@given(**customer_agreement_kwargs)
+@given(**customer_agreement_kwargs())
def test_customer_agreement_constructor_kwargs(customer, pricing_structures, **kwargs):
ca = CustomerAgreement(
customer=customer,
@@ -48,9 +40,9 @@ def test_customer_agreement_constructor_args():
verify_agreement_constructor_args(ca)
assert [
- ca.customer,
- list(ca.pricing_structures)
- ] == customer_agreement_args[-2:]
+ ca.customer,
+ list(ca.pricing_structures)
+ ] == customer_agreement_args[-2:]
def test_pricing_structures_collection():
diff --git a/test/cim/iec61968/customers/test_pricing_structure.py b/test/cim/iec61968/customers/test_pricing_structure.py
index 32a1a40b4..002fc90eb 100644
--- a/test/cim/iec61968/customers/test_pricing_structure.py
+++ b/test/cim/iec61968/customers/test_pricing_structure.py
@@ -4,21 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds, text
-from cim.cim_creators import ALPHANUM
-from util import mrid_strategy
-from zepben.ewb import PricingStructure, Tariff, generate_id
-
-from cim.iec61968.common.test_document import document_kwargs, verify_document_constructor_default, verify_document_constructor_kwargs, \
+from cim.fill_fields import pricing_structure_kwargs
+from cim.iec61968.common.test_document import verify_document_constructor_default, verify_document_constructor_kwargs, \
verify_document_constructor_args, document_args
from cim.private_collection_validator import validate_unordered
-
-pricing_structure_kwargs = {
- **document_kwargs,
- "tariffs": lists(builds(Tariff, mrid=mrid_strategy), max_size=2),
- "code": text(alphabet=ALPHANUM),
-}
+from zepben.ewb import PricingStructure, Tariff, generate_id
pricing_structure_args = [*document_args, [Tariff(mrid=generate_id())], "asd"]
@@ -31,7 +22,7 @@ def test_pricing_structure_constructor_default():
assert ps.code is None
-@given(**pricing_structure_kwargs)
+@given(**pricing_structure_kwargs())
def test_pricing_structure_constructor_kwargs(tariffs, code, **kwargs):
ps = PricingStructure(
tariffs=tariffs,
@@ -49,15 +40,15 @@ def test_pricing_structure_constructor_args():
verify_document_constructor_args(ps)
assert pricing_structure_args[-2:] == [
- list(ps.tariffs),
- ps.code
- ]
+ list(ps.tariffs),
+ ps.code
+ ]
def test_tariffs_collection():
validate_unordered(
PricingStructure,
- lambda mrid: Tariff(mrid),
+ Tariff,
PricingStructure.tariffs,
PricingStructure.num_tariffs,
PricingStructure.get_tariff,
diff --git a/test/cim/iec61968/customers/test_tariff.py b/test/cim/iec61968/customers/test_tariff.py
index 3b5d14145..c6da20cd1 100644
--- a/test/cim/iec61968/customers/test_tariff.py
+++ b/test/cim/iec61968/customers/test_tariff.py
@@ -5,11 +5,11 @@
from hypothesis import given
-from cim.iec61968.common.test_document import document_kwargs, verify_document_constructor_default, verify_document_constructor_kwargs, \
+from cim.fill_fields import tariff_kwargs
+from cim.iec61968.common.test_document import verify_document_constructor_default, verify_document_constructor_kwargs, \
verify_document_constructor_args, document_args
from zepben.ewb import Tariff, generate_id
-tariff_kwargs = document_kwargs
tariff_args = document_args
@@ -17,7 +17,7 @@ def test_tariff_constructor_default():
verify_document_constructor_default(Tariff(mrid=generate_id()))
-@given(**tariff_kwargs)
+@given(**tariff_kwargs())
def test_tariff_constructor_kwargs(**kwargs):
verify_document_constructor_kwargs(Tariff(**kwargs), **kwargs)
diff --git a/test/cim/iec61968/infiec61968/infassetinfo/test_current_transformer_info.py b/test/cim/iec61968/infiec61968/infassetinfo/test_current_transformer_info.py
index 0c468c1e7..afed0a083 100644
--- a/test/cim/iec61968/infiec61968/infassetinfo/test_current_transformer_info.py
+++ b/test/cim/iec61968/infiec61968/infassetinfo/test_current_transformer_info.py
@@ -4,28 +4,11 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, floats, integers, text
-from zepben.ewb import CurrentTransformerInfo, Ratio, generate_id
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX, MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, ALPHANUM, TEXT_MAX_SIZE
-from cim.iec61968.assets.test_asset_info import asset_info_kwargs, verify_asset_info_constructor_default, \
+from cim.fill_fields import current_transformer_info_kwargs
+from cim.iec61968.assets.test_asset_info import verify_asset_info_constructor_default, \
verify_asset_info_constructor_kwargs, verify_asset_info_constructor_args, asset_info_args
-
-current_transformer_info_kwargs = {
- **asset_info_kwargs,
- "accuracy_class": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "accuracy_limit": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "core_count": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "ct_class": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "knee_point_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "max_ratio": builds(Ratio, floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "nominal_ratio": builds(Ratio, floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "primary_ratio": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "rated_current": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "secondary_fls_rating": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "secondary_ratio": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "usage": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
-}
+from zepben.ewb import CurrentTransformerInfo, Ratio, generate_id
# noinspection PyArgumentList
current_transformer_info_args = [*asset_info_args, "a", 1.1, 2, "b", 3, Ratio(4.4, 5.5), Ratio(6.6, 7.7), 8.8, 9, 10, 11.11, "c"]
@@ -49,7 +32,7 @@ def test_current_transformer_info_constructor_default():
assert cti.usage is None
-@given(**current_transformer_info_kwargs)
+@given(**current_transformer_info_kwargs())
def test_current_transformer_info_constructor_kwargs(accuracy_class, accuracy_limit, core_count, ct_class, knee_point_voltage, max_ratio, nominal_ratio,
primary_ratio, rated_current, secondary_fls_rating, secondary_ratio, usage, **kwargs):
cti = CurrentTransformerInfo(
diff --git a/test/cim/iec61968/infiec61968/infassetinfo/test_potential_transformer_info.py b/test/cim/iec61968/infiec61968/infassetinfo/test_potential_transformer_info.py
index 2108a1adc..2ad776f57 100644
--- a/test/cim/iec61968/infiec61968/infassetinfo/test_potential_transformer_info.py
+++ b/test/cim/iec61968/infiec61968/infassetinfo/test_potential_transformer_info.py
@@ -4,23 +4,11 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, floats, integers, text
-from zepben.ewb import PotentialTransformerInfo, Ratio, generate_id
-
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX, MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, ALPHANUM, TEXT_MAX_SIZE
-from cim.iec61968.assets.test_asset_info import asset_info_kwargs, verify_asset_info_constructor_default, \
+from cim.fill_fields import potential_transformer_info_kwargs
+from cim.iec61968.assets.test_asset_info import verify_asset_info_constructor_default, \
verify_asset_info_constructor_kwargs, verify_asset_info_constructor_args, asset_info_args
-
-potential_transformer_info_kwargs = {
- **asset_info_kwargs,
- "accuracy_class": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "nominal_ratio": builds(Ratio, floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "primary_ratio": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "pt_class": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "rated_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "secondary_ratio": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
+from zepben.ewb import PotentialTransformerInfo, Ratio, generate_id
# noinspection PyArgumentList
potential_transformer_info_args = [*asset_info_args, "a", Ratio(1.1, 2.2), 3.3, "b", 4, 5.5]
@@ -38,7 +26,7 @@ def test_potential_transformer_info_constructor_default():
assert vti.secondary_ratio is None
-@given(**potential_transformer_info_kwargs)
+@given(**potential_transformer_info_kwargs())
def test_potential_transformer_info_constructor_kwargs(accuracy_class, nominal_ratio, primary_ratio, pt_class, rated_voltage, secondary_ratio, **kwargs):
vti = PotentialTransformerInfo(
accuracy_class=accuracy_class,
diff --git a/test/cim/iec61968/infiec61968/infassetinfo/test_relay_info.py b/test/cim/iec61968/infiec61968/infassetinfo/test_relay_info.py
index 8845dae60..eb4530f83 100644
--- a/test/cim/iec61968/infiec61968/infassetinfo/test_relay_info.py
+++ b/test/cim/iec61968/infiec61968/infassetinfo/test_relay_info.py
@@ -3,22 +3,13 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import text, lists, floats, booleans
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE, FLOAT_MIN, FLOAT_MAX
-from cim.iec61968.assets.test_asset_info import asset_info_kwargs, asset_info_args, verify_asset_info_constructor_default, verify_asset_info_constructor_kwargs, \
+from cim.fill_fields import relay_info_kwargs
+from cim.iec61968.assets.test_asset_info import asset_info_args, verify_asset_info_constructor_default, verify_asset_info_constructor_kwargs, \
verify_asset_info_constructor_args
from cim.private_collection_validator import validate_ordered_other
from zepben.ewb import RelayInfo, generate_id
-relay_info_kwargs = {
- **asset_info_kwargs,
- "curve_setting": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "reclose_fast": booleans(),
- "reclose_delays": lists(floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
-
-}
-
relay_info_args = [*asset_info_args, "a", True, [0.1, 0.2, 0.3]]
@@ -31,7 +22,7 @@ def test_relay_info_constructor_default():
assert not list(ri.reclose_delays)
-@given(**relay_info_kwargs)
+@given(**relay_info_kwargs())
def test_relay_info_constructor_kwargs(curve_setting, reclose_fast, reclose_delays, **kwargs):
ri = RelayInfo(
curve_setting=curve_setting,
diff --git a/test/cim/iec61968/infiec61968/infcommon/test_ratio.py b/test/cim/iec61968/infiec61968/infcommon/test_ratio.py
index cbb7fb97b..480bfbb2e 100644
--- a/test/cim/iec61968/infiec61968/infcommon/test_ratio.py
+++ b/test/cim/iec61968/infiec61968/infcommon/test_ratio.py
@@ -3,17 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from pytest import raises
from hypothesis import given
-from hypothesis.strategies import floats
+from pytest import raises
+from cim.fill_fields import ratio_kwargs
from zepben.ewb import Ratio
-ratio_kwargs = {
- "denominator": floats(min_value=0.1, max_value=1000),
- "numerator": floats(min_value=0.0, max_value=1000)
-}
-
ratio_args = [9.0, 6.0]
@@ -32,7 +27,7 @@ def test_ratio_constructor_default():
Ratio(numerator=2.0)
-@given(**ratio_kwargs)
+@given(**ratio_kwargs())
def test_ratio_constructor_kwargs(denominator, numerator, **kwargs):
assert not kwargs
diff --git a/test/cim/iec61968/metering/test_end_device.py b/test/cim/iec61968/metering/test_end_device.py
index 17e3f9611..627418b29 100644
--- a/test/cim/iec61968/metering/test_end_device.py
+++ b/test/cim/iec61968/metering/test_end_device.py
@@ -3,24 +3,14 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import text, builds, lists
-
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE
-from cim.iec61968.assets.test_asset_container import asset_container_kwargs, verify_asset_container_constructor_default, \
+from cim.iec61968.assets.test_asset_container import verify_asset_container_constructor_default, \
verify_asset_container_constructor_kwargs, verify_asset_container_constructor_args, asset_container_args
from cim.private_collection_validator import validate_unordered
-from util import mrid_strategy
+from util import assert_or_empty
from zepben.ewb import Location, generate_id
+from zepben.ewb.model.cim.iec61968.metering.end_device import EndDevice
from zepben.ewb.model.cim.iec61968.metering.end_device_function import EndDeviceFunction
from zepben.ewb.model.cim.iec61968.metering.usage_point import UsagePoint
-from zepben.ewb.model.cim.iec61968.metering.end_device import EndDevice
-
-end_device_kwargs = {
- **asset_container_kwargs,
- "customer_mrid": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "service_location": builds(Location, mrid=mrid_strategy),
- "usage_points": lists(builds(UsagePoint, mrid=mrid_strategy), max_size=2)
-}
end_device_args = [*asset_container_args, "a", Location(mrid=generate_id()), [UsagePoint(mrid=generate_id())]]
@@ -32,11 +22,12 @@ def verify_end_device_constructor_default(ed: EndDevice):
assert not list(ed.usage_points)
-def verify_end_device_constructor_kwargs(ed: EndDevice, customer_mrid, service_location, usage_points, **kwargs):
+def verify_end_device_constructor_kwargs(ed: EndDevice, customer_mrid, service_location, usage_points, functions, **kwargs):
verify_asset_container_constructor_kwargs(ed, **kwargs)
assert ed.customer_mrid == customer_mrid
assert ed.service_location == service_location
- assert list(ed.usage_points) == usage_points
+ assert_or_empty(ed.usage_points, usage_points)
+ assert_or_empty(ed.functions, functions)
def verify_end_device_constructor_args(ed: EndDevice):
@@ -51,7 +42,7 @@ def verify_end_device_constructor_args(ed: EndDevice):
def test_usage_points_collection():
validate_unordered(
EndDevice,
- lambda mrid: UsagePoint(mrid),
+ UsagePoint,
EndDevice.usage_points,
EndDevice.num_usage_points,
EndDevice.get_usage_point,
@@ -64,7 +55,7 @@ def test_usage_points_collection():
def test_end_device_function_collection():
validate_unordered(
EndDevice,
- lambda mrid: EndDeviceFunction(mrid),
+ EndDeviceFunction,
EndDevice.functions,
EndDevice.num_functions,
EndDevice.get_function,
diff --git a/test/cim/iec61968/metering/test_end_device_function.py b/test/cim/iec61968/metering/test_end_device_function.py
index ce9e07354..ddf07a39a 100644
--- a/test/cim/iec61968/metering/test_end_device_function.py
+++ b/test/cim/iec61968/metering/test_end_device_function.py
@@ -3,17 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import booleans
-
-from test.cim.iec61968.assets.test_asset_function import asset_function_kwargs, asset_function_args, verify_asset_function_constructor_default, \
+from test.cim.iec61968.assets.test_asset_function import asset_function_args, verify_asset_function_constructor_default, \
verify_asset_function_constructor_kwargs, verify_asset_function_constructor_args
from zepben.ewb.model.cim.iec61968.metering.end_device_function import EndDeviceFunction
-end_device_function_kwargs = {
- **asset_function_kwargs,
- "enabled": booleans(),
-}
-
end_device_function_args = [*asset_function_args, False]
diff --git a/test/cim/iec61968/metering/test_meter.py b/test/cim/iec61968/metering/test_meter.py
index a9ab68f9a..608502769 100644
--- a/test/cim/iec61968/metering/test_meter.py
+++ b/test/cim/iec61968/metering/test_meter.py
@@ -5,12 +5,12 @@
from hypothesis import given
-from cim.iec61968.metering.test_end_device import end_device_kwargs, verify_end_device_constructor_default, verify_end_device_constructor_kwargs, \
+from cim.fill_fields import meter_kwargs
+from cim.iec61968.metering.test_end_device import verify_end_device_constructor_default, verify_end_device_constructor_kwargs, \
verify_end_device_constructor_args, end_device_args
from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61968.metering.meter import Meter
-meter_kwargs = end_device_kwargs
meter_args = end_device_args
@@ -18,10 +18,10 @@ def test_meter_constructor_default():
meter = Meter(mrid=generate_id())
verify_end_device_constructor_default(meter)
assert meter.company_meter_id is None
- assert meter.name is None
+ assert meter.name is None
-@given(**meter_kwargs)
+@given(**meter_kwargs())
def test_meter_constructor_kwargs(**kwargs):
verify_end_device_constructor_kwargs(Meter(**kwargs), **kwargs)
diff --git a/test/cim/iec61968/metering/test_usage_point.py b/test/cim/iec61968/metering/test_usage_point.py
index eeee96b3b..f4f020f7c 100644
--- a/test/cim/iec61968/metering/test_usage_point.py
+++ b/test/cim/iec61968/metering/test_usage_point.py
@@ -4,32 +4,19 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, lists, booleans, text, integers, sampled_from
-from util import mrid_strategy
+from cim.fill_fields import usage_point_kwargs
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
+ verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
+from cim.private_collection_validator import validate_unordered, validate_unordered_other
+from util import assert_or_empty
from zepben.ewb import Location, Equipment, PhaseCode, generate_id
from zepben.ewb.model.cim.extensions.iec61968.common.contact_details import ContactDetails
-from zepben.ewb.model.cim.iec61968.metering.usage_point import UsagePoint
from zepben.ewb.model.cim.iec61968.metering.end_device import EndDevice
+from zepben.ewb.model.cim.iec61968.metering.usage_point import UsagePoint
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE, MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
- verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
-from cim.private_collection_validator import validate_unordered, validate_unordered_other
-
-usage_point_kwargs = {
- **identified_object_kwargs,
- "usage_point_location": builds(Location, mrid=mrid_strategy),
- "is_virtual": booleans(),
- "connection_category": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "rated_power": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "approved_inverter_capacity": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "phase_code": sampled_from(PhaseCode),
- "equipment": lists(builds(Equipment, mrid=mrid_strategy)),
- "end_devices": lists(builds(EndDevice, mrid=mrid_strategy))
-}
-
-usage_point_args = [*identified_object_args, Location(mrid=generate_id()), True, "1", 1, 2, PhaseCode.XYN, [Equipment(mrid=generate_id())], [EndDevice(mrid=generate_id())]]
+usage_point_args = [*identified_object_args, Location(mrid=generate_id()), True, "1", 1, 2, PhaseCode.XYN, [Equipment(mrid=generate_id())],
+ [EndDevice(mrid=generate_id())]]
def test_usage_point_constructor_default():
@@ -45,7 +32,7 @@ def test_usage_point_constructor_default():
assert not list(up.end_devices)
-@given(**usage_point_kwargs)
+@given(**usage_point_kwargs())
def test_usage_point_constructor_kwargs(
usage_point_location,
is_virtual,
@@ -55,6 +42,7 @@ def test_usage_point_constructor_kwargs(
phase_code,
equipment,
end_devices,
+ contacts,
**kwargs
):
up = UsagePoint(usage_point_location=usage_point_location,
@@ -65,6 +53,7 @@ def test_usage_point_constructor_kwargs(
phase_code=phase_code,
equipment=equipment,
end_devices=end_devices,
+ contacts=contacts,
**kwargs)
verify_identified_object_constructor_kwargs(up, **kwargs)
@@ -74,8 +63,9 @@ def test_usage_point_constructor_kwargs(
assert up.rated_power == rated_power
assert up.approved_inverter_capacity == approved_inverter_capacity
assert up.phase_code == phase_code
- assert list(up.equipment) == equipment
- assert list(up.end_devices) == end_devices
+ assert_or_empty(up.equipment, equipment)
+ assert_or_empty(up.end_devices, end_devices)
+ assert_or_empty(up.contacts, contacts)
def test_usage_point_constructor_args():
@@ -98,7 +88,7 @@ def test_usage_point_constructor_args():
def test_equipment_collection():
validate_unordered(
UsagePoint,
- lambda mrid: Equipment(mrid),
+ Equipment,
UsagePoint.equipment,
UsagePoint.num_equipment,
UsagePoint.get_equipment,
@@ -111,7 +101,7 @@ def test_equipment_collection():
def test_end_devices_collection():
validate_unordered(
UsagePoint,
- lambda mrid: EndDevice(mrid),
+ EndDevice,
UsagePoint.end_devices,
UsagePoint.num_end_devices,
UsagePoint.get_end_device,
@@ -120,10 +110,11 @@ def test_end_devices_collection():
UsagePoint.clear_end_devices
)
+
def test_contacts_collection():
validate_unordered_other(
UsagePoint,
- lambda _id: ContactDetails(_id),
+ lambda _id: ContactDetails(id=str(_id)),
UsagePoint.contacts,
UsagePoint.num_contacts,
UsagePoint.get_contact,
diff --git a/test/cim/iec61968/operations/test_operational_restriction.py b/test/cim/iec61968/operations/test_operational_restriction.py
index cb79abcb6..8528ae772 100644
--- a/test/cim/iec61968/operations/test_operational_restriction.py
+++ b/test/cim/iec61968/operations/test_operational_restriction.py
@@ -4,19 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds
-from util import mrid_strategy
-from zepben.ewb import OperationalRestriction, Equipment, generate_id
-
-from cim.iec61968.common.test_document import document_kwargs, verify_document_constructor_default, verify_document_constructor_kwargs, \
+from cim.fill_fields import operational_restriction_kwargs
+from cim.iec61968.common.test_document import verify_document_constructor_default, verify_document_constructor_kwargs, \
verify_document_constructor_args, document_args
from cim.private_collection_validator import validate_unordered
-
-operational_restriction_kwargs = {
- **document_kwargs,
- "equipment": lists(builds(Equipment, mrid=mrid_strategy), max_size=2),
-}
+from zepben.ewb import OperationalRestriction, Equipment, generate_id
operational_restriction_args = [*document_args, [Equipment(mrid=generate_id())]]
@@ -28,7 +21,7 @@ def test_operational_restriction_constructor_default():
assert not list(or_.equipment)
-@given(**operational_restriction_kwargs)
+@given(**operational_restriction_kwargs())
def test_operational_restriction_constructor_kwargs(equipment, **kwargs):
or_ = OperationalRestriction(
equipment=equipment,
diff --git a/test/cim/iec61970/base/auxiliaryequipment/test_auxiliary_equipment.py b/test/cim/iec61970/base/auxiliaryequipment/test_auxiliary_equipment.py
index f69f2a907..fd94f207d 100644
--- a/test/cim/iec61970/base/auxiliaryequipment/test_auxiliary_equipment.py
+++ b/test/cim/iec61970/base/auxiliaryequipment/test_auxiliary_equipment.py
@@ -2,18 +2,10 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import builds
-from util import mrid_strategy
-from zepben.ewb import AuxiliaryEquipment, Terminal, generate_id
-
-from cim.iec61970.base.core.test_equipment import equipment_kwargs, verify_equipment_constructor_default, \
+from cim.iec61970.base.core.test_equipment import verify_equipment_constructor_default, \
verify_equipment_constructor_kwargs, verify_equipment_constructor_args, equipment_args
-
-auxiliary_equipment_kwargs = {
- **equipment_kwargs,
- "terminal": builds(Terminal, mrid=mrid_strategy)
-}
+from zepben.ewb import AuxiliaryEquipment, Terminal, generate_id
auxiliary_equipment_args = [*equipment_args, Terminal(mrid=generate_id())]
diff --git a/test/cim/iec61970/base/auxiliaryequipment/test_current_transformer.py b/test/cim/iec61970/base/auxiliaryequipment/test_current_transformer.py
index 0a7ba1b7f..cbdddc5a3 100644
--- a/test/cim/iec61970/base/auxiliaryequipment/test_current_transformer.py
+++ b/test/cim/iec61970/base/auxiliaryequipment/test_current_transformer.py
@@ -4,18 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import integers
-from zepben.ewb import CurrentTransformer, CurrentTransformerInfo, generate_id
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61970.base.auxiliaryequipment.test_sensor import sensor_kwargs, verify_sensor_constructor_default, \
+from cim.fill_fields import current_transformer_kwargs
+from cim.iec61970.base.auxiliaryequipment.test_sensor import verify_sensor_constructor_default, \
verify_sensor_constructor_kwargs, verify_sensor_constructor_args, sensor_args
-from cim.property_validator import validate_property_accessor
+from zepben.ewb import CurrentTransformer, generate_id
-current_transformer_kwargs = {
- **sensor_kwargs,
- "core_burden": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
-}
current_transformer_args = [*sensor_args, 1]
@@ -26,7 +20,7 @@ def test_current_transformer_constructor_default():
assert ct.core_burden is None
-@given(**current_transformer_kwargs)
+@given(**current_transformer_kwargs())
def test_current_transformer_constructor_kwargs(core_burden, **kwargs):
ct = CurrentTransformer(core_burden=core_burden, **kwargs)
@@ -41,7 +35,3 @@ def test_current_transformer_constructor_args():
assert current_transformer_args[-1:] == [
ct.core_burden
]
-
-
-def test_current_transformer_info_accessor():
- validate_property_accessor(CurrentTransformer, CurrentTransformerInfo, CurrentTransformer.current_transformer_info)
diff --git a/test/cim/iec61970/base/auxiliaryequipment/test_fault_indicator.py b/test/cim/iec61970/base/auxiliaryequipment/test_fault_indicator.py
index b8e1160f5..750cb3ad3 100644
--- a/test/cim/iec61970/base/auxiliaryequipment/test_fault_indicator.py
+++ b/test/cim/iec61970/base/auxiliaryequipment/test_fault_indicator.py
@@ -4,12 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from cim.iec61970.base.auxiliaryequipment.test_auxiliary_equipment import auxiliary_equipment_kwargs, verify_auxiliary_equipment_constructor_default, \
+from cim.fill_fields import fault_indicator_kwargs
+from cim.iec61970.base.auxiliaryequipment.test_auxiliary_equipment import verify_auxiliary_equipment_constructor_default, \
verify_auxiliary_equipment_constructor_kwargs, verify_auxiliary_equipment_constructor_args, auxiliary_equipment_args
from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.fault_indicator import FaultIndicator
-fault_indicator_kwargs = auxiliary_equipment_kwargs
fault_indicator_args = auxiliary_equipment_args
@@ -17,7 +17,7 @@ def test_fault_indicator_constructor_default():
verify_auxiliary_equipment_constructor_default(FaultIndicator(mrid=generate_id()))
-@given(**fault_indicator_kwargs)
+@given(**fault_indicator_kwargs())
def test_fault_indicator_constructor_kwargs(**kwargs):
verify_auxiliary_equipment_constructor_kwargs(FaultIndicator(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/auxiliaryequipment/test_potential_transformer.py b/test/cim/iec61970/base/auxiliaryequipment/test_potential_transformer.py
index 9335382d2..ec18ee087 100644
--- a/test/cim/iec61970/base/auxiliaryequipment/test_potential_transformer.py
+++ b/test/cim/iec61970/base/auxiliaryequipment/test_potential_transformer.py
@@ -4,17 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import sampled_from
-from zepben.ewb import PotentialTransformer, PotentialTransformerInfo, PotentialTransformerKind, generate_id
-from cim.iec61970.base.auxiliaryequipment.test_sensor import sensor_kwargs, verify_sensor_constructor_default, \
+from cim.fill_fields import potential_transformer_kwargs
+from cim.iec61970.base.auxiliaryequipment.test_sensor import verify_sensor_constructor_default, \
verify_sensor_constructor_kwargs, verify_sensor_constructor_args, sensor_args
-from cim.property_validator import validate_property_accessor
+from zepben.ewb import PotentialTransformer, PotentialTransformerKind, generate_id
-potential_transformer_kwargs = {
- **sensor_kwargs,
- "type": sampled_from(PotentialTransformerKind)
-}
potential_transformer_args = [*sensor_args, PotentialTransformerKind.capacitiveCoupling]
@@ -26,7 +21,7 @@ def test_potential_transformer_constructor_default():
# noinspection PyShadowingBuiltins
-@given(**potential_transformer_kwargs)
+@given(**potential_transformer_kwargs())
def test_potential_transformer_constructor_kwargs(type, **kwargs):
vt = PotentialTransformer(type=type, **kwargs)
@@ -41,7 +36,3 @@ def test_potential_transformer_constructor_args():
assert potential_transformer_args[-1:] == [
vt.type
]
-
-
-def test_potential_transformer_info_accessor():
- validate_property_accessor(PotentialTransformer, PotentialTransformerInfo, PotentialTransformer.potential_transformer_info)
diff --git a/test/cim/iec61970/base/auxiliaryequipment/test_sensor.py b/test/cim/iec61970/base/auxiliaryequipment/test_sensor.py
index 84b6924e7..ba8f6dc3f 100644
--- a/test/cim/iec61970/base/auxiliaryequipment/test_sensor.py
+++ b/test/cim/iec61970/base/auxiliaryequipment/test_sensor.py
@@ -3,19 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import lists, builds
-
-from util import mrid_strategy
-from zepben.ewb import Sensor, ProtectionRelayFunction, generate_id
-
-from cim.iec61970.base.auxiliaryequipment.test_auxiliary_equipment import auxiliary_equipment_kwargs, verify_auxiliary_equipment_constructor_default, \
+from cim.iec61970.base.auxiliaryequipment.test_auxiliary_equipment import verify_auxiliary_equipment_constructor_default, \
verify_auxiliary_equipment_constructor_kwargs, verify_auxiliary_equipment_constructor_args, auxiliary_equipment_args
from cim.private_collection_validator import validate_unordered
-
-sensor_kwargs = {
- **auxiliary_equipment_kwargs,
- "relay_functions": lists(builds(ProtectionRelayFunction, mrid=mrid_strategy), max_size=2)
-}
+from zepben.ewb import Sensor, ProtectionRelayFunction, generate_id
sensor_args = [*auxiliary_equipment_args, [ProtectionRelayFunction(mrid=generate_id())]]
diff --git a/test/cim/iec61970/base/core/test_ac_dc_terminal.py b/test/cim/iec61970/base/core/test_ac_dc_terminal.py
index e2e033cf8..d32aea3fe 100644
--- a/test/cim/iec61970/base/core/test_ac_dc_terminal.py
+++ b/test/cim/iec61970/base/core/test_ac_dc_terminal.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from zepben.ewb.model.cim.iec61970.base.core.ac_dc_terminal import AcDcTerminal
-ac_dc_terminal_kwargs = identified_object_kwargs
ac_dc_terminal_args = identified_object_args
diff --git a/test/cim/iec61970/base/core/test_base_voltage.py b/test/cim/iec61970/base/core/test_base_voltage.py
index 71a374a08..4fe6c6679 100644
--- a/test/cim/iec61970/base/core/test_base_voltage.py
+++ b/test/cim/iec61970/base/core/test_base_voltage.py
@@ -3,17 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import integers
-from zepben.ewb import BaseVoltage, generate_id
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.fill_fields import base_voltage_kwargs
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
-
-base_voltage_kwargs = {
- **identified_object_kwargs,
- "nominal_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
-}
+from zepben.ewb import BaseVoltage, generate_id
base_voltage_args = [*identified_object_args, 1]
@@ -25,7 +19,7 @@ def test_base_voltage_constructor_default():
assert bv.nominal_voltage == 0
-@given(**base_voltage_kwargs)
+@given(**base_voltage_kwargs())
def test_base_voltage_constructor_kwargs(nominal_voltage, **kwargs):
bv = BaseVoltage(nominal_voltage=nominal_voltage, **kwargs)
diff --git a/test/cim/iec61970/base/core/test_conducting_equipment.py b/test/cim/iec61970/base/core/test_conducting_equipment.py
index f78011e69..3cb9540a3 100644
--- a/test/cim/iec61970/base/core/test_conducting_equipment.py
+++ b/test/cim/iec61970/base/core/test_conducting_equipment.py
@@ -5,20 +5,11 @@
import sys
import pytest
-from hypothesis.strategies import lists, builds
-from util import mrid_strategy
-from zepben.ewb import ConductingEquipment, BaseVoltage, Terminal, generate_id
-
-from cim.iec61970.base.core.test_equipment import equipment_kwargs, verify_equipment_constructor_default, \
+from cim.iec61970.base.core.test_equipment import verify_equipment_constructor_default, \
verify_equipment_constructor_kwargs, verify_equipment_constructor_args, equipment_args
from cim.private_collection_validator import validate_ordered
-
-conducting_equipment_kwargs = {
- **equipment_kwargs,
- "base_voltage": builds(BaseVoltage, mrid=mrid_strategy),
- "terminals": lists(builds(Terminal, mrid=mrid_strategy), max_size=2)
-}
+from zepben.ewb import ConductingEquipment, BaseVoltage, Terminal, generate_id
conducting_equipment_args = [*equipment_args, BaseVoltage(mrid=generate_id()), [Terminal(mrid=generate_id()), Terminal(mrid=generate_id())]]
@@ -46,7 +37,7 @@ def verify_conducting_equipment_constructor_args(ce: ConductingEquipment):
def test_terminals_collection():
validate_ordered(
ConductingEquipment,
- lambda mrid, sn: Terminal(mrid, sequence_number=sn),
+ lambda mrid, sn: Terminal(mrid=mrid, sequence_number=sn),
ConductingEquipment.terminals,
ConductingEquipment.num_terminals,
ConductingEquipment.get_terminal_by_mrid,
@@ -57,12 +48,15 @@ def test_terminals_collection():
lambda t: t.sequence_number
)
+
def test_default_max_terminals_is_sys_maxsize():
assert ConductingEquipment(mrid=generate_id()).max_terminals == sys.maxsize
+
class SingleTerminalCE(ConductingEquipment):
max_terminals = 1
+
def test_exceeding_max_terminals_raises_exception():
ce = SingleTerminalCE(mrid=generate_id())
ce.add_terminal(Terminal(mrid=generate_id()))
@@ -70,6 +64,7 @@ def test_exceeding_max_terminals_raises_exception():
with pytest.raises(ValueError):
ce.add_terminal(Terminal(mrid=generate_id()))
+
def test_adding_terminal_twice_wont_cause_max_terminals_to_raise_exception():
ce = SingleTerminalCE(mrid=generate_id())
t = Terminal(mrid=generate_id())
diff --git a/test/cim/iec61970/base/core/test_connectivity_node.py b/test/cim/iec61970/base/core/test_connectivity_node.py
index 4abac7087..0fc90ef38 100644
--- a/test/cim/iec61970/base/core/test_connectivity_node.py
+++ b/test/cim/iec61970/base/core/test_connectivity_node.py
@@ -3,19 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds
-from util import mrid_strategy
-from zepben.ewb import ConnectivityNode, Terminal, generate_id
-
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.fill_fields import connectivity_node_kwargs
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from cim.private_collection_validator import validate_unordered
-
-connectivity_node_kwargs = {
- **identified_object_kwargs,
- "terminals": lists(builds(Terminal, mrid=mrid_strategy), max_size=2)
-}
+from zepben.ewb import ConnectivityNode, Terminal, generate_id
connectivity_node_args = [*identified_object_args, [Terminal(mrid=generate_id())]]
@@ -27,7 +20,7 @@ def test_connectivity_node_constructor_default():
assert not list(cn.terminals)
-@given(**connectivity_node_kwargs)
+@given(**connectivity_node_kwargs())
def test_connectivity_node_constructor_kwargs(terminals, **kwargs):
cn = ConnectivityNode(terminals=terminals, **kwargs)
diff --git a/test/cim/iec61970/base/core/test_connectivity_node_container.py b/test/cim/iec61970/base/core/test_connectivity_node_container.py
index 523e01994..eba6709e3 100644
--- a/test/cim/iec61970/base/core/test_connectivity_node_container.py
+++ b/test/cim/iec61970/base/core/test_connectivity_node_container.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61970.base.core.test_power_system_resource import power_system_resource_kwargs, verify_power_system_resource_constructor_default, \
+from cim.iec61970.base.core.test_power_system_resource import verify_power_system_resource_constructor_default, \
verify_power_system_resource_constructor_kwargs, verify_power_system_resource_constructor_args, power_system_resource_args
from zepben.ewb import ConnectivityNodeContainer
-connectivity_node_container_kwargs = power_system_resource_kwargs
connectivity_node_container_args = power_system_resource_args
diff --git a/test/cim/iec61970/base/core/test_curve.py b/test/cim/iec61970/base/core/test_curve.py
index 0acd0f854..a204458ff 100644
--- a/test/cim/iec61970/base/core/test_curve.py
+++ b/test/cim/iec61970/base/core/test_curve.py
@@ -5,14 +5,12 @@
from typing import Callable
from pytest import raises
-from zepben.ewb import Curve, CurveData, generate_id
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, identified_object_args, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import identified_object_args, verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args
from cim.private_collection_validator import validate_unordered_other
+from zepben.ewb import Curve, CurveData, generate_id
-# todo curve data?
-curve_kwargs = identified_object_kwargs
curve_args = identified_object_args
@@ -65,6 +63,6 @@ def test_cant_add_duplicate_curve_data():
_validate_duplicate_error(curve, 2, lambda it: it.add_curve_data(CurveData(2, 1.2, 2.2, 3.2)))
-def _validate_duplicate_error(curve: Curve, x: float, add_data: Callable[[Curve], None]):
+def _validate_duplicate_error(curve: Curve, x: float, add_data: Callable[[Curve], Curve]):
with raises(ValueError, match=f"Unable to add datapoint to {curve}. x_value {x} is invalid, as data with same x_value already exist in this Curve."):
add_data(curve)
diff --git a/test/cim/iec61970/base/core/test_curve_data.py b/test/cim/iec61970/base/core/test_curve_data.py
index 80f7cd5ee..2ee2fdd19 100644
--- a/test/cim/iec61970/base/core/test_curve_data.py
+++ b/test/cim/iec61970/base/core/test_curve_data.py
@@ -3,18 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats, one_of, none
from pytest import raises
-from zepben.ewb import CurveData
-
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-curve_data_kwargs = {
- "x_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "y1_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "y2_value": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "y3_value": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
-}
+from cim.fill_fields import curve_data_kwargs
+from zepben.ewb import CurveData
curve_data_args = [1.1, 2.2, 3.3, 4.4]
@@ -40,7 +32,7 @@ def test_curve_data_constructor_default():
CurveData(x_value=1.0, y1_value=2.0, y2_value=3.0, y3_value=4.0)
-@given(**curve_data_kwargs)
+@given(**curve_data_kwargs())
def test_curve_data_constructor_kwargs(x_value, y1_value, y2_value, y3_value, **kwargs):
assert not kwargs
diff --git a/test/cim/iec61970/base/core/test_equipment.py b/test/cim/iec61970/base/core/test_equipment.py
index 5a197a9a4..4a82c9163 100644
--- a/test/cim/iec61970/base/core/test_equipment.py
+++ b/test/cim/iec61970/base/core/test_equipment.py
@@ -4,28 +4,13 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import datetime
-from hypothesis.strategies import booleans, lists, builds, datetimes
-
-from cim.cim_creators import sampled_equipment_container, sampled_hvlv_feeder
-from cim.iec61970.base.core.test_power_system_resource import power_system_resource_kwargs, verify_power_system_resource_constructor_default, \
+from cim.iec61970.base.core.test_power_system_resource import verify_power_system_resource_constructor_default, \
verify_power_system_resource_constructor_kwargs, verify_power_system_resource_constructor_args, power_system_resource_args
from cim.private_collection_validator import validate_unordered
-from util import mrid_strategy
from zepben.ewb import Equipment, OperationalRestriction, EquipmentContainer, generate_id, Site, LvFeeder, Substation, LvSubstation
from zepben.ewb.model.cim.iec61968.metering.usage_point import UsagePoint
from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
-equipment_kwargs = {
- **power_system_resource_kwargs,
- "in_service": booleans(),
- "normally_in_service": booleans(),
- "commissioned_date": datetimes(),
- "usage_points": lists(builds(UsagePoint, mrid=mrid_strategy), max_size=2),
- "equipment_containers": lists(sampled_equipment_container(True), max_size=2),
- "operational_restrictions": lists(builds(OperationalRestriction, mrid=mrid_strategy), max_size=2),
- "current_containers": lists(sampled_hvlv_feeder(True), max_size=2),
-}
-
equipment_args = [
*power_system_resource_args,
False,
@@ -78,7 +63,7 @@ def verify_equipment_constructor_args(eq: Equipment):
def test_usage_points_collection():
validate_unordered(
Equipment,
- lambda mrid: UsagePoint(mrid),
+ UsagePoint,
Equipment.usage_points,
Equipment.num_usage_points,
Equipment.get_usage_point,
@@ -91,7 +76,7 @@ def test_usage_points_collection():
def test_equipment_containers_collection():
validate_unordered(
Equipment,
- lambda mrid: EquipmentContainer(mrid),
+ EquipmentContainer,
Equipment.containers,
Equipment.num_containers,
Equipment.get_container,
@@ -104,7 +89,7 @@ def test_equipment_containers_collection():
def test_operational_restrictions_collection():
validate_unordered(
Equipment,
- lambda mrid: OperationalRestriction(mrid),
+ OperationalRestriction,
Equipment.operational_restrictions,
Equipment.num_operational_restrictions,
Equipment.get_operational_restriction,
@@ -117,7 +102,7 @@ def test_operational_restrictions_collection():
def test_current_containers_collection():
validate_unordered(
Equipment,
- lambda mrid: EquipmentContainer(mrid),
+ EquipmentContainer,
Equipment.current_containers,
Equipment.num_current_containers,
Equipment.get_current_container,
@@ -126,6 +111,7 @@ def test_current_containers_collection():
Equipment.clear_current_containers
)
+
def test_equipmentContainerFilters():
equipment = Equipment(mrid=generate_id())
site1 = Site(mrid=generate_id())
@@ -161,10 +147,10 @@ def test_equipmentContainerFilters():
equipment.add_current_container(lv_sub1)
equipment.add_current_container(lv_sub2)
- assert [site1, site2] == list(equipment.sites)
- assert [feeder1, feeder2] == list(equipment.normal_feeders)
- assert [feeder3, feeder4] == list(equipment.current_feeders)
- assert [lv_feeder1, lv_feeder2] == list(equipment.normal_lv_feeders)
- assert [lv_feeder3, lv_feeder4] == list(equipment.current_lv_feeders)
- assert [substation1, substation2] == list(equipment.substations)
- assert [lv_sub1, lv_sub2] == list(equipment.normal_lv_substations)
\ No newline at end of file
+ assert [site1, site2] == list(equipment.sites)
+ assert [feeder1, feeder2] == list(equipment.normal_feeders)
+ assert [feeder3, feeder4] == list(equipment.current_feeders)
+ assert [lv_feeder1, lv_feeder2] == list(equipment.normal_lv_feeders)
+ assert [lv_feeder3, lv_feeder4] == list(equipment.current_lv_feeders)
+ assert [substation1, substation2] == list(equipment.substations)
+ assert [lv_sub1, lv_sub2] == list(equipment.normal_lv_substations)
diff --git a/test/cim/iec61970/base/core/test_equipment_container.py b/test/cim/iec61970/base/core/test_equipment_container.py
index 85b7e308e..8cf80f88f 100644
--- a/test/cim/iec61970/base/core/test_equipment_container.py
+++ b/test/cim/iec61970/base/core/test_equipment_container.py
@@ -6,21 +6,13 @@
import pytest
-from hypothesis.strategies import builds, lists
-
-from cim.iec61970.base.core.test_connectivity_node_container import connectivity_node_container_kwargs, \
+from cim.iec61970.base.core.test_connectivity_node_container import \
verify_connectivity_node_container_constructor_default, verify_connectivity_node_container_constructor_kwargs, \
verify_connectivity_node_container_constructor_args, connectivity_node_container_args
from cim.private_collection_validator import validate_unordered
-from util import mrid_strategy
from zepben.ewb import EquipmentContainer, Equipment, LvFeeder, Substation, generate_id, TestNetworkBuilder, NetworkStateOperators
from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
-equipment_container_kwargs = {
- **connectivity_node_container_kwargs,
- "equipment": lists(builds(Equipment, mrid=mrid_strategy), max_size=2)
-}
-
equipment_container_args = [*connectivity_node_container_args, {"e": Equipment(mrid=generate_id())}]
@@ -126,21 +118,21 @@ def test_current_lv_feeders():
async def test_detects_edge_terminals_correctly():
network = await (
TestNetworkBuilder()
- .from_power_transformer() # tx0
- .to_busbar_section() # bbs1
- .to_breaker() # b2 edge of substation, feeder
- .to_acls() # c3
- .to_power_transformer() # tx4 edge of feeder, lv substation, tx4 lv feeder
- .to_busbar_section() # bbs5
- .to_breaker() # b6 edge of lv substation, tx4 lv feeder, b6 lv feeder
- .to_acls() # c7
- .to_energy_consumer() # ec8
+ .from_power_transformer() # tx0
+ .to_busbar_section() # bbs1
+ .to_breaker() # b2 edge of substation, feeder
+ .to_acls() # c3
+ .to_power_transformer() # tx4 edge of feeder, lv substation, tx4 lv feeder
+ .to_busbar_section() # bbs5
+ .to_breaker() # b6 edge of lv substation, tx4 lv feeder, b6 lv feeder
+ .to_acls() # c7
+ .to_energy_consumer() # ec8
.branch_from("tx0")
- .to_breaker() # b9 edge of substation
- .to_acls() # c10
- .add_feeder("b2") # fdr11
- .add_lv_feeder("tx4") # lvf12
- .add_lv_feeder("b6") # lvf13
+ .to_breaker() # b9 edge of substation
+ .to_acls() # c10
+ .add_feeder("b2") # fdr11
+ .add_lv_feeder("tx4") # lvf12
+ .add_lv_feeder("b6") # lvf13
.add_lv_substation(["tx4", "bbs5", "b6"]) # lvs14
.add_substation(["tx0", "bbs1", "b2", "b9"]) # sub15
.build()
@@ -168,29 +160,30 @@ async def test_detects_edge_terminals_correctly():
@pytest.mark.asyncio
async def test_detects_edge_terminals_for_open_switch():
network = await (TestNetworkBuilder()
- .from_power_transformer()
- .to_busbar_section()
- .to_breaker()
- .to_acls()
- .branch_from("tx0", 1)
- .to_acls()
- .to_breaker(is_normally_open=True, is_open=True)
- .to_acls()
- .branch_from("bbs1")
- .to_acls()
- .to_breaker()
- .to_acls()
- .add_substation(["tx0", "bbs1", "b2", "c4", "b5", "c7"])
- .build()
- )
+ .from_power_transformer()
+ .to_busbar_section()
+ .to_breaker()
+ .to_acls()
+ .branch_from("tx0", 1)
+ .to_acls()
+ .to_breaker(is_normally_open=True, is_open=True)
+ .to_acls()
+ .branch_from("bbs1")
+ .to_acls()
+ .to_breaker()
+ .to_acls()
+ .add_substation(["tx0", "bbs1", "b2", "c4", "b5", "c7"])
+ .build()
+ )
sub = network['sub10']
assert list(edge_equip_mrids(sub)) == ['b2', 'b5', 'c7']
assert list(edge_equip_mrids(sub, NetworkStateOperators.CURRENT)) == ['b2', 'b5', 'c7']
+
def edge_equip_mrids(ec: EquipmentContainer, state_operators: Type[NetworkStateOperators] = NetworkStateOperators.NORMAL) -> Generator[str, None, None]:
print("\n\nedge_terminals", list(ec.edge_terminals(state_operators)))
for t in ec.edge_terminals(state_operators):
if (it := t.conducting_equipment) is not None:
- yield it.mrid
\ No newline at end of file
+ yield it.mrid
diff --git a/test/cim/iec61970/base/core/test_feeder.py b/test/cim/iec61970/base/core/test_feeder.py
index 38c179c63..b682cbe39 100644
--- a/test/cim/iec61970/base/core/test_feeder.py
+++ b/test/cim/iec61970/base/core/test_feeder.py
@@ -3,25 +3,16 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, lists
from pytest import raises
-from cim.iec61970.base.core.test_equipment_container import equipment_container_kwargs, verify_equipment_container_constructor_default, \
+from cim.fill_fields import feeder_kwargs
+from cim.iec61970.base.core.test_equipment_container import verify_equipment_container_constructor_default, \
verify_equipment_container_constructor_kwargs, verify_equipment_container_constructor_args, equipment_container_args
from cim.private_collection_validator import validate_unordered
-from util import mrid_strategy
+from util import assert_or_empty
from zepben.ewb import Terminal, Substation, Equipment, LvFeeder, Switch, generate_id, LvSubstation
from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
-feeder_kwargs = {
- **equipment_container_kwargs,
- "normal_head_terminal": builds(Terminal, mrid=mrid_strategy),
- "normal_energizing_substation": builds(Substation, mrid=mrid_strategy),
- "normal_energized_lv_feeders": lists(builds(LvFeeder, mrid=mrid_strategy), max_size=2),
- "current_equipment": lists(builds(Equipment, mrid=mrid_strategy), max_size=2),
- "current_energized_lv_feeders": lists(builds(LvFeeder, mrid=mrid_strategy), max_size=2)
-}
-
feeder_args = [
*equipment_container_args,
Terminal(mrid=generate_id()),
@@ -43,22 +34,34 @@ def test_feeder_constructor_default():
assert not list(f.current_energized_lv_feeders)
-@given(**feeder_kwargs)
-def test_feeder_constructor_kwargs(normal_head_terminal, normal_energizing_substation, normal_energized_lv_feeders, current_equipment,
- current_energized_lv_feeders, **kwargs):
+@given(**feeder_kwargs())
+def test_feeder_constructor_kwargs(
+ normal_head_terminal,
+ normal_energizing_substation,
+ normal_energized_lv_feeders,
+ current_equipment,
+ current_energized_lv_feeders,
+ normal_energized_lv_substations,
+ current_energized_lv_substations,
+ **kwargs
+):
f = Feeder(normal_head_terminal=normal_head_terminal,
normal_energizing_substation=normal_energizing_substation,
normal_energized_lv_feeders=normal_energized_lv_feeders,
current_equipment=current_equipment,
current_energized_lv_feeders=current_energized_lv_feeders,
+ normal_energized_lv_substations=normal_energized_lv_substations,
+ current_energized_lv_substations=current_energized_lv_substations,
**kwargs)
verify_equipment_container_constructor_kwargs(f, **kwargs)
assert f.normal_head_terminal == normal_head_terminal
assert f.normal_energizing_substation == normal_energizing_substation
- assert list(f.normal_energized_lv_feeders) == normal_energized_lv_feeders
- assert list(f.current_equipment) == current_equipment
- assert list(f.current_energized_lv_feeders) == current_energized_lv_feeders
+ assert_or_empty(f.normal_energized_lv_feeders, normal_energized_lv_feeders)
+ assert_or_empty(f.current_equipment, current_equipment)
+ assert_or_empty(f.current_energized_lv_feeders, current_energized_lv_feeders)
+ assert_or_empty(f.normal_energized_lv_substations, normal_energized_lv_substations)
+ assert_or_empty(f.current_energized_lv_substations, current_energized_lv_substations)
def test_feeder_constructor_args():
@@ -115,6 +118,7 @@ def test_current_energized_lv_feeder_collection():
Feeder.clear_current_energized_lv_feeders
)
+
def test_normal_energized_lv_substations_collection():
validate_unordered(
Feeder,
diff --git a/test/cim/iec61970/base/core/test_geographical_region.py b/test/cim/iec61970/base/core/test_geographical_region.py
index 7d72b69c3..41c3da764 100644
--- a/test/cim/iec61970/base/core/test_geographical_region.py
+++ b/test/cim/iec61970/base/core/test_geographical_region.py
@@ -3,21 +3,14 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds
-from util import mrid_strategy
-from zepben.ewb import generate_id
-from zepben.ewb.model.cim.iec61970.base.core.sub_geographical_region import SubGeographicalRegion
-from zepben.ewb.model.cim.iec61970.base.core.geographical_region import GeographicalRegion
-
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.fill_fields import geographical_region_kwargs
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from cim.private_collection_validator import validate_unordered
-
-geographical_region_kwargs = {
- **identified_object_kwargs,
- "sub_geographical_regions": lists(builds(SubGeographicalRegion, mrid=mrid_strategy), max_size=2)
-}
+from zepben.ewb import generate_id
+from zepben.ewb.model.cim.iec61970.base.core.geographical_region import GeographicalRegion
+from zepben.ewb.model.cim.iec61970.base.core.sub_geographical_region import SubGeographicalRegion
geographical_region_args = [*identified_object_args, [SubGeographicalRegion(mrid=generate_id())]]
@@ -29,7 +22,7 @@ def test_geographical_region_constructor_default():
assert not list(gr.sub_geographical_regions)
-@given(**geographical_region_kwargs)
+@given(**geographical_region_kwargs())
def test_geographical_region_constructor_kwargs(sub_geographical_regions, **kwargs):
gr = GeographicalRegion(sub_geographical_regions=sub_geographical_regions, **kwargs)
diff --git a/test/cim/iec61970/base/core/test_identified_object.py b/test/cim/iec61970/base/core/test_identified_object.py
index 76ce1fe8b..eacab7482 100644
--- a/test/cim/iec61970/base/core/test_identified_object.py
+++ b/test/cim/iec61970/base/core/test_identified_object.py
@@ -6,9 +6,11 @@
from typing import Tuple
import pytest
-from hypothesis.strategies import uuids, text, lists, builds
+
from zepben.ewb import IdentifiedObject, generate_id
+from zepben.ewb.model.cim.iec61970.base.core.name_type import Name, NameType
from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction
+
#
# NOTE: The following should be called in a chain through the inheritance hierarchy:
# 1. verify...default verifies the constructor with no args.
@@ -17,18 +19,6 @@
# There is a lot of overlap here, but calling both maximises the constructor combinations we check and should catch any breaking changes to
# constructors.
#
-from zepben.ewb.model.cim.iec61970.base.core.name_type import Name, NameType
-
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE, create_name_type
-
-identified_object_kwargs = {
- "mrid": uuids(version=4).map(lambda x: str(x)),
- "name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "description": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "names": lists(builds(Name, text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), create_name_type()),
- max_size=2,
- unique_by=lambda it: it.name)
-}
# noinspection PyArgumentList
identified_object_args = ["test_mrid", "test_name", "test_description", [Name("1", NameType("nt1"), Junction(mrid=generate_id()))]]
@@ -49,9 +39,12 @@ def verify_identified_object_constructor_kwargs(io: IdentifiedObject, mrid, name
assert io.description == description
# Assign identified object to the names we are checking against due to no identified object requirement on Name creation
# Note: this is due to automatic two-way association introduced in the name rejig rework
- for name in names:
- name.identified_object = io
- assert list(io.names) == names
+ if names is not None:
+ for name in names:
+ name.identified_object = io
+ assert list(io.names) == names
+ else:
+ assert not list(io.names)
def verify_identified_object_constructor_args(io: IdentifiedObject):
diff --git a/test/cim/iec61970/base/core/test_name.py b/test/cim/iec61970/base/core/test_name.py
index d76f4cc59..078de2d85 100644
--- a/test/cim/iec61970/base/core/test_name.py
+++ b/test/cim/iec61970/base/core/test_name.py
@@ -4,21 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import text, builds
+from cim.fill_fields import name_kwargs
from zepben.ewb import generate_id
-from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction
from zepben.ewb.model.cim.iec61970.base.core.name import Name
from zepben.ewb.model.cim.iec61970.base.core.name_type import NameType
-
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE, sampled_equipment
-from cim.iec61970.base.core.test_name_type import name_type_kwargs
-
-name_kwargs = {
- "name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "type": builds(NameType, **name_type_kwargs),
- "identified_object": sampled_equipment(True)
-}
+from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction
# noinspection PyArgumentList
name_args = ["1", NameType("nt1"), Junction(mrid=generate_id())]
@@ -31,7 +22,7 @@
# noinspection PyShadowingBuiltins
-@given(**name_kwargs)
+@given(**name_kwargs())
def test_name_constructor_kwargs(name, type, identified_object, **kwargs):
assert not kwargs, f"found unexpected args: {kwargs}"
diff --git a/test/cim/iec61970/base/core/test_name_type.py b/test/cim/iec61970/base/core/test_name_type.py
index 9d7c0ef53..ef7340b46 100644
--- a/test/cim/iec61970/base/core/test_name_type.py
+++ b/test/cim/iec61970/base/core/test_name_type.py
@@ -5,19 +5,12 @@
from collections import Counter
from hypothesis import given
-from hypothesis.strategies import text
+from cim.fill_fields import name_type_kwargs
from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61970.base.core.name_type import NameType
from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE
-
-name_type_kwargs = {
- "name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "description": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
-}
-
# noinspection PyArgumentList
name_type_args = ["1", "2"]
@@ -31,7 +24,7 @@ def test_name_type_constructor_default():
assert not list(nt.names)
-@given(**name_type_kwargs)
+@given(**name_type_kwargs())
def test_name_type_constructor_kwargs(name, description, **kwargs):
assert not kwargs, f"found unexpected args: {kwargs}"
diff --git a/test/cim/iec61970/base/core/test_power_system_resource.py b/test/cim/iec61970/base/core/test_power_system_resource.py
index f801e877f..1b66fbed9 100644
--- a/test/cim/iec61970/base/core/test_power_system_resource.py
+++ b/test/cim/iec61970/base/core/test_power_system_resource.py
@@ -2,23 +2,12 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import builds, integers, lists
-from cim.cim_creators import sampled_wire_info, MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from cim.private_collection_validator import validate_unordered
-from util import mrid_strategy
from zepben.ewb import PowerSystemResource, Location, PowerTransformerInfo, Asset, generate_id
-power_system_resource_kwargs = {
- **identified_object_kwargs,
- "location": builds(Location, mrid=mrid_strategy),
- "asset_info": sampled_wire_info(True),
- "num_controls": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "assets": lists(builds(Asset, mrid=mrid_strategy), max_size=2)
-}
-
power_system_resource_args = [
*identified_object_args,
Location(mrid=generate_id()),
@@ -36,7 +25,7 @@ def verify_power_system_resource_constructor_default(psr: PowerSystemResource):
assert not list(psr.assets)
-def verify_power_system_resource_constructor_kwargs(psr: PowerSystemResource, location, asset_info, num_controls, assets, **kwargs):
+def verify_power_system_resource_constructor_kwargs(psr: PowerSystemResource, location, num_controls, assets, asset_info = None, **kwargs):
verify_identified_object_constructor_kwargs(psr, **kwargs)
assert psr.location is location
assert psr.asset_info is asset_info
@@ -57,7 +46,7 @@ def verify_power_system_resource_constructor_args(psr: PowerSystemResource):
def test_assets_collection():
validate_unordered(
PowerSystemResource,
- lambda mrid: Asset(mrid),
+ Asset,
PowerSystemResource.assets,
PowerSystemResource.num_assets,
PowerSystemResource.get_asset,
diff --git a/test/cim/iec61970/base/core/test_sub_geographical_region.py b/test/cim/iec61970/base/core/test_sub_geographical_region.py
index 5eb616938..6b25eb6b1 100644
--- a/test/cim/iec61970/base/core/test_sub_geographical_region.py
+++ b/test/cim/iec61970/base/core/test_sub_geographical_region.py
@@ -3,22 +3,14 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds
-from util import mrid_strategy
-from zepben.ewb import Substation, generate_id
-from zepben.ewb.model.cim.iec61970.base.core.sub_geographical_region import SubGeographicalRegion
-from zepben.ewb.model.cim.iec61970.base.core.geographical_region import GeographicalRegion
-
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.fill_fields import sub_geographical_region_kwargs
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from cim.private_collection_validator import validate_unordered
-
-sub_geographical_region_kwargs = {
- **identified_object_kwargs,
- "geographical_region": builds(GeographicalRegion, mrid=mrid_strategy),
- "substations": lists(builds(Substation, mrid=mrid_strategy), max_size=2)
-}
+from zepben.ewb import Substation, generate_id
+from zepben.ewb.model.cim.iec61970.base.core.geographical_region import GeographicalRegion
+from zepben.ewb.model.cim.iec61970.base.core.sub_geographical_region import SubGeographicalRegion
sub_geographical_region_args = [*identified_object_args, GeographicalRegion(mrid=generate_id()), [Substation(mrid=generate_id())]]
@@ -30,7 +22,7 @@ def test_sub_geographical_region_constructor_default():
assert not list(sgr.substations)
-@given(**sub_geographical_region_kwargs)
+@given(**sub_geographical_region_kwargs())
def test_sub_geographical_region_constructor_kwargs(geographical_region, substations, **kwargs):
sgr = SubGeographicalRegion(geographical_region=geographical_region,
substations=substations,
diff --git a/test/cim/iec61970/base/core/test_substation.py b/test/cim/iec61970/base/core/test_substation.py
index b9cba8300..60013aba6 100644
--- a/test/cim/iec61970/base/core/test_substation.py
+++ b/test/cim/iec61970/base/core/test_substation.py
@@ -3,23 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds
-from cim.iec61970.base.core.test_equipment_container import equipment_container_kwargs, verify_equipment_container_constructor_default, \
+from cim.fill_fields import substation_kwargs
+from cim.iec61970.base.core.test_equipment_container import verify_equipment_container_constructor_default, \
verify_equipment_container_constructor_kwargs, verify_equipment_container_constructor_args, equipment_container_args
from cim.private_collection_validator import validate_unordered
-from util import mrid_strategy
from zepben.ewb import Substation, Feeder, Loop, Circuit, generate_id
-from zepben.ewb.model.cim.iec61970.base.core.sub_geographical_region import SubGeographicalRegion
-
-substation_kwargs = {
- **equipment_container_kwargs,
- "sub_geographical_region": builds(SubGeographicalRegion, mrid=mrid_strategy),
- "normal_energized_feeders": lists(builds(Feeder, mrid=mrid_strategy), max_size=2),
- "loops": lists(builds(Loop, mrid=mrid_strategy), max_size=2),
- "energized_loops": lists(builds(Loop, mrid=mrid_strategy), max_size=2),
- "circuits": lists(builds(Circuit, mrid=mrid_strategy), max_size=2)
-}
substation_args = [
*equipment_container_args,
@@ -42,7 +31,7 @@ def test_substation_constructor_default():
assert not list(cn.circuits)
-@given(**substation_kwargs)
+@given(**substation_kwargs())
def test_substation_constructor_kwargs(sub_geographical_region, normal_energized_feeders, loops, energized_loops, circuits, **kwargs):
cn = Substation(sub_geographical_region=sub_geographical_region,
normal_energized_feeders=normal_energized_feeders,
diff --git a/test/cim/iec61970/base/core/test_terminal.py b/test/cim/iec61970/base/core/test_terminal.py
index 3ea4cb346..d9ec4c18d 100644
--- a/test/cim/iec61970/base/core/test_terminal.py
+++ b/test/cim/iec61970/base/core/test_terminal.py
@@ -3,25 +3,13 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, sampled_from, integers
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61970.base.core.test_ac_dc_terminal import ac_dc_terminal_kwargs, verify_ac_dc_terminal_constructor_default, \
+from cim.fill_fields import terminal_kwargs
+from cim.iec61970.base.core.test_ac_dc_terminal import verify_ac_dc_terminal_constructor_default, \
verify_ac_dc_terminal_constructor_kwargs, verify_ac_dc_terminal_constructor_args, ac_dc_terminal_args
-from util import mrid_strategy
from zepben.ewb import Terminal, ConnectivityNode, ConductingEquipment, PhaseCode, generate_id, NetworkService, Junction
from zepben.ewb.services.network.tracing.feeder.feeder_direction import FeederDirection
-terminal_kwargs = {
- **ac_dc_terminal_kwargs,
- "conducting_equipment": builds(ConductingEquipment, mrid=mrid_strategy),
- "phases": sampled_from(PhaseCode),
- "sequence_number": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "normal_feeder_direction": sampled_from(FeederDirection),
- "current_feeder_direction": sampled_from(FeederDirection),
- "connectivity_node": builds(ConnectivityNode, mrid=mrid_strategy)
-}
-
# noinspection PyArgumentList
terminal_args = [
*ac_dc_terminal_args,
@@ -48,9 +36,16 @@ def test_terminal_constructor_default():
assert not t.connectivity_node
-@given(**terminal_kwargs)
-def test_terminal_constructor_kwargs(conducting_equipment, phases, sequence_number, normal_feeder_direction, current_feeder_direction,
- connectivity_node, **kwargs):
+@given(**terminal_kwargs())
+def test_terminal_constructor_kwargs(
+ conducting_equipment,
+ phases,
+ sequence_number,
+ normal_feeder_direction,
+ current_feeder_direction,
+ connectivity_node,
+ **kwargs
+):
t = Terminal(conducting_equipment=conducting_equipment,
phases=phases,
sequence_number=sequence_number,
diff --git a/test/cim/iec61970/base/diagramlayout/test_diagram.py b/test/cim/iec61970/base/diagramlayout/test_diagram.py
index 6d87e87f5..d0371bfaf 100644
--- a/test/cim/iec61970/base/diagramlayout/test_diagram.py
+++ b/test/cim/iec61970/base/diagramlayout/test_diagram.py
@@ -3,23 +3,15 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds, sampled_from
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.fill_fields import diagram_kwargs
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from cim.private_collection_validator import validate_unordered
-from util import mrid_strategy
from zepben.ewb import DiagramStyle, OrientationKind, generate_id
from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram import Diagram
from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object import DiagramObject
-diagram_kwargs = {
- **identified_object_kwargs,
- "diagram_style": sampled_from(DiagramStyle),
- "orientation_kind": sampled_from(OrientationKind),
- "diagram_objects": lists(builds(DiagramObject, mrid=mrid_strategy))
-}
-
# noinspection PyArgumentList
diagram_args = [*identified_object_args, DiagramStyle.GEOGRAPHIC, OrientationKind.NEGATIVE, {"do": DiagramObject(mrid=generate_id())}]
@@ -33,7 +25,7 @@ def test_diagram_constructor_default():
assert not list(d.diagram_objects)
-@given(**diagram_kwargs)
+@given(**diagram_kwargs())
def test_diagram_constructor_kwargs(diagram_style, orientation_kind, diagram_objects, **kwargs):
d = Diagram(diagram_style=diagram_style,
orientation_kind=orientation_kind,
diff --git a/test/cim/iec61970/base/diagramlayout/test_diagram_object.py b/test/cim/iec61970/base/diagramlayout/test_diagram_object.py
index ec7c81a62..6adb970b9 100644
--- a/test/cim/iec61970/base/diagramlayout/test_diagram_object.py
+++ b/test/cim/iec61970/base/diagramlayout/test_diagram_object.py
@@ -3,27 +3,16 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import lists, builds, text, floats
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE, create_diagram_object_point
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.fill_fields import diagram_object_kwargs
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from cim.private_collection_validator import validate_ordered_other
-from util import mrid_strategy
from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram import Diagram
from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object import DiagramObject
from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object_point import DiagramObjectPoint
-diagram_object_kwargs = {
- **identified_object_kwargs,
- "diagram": builds(Diagram, mrid=mrid_strategy),
- "identified_object_mrid": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "style": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "rotation": floats(min_value=0, max_value=360),
- "diagram_object_points": lists(create_diagram_object_point(), max_size=2)
-}
-
# noinspection PyArgumentList
diagram_object_args = [*identified_object_args, Diagram(mrid=generate_id()), "a", "CB", 1.1, [DiagramObjectPoint(1.1, 2.2)]]
@@ -39,7 +28,7 @@ def test_diagram_object_constructor_default():
assert not list(do.points)
-@given(**diagram_object_kwargs)
+@given(**diagram_object_kwargs())
def test_diagram_object_constructor_kwargs(diagram, identified_object_mrid, style, rotation, diagram_object_points, **kwargs):
do = DiagramObject(diagram=diagram,
identified_object_mrid=identified_object_mrid,
diff --git a/test/cim/iec61970/base/diagramlayout/test_diagram_object_point.py b/test/cim/iec61970/base/diagramlayout/test_diagram_object_point.py
index 4c2f83f12..a86543637 100644
--- a/test/cim/iec61970/base/diagramlayout/test_diagram_object_point.py
+++ b/test/cim/iec61970/base/diagramlayout/test_diagram_object_point.py
@@ -3,16 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats
from pytest import raises
-from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object_point import DiagramObjectPoint
-
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-diagram_object_point_kwargs = {
- "x_position": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "y_position": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
+from cim.fill_fields import diagram_object_point_kwargs
+from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object_point import DiagramObjectPoint
diagram_object_point_args = [1.1, 2.2]
@@ -32,7 +26,7 @@ def test_diagram_object_point_constructor_default():
DiagramObjectPoint(y_position=2.0)
-@given(**diagram_object_point_kwargs)
+@given(**diagram_object_point_kwargs())
def test_diagram_object_point_constructor_kwargs(x_position, y_position, **kwargs):
assert not kwargs
diff --git a/test/cim/iec61970/base/domain/test_date_time_interval.py b/test/cim/iec61970/base/domain/test_date_time_interval.py
index f368dbdc5..01a6c9aac 100644
--- a/test/cim/iec61970/base/domain/test_date_time_interval.py
+++ b/test/cim/iec61970/base/domain/test_date_time_interval.py
@@ -22,7 +22,8 @@
def test_datetime_interval_constructor_default():
- with pytest.raises(ValueError):
+ with pytest.raises(ValueError, match="You must provide a start or end time."):
+ # noinspection PyUnusedLocal
dti = DateTimeInterval()
a = DateTimeInterval(start=datetime(2020, 1, 1))
@@ -42,3 +43,7 @@ def test_datetime_interval_constructor_args():
assert dti.start == datetime_interval_args[-2]
assert dti.end == datetime_interval_args[-1]
+
+def test_must_have_a_valid_start_or_end():
+ with pytest.raises(ValueError, match="The start time must be before the end time."):
+ DateTimeInterval(start=datetime(2020, 12, 1), end=datetime(2020, 1, 1))
diff --git a/test/cim/iec61970/base/equivalents/test_equivalent_branch.py b/test/cim/iec61970/base/equivalents/test_equivalent_branch.py
index 371dc0135..2ebc60c1f 100644
--- a/test/cim/iec61970/base/equivalents/test_equivalent_branch.py
+++ b/test/cim/iec61970/base/equivalents/test_equivalent_branch.py
@@ -3,32 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats
-from zepben.ewb import EquivalentBranch, generate_id
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-from cim.iec61970.base.equivalents.test_equivalent_equipment import equivalent_equipment_kwargs, verify_equivalent_equipment_constructor_default, \
+from cim.fill_fields import equivalent_branch_kwargs
+from cim.iec61970.base.equivalents.test_equivalent_equipment import verify_equivalent_equipment_constructor_default, \
verify_equivalent_equipment_constructor_kwargs, verify_equivalent_equipment_constructor_args, equivalent_equipment_args
-
-equivalent_branch_kwargs = {
- **equivalent_equipment_kwargs,
- "negative_r12": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "negative_r21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "negative_x12": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "negative_x21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "positive_r12": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "positive_r21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "positive_x12": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "positive_x21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "r21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "zero_r12": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "zero_r21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "zero_x12": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "zero_x21": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
-}
+from zepben.ewb import EquivalentBranch, generate_id
equivalent_branch_args = [*equivalent_equipment_args, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.01, 11.11, 12.21, 13.31, 14.41, 15.51, 16.61]
@@ -55,7 +34,7 @@ def test_equivalent_branch_constructor_default():
assert not t.zero_x21
-@given(**equivalent_branch_kwargs)
+@given(**equivalent_branch_kwargs())
def test_equivalent_branch_constructor_kwargs(negative_r12, negative_r21, negative_x12, negative_x21, positive_r12, positive_r21, positive_x12, positive_x21, r,
r21, x,
x21, zero_r12, zero_r21, zero_x12, zero_x21, **kwargs):
diff --git a/test/cim/iec61970/base/equivalents/test_equivalent_equipment.py b/test/cim/iec61970/base/equivalents/test_equivalent_equipment.py
index 013467f31..f2f8dfd56 100644
--- a/test/cim/iec61970/base/equivalents/test_equivalent_equipment.py
+++ b/test/cim/iec61970/base/equivalents/test_equivalent_equipment.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61970.base.core.test_conducting_equipment import conducting_equipment_kwargs, verify_conducting_equipment_constructor_default, \
+from cim.iec61970.base.core.test_conducting_equipment import verify_conducting_equipment_constructor_default, \
verify_conducting_equipment_constructor_kwargs, verify_conducting_equipment_constructor_args, conducting_equipment_args
from zepben.ewb import EquivalentEquipment
-equivalent_equipment_kwargs = conducting_equipment_kwargs
equivalent_equipment_args = conducting_equipment_args
diff --git a/test/cim/iec61970/base/meas/test_accumulator.py b/test/cim/iec61970/base/meas/test_accumulator.py
index 7e8dc0631..9939bcda5 100644
--- a/test/cim/iec61970/base/meas/test_accumulator.py
+++ b/test/cim/iec61970/base/meas/test_accumulator.py
@@ -4,12 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from cim.iec61970.base.meas.test_measurement import measurement_kwargs, verify_measurement_constructor_default, \
+from cim.fill_fields import accumulator_kwargs
+from cim.iec61970.base.meas.test_measurement import verify_measurement_constructor_default, \
verify_measurement_constructor_kwargs, verify_measurement_constructor_args, measurement_args
from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61970.base.meas.accumulator import Accumulator
-accumulator_kwargs = measurement_kwargs
accumulator_args = measurement_args
@@ -17,7 +17,7 @@ def test_accumulator_constructor_default():
verify_measurement_constructor_default(Accumulator(mrid=generate_id()))
-@given(**accumulator_kwargs)
+@given(**accumulator_kwargs())
def test_accumulator_constructor_kwargs(**kwargs):
verify_measurement_constructor_kwargs(Accumulator(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/meas/test_accumulator_value.py b/test/cim/iec61970/base/meas/test_accumulator_value.py
index c5fa8fca2..c7b31a0a2 100644
--- a/test/cim/iec61970/base/meas/test_accumulator_value.py
+++ b/test/cim/iec61970/base/meas/test_accumulator_value.py
@@ -3,18 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import integers, text
-from zepben.ewb.model.cim.iec61970.base.meas.accumulator_value import AccumulatorValue
-from cim.cim_creators import MAX_32_BIT_INTEGER, ALPHANUM, TEXT_MAX_SIZE
-from cim.iec61970.base.meas.test_measurement_value import measurement_value_kwargs, verify_measurement_value_constructor_default, \
+from cim.fill_fields import accumulator_value_kwargs
+from cim.iec61970.base.meas.test_measurement_value import verify_measurement_value_constructor_default, \
verify_measurement_value_constructor_kwargs, verify_measurement_value_constructor_args, measurement_value_args
-
-accumulator_value_kwargs = {
- **measurement_value_kwargs,
- "value": integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- "accumulator_mrid": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
-}
+from zepben.ewb.model.cim.iec61970.base.meas.accumulator_value import AccumulatorValue
accumulator_value_args = [*measurement_value_args, 1, "a"]
@@ -27,7 +20,7 @@ def test_accumulator_value_constructor_default():
assert not av.accumulator_mrid
-@given(**accumulator_value_kwargs)
+@given(**accumulator_value_kwargs())
def test_accumulator_value_constructor_kwargs(value, accumulator_mrid, **kwargs):
# noinspection PyArgumentList
av = AccumulatorValue(
diff --git a/test/cim/iec61970/base/meas/test_analog.py b/test/cim/iec61970/base/meas/test_analog.py
index b45620ac4..40f4ed116 100644
--- a/test/cim/iec61970/base/meas/test_analog.py
+++ b/test/cim/iec61970/base/meas/test_analog.py
@@ -4,12 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from cim.iec61970.base.meas.test_measurement import measurement_kwargs, verify_measurement_constructor_default, \
+from cim.fill_fields import analog_kwargs
+from cim.iec61970.base.meas.test_measurement import verify_measurement_constructor_default, \
verify_measurement_constructor_kwargs, verify_measurement_constructor_args, measurement_args
from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61970.base.meas.analog import Analog
-analog_kwargs = measurement_kwargs
analog_args = measurement_args
@@ -20,9 +20,15 @@ def test_analog_constructor_default():
assert analog.positive_flow_in is None
-@given(**analog_kwargs)
-def test_analog_constructor_kwargs(**kwargs):
- verify_measurement_constructor_kwargs(Analog(**kwargs), **kwargs)
+@given(**analog_kwargs())
+def test_analog_constructor_kwargs(positive_flow_in, **kwargs):
+ ana = Analog(
+ positive_flow_in=positive_flow_in,
+ **kwargs
+ )
+
+ verify_measurement_constructor_kwargs(ana, **kwargs)
+ assert ana.positive_flow_in == positive_flow_in
def test_analog_constructor_args():
diff --git a/test/cim/iec61970/base/meas/test_analog_value.py b/test/cim/iec61970/base/meas/test_analog_value.py
index fcf8366db..1425af77c 100644
--- a/test/cim/iec61970/base/meas/test_analog_value.py
+++ b/test/cim/iec61970/base/meas/test_analog_value.py
@@ -3,18 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import text, floats
-from zepben.ewb.model.cim.iec61970.base.meas.analog_value import AnalogValue
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE, FLOAT_MIN, FLOAT_MAX
-from cim.iec61970.base.meas.test_measurement_value import measurement_value_kwargs, verify_measurement_value_constructor_default, \
+from cim.fill_fields import analog_value_kwargs
+from cim.iec61970.base.meas.test_measurement_value import verify_measurement_value_constructor_default, \
verify_measurement_value_constructor_kwargs, verify_measurement_value_constructor_args, measurement_value_args
-
-analog_value_kwargs = {
- **measurement_value_kwargs,
- "value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "analog_mrid": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
-}
+from zepben.ewb.model.cim.iec61970.base.meas.analog_value import AnalogValue
analog_value_args = [*measurement_value_args, 1.1, "a"]
@@ -27,7 +20,7 @@ def test_analog_value_constructor_default():
assert not av.analog_mrid
-@given(**analog_value_kwargs)
+@given(**analog_value_kwargs())
def test_analog_value_constructor_kwargs(value, analog_mrid, **kwargs):
# noinspection PyArgumentList
av = AnalogValue(
diff --git a/test/cim/iec61970/base/meas/test_control.py b/test/cim/iec61970/base/meas/test_control.py
index b21276994..7f163e0df 100644
--- a/test/cim/iec61970/base/meas/test_control.py
+++ b/test/cim/iec61970/base/meas/test_control.py
@@ -3,20 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, text
-from util import mrid_strategy
-from zepben.ewb import Control, RemoteControl, generate_id
-
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE
-from cim.iec61970.base.meas.test_io_point import io_point_kwargs, verify_io_point_constructor_default, \
+from cim.fill_fields import control_kwargs
+from cim.iec61970.base.meas.test_io_point import verify_io_point_constructor_default, \
verify_io_point_constructor_kwargs, verify_io_point_constructor_args, io_point_args
-
-control_kwargs = {
- **io_point_kwargs,
- "power_system_resource_mrid": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "remote_control": builds(RemoteControl, mrid=mrid_strategy)
-}
+from zepben.ewb import Control, RemoteControl, generate_id
control_args = [*io_point_args, "a", RemoteControl(mrid=generate_id())]
@@ -29,7 +20,7 @@ def test_control_constructor_default():
assert not c.remote_control
-@given(**control_kwargs)
+@given(**control_kwargs())
def test_control_constructor_kwargs(power_system_resource_mrid, remote_control, **kwargs):
c = Control(power_system_resource_mrid=power_system_resource_mrid, remote_control=remote_control, **kwargs)
diff --git a/test/cim/iec61970/base/meas/test_discrete.py b/test/cim/iec61970/base/meas/test_discrete.py
index bf7a2f0a3..8f9150087 100644
--- a/test/cim/iec61970/base/meas/test_discrete.py
+++ b/test/cim/iec61970/base/meas/test_discrete.py
@@ -4,12 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from cim.iec61970.base.meas.test_measurement import measurement_kwargs, verify_measurement_constructor_default, \
+from cim.fill_fields import discrete_kwargs
+from cim.iec61970.base.meas.test_measurement import verify_measurement_constructor_default, \
verify_measurement_constructor_kwargs, verify_measurement_constructor_args, measurement_args
from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61970.base.meas.discrete import Discrete
-discrete_kwargs = measurement_kwargs
discrete_args = measurement_args
@@ -17,7 +17,7 @@ def test_discrete_constructor_default():
verify_measurement_constructor_default(Discrete(mrid=generate_id()))
-@given(**discrete_kwargs)
+@given(**discrete_kwargs())
def test_discrete_constructor_kwargs(**kwargs):
verify_measurement_constructor_kwargs(Discrete(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/meas/test_discrete_value.py b/test/cim/iec61970/base/meas/test_discrete_value.py
index 405b65270..94491ed39 100644
--- a/test/cim/iec61970/base/meas/test_discrete_value.py
+++ b/test/cim/iec61970/base/meas/test_discrete_value.py
@@ -3,18 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import integers, text
-from zepben.ewb.model.cim.iec61970.base.meas.discrete_value import DiscreteValue
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, ALPHANUM, TEXT_MAX_SIZE
-from cim.iec61970.base.meas.test_measurement_value import measurement_value_kwargs, verify_measurement_value_constructor_default, \
+from cim.fill_fields import discrete_value_kwargs
+from cim.iec61970.base.meas.test_measurement_value import verify_measurement_value_constructor_default, \
verify_measurement_value_constructor_kwargs, verify_measurement_value_constructor_args, measurement_value_args
-
-discrete_value_kwargs = {
- **measurement_value_kwargs,
- "value": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "discrete_mrid": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
-}
+from zepben.ewb.model.cim.iec61970.base.meas.discrete_value import DiscreteValue
discrete_value_args = [*measurement_value_args, 1, "a"]
@@ -27,7 +20,7 @@ def test_discrete_value_constructor_default():
assert not dv.discrete_mrid
-@given(**discrete_value_kwargs)
+@given(**discrete_value_kwargs())
def test_discrete_value_constructor_kwargs(value, discrete_mrid, **kwargs):
# noinspection PyArgumentList
dv = DiscreteValue(
diff --git a/test/cim/iec61970/base/meas/test_io_point.py b/test/cim/iec61970/base/meas/test_io_point.py
index b3cc5a599..4f5145c6d 100644
--- a/test/cim/iec61970/base/meas/test_io_point.py
+++ b/test/cim/iec61970/base/meas/test_io_point.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from zepben.ewb import IoPoint
-io_point_kwargs = identified_object_kwargs
io_point_args = identified_object_args
diff --git a/test/cim/iec61970/base/meas/test_measurement.py b/test/cim/iec61970/base/meas/test_measurement.py
index 58753216b..c68cb9090 100644
--- a/test/cim/iec61970/base/meas/test_measurement.py
+++ b/test/cim/iec61970/base/meas/test_measurement.py
@@ -3,23 +3,9 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import text, builds, sampled_from
-
-from util import mrid_strategy
-from zepben.ewb import Measurement, RemoteSource, PhaseCode, UnitSymbol, generate_id
-
-from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
-
-measurement_kwargs = {
- **identified_object_kwargs,
- "power_system_resource_mrid": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "remote_source": builds(RemoteSource, mrid=mrid_strategy),
- "terminal_mrid": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "phases": sampled_from(PhaseCode),
- "unit_symbol": sampled_from(UnitSymbol)
-}
+from zepben.ewb import Measurement, RemoteSource, PhaseCode, UnitSymbol, generate_id
measurement_args = [*identified_object_args, "a", RemoteSource(mrid=generate_id()), "b", PhaseCode.XYN, UnitSymbol.A]
diff --git a/test/cim/iec61970/base/meas/test_measurement_value.py b/test/cim/iec61970/base/meas/test_measurement_value.py
index 0b4d33daf..97249127f 100644
--- a/test/cim/iec61970/base/meas/test_measurement_value.py
+++ b/test/cim/iec61970/base/meas/test_measurement_value.py
@@ -4,10 +4,8 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from datetime import datetime
-from hypothesis.strategies import datetimes
from zepben.ewb.model.cim.iec61970.base.meas.measurement_value import MeasurementValue
-measurement_value_kwargs = {"time_stamp": datetimes()}
measurement_value_args = [datetime(2021, 1, 1)]
diff --git a/test/cim/iec61970/base/protection/test_current_relay.py b/test/cim/iec61970/base/protection/test_current_relay.py
index 734daed21..71877323b 100644
--- a/test/cim/iec61970/base/protection/test_current_relay.py
+++ b/test/cim/iec61970/base/protection/test_current_relay.py
@@ -3,19 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats, booleans
-from zepben.ewb import CurrentRelay, ProtectionKind, generate_id
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-from cim.iec61970.base.protection.test_protection_relay_function import protection_relay_function_kwargs, protection_relay_function_args, \
+from cim.fill_fields import current_relay_kwargs
+from cim.iec61970.base.protection.test_protection_relay_function import protection_relay_function_args, \
verify_protection_relay_function_constructor_default, verify_protection_relay_function_constructor_kwargs, verify_protection_relay_function_constructor_args
-
-current_relay_kwargs = {
- **protection_relay_function_kwargs,
- "current_limit_1": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "inverse_time_flag": booleans(),
- "time_delay_1": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
+from zepben.ewb import CurrentRelay, ProtectionKind, generate_id
current_relay_args = [*protection_relay_function_args, 1.1, True, 2.2]
@@ -29,7 +21,7 @@ def test_current_relay_constructor_default():
assert cr.time_delay_1 is None
-@given(**current_relay_kwargs)
+@given(**current_relay_kwargs())
def test_current_relay_constructor_kwargs(current_limit_1, inverse_time_flag, time_delay_1, **kwargs):
cr = CurrentRelay(
current_limit_1=current_limit_1,
diff --git a/test/cim/iec61970/base/protection/test_distance_relay.py b/test/cim/iec61970/base/protection/test_distance_relay.py
index e03a69cd2..f215d90f5 100644
--- a/test/cim/iec61970/base/protection/test_distance_relay.py
+++ b/test/cim/iec61970/base/protection/test_distance_relay.py
@@ -3,25 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats
-from zepben.ewb import DistanceRelay, generate_id
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-from cim.iec61970.base.protection.test_protection_relay_function import protection_relay_function_kwargs, protection_relay_function_args, \
+from cim.fill_fields import distance_relay_kwargs
+from cim.iec61970.base.protection.test_protection_relay_function import protection_relay_function_args, \
verify_protection_relay_function_constructor_default, verify_protection_relay_function_constructor_kwargs, verify_protection_relay_function_constructor_args
-
-distance_relay_kwargs = {
- **protection_relay_function_kwargs,
- "backward_blind": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "backward_reach": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "backward_reactance": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "forward_blind": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "forward_reach": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "forward_reactance": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "operation_phase_angle1": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "operation_phase_angle2": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "operation_phase_angle3": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
+from zepben.ewb import DistanceRelay, generate_id
distance_relay_args = [*protection_relay_function_args, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9]
@@ -41,7 +27,7 @@ def test_distance_relay_constructor_default():
assert dr.operation_phase_angle3 is None
-@given(**distance_relay_kwargs)
+@given(**distance_relay_kwargs())
def test_distance_relay_constructor_kwargs(
backward_blind,
backward_reach,
diff --git a/test/cim/iec61970/base/protection/test_protection_relay_function.py b/test/cim/iec61970/base/protection/test_protection_relay_function.py
index 20a22bbc8..6d3069344 100644
--- a/test/cim/iec61970/base/protection/test_protection_relay_function.py
+++ b/test/cim/iec61970/base/protection/test_protection_relay_function.py
@@ -2,33 +2,13 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import floats, sampled_from, booleans, lists, builds, text
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX, ALPHANUM, TEXT_MAX_SIZE, boolean_or_none
-from cim.iec61970.base.core.test_power_system_resource import power_system_resource_kwargs, verify_power_system_resource_constructor_default, \
+from cim.iec61970.base.core.test_power_system_resource import verify_power_system_resource_constructor_default, \
verify_power_system_resource_constructor_kwargs, verify_power_system_resource_constructor_args, power_system_resource_args
from cim.private_collection_validator import validate_unordered, validate_ordered_other
-from cim.property_validator import validate_property_accessor
-from util import mrid_strategy
-from zepben.ewb import ProtectionKind, PowerDirectionKind, ProtectedSwitch, ProtectionRelayFunction, RelayInfo, ProtectionRelayScheme, RelaySetting, Sensor, \
+from zepben.ewb import ProtectionKind, PowerDirectionKind, ProtectedSwitch, ProtectionRelayFunction, ProtectionRelayScheme, RelaySetting, Sensor, \
UnitSymbol, unit_symbol_from_id, generate_id
-protection_relay_function_kwargs = {
- **power_system_resource_kwargs,
- "model": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "reclosing": boolean_or_none(),
- "relay_delay_time": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "protection_kind": sampled_from(ProtectionKind),
- "directable": booleans(),
- "power_direction": sampled_from(PowerDirectionKind),
- "sensors": lists(builds(Sensor, mrid=mrid_strategy), max_size=2),
- "protected_switches": lists(builds(ProtectedSwitch, mrid=mrid_strategy), max_size=2),
- "schemes": lists(builds(ProtectionRelayScheme, mrid=mrid_strategy), max_size=2),
- "time_limits": lists(floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), min_size=4, max_size=4),
- "thresholds": lists(builds(RelaySetting, unit_symbol=sampled_from(UnitSymbol), value=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- name=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)), min_size=4, max_size=4),
-}
-
protection_relay_function_args = [
*power_system_resource_args,
"model_string",
@@ -108,7 +88,7 @@ def verify_protection_relay_function_constructor_args(prf: ProtectionRelayFuncti
def test_sensors_collection():
validate_unordered(
ProtectionRelayFunction,
- lambda mrid: Sensor(mrid),
+ Sensor,
ProtectionRelayFunction.sensors,
ProtectionRelayFunction.num_sensors,
ProtectionRelayFunction.get_sensor,
@@ -121,7 +101,7 @@ def test_sensors_collection():
def test_protected_switches_collection():
validate_unordered(
ProtectionRelayFunction,
- lambda mrid: ProtectedSwitch(mrid),
+ ProtectedSwitch,
ProtectionRelayFunction.protected_switches,
ProtectionRelayFunction.num_protected_switches,
ProtectionRelayFunction.get_protected_switch,
@@ -134,7 +114,7 @@ def test_protected_switches_collection():
def test_scheme_collection():
validate_unordered(
ProtectionRelayFunction,
- lambda mrid: ProtectionRelayScheme(mrid),
+ ProtectionRelayScheme,
ProtectionRelayFunction.schemes,
ProtectionRelayFunction.num_schemes,
ProtectionRelayFunction.get_scheme,
@@ -174,7 +154,3 @@ def test_thresholds_collection():
ProtectionRelayFunction.remove_threshold_at,
ProtectionRelayFunction.clear_thresholds
)
-
-
-def test_relay_info_accessor():
- validate_property_accessor(ProtectionRelayFunction, RelayInfo, ProtectionRelayFunction.relay_info)
diff --git a/test/cim/iec61970/base/protection/test_protection_relay_scheme.py b/test/cim/iec61970/base/protection/test_protection_relay_scheme.py
index 32f8056fe..8f1a964f2 100644
--- a/test/cim/iec61970/base/protection/test_protection_relay_scheme.py
+++ b/test/cim/iec61970/base/protection/test_protection_relay_scheme.py
@@ -3,20 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, lists
-from util import mrid_strategy
-from zepben.ewb import ProtectionRelaySystem, ProtectionRelayFunction, ProtectionRelayScheme, generate_id
-
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, identified_object_args, verify_identified_object_constructor_default, \
+from cim.fill_fields import protection_relay_scheme_kwargs
+from cim.iec61970.base.core.test_identified_object import identified_object_args, verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args
from cim.private_collection_validator import validate_unordered
-
-protection_relay_scheme_kwargs = {
- **identified_object_kwargs,
- "system": builds(ProtectionRelaySystem, mrid=mrid_strategy),
- "functions": lists(builds(ProtectionRelayFunction, mrid=mrid_strategy))
-}
+from zepben.ewb import ProtectionRelaySystem, ProtectionRelayFunction, ProtectionRelayScheme, generate_id
protection_relay_scheme_args = [
*identified_object_args,
@@ -33,7 +25,7 @@ def test_protection_relay_scheme_constructor_default():
assert len(list(prs.functions)) == 0
-@given(**protection_relay_scheme_kwargs)
+@given(**protection_relay_scheme_kwargs())
def test_protection_relay_scheme_constructor_kwargs(system, functions, **kwargs):
prs = ProtectionRelayScheme(
system=system,
diff --git a/test/cim/iec61970/base/protection/test_protection_relay_system.py b/test/cim/iec61970/base/protection/test_protection_relay_system.py
index a94d92f97..f7e2071ef 100644
--- a/test/cim/iec61970/base/protection/test_protection_relay_system.py
+++ b/test/cim/iec61970/base/protection/test_protection_relay_system.py
@@ -4,20 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, lists, sampled_from
-from util import mrid_strategy
-from zepben.ewb import ProtectionRelaySystem, ProtectionKind, ProtectionRelayScheme, generate_id
-
-from cim.iec61970.base.core.test_equipment import equipment_kwargs, equipment_args, verify_equipment_constructor_default, \
+from cim.fill_fields import protection_relay_system_kwargs
+from cim.iec61970.base.core.test_equipment import equipment_args, verify_equipment_constructor_default, \
verify_equipment_constructor_kwargs, verify_equipment_constructor_args
from cim.private_collection_validator import validate_unordered
-
-protection_relay_system_kwargs = {
- **equipment_kwargs,
- "protection_kind": sampled_from(ProtectionKind),
- "schemes": lists(builds(ProtectionRelayScheme, mrid=mrid_strategy))
-}
+from zepben.ewb import ProtectionRelaySystem, ProtectionKind, ProtectionRelayScheme, generate_id
protection_relay_system_args = [
*equipment_args,
@@ -34,7 +26,7 @@ def test_protection_relay_system_constructor_default():
assert len(list(prs.schemes)) == 0
-@given(**protection_relay_system_kwargs)
+@given(**protection_relay_system_kwargs())
def test_protection_relay_system_constructor_kwargs(protection_kind, schemes, **kwargs):
prs = ProtectionRelaySystem(
protection_kind=protection_kind,
diff --git a/test/cim/iec61970/base/protection/test_voltage_relay.py b/test/cim/iec61970/base/protection/test_voltage_relay.py
index fc787df2f..65a7040f9 100644
--- a/test/cim/iec61970/base/protection/test_voltage_relay.py
+++ b/test/cim/iec61970/base/protection/test_voltage_relay.py
@@ -4,14 +4,11 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from cim.iec61970.base.protection.test_protection_relay_function import protection_relay_function_kwargs, protection_relay_function_args, \
+from cim.fill_fields import voltage_relay_kwargs
+from cim.iec61970.base.protection.test_protection_relay_function import protection_relay_function_args, \
verify_protection_relay_function_constructor_default, verify_protection_relay_function_constructor_kwargs, verify_protection_relay_function_constructor_args
from zepben.ewb import VoltageRelay, generate_id
-voltage_relay_kwargs = {
- **protection_relay_function_kwargs
-}
-
voltage_relay_args = [*protection_relay_function_args]
@@ -21,7 +18,7 @@ def test_voltage_relay_constructor_default():
verify_protection_relay_function_constructor_default(vr)
-@given(**voltage_relay_kwargs)
+@given(**voltage_relay_kwargs())
def test_voltage_relay_constructor_kwargs(**kwargs):
vr = VoltageRelay(**kwargs)
verify_protection_relay_function_constructor_kwargs(vr, **kwargs)
diff --git a/test/cim/iec61970/base/scada/test_remote_control.py b/test/cim/iec61970/base/scada/test_remote_control.py
index 11be11a8c..471063df2 100644
--- a/test/cim/iec61970/base/scada/test_remote_control.py
+++ b/test/cim/iec61970/base/scada/test_remote_control.py
@@ -3,18 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds
-from util import mrid_strategy
-from zepben.ewb import RemoteControl, Control, generate_id
-
-from cim.iec61970.base.scada.test_remote_point import remote_point_kwargs, verify_remote_point_constructor_default, \
+from cim.fill_fields import remote_control_kwargs
+from cim.iec61970.base.scada.test_remote_point import verify_remote_point_constructor_default, \
verify_remote_point_constructor_kwargs, verify_remote_point_constructor_args, remote_point_args
-
-remote_control_kwargs = {
- **remote_point_kwargs,
- "control": builds(Control, mrid=mrid_strategy)
-}
+from zepben.ewb import RemoteControl, Control, generate_id
remote_control_args = [*remote_point_args, Control(mrid=generate_id())]
@@ -26,7 +19,7 @@ def test_remote_control_constructor_default():
assert not rc.control
-@given(**remote_control_kwargs)
+@given(**remote_control_kwargs())
def test_remote_control_constructor_kwargs(control, **kwargs):
# noinspection PyArgumentList
rc = RemoteControl(control=control, **kwargs)
diff --git a/test/cim/iec61970/base/scada/test_remote_point.py b/test/cim/iec61970/base/scada/test_remote_point.py
index a9db8a990..5d91c2ee3 100644
--- a/test/cim/iec61970/base/scada/test_remote_point.py
+++ b/test/cim/iec61970/base/scada/test_remote_point.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from zepben.ewb import RemotePoint
-remote_point_kwargs = identified_object_kwargs
remote_point_args = identified_object_args
diff --git a/test/cim/iec61970/base/scada/test_remote_source.py b/test/cim/iec61970/base/scada/test_remote_source.py
index 10c7a7cc9..2acadfda1 100644
--- a/test/cim/iec61970/base/scada/test_remote_source.py
+++ b/test/cim/iec61970/base/scada/test_remote_source.py
@@ -3,18 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds
-from util import mrid_strategy
-from zepben.ewb import RemoteSource, Measurement, generate_id
-
-from cim.iec61970.base.scada.test_remote_point import remote_point_kwargs, verify_remote_point_constructor_default, \
+from cim.fill_fields import remote_source_kwargs
+from cim.iec61970.base.scada.test_remote_point import verify_remote_point_constructor_default, \
verify_remote_point_constructor_kwargs, verify_remote_point_constructor_args, remote_point_args
-
-remote_source_kwargs = {
- **remote_point_kwargs,
- "measurement": builds(Measurement, mrid=mrid_strategy)
-}
+from zepben.ewb import RemoteSource, Measurement, generate_id
remote_source_args = [*remote_point_args, Measurement(mrid=generate_id())]
@@ -26,7 +19,7 @@ def test_remote_source_constructor_default():
assert not c.measurement
-@given(**remote_source_kwargs)
+@given(**remote_source_kwargs())
def test_remote_source_constructor_kwargs(measurement, **kwargs):
c = RemoteSource(measurement=measurement, **kwargs)
diff --git a/test/cim/iec61970/base/wires/generation/production/test_battery_unit.py b/test/cim/iec61970/base/wires/generation/production/test_battery_unit.py
index 3815f7fee..824bc3440 100644
--- a/test/cim/iec61970/base/wires/generation/production/test_battery_unit.py
+++ b/test/cim/iec61970/base/wires/generation/production/test_battery_unit.py
@@ -3,24 +3,14 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import integers, sampled_from, builds, lists
-from cim.cim_creators import MAX_32_BIT_INTEGER
-from cim.iec61970.base.wires.generation.production.test_power_electronics_unit import power_electronics_unit_kwargs, \
+from cim.fill_fields import battery_unit_kwargs
+from cim.iec61970.base.wires.generation.production.test_power_electronics_unit import \
verify_power_electronics_unit_constructor_default, verify_power_electronics_unit_constructor_kwargs, verify_power_electronics_unit_constructor_args, \
power_electronics_unit_args
from cim.private_collection_validator import validate_unordered
-from util import mrid_strategy
from zepben.ewb import BatteryUnit, BatteryStateKind, BatteryControl, BatteryControlMode, generate_id
-battery_unit_kwargs = {
- **power_electronics_unit_kwargs,
- "battery_state": sampled_from(BatteryStateKind),
- "rated_e": integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- "stored_e": integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- "controls": lists(builds(BatteryControl, mrid=mrid_strategy), max_size=2)
-}
-
battery_unit_args = [*power_electronics_unit_args, BatteryStateKind.full, 1, 2, [BatteryControl(mrid=generate_id())]]
@@ -34,7 +24,7 @@ def test_battery_unit_constructor_default():
assert b.num_battery_controls() == 0
-@given(**battery_unit_kwargs)
+@given(**battery_unit_kwargs())
def test_battery_unit_constructor_kwargs(battery_state, rated_e, stored_e, controls, **kwargs):
b = BatteryUnit(
battery_state=battery_state,
@@ -66,7 +56,7 @@ def test_battery_unit_constructor_args():
def test_battery_control_collection():
validate_unordered(
BatteryUnit,
- lambda mrid: BatteryControl(mrid),
+ BatteryControl,
BatteryUnit.controls,
BatteryUnit.num_battery_controls,
BatteryUnit.get_control,
diff --git a/test/cim/iec61970/base/wires/generation/production/test_photo_voltaic_unit.py b/test/cim/iec61970/base/wires/generation/production/test_photo_voltaic_unit.py
index edf0d1586..fbd4cf2ac 100644
--- a/test/cim/iec61970/base/wires/generation/production/test_photo_voltaic_unit.py
+++ b/test/cim/iec61970/base/wires/generation/production/test_photo_voltaic_unit.py
@@ -4,12 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from cim.iec61970.base.wires.generation.production.test_power_electronics_unit import power_electronics_unit_kwargs, \
+from cim.fill_fields import photo_voltaic_unit_kwargs
+from cim.iec61970.base.wires.generation.production.test_power_electronics_unit import \
verify_power_electronics_unit_constructor_default, verify_power_electronics_unit_constructor_kwargs, verify_power_electronics_unit_constructor_args, \
power_electronics_unit_args
from zepben.ewb import PhotoVoltaicUnit, generate_id
-photo_voltaic_unit_kwargs = power_electronics_unit_kwargs
photo_voltaic_unit_args = power_electronics_unit_args
@@ -17,7 +17,7 @@ def test_photo_voltaic_unit_constructor_default():
verify_power_electronics_unit_constructor_default(PhotoVoltaicUnit(mrid=generate_id()))
-@given(**photo_voltaic_unit_kwargs)
+@given(**photo_voltaic_unit_kwargs())
def test_photo_voltaic_unit_constructor_kwargs(**kwargs):
verify_power_electronics_unit_constructor_kwargs(PhotoVoltaicUnit(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/wires/generation/production/test_power_electronics_unit.py b/test/cim/iec61970/base/wires/generation/production/test_power_electronics_unit.py
index 4e9c2d024..ff2a52b85 100644
--- a/test/cim/iec61970/base/wires/generation/production/test_power_electronics_unit.py
+++ b/test/cim/iec61970/base/wires/generation/production/test_power_electronics_unit.py
@@ -2,21 +2,10 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import integers, builds
-from util import mrid_strategy
-from zepben.ewb import PowerElectronicsUnit, PowerElectronicsConnection, generate_id
-
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61970.base.core.test_equipment import equipment_kwargs, verify_equipment_constructor_default, \
+from cim.iec61970.base.core.test_equipment import verify_equipment_constructor_default, \
verify_equipment_constructor_kwargs, verify_equipment_constructor_args, equipment_args
-
-power_electronics_unit_kwargs = {
- **equipment_kwargs,
- "power_electronics_connection": builds(PowerElectronicsConnection, mrid=mrid_strategy),
- "max_p": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "min_p": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
-}
+from zepben.ewb import PowerElectronicsUnit, PowerElectronicsConnection, generate_id
power_electronics_unit_args = [*equipment_args, PowerElectronicsConnection(mrid=generate_id()), 1, 2]
diff --git a/test/cim/iec61970/base/wires/generation/production/test_power_electronics_wind_unit.py b/test/cim/iec61970/base/wires/generation/production/test_power_electronics_wind_unit.py
index ac88d4951..4d100648b 100644
--- a/test/cim/iec61970/base/wires/generation/production/test_power_electronics_wind_unit.py
+++ b/test/cim/iec61970/base/wires/generation/production/test_power_electronics_wind_unit.py
@@ -4,12 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from cim.iec61970.base.wires.generation.production.test_power_electronics_unit import power_electronics_unit_kwargs, \
+from cim.fill_fields import power_electronics_wind_unit_kwargs
+from cim.iec61970.base.wires.generation.production.test_power_electronics_unit import \
verify_power_electronics_unit_constructor_default, verify_power_electronics_unit_constructor_kwargs, verify_power_electronics_unit_constructor_args, \
power_electronics_unit_args
from zepben.ewb import PowerElectronicsWindUnit, generate_id
-power_electronics_wind_unit_kwargs = power_electronics_unit_kwargs
power_electronics_wind_unit_args = power_electronics_unit_args
@@ -17,7 +17,7 @@ def test_power_electronics_wind_unit_constructor_default():
verify_power_electronics_unit_constructor_default(PowerElectronicsWindUnit(mrid=generate_id()))
-@given(**power_electronics_wind_unit_kwargs)
+@given(**power_electronics_wind_unit_kwargs())
def test_power_electronics_wind_unit_constructor_kwargs(**kwargs):
verify_power_electronics_unit_constructor_kwargs(PowerElectronicsWindUnit(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/wires/test_ac_line_segment.py b/test/cim/iec61970/base/wires/test_ac_line_segment.py
index b686e2e38..8ce532029 100644
--- a/test/cim/iec61970/base/wires/test_ac_line_segment.py
+++ b/test/cim/iec61970/base/wires/test_ac_line_segment.py
@@ -4,22 +4,15 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import pytest
from hypothesis import given
-from hypothesis.strategies import builds
+from cim.fill_fields import ac_line_segment_kwargs
+from cim.iec61970.base.wires.test_conductor import verify_conductor_constructor_default, \
+ verify_conductor_constructor_kwargs, verify_conductor_constructor_args, conductor_args
from cim.private_collection_validator import validate_unordered
-from util import mrid_strategy
from zepben.ewb import AcLineSegment, generate_id, SinglePhaseKind, OverheadWireInfo
from zepben.ewb.model.cim.iec61970.base.wires.ac_line_segment_phase import AcLineSegmentPhase
-from zepben.ewb.model.cim.iec61970.base.wires.per_length_sequence_impedance import PerLengthSequenceImpedance
-
-from cim.iec61970.base.wires.test_conductor import verify_conductor_constructor_default, \
- verify_conductor_constructor_kwargs, verify_conductor_constructor_args, conductor_kwargs, conductor_args
from zepben.ewb.model.cim.iec61970.base.wires.per_length_phase_impedance import PerLengthPhaseImpedance
-
-ac_line_segment_kwargs = {
- **conductor_kwargs,
- "per_length_impedance": builds(PerLengthSequenceImpedance, mrid=mrid_strategy)
-}
+from zepben.ewb.model.cim.iec61970.base.wires.per_length_sequence_impedance import PerLengthSequenceImpedance
ac_line_segment_args = [*conductor_args, PerLengthSequenceImpedance(mrid=generate_id())]
@@ -33,7 +26,7 @@ def test_ac_line_segment_constructor_default():
assert not als.per_length_phase_impedance
-@given(**ac_line_segment_kwargs)
+@given(**ac_line_segment_kwargs())
def test_ac_line_segment_constructor_kwargs(per_length_impedance, **kwargs):
als = AcLineSegment(per_length_impedance=per_length_impedance, **kwargs)
@@ -125,7 +118,7 @@ def test_ac_line_segment_phases():
def test_retrieves_wire_info_for_phase():
wi = OverheadWireInfo(mrid=generate_id())
- (acls := AcLineSegment(mrid=generate_id())).wire_info = wi
+ (acls := AcLineSegment(mrid=generate_id())).asset_info = wi
wiA = OverheadWireInfo(mrid=generate_id())
wiB = OverheadWireInfo(mrid=generate_id())
wiC = OverheadWireInfo(mrid=generate_id())
diff --git a/test/cim/iec61970/base/wires/test_ac_line_segment_phase.py b/test/cim/iec61970/base/wires/test_ac_line_segment_phase.py
index 422c0be45..5b538c407 100644
--- a/test/cim/iec61970/base/wires/test_ac_line_segment_phase.py
+++ b/test/cim/iec61970/base/wires/test_ac_line_segment_phase.py
@@ -3,22 +3,13 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import integers, builds
-from cim.cim_creators import sampled_single_phase_kind, MIN_SEQUENCE_NUMBER, MAX_SEQUENCE_NUMBER
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs
+from cim.fill_fields import ac_line_segment_phase_kwargs
from cim.iec61970.base.core.test_power_system_resource import verify_power_system_resource_constructor_default, verify_power_system_resource_constructor_kwargs, \
- verify_power_system_resource_constructor_args, power_system_resource_kwargs, power_system_resource_args
+ verify_power_system_resource_constructor_args, power_system_resource_args
from zepben.ewb import generate_id, AcLineSegment, SinglePhaseKind
from zepben.ewb.model.cim.iec61970.base.wires.ac_line_segment_phase import AcLineSegmentPhase
-ac_line_segment_phase_kwargs = {
- **power_system_resource_kwargs,
- "phase": sampled_single_phase_kind(),
- "sequence_number": integers(min_value=MIN_SEQUENCE_NUMBER, max_value=MAX_SEQUENCE_NUMBER),
- "ac_line_segment": builds(AcLineSegment, **identified_object_kwargs),
-}
-
ac_line_segment_phase_args = [*power_system_resource_args, SinglePhaseKind.A, 0, AcLineSegment(mrid=generate_id())]
@@ -31,7 +22,7 @@ def test_ac_line_segment_phase_constructor_default():
assert not als.ac_line_segment
-@given(**ac_line_segment_phase_kwargs)
+@given(**ac_line_segment_phase_kwargs())
def test_ac_line_segment_phase_constructor_kwargs(phase, sequence_number, ac_line_segment, **kwargs):
als = AcLineSegmentPhase(
phase=phase,
@@ -55,4 +46,3 @@ def test_ac_line_segment_phase_constructor_args():
als.sequence_number,
als.ac_line_segment,
]
-
diff --git a/test/cim/iec61970/base/wires/test_breaker.py b/test/cim/iec61970/base/wires/test_breaker.py
index f8336d5bb..983aa2ea4 100644
--- a/test/cim/iec61970/base/wires/test_breaker.py
+++ b/test/cim/iec61970/base/wires/test_breaker.py
@@ -3,18 +3,13 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats
-from zepben.ewb import Breaker, Substation, Terminal, generate_id
-from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
+from cim.fill_fields import breaker_kwargs
from cim.iec61970.base.wires.test_protected_switch import verify_protected_switch_constructor_default, \
- verify_protected_switch_constructor_kwargs, verify_protected_switch_constructor_args, protected_switch_kwargs, protected_switch_args
+ verify_protected_switch_constructor_kwargs, verify_protected_switch_constructor_args, protected_switch_args
+from zepben.ewb import Breaker, Substation, Terminal, generate_id
+from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
-breaker_kwargs = {
- **protected_switch_kwargs,
- "in_transit_time": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
breaker_args = [*protected_switch_args, 1.1]
@@ -25,7 +20,7 @@ def test_breaker_constructor_default():
assert br.in_transit_time is None
-@given(**breaker_kwargs)
+@given(**breaker_kwargs())
def test_breaker_constructor_kwargs(in_transit_time, **kwargs):
br = Breaker(in_transit_time=in_transit_time, **kwargs)
verify_protected_switch_constructor_kwargs(br, **kwargs)
diff --git a/test/cim/iec61970/base/wires/test_busbar_section.py b/test/cim/iec61970/base/wires/test_busbar_section.py
index 77693297d..53d988b89 100644
--- a/test/cim/iec61970/base/wires/test_busbar_section.py
+++ b/test/cim/iec61970/base/wires/test_busbar_section.py
@@ -3,19 +3,13 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, lists
+from cim.fill_fields import busbar_section_kwargs
from cim.iec61970.base.wires.test_connector import verify_connector_constructor_default, \
- verify_connector_constructor_kwargs, verify_connector_constructor_args, connector_kwargs, connector_args
-from util import mrid_strategy
-from zepben.ewb import Terminal, generate_id
+ verify_connector_constructor_kwargs, verify_connector_constructor_args, connector_args
+from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61970.base.wires.busbar_section import BusbarSection
-busbar_section_kwargs = {
- **connector_kwargs,
- 'terminals': lists(builds(Terminal, mrid=mrid_strategy), max_size=1) # Busbar's can only have 1 terminal
-}
-
busbar_section_args = connector_args
@@ -23,7 +17,7 @@ def test_busbar_section_constructor_default():
verify_connector_constructor_default(BusbarSection(mrid=generate_id()))
-@given(**busbar_section_kwargs)
+@given(**busbar_section_kwargs())
def test_busbar_section_constructor_kwargs(**kwargs):
verify_connector_constructor_kwargs(BusbarSection(**kwargs), **kwargs)
@@ -31,5 +25,6 @@ def test_busbar_section_constructor_kwargs(**kwargs):
def test_busbar_section_constructor_args():
verify_connector_constructor_args(BusbarSection(*busbar_section_args))
+
def test_busbar_max_terminals_is_one():
assert BusbarSection.max_terminals == 1
diff --git a/test/cim/iec61970/base/wires/test_conductor.py b/test/cim/iec61970/base/wires/test_conductor.py
index b51c2c142..fb69dde0c 100644
--- a/test/cim/iec61970/base/wires/test_conductor.py
+++ b/test/cim/iec61970/base/wires/test_conductor.py
@@ -2,22 +2,11 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import floats, integers
-from cim.iec61970.base.core.test_conducting_equipment import conducting_equipment_kwargs, verify_conducting_equipment_constructor_default, \
+from cim.iec61970.base.core.test_conducting_equipment import verify_conducting_equipment_constructor_default, \
verify_conducting_equipment_constructor_kwargs, verify_conducting_equipment_constructor_args, conducting_equipment_args
-from cim.property_validator import validate_property_accessor
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX, MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from zepben.ewb import WireInfo
from zepben.ewb.model.cim.iec61970.base.wires.conductor import Conductor
-conductor_kwargs = {
- **conducting_equipment_kwargs,
- "length": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "design_temperature": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "design_rating": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
-
conductor_args = [*conducting_equipment_args, 1, 2, 3.3]
@@ -42,7 +31,3 @@ def verify_conductor_constructor_args(c: Conductor):
c.design_temperature,
c.design_rating
]
-
-
-def test_wire_info_accessor():
- validate_property_accessor(Conductor, WireInfo, Conductor.wire_info)
diff --git a/test/cim/iec61970/base/wires/test_connector.py b/test/cim/iec61970/base/wires/test_connector.py
index fefaf22f3..1b73072d7 100644
--- a/test/cim/iec61970/base/wires/test_connector.py
+++ b/test/cim/iec61970/base/wires/test_connector.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61970.base.core.test_conducting_equipment import conducting_equipment_kwargs, verify_conducting_equipment_constructor_default, \
+from cim.iec61970.base.core.test_conducting_equipment import verify_conducting_equipment_constructor_default, \
verify_conducting_equipment_constructor_kwargs, verify_conducting_equipment_constructor_args, conducting_equipment_args
from zepben.ewb import Connector, Conductor, CableInfo, generate_id
-connector_kwargs = conducting_equipment_kwargs
connector_args = conducting_equipment_args
@@ -27,5 +26,5 @@ def test_is_underground():
c = Conductor(mrid=generate_id())
assert not c.is_underground()
- c.wire_info = CableInfo(mrid=generate_id())
+ c.asset_info = CableInfo(mrid=generate_id())
assert c.is_underground()
diff --git a/test/cim/iec61970/base/wires/test_disconnector.py b/test/cim/iec61970/base/wires/test_disconnector.py
index 8a4f960fd..92f74dd8c 100644
--- a/test/cim/iec61970/base/wires/test_disconnector.py
+++ b/test/cim/iec61970/base/wires/test_disconnector.py
@@ -4,11 +4,11 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
+from cim.fill_fields import disconnector_kwargs
from cim.iec61970.base.wires.test_switch import verify_switch_constructor_default, verify_switch_constructor_kwargs, verify_switch_constructor_args, \
- switch_kwargs, switch_args
+ switch_args
from zepben.ewb import Disconnector, generate_id
-disconnector_kwargs = switch_kwargs
disconnector_args = switch_args
@@ -16,7 +16,7 @@ def test_disconnector_constructor_default():
verify_switch_constructor_default(Disconnector(mrid=generate_id()))
-@given(**disconnector_kwargs)
+@given(**disconnector_kwargs())
def test_disconnector_constructor_kwargs(**kwargs):
verify_switch_constructor_kwargs(Disconnector(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/wires/test_earth_fault_compensator.py b/test/cim/iec61970/base/wires/test_earth_fault_compensator.py
index 4b0e5d92b..6309360e1 100644
--- a/test/cim/iec61970/base/wires/test_earth_fault_compensator.py
+++ b/test/cim/iec61970/base/wires/test_earth_fault_compensator.py
@@ -2,17 +2,9 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import floats, one_of, none
-from zepben.ewb import EarthFaultCompensator
-
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-from cim.iec61970.base.core.test_conducting_equipment import conducting_equipment_kwargs, conducting_equipment_args, \
+from cim.iec61970.base.core.test_conducting_equipment import conducting_equipment_args, \
verify_conducting_equipment_constructor_default, verify_conducting_equipment_constructor_kwargs, verify_conducting_equipment_constructor_args
-
-earth_fault_compensator_kwargs = {
- **conducting_equipment_kwargs,
- "r": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
-}
+from zepben.ewb import EarthFaultCompensator
earth_fault_compensator_args = [*conducting_equipment_args, 1.0]
diff --git a/test/cim/iec61970/base/wires/test_energy_connection.py b/test/cim/iec61970/base/wires/test_energy_connection.py
index e231918c4..1d77c45fe 100644
--- a/test/cim/iec61970/base/wires/test_energy_connection.py
+++ b/test/cim/iec61970/base/wires/test_energy_connection.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61970.base.core.test_conducting_equipment import conducting_equipment_kwargs, verify_conducting_equipment_constructor_default, \
+from cim.iec61970.base.core.test_conducting_equipment import verify_conducting_equipment_constructor_default, \
verify_conducting_equipment_constructor_kwargs, verify_conducting_equipment_constructor_args, conducting_equipment_args
from zepben.ewb import EnergyConnection
-energy_connection_kwargs = conducting_equipment_kwargs
energy_connection_args = conducting_equipment_args
diff --git a/test/cim/iec61970/base/wires/test_energy_consumer.py b/test/cim/iec61970/base/wires/test_energy_consumer.py
index a91df63e8..f68fe734b 100644
--- a/test/cim/iec61970/base/wires/test_energy_consumer.py
+++ b/test/cim/iec61970/base/wires/test_energy_consumer.py
@@ -3,28 +3,13 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, lists, integers, booleans, sampled_from, floats
-from util import mrid_strategy
-from zepben.ewb import EnergyConsumer, PhaseShuntConnectionKind, generate_id
-from zepben.ewb.model.cim.iec61970.base.wires.energy_consumer_phase import EnergyConsumerPhase
-
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, FLOAT_MIN, FLOAT_MAX
+from cim.fill_fields import energy_consumer_kwargs
from cim.iec61970.base.wires.test_energy_connection import verify_energy_connection_constructor_default, \
- verify_energy_connection_constructor_kwargs, verify_energy_connection_constructor_args, energy_connection_kwargs, energy_connection_args
+ verify_energy_connection_constructor_kwargs, verify_energy_connection_constructor_args, energy_connection_args
from cim.private_collection_validator import validate_unordered
-
-energy_consumer_kwargs = {
- **energy_connection_kwargs,
- "energy_consumer_phases": lists(builds(EnergyConsumerPhase, mrid=mrid_strategy)),
- "customer_count": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "grounded": booleans(),
- "phase_connection": sampled_from(PhaseShuntConnectionKind),
- "p": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "p_fixed": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "q": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "q_fixed": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
+from zepben.ewb import EnergyConsumer, PhaseShuntConnectionKind, generate_id
+from zepben.ewb.model.cim.iec61970.base.wires.energy_consumer_phase import EnergyConsumerPhase
energy_consumer_args = [*energy_connection_args, [EnergyConsumerPhase(mrid=generate_id())], 1, True, PhaseShuntConnectionKind.Y, 2.2, 3.3, 4.4, 5.5]
@@ -43,7 +28,7 @@ def test_energy_consumer_constructor_default():
assert ec.q_fixed is None
-@given(**energy_consumer_kwargs)
+@given(**energy_consumer_kwargs())
def test_energy_consumer_constructor_kwargs(energy_consumer_phases, customer_count, grounded, phase_connection, p, p_fixed, q, q_fixed, **kwargs):
ec = EnergyConsumer(
energy_consumer_phases=energy_consumer_phases,
@@ -87,7 +72,7 @@ def test_energy_consumer_constructor_args():
def test_phases_collection():
validate_unordered(
EnergyConsumer,
- lambda mrid: EnergyConsumerPhase(mrid),
+ EnergyConsumerPhase,
EnergyConsumer.phases,
EnergyConsumer.num_phases,
EnergyConsumer.get_phase,
diff --git a/test/cim/iec61970/base/wires/test_energy_source.py b/test/cim/iec61970/base/wires/test_energy_source.py
index c645237af..acf35ee6e 100644
--- a/test/cim/iec61970/base/wires/test_energy_source.py
+++ b/test/cim/iec61970/base/wires/test_energy_source.py
@@ -3,45 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, lists, floats, booleans
-from util import mrid_strategy
-from zepben.ewb import EnergySource, EnergySourcePhase, generate_id
-
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
+from cim.fill_fields import energy_source_kwargs
from cim.iec61970.base.wires.test_energy_connection import verify_energy_connection_constructor_default, \
- verify_energy_connection_constructor_kwargs, verify_energy_connection_constructor_args, energy_connection_kwargs, energy_connection_args
+ verify_energy_connection_constructor_kwargs, verify_energy_connection_constructor_args, energy_connection_args
from cim.private_collection_validator import validate_unordered
-
-energy_source_kwargs = {
- **energy_connection_kwargs,
- "energy_source_phases": lists(builds(EnergySourcePhase, mrid=mrid_strategy)),
- "active_power": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "reactive_power": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "voltage_angle": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "voltage_magnitude": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "p_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "p_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "r0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "rn": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "xn": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "is_external_grid": booleans(),
- "r_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "rn_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "r0_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "xn_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x0_min": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "r_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "rn_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "r0_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "xn_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x0_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
+from zepben.ewb import EnergySource, EnergySourcePhase, generate_id
energy_source_args = [
*energy_connection_args,
@@ -106,7 +73,7 @@ def test_energy_source_constructor_default():
assert es.x0_max is None
-@given(**energy_source_kwargs)
+@given(**energy_source_kwargs())
def test_energy_source_constructor_kwargs(energy_source_phases, active_power, reactive_power, voltage_angle, voltage_magnitude, p_max, p_min,
r, r0, rn, x, x0, xn, is_external_grid, r_min, rn_min, r0_min, x_min, xn_min, x0_min,
r_max, rn_max, r0_max, x_max, xn_max, x0_max, **kwargs):
@@ -206,7 +173,7 @@ def test_energy_source_constructor_args():
def test_phases_collection():
validate_unordered(
EnergySource,
- lambda mrid: EnergySourcePhase(mrid),
+ EnergySourcePhase,
EnergySource.phases,
EnergySource.num_phases,
EnergySource.get_phase,
diff --git a/test/cim/iec61970/base/wires/test_fuse.py b/test/cim/iec61970/base/wires/test_fuse.py
index 7fdfc46a0..b712efd93 100644
--- a/test/cim/iec61970/base/wires/test_fuse.py
+++ b/test/cim/iec61970/base/wires/test_fuse.py
@@ -4,17 +4,11 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
+from cim.fill_fields import fuse_kwargs
from cim.iec61970.base.wires.test_switch import verify_switch_constructor_default, verify_switch_constructor_kwargs, verify_switch_constructor_args, \
- switch_kwargs, switch_args
-from hypothesis.strategies import builds
-
-from util import mrid_strategy
+ switch_args
from zepben.ewb import Fuse, ProtectionRelayFunction, generate_id
-fuse_kwargs = {
- **switch_kwargs,
- "function": builds(ProtectionRelayFunction, mrid=mrid_strategy)
-}
fuse_args = [*switch_args, ProtectionRelayFunction(mrid=generate_id())]
@@ -24,7 +18,7 @@ def test_fuse_constructor_default():
assert f.function is None
-@given(**fuse_kwargs)
+@given(**fuse_kwargs())
def test_fuse_constructor_kwargs(function, **kwargs):
f = Fuse(function=function, **kwargs)
verify_switch_constructor_kwargs(f, **kwargs)
diff --git a/test/cim/iec61970/base/wires/test_ground.py b/test/cim/iec61970/base/wires/test_ground.py
index 9b56e4882..6b01f716b 100644
--- a/test/cim/iec61970/base/wires/test_ground.py
+++ b/test/cim/iec61970/base/wires/test_ground.py
@@ -5,11 +5,12 @@
from hypothesis import given
-from cim.iec61970.base.core.test_conducting_equipment import verify_conducting_equipment_constructor_default, verify_conducting_equipment_constructor_kwargs, verify_conducting_equipment_constructor_args, \
- conducting_equipment_kwargs, conducting_equipment_args
+from cim.fill_fields import ground_kwargs
+from cim.iec61970.base.core.test_conducting_equipment import verify_conducting_equipment_constructor_default, verify_conducting_equipment_constructor_kwargs, \
+ verify_conducting_equipment_constructor_args, \
+ conducting_equipment_args
from zepben.ewb import Ground, generate_id
-ground_kwargs = conducting_equipment_kwargs
ground_args = conducting_equipment_args
@@ -17,7 +18,7 @@ def test_ground_constructor_default():
verify_conducting_equipment_constructor_default(Ground(mrid=generate_id()))
-@given(**ground_kwargs)
+@given(**ground_kwargs())
def test_ground_constructor_kwargs(**kwargs):
verify_conducting_equipment_constructor_kwargs(Ground(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/wires/test_ground_disconnector.py b/test/cim/iec61970/base/wires/test_ground_disconnector.py
index 0b8cdf763..445c87698 100644
--- a/test/cim/iec61970/base/wires/test_ground_disconnector.py
+++ b/test/cim/iec61970/base/wires/test_ground_disconnector.py
@@ -4,11 +4,11 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
+from cim.fill_fields import ground_disconnector_kwargs
from cim.iec61970.base.wires.test_switch import verify_switch_constructor_default, verify_switch_constructor_kwargs, verify_switch_constructor_args, \
- switch_kwargs, switch_args
+ switch_args
from zepben.ewb import GroundDisconnector, generate_id
-ground_disconnector_kwargs = switch_kwargs
ground_disconnector_args = switch_args
@@ -16,7 +16,7 @@ def test_ground_disconnector_constructor_default():
verify_switch_constructor_default(GroundDisconnector(mrid=generate_id()))
-@given(**ground_disconnector_kwargs)
+@given(**ground_disconnector_kwargs())
def test_ground_disconnector_constructor_kwargs(**kwargs):
verify_switch_constructor_kwargs(GroundDisconnector(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/wires/test_grounding_impedance.py b/test/cim/iec61970/base/wires/test_grounding_impedance.py
index 57de96a67..f17a36c0f 100644
--- a/test/cim/iec61970/base/wires/test_grounding_impedance.py
+++ b/test/cim/iec61970/base/wires/test_grounding_impedance.py
@@ -3,17 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats, one_of, none
-from zepben.ewb import GroundingImpedance
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-from cim.iec61970.base.wires.test_earth_fault_compensator import earth_fault_compensator_kwargs, earth_fault_compensator_args, \
+from cim.fill_fields import grounding_impedance_kwargs
+from cim.iec61970.base.wires.test_earth_fault_compensator import earth_fault_compensator_args, \
verify_earth_fault_compensator_constructor_default, verify_earth_fault_compensator_constructor_kwargs, verify_earth_fault_compensator_constructor_args
-
-grounding_impedance_kwargs = {
- **earth_fault_compensator_kwargs,
- "x": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
-}
+from zepben.ewb import GroundingImpedance
grounding_impedance_args = [*earth_fault_compensator_args, 1.0]
@@ -25,9 +19,9 @@ def verify_grounding_impedance_constructor_default():
assert gi.x is None
-@given(**grounding_impedance_kwargs)
+@given(**grounding_impedance_kwargs())
def verify_grounding_impedance_constructor_kwargs(x, **kwargs):
- gi = GroundingImpedance(x = x, **kwargs)
+ gi = GroundingImpedance(x=x, **kwargs)
verify_earth_fault_compensator_constructor_kwargs(gi, **kwargs)
assert gi.x == x
diff --git a/test/cim/iec61970/base/wires/test_jumper.py b/test/cim/iec61970/base/wires/test_jumper.py
index 5786bcf5d..8e43cc59b 100644
--- a/test/cim/iec61970/base/wires/test_jumper.py
+++ b/test/cim/iec61970/base/wires/test_jumper.py
@@ -4,11 +4,11 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
+from cim.fill_fields import jumper_kwargs
from cim.iec61970.base.wires.test_switch import verify_switch_constructor_default, verify_switch_constructor_kwargs, verify_switch_constructor_args, \
- switch_kwargs, switch_args
+ switch_args
from zepben.ewb import Jumper, generate_id
-jumper_kwargs = switch_kwargs
jumper_args = switch_args
@@ -16,7 +16,7 @@ def test_jumper_constructor_default():
verify_switch_constructor_default(Jumper(mrid=generate_id()))
-@given(**jumper_kwargs)
+@given(**jumper_kwargs())
def test_jumper_constructor_kwargs(**kwargs):
verify_switch_constructor_kwargs(Jumper(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/wires/test_junction.py b/test/cim/iec61970/base/wires/test_junction.py
index d454485e2..be93bcca6 100644
--- a/test/cim/iec61970/base/wires/test_junction.py
+++ b/test/cim/iec61970/base/wires/test_junction.py
@@ -4,12 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
+from cim.fill_fields import junction_kwargs
from cim.iec61970.base.wires.test_connector import verify_connector_constructor_default, \
- verify_connector_constructor_kwargs, verify_connector_constructor_args, connector_kwargs, connector_args
+ verify_connector_constructor_kwargs, verify_connector_constructor_args, connector_args
from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction
-junction_kwargs = connector_kwargs
junction_args = connector_args
@@ -17,7 +17,7 @@ def test_junction_constructor_default():
verify_connector_constructor_default(Junction(mrid=generate_id()))
-@given(**junction_kwargs)
+@given(**junction_kwargs())
def test_junction_constructor_kwargs(**kwargs):
verify_connector_constructor_kwargs(Junction(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/wires/test_line.py b/test/cim/iec61970/base/wires/test_line.py
index 76a4e2428..4f91f0279 100644
--- a/test/cim/iec61970/base/wires/test_line.py
+++ b/test/cim/iec61970/base/wires/test_line.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61970.base.core.test_equipment_container import equipment_container_kwargs, verify_equipment_container_constructor_default, \
+from cim.iec61970.base.core.test_equipment_container import verify_equipment_container_constructor_default, \
verify_equipment_container_constructor_kwargs, verify_equipment_container_constructor_args, equipment_container_args
from zepben.ewb import Line
-line_kwargs = equipment_container_kwargs
line_args = equipment_container_args
diff --git a/test/cim/iec61970/base/wires/test_linear_shunt_compensator.py b/test/cim/iec61970/base/wires/test_linear_shunt_compensator.py
index ea6fe736e..3404c4c66 100644
--- a/test/cim/iec61970/base/wires/test_linear_shunt_compensator.py
+++ b/test/cim/iec61970/base/wires/test_linear_shunt_compensator.py
@@ -4,22 +4,13 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats
-from zepben.ewb import generate_id
+from zepben.ewb import generate_id, PhaseCode
from zepben.ewb.model.cim.iec61970.base.wires.linear_shunt_compensator import LinearShuntCompensator
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
+from cim.fill_fields import linear_shunt_compensator_kwargs
from cim.iec61970.base.wires.test_shunt_compensator import verify_shunt_compensator_constructor_default, \
- verify_shunt_compensator_constructor_kwargs, verify_shunt_compensator_constructor_args, shunt_compensator_kwargs, shunt_compensator_args
-
-linear_shunt_compensator_kwargs = {
- **shunt_compensator_kwargs,
- "b0_per_section": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "b_per_section": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "g0_per_section": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "g_per_section": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
+ verify_shunt_compensator_constructor_kwargs, verify_shunt_compensator_constructor_args, shunt_compensator_args
linear_shunt_compensator_args = [*shunt_compensator_args, 1.1, 2.2, 3.3, 4.4]
@@ -34,8 +25,18 @@ def test_linear_shunt_compensator_constructor_default():
assert lsc.g_per_section is None
-@given(**linear_shunt_compensator_kwargs)
+@given(**linear_shunt_compensator_kwargs())
def test_linear_shunt_compensator_constructor_kwargs(b0_per_section, b_per_section, g0_per_section, g_per_section, **kwargs):
+ #
+ # NOTE: The grounding terminal must be one of the included terminals, with phases N. If it isn't, the automated processes
+ # will add the terminal and cause the tests to fail. If the phases are N, it will reject the invalid phases.
+ #
+ if kwargs["terminals"]:
+ kwargs["grounding_terminal"] = kwargs["terminals"][-1]
+ kwargs["grounding_terminal"].phases = PhaseCode.N
+ else:
+ kwargs["grounding_terminal"] = None
+
lsc = LinearShuntCompensator(
b0_per_section=b0_per_section,
b_per_section=b_per_section,
diff --git a/test/cim/iec61970/base/wires/test_load_break_switch.py b/test/cim/iec61970/base/wires/test_load_break_switch.py
index 4d5929839..442debfff 100644
--- a/test/cim/iec61970/base/wires/test_load_break_switch.py
+++ b/test/cim/iec61970/base/wires/test_load_break_switch.py
@@ -4,11 +4,11 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
+from cim.fill_fields import load_break_switch_kwargs
from cim.iec61970.base.wires.test_protected_switch import verify_protected_switch_constructor_default, \
- verify_protected_switch_constructor_kwargs, verify_protected_switch_constructor_args, protected_switch_kwargs, protected_switch_args
+ verify_protected_switch_constructor_kwargs, verify_protected_switch_constructor_args, protected_switch_args
from zepben.ewb import LoadBreakSwitch, generate_id
-load_break_switch_kwargs = protected_switch_kwargs
load_break_switch_args = protected_switch_args
@@ -16,7 +16,7 @@ def test_load_break_switch_constructor_default():
verify_protected_switch_constructor_default(LoadBreakSwitch(mrid=generate_id()))
-@given(**load_break_switch_kwargs)
+@given(**load_break_switch_kwargs())
def test_load_break_switch_constructor_kwargs(**kwargs):
verify_protected_switch_constructor_kwargs(LoadBreakSwitch(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/wires/test_per_length_impedance.py b/test/cim/iec61970/base/wires/test_per_length_impedance.py
index f8e394fc3..6c0ea09de 100644
--- a/test/cim/iec61970/base/wires/test_per_length_impedance.py
+++ b/test/cim/iec61970/base/wires/test_per_length_impedance.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61970.base.wires.test_per_length_line_parameter import per_length_line_parameter_kwargs, verify_per_length_line_parameter_constructor_default, \
+from cim.iec61970.base.wires.test_per_length_line_parameter import verify_per_length_line_parameter_constructor_default, \
verify_per_length_line_parameter_constructor_kwargs, verify_per_length_line_parameter_constructor_args, per_length_line_parameter_args
from zepben.ewb.model.cim.iec61970.base.wires.per_length_impedance import PerLengthImpedance
-per_length_impedance_kwargs = per_length_line_parameter_kwargs
per_length_impedance_args = per_length_line_parameter_args
diff --git a/test/cim/iec61970/base/wires/test_per_length_line_parameter.py b/test/cim/iec61970/base/wires/test_per_length_line_parameter.py
index f99abae81..0de041367 100644
--- a/test/cim/iec61970/base/wires/test_per_length_line_parameter.py
+++ b/test/cim/iec61970/base/wires/test_per_length_line_parameter.py
@@ -3,11 +3,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from zepben.ewb.model.cim.iec61970.base.wires.per_length_line_parameter import PerLengthLineParameter
-per_length_line_parameter_kwargs = identified_object_kwargs
per_length_line_parameter_args = identified_object_args
diff --git a/test/cim/iec61970/base/wires/test_per_length_phase_impedance.py b/test/cim/iec61970/base/wires/test_per_length_phase_impedance.py
index b400db267..1126183bf 100644
--- a/test/cim/iec61970/base/wires/test_per_length_phase_impedance.py
+++ b/test/cim/iec61970/base/wires/test_per_length_phase_impedance.py
@@ -4,21 +4,16 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import pytest
from hypothesis import given
-from hypothesis.strategies import lists, builds
+from cim.fill_fields import per_length_phase_impedance_kwargs
+from cim.iec61970.base.wires.test_per_length_impedance import verify_per_length_impedance_constructor_default, \
+ verify_per_length_impedance_constructor_kwargs, verify_per_length_impedance_constructor_args, per_length_impedance_args
from cim.private_collection_validator import validate_unordered_other
+from util import assert_or_empty
from zepben.ewb import SinglePhaseKind, single_phase_kind_by_id, generate_id
-
-from cim.iec61970.base.wires.test_per_length_impedance import verify_per_length_impedance_constructor_default, \
- verify_per_length_impedance_constructor_kwargs, verify_per_length_impedance_constructor_args, per_length_impedance_kwargs, per_length_impedance_args
from zepben.ewb.model.cim.iec61970.base.wires.per_length_phase_impedance import PerLengthPhaseImpedance
from zepben.ewb.model.cim.iec61970.base.wires.phase_impedance_data import PhaseImpedanceData
-per_length_phase_impedance_kwargs = {
- **per_length_impedance_kwargs,
- "phase_impedance_data": lists(builds(PhaseImpedanceData), max_size=1),
-}
-
per_length_phase_impedance_args = [*per_length_impedance_args, [PhaseImpedanceData(SinglePhaseKind.A, SinglePhaseKind.A)]]
@@ -29,13 +24,13 @@ def test_per_length_phase_impedance_constructor_default():
assert not list(plpi.data)
-@given(**per_length_phase_impedance_kwargs)
-def test_per_length_phase_impedance_constructor_kwargs(phase_impedance_data, **kwargs):
+@given(**per_length_phase_impedance_kwargs())
+def test_per_length_phase_impedance_constructor_kwargs(data, **kwargs):
# noinspection PyArgumentList
- plpi = PerLengthPhaseImpedance(data=phase_impedance_data, **kwargs)
+ plpi = PerLengthPhaseImpedance(data=data, **kwargs)
verify_per_length_impedance_constructor_kwargs(plpi, **kwargs)
- assert list(plpi.data) == phase_impedance_data
+ assert_or_empty(plpi.data, data)
def test_per_length_phase_impedance_constructor_args():
diff --git a/test/cim/iec61970/base/wires/test_per_length_sequence_impedance.py b/test/cim/iec61970/base/wires/test_per_length_sequence_impedance.py
index a3d4040fa..ef322b09f 100644
--- a/test/cim/iec61970/base/wires/test_per_length_sequence_impedance.py
+++ b/test/cim/iec61970/base/wires/test_per_length_sequence_impedance.py
@@ -3,27 +3,13 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats
+from cim.fill_fields import per_length_sequence_impedance_kwargs
+from cim.iec61970.base.wires.test_per_length_impedance import verify_per_length_impedance_constructor_default, \
+ verify_per_length_impedance_constructor_kwargs, verify_per_length_impedance_constructor_args, per_length_impedance_args
from zepben.ewb import generate_id
from zepben.ewb.model.cim.iec61970.base.wires.per_length_sequence_impedance import PerLengthSequenceImpedance
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-from cim.iec61970.base.wires.test_per_length_impedance import verify_per_length_impedance_constructor_default, \
- verify_per_length_impedance_constructor_kwargs, verify_per_length_impedance_constructor_args, per_length_impedance_kwargs, per_length_impedance_args
-
-per_length_sequence_impedance_kwargs = {
- **per_length_impedance_kwargs,
- "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "bch": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "gch": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "r0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "b0ch": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "g0ch": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
-
per_length_sequence_impedance_args = [*per_length_impedance_args, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8]
@@ -41,7 +27,7 @@ def test_per_length_sequence_impedance_constructor_default():
assert plsi.g0ch is None
-@given(**per_length_sequence_impedance_kwargs)
+@given(**per_length_sequence_impedance_kwargs())
def test_per_length_sequence_impedance_constructor_kwargs(r, x, bch, gch, r0, x0, b0ch, g0ch, **kwargs):
# noinspection PyArgumentList
plsi = PerLengthSequenceImpedance(r=r, x=x, bch=bch, gch=gch, r0=r0, x0=x0, b0ch=b0ch, g0ch=g0ch, **kwargs)
diff --git a/test/cim/iec61970/base/wires/test_petersen_coil.py b/test/cim/iec61970/base/wires/test_petersen_coil.py
index 84935550b..44ff9d845 100644
--- a/test/cim/iec61970/base/wires/test_petersen_coil.py
+++ b/test/cim/iec61970/base/wires/test_petersen_coil.py
@@ -3,17 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats, one_of, none
-from zepben.ewb import PetersenCoil
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-from cim.iec61970.base.wires.test_earth_fault_compensator import earth_fault_compensator_kwargs, earth_fault_compensator_args, \
+from cim.fill_fields import petersen_coil_kwargs
+from cim.iec61970.base.wires.test_earth_fault_compensator import earth_fault_compensator_args, \
verify_earth_fault_compensator_constructor_default, verify_earth_fault_compensator_constructor_kwargs, verify_earth_fault_compensator_constructor_args
-
-petersen_coil_kwargs = {
- **earth_fault_compensator_kwargs,
- "x_ground_nominal": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
-}
+from zepben.ewb import PetersenCoil
petersen_coil_args = [*earth_fault_compensator_args, 1.0]
@@ -25,9 +19,9 @@ def verify_petersen_coil_constructor_default():
assert pc.x_ground_nominal is None
-@given(**petersen_coil_kwargs)
+@given(**petersen_coil_kwargs())
def verify_petersen_coil_constructor_kwargs(x_ground_nominal, **kwargs):
- pc = PetersenCoil(x_ground_nominal = x_ground_nominal, **kwargs)
+ pc = PetersenCoil(x_ground_nominal=x_ground_nominal, **kwargs)
verify_earth_fault_compensator_constructor_kwargs(pc, **kwargs)
assert pc.x_ground_nominal == x_ground_nominal
diff --git a/test/cim/iec61970/base/wires/test_phase_impedance_data.py b/test/cim/iec61970/base/wires/test_phase_impedance_data.py
index ed7ce3d6e..10bb14b47 100644
--- a/test/cim/iec61970/base/wires/test_phase_impedance_data.py
+++ b/test/cim/iec61970/base/wires/test_phase_impedance_data.py
@@ -3,22 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats, sampled_from
from pytest import raises
-from zepben.ewb import SinglePhaseKind
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
+from cim.fill_fields import phase_impedance_data_kwargs
+from zepben.ewb import SinglePhaseKind
from zepben.ewb.model.cim.iec61970.base.wires.phase_impedance_data import PhaseImpedanceData
-phase_impedance_data_kwargs = {
- "from_phase": sampled_from(SinglePhaseKind),
- "to_phase": sampled_from(SinglePhaseKind),
- "b": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "g": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
-}
-
phase_impedance_data_args = [SinglePhaseKind.B, SinglePhaseKind.C, 1.1, 2.2, 3.3, 4.4]
@@ -44,7 +34,7 @@ def test_data_constructor_default():
PhaseImpedanceData(from_phase=SinglePhaseKind.A, to_phase=SinglePhaseKind.B, b=1.0, g=2.0, r=3.0, x=4.0)
-@given(**phase_impedance_data_kwargs)
+@given(**phase_impedance_data_kwargs())
def test_phase_impedance_data_constructor_kwargs(from_phase, to_phase, b, g, r, x, **kwargs):
assert not kwargs
diff --git a/test/cim/iec61970/base/wires/test_power_electronics_connection.py b/test/cim/iec61970/base/wires/test_power_electronics_connection.py
index 181e13355..e29fb1058 100644
--- a/test/cim/iec61970/base/wires/test_power_electronics_connection.py
+++ b/test/cim/iec61970/base/wires/test_power_electronics_connection.py
@@ -4,55 +4,15 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import re
-from pytest import raises
from hypothesis import given
-from hypothesis.strategies import integers, builds, lists, floats, text, booleans
-
-from util import mrid_strategy
-from zepben.ewb import PowerElectronicsUnit, BatteryUnit, PowerElectronicsConnection, generate_id
-from zepben.ewb.model.cim.iec61970.base.wires.power_electronics_connection_phase import PowerElectronicsConnectionPhase
+from pytest import raises
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, FLOAT_MIN, FLOAT_MAX, ALPHANUM, TEXT_MAX_SIZE
+from cim.fill_fields import power_electronics_connection_kwargs
from cim.iec61970.base.wires.test_regulating_cond_eq import verify_regulating_cond_eq_constructor_default, \
- verify_regulating_cond_eq_constructor_kwargs, verify_regulating_cond_eq_constructor_args, regulating_cond_eq_kwargs, regulating_cond_eq_args
+ verify_regulating_cond_eq_constructor_kwargs, verify_regulating_cond_eq_constructor_args, regulating_cond_eq_args
from cim.private_collection_validator import validate_unordered
-
-power_electronics_connection_kwargs = {
- **regulating_cond_eq_kwargs,
- "max_i_fault": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "p": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "q": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "max_q": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "min_q": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "rated_s": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "rated_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "inverter_standard": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- "sustain_op_overvolt_limit": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "stop_at_over_freq": floats(min_value=51.0, max_value=52.0),
- "stop_at_under_freq": floats(min_value=47.0, max_value=49.0),
- "inv_volt_watt_resp_mode": booleans(),
- "inv_watt_resp_v1": integers(min_value=200, max_value=300),
- "inv_watt_resp_v2": integers(min_value=216, max_value=230),
- "inv_watt_resp_v3": integers(min_value=235, max_value=255),
- "inv_watt_resp_v4": integers(min_value=244, max_value=265),
- "inv_watt_resp_p_at_v1": floats(min_value=0.0, max_value=1.0),
- "inv_watt_resp_p_at_v2": floats(min_value=0.0, max_value=1.0),
- "inv_watt_resp_p_at_v3": floats(min_value=0.0, max_value=1.0),
- "inv_watt_resp_p_at_v4": floats(min_value=0.0, max_value=0.2),
- "inv_volt_var_resp_mode": booleans(),
- "inv_var_resp_v1": integers(min_value=200, max_value=300),
- "inv_var_resp_v2": integers(min_value=200, max_value=300),
- "inv_var_resp_v3": integers(min_value=200, max_value=300),
- "inv_var_resp_v4": integers(min_value=200, max_value=300),
- "inv_var_resp_q_at_v1": floats(min_value=0.0, max_value=0.6),
- "inv_var_resp_q_at_v2": floats(min_value=-1.0, max_value=1.0),
- "inv_var_resp_q_at_v3": floats(min_value=-1.0, max_value=1.0),
- "inv_var_resp_q_at_v4": floats(min_value=-0.6, max_value=0.0),
- "inv_reactive_power_mode": booleans(),
- "inv_fix_reactive_power": floats(min_value=-1.0, max_value=1.0),
- "power_electronics_units": lists(builds(BatteryUnit, mrid=mrid_strategy), max_size=2),
- "power_electronics_connection_phases": lists(builds(PowerElectronicsConnectionPhase, mrid=mrid_strategy), max_size=2)
-}
+from zepben.ewb import PowerElectronicsUnit, BatteryUnit, PowerElectronicsConnection, generate_id
+from zepben.ewb.model.cim.iec61970.base.wires.power_electronics_connection_phase import PowerElectronicsConnectionPhase
power_electronics_connection_args = [
*regulating_cond_eq_args,
@@ -131,7 +91,7 @@ def test_power_electronics_connection_constructor_default():
assert not list(pec.phases)
-@given(**power_electronics_connection_kwargs)
+@given(**power_electronics_connection_kwargs())
def test_power_electronics_connection_constructor_kwargs(
max_i_fault,
p,
@@ -285,7 +245,7 @@ def test_power_electronics_connection_constructor_args():
def test_power_electronics_units_collection():
validate_unordered(
PowerElectronicsConnection,
- lambda mrid: PowerElectronicsUnit(mrid),
+ PowerElectronicsUnit,
PowerElectronicsConnection.units,
PowerElectronicsConnection.num_units,
PowerElectronicsConnection.get_unit,
@@ -298,7 +258,7 @@ def test_power_electronics_units_collection():
def test_power_electronics_connection_phases_collection():
validate_unordered(
PowerElectronicsConnection,
- lambda mrid: PowerElectronicsConnectionPhase(mrid),
+ PowerElectronicsConnectionPhase,
PowerElectronicsConnection.phases,
PowerElectronicsConnection.num_phases,
PowerElectronicsConnection.get_phase,
diff --git a/test/cim/iec61970/base/wires/test_power_transformer.py b/test/cim/iec61970/base/wires/test_power_transformer.py
index d422ab302..34eeaf715 100644
--- a/test/cim/iec61970/base/wires/test_power_transformer.py
+++ b/test/cim/iec61970/base/wires/test_power_transformer.py
@@ -3,26 +3,13 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, sampled_from, lists, floats
from pytest import raises
-from util import mrid_strategy
-from zepben.ewb import PowerTransformer, VectorGroup, PowerTransformerEnd, PowerTransformerInfo, TransformerConstructionKind, TransformerFunctionKind, \
- Terminal, generate_id
-
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
+from cim.fill_fields import power_transformer_kwargs
from cim.iec61970.base.core.test_conducting_equipment import verify_conducting_equipment_constructor_default, \
- verify_conducting_equipment_constructor_kwargs, verify_conducting_equipment_constructor_args, conducting_equipment_kwargs, conducting_equipment_args
-from cim.property_validator import validate_property_accessor
-
-power_transformer_kwargs = {
- **conducting_equipment_kwargs,
- "vector_group": sampled_from(VectorGroup),
- "power_transformer_ends": lists(builds(PowerTransformerEnd, mrid=mrid_strategy), max_size=2),
- "transformer_utilisation": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "construction_kind": sampled_from(TransformerConstructionKind),
- "function": sampled_from(TransformerFunctionKind)
-}
+ verify_conducting_equipment_constructor_kwargs, verify_conducting_equipment_constructor_args, conducting_equipment_args
+from zepben.ewb import PowerTransformer, VectorGroup, PowerTransformerEnd, TransformerConstructionKind, TransformerFunctionKind, \
+ Terminal, generate_id
power_transformer_args = [
*conducting_equipment_args,
@@ -45,10 +32,23 @@ def test_power_transformer_constructor_default():
assert pt.transformer_utilisation is None
-@given(**power_transformer_kwargs)
-def test_power_transformer_constructor_kwargs(vector_group, power_transformer_ends, transformer_utilisation, construction_kind, function, **kwargs):
- pt = PowerTransformer(vector_group=vector_group, power_transformer_ends=power_transformer_ends, transformer_utilisation=transformer_utilisation,
- construction_kind=construction_kind, function=function, **kwargs)
+@given(**power_transformer_kwargs())
+def test_power_transformer_constructor_kwargs(
+ vector_group,
+ power_transformer_ends,
+ transformer_utilisation,
+ construction_kind,
+ function,
+ **kwargs,
+):
+ pt = PowerTransformer(
+ vector_group=vector_group,
+ power_transformer_ends=power_transformer_ends,
+ transformer_utilisation=transformer_utilisation,
+ construction_kind=construction_kind,
+ function=function,
+ **kwargs
+ )
verify_conducting_equipment_constructor_kwargs(pt, **kwargs)
assert pt.vector_group == vector_group
@@ -71,10 +71,6 @@ def test_power_transformer_constructor_args():
]
-def test_power_transformer_info_accessor():
- validate_property_accessor(PowerTransformer, PowerTransformerInfo, PowerTransformer.power_transformer_info)
-
-
def test_get_end_by_terminal():
t1 = Terminal(mrid="t1")
t2 = Terminal(mrid="t2")
diff --git a/test/cim/iec61970/base/wires/test_power_transformer_end.py b/test/cim/iec61970/base/wires/test_power_transformer_end.py
index d20214776..1c183fa7b 100644
--- a/test/cim/iec61970/base/wires/test_power_transformer_end.py
+++ b/test/cim/iec61970/base/wires/test_power_transformer_end.py
@@ -5,37 +5,20 @@
import re
import pytest
-from pytest import raises
from hypothesis import given
-from hypothesis.strategies import builds, integers, floats, sampled_from
-
-from util import mrid_strategy
-from zepben.ewb import PowerTransformerEnd, PowerTransformer, WindingConnection, TransformerCoolingType, generate_id
-from zepben.ewb.model.cim.extensions.iec61970.base.wires.transformer_end_rated_s import TransformerEndRatedS
+from pytest import raises
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, FLOAT_MIN, FLOAT_MAX
+from cim.fill_fields import power_transformer_end_kwargs
from cim.iec61970.base.wires.test_transformer_end import verify_transformer_end_constructor_default, \
- verify_transformer_end_constructor_kwargs, verify_transformer_end_constructor_args, transformer_end_kwargs, transformer_end_args
+ verify_transformer_end_constructor_kwargs, verify_transformer_end_constructor_args, transformer_end_args
from cim.private_collection_validator import validate_unordered_other
+from util import assert_or_empty
+from zepben.ewb import PowerTransformerEnd, PowerTransformer, WindingConnection, TransformerCoolingType, generate_id
+from zepben.ewb.model.cim.extensions.iec61970.base.wires.transformer_end_rated_s import TransformerEndRatedS
-power_transformer_end_kwargs = {
- **transformer_end_kwargs,
- "power_transformer": builds(PowerTransformer, mrid=mrid_strategy),
- "rated_s": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "rated_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "r0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "g": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "g0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "b": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "b0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "connection_kind": sampled_from(WindingConnection),
- "phase_angle_clock": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
-}
-
-power_transformer_end_args = [*transformer_end_args, PowerTransformer(mrid=generate_id()), 1, 2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.01, WindingConnection.A, 11]
+power_transformer_end_args = [
+ *transformer_end_args, PowerTransformer(mrid=generate_id()), 1, 2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.01, WindingConnection.A, 11
+]
def test_power_transformer_end_constructor_default():
@@ -58,12 +41,26 @@ def test_power_transformer_end_constructor_default():
assert pte.phase_angle_clock is None
-@given(**power_transformer_end_kwargs)
-def test_power_transformer_end_constructor_kwargs(power_transformer, rated_s, rated_u, r, x, r0, x0, g, g0, b, b0, connection_kind, phase_angle_clock,
- **kwargs):
+@given(**power_transformer_end_kwargs())
+def test_power_transformer_end_constructor_kwargs(
+ power_transformer,
+ ratings,
+ rated_u,
+ r,
+ x,
+ r0,
+ x0,
+ g,
+ g0,
+ b,
+ b0,
+ connection_kind,
+ phase_angle_clock,
+ **kwargs
+):
pte = PowerTransformerEnd(
power_transformer=power_transformer,
- rated_s=rated_s,
+ ratings=ratings,
rated_u=rated_u,
r=r,
x=x,
@@ -80,9 +77,11 @@ def test_power_transformer_end_constructor_kwargs(power_transformer, rated_s, ra
verify_transformer_end_constructor_kwargs(pte, **kwargs)
assert pte.power_transformer == power_transformer
- assert pte.rated_s == rated_s
- # noinspection PyArgumentList
- assert list(pte.s_ratings) == [TransformerEndRatedS(TransformerCoolingType.UNKNOWN, rated_s)]
+ if ratings:
+ assert pte.rated_s == sorted(ratings, key=lambda it: it.rated_s, reverse=True)[0].rated_s
+ else:
+ assert pte.rated_s is None
+ assert_or_empty(pte.s_ratings, ratings, sorted_by=lambda it: it.rated_s, sort_reversed=True)
assert pte.rated_u == rated_u
assert pte.r == r
assert pte.x == x
diff --git a/test/cim/iec61970/base/wires/test_protected_switch.py b/test/cim/iec61970/base/wires/test_protected_switch.py
index 82bfa5248..5179db2cc 100644
--- a/test/cim/iec61970/base/wires/test_protected_switch.py
+++ b/test/cim/iec61970/base/wires/test_protected_switch.py
@@ -2,21 +2,12 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import integers, lists, builds
-from util import mrid_strategy
-from zepben.ewb import ProtectionRelayFunction, ProtectedSwitch, generate_id
-
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61970.base.wires.test_switch import switch_kwargs, verify_switch_constructor_default, verify_switch_constructor_kwargs, \
+from cim.iec61970.base.wires.test_switch import verify_switch_constructor_default, verify_switch_constructor_kwargs, \
verify_switch_constructor_args, switch_args
from cim.private_collection_validator import validate_unordered
+from zepben.ewb import ProtectionRelayFunction, ProtectedSwitch, generate_id
-protected_switch_kwargs = {
- **switch_kwargs,
- "breaking_capacity": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "relay_functions": lists(builds(ProtectionRelayFunction, mrid=mrid_strategy), max_size=2)
-}
protected_switch_args = [*switch_args, 1, [ProtectionRelayFunction(mrid=generate_id())]]
@@ -46,7 +37,7 @@ def verify_protected_switch_constructor_args(ps: ProtectedSwitch):
def test_relay_function_collection():
validate_unordered(
ProtectedSwitch,
- lambda mrid: ProtectionRelayFunction(mrid),
+ ProtectionRelayFunction,
ProtectedSwitch.relay_functions,
ProtectedSwitch.num_relay_functions,
ProtectedSwitch.get_relay_function,
diff --git a/test/cim/iec61970/base/wires/test_ratio_tap_changer.py b/test/cim/iec61970/base/wires/test_ratio_tap_changer.py
index 1c740d259..e7cd437b6 100644
--- a/test/cim/iec61970/base/wires/test_ratio_tap_changer.py
+++ b/test/cim/iec61970/base/wires/test_ratio_tap_changer.py
@@ -3,22 +3,13 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, floats
-from util import mrid_strategy
+from cim.fill_fields import ratio_tap_changer_kwargs
+from cim.iec61970.base.wires.test_tap_changer import verify_tap_changer_constructor_default, \
+ verify_tap_changer_constructor_kwargs, verify_tap_changer_constructor_args, tap_changer_args, assume_step_values
from zepben.ewb import generate_id
-from zepben.ewb.model.cim.iec61970.base.wires.transformer_end import TransformerEnd
from zepben.ewb.model.cim.iec61970.base.wires.ratio_tap_changer import RatioTapChanger
-
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-from cim.iec61970.base.wires.test_tap_changer import verify_tap_changer_constructor_default, \
- verify_tap_changer_constructor_kwargs, verify_tap_changer_constructor_args, tap_changer_kwargs, tap_changer_args, assume_step_values
-
-ratio_tap_changer_kwargs = {
- **tap_changer_kwargs,
- "transformer_end": builds(TransformerEnd, mrid=mrid_strategy),
- "step_voltage_increment": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
-}
+from zepben.ewb.model.cim.iec61970.base.wires.transformer_end import TransformerEnd
ratio_tap_changer_args = [*tap_changer_args, TransformerEnd(mrid=generate_id()), 1.1]
@@ -31,7 +22,7 @@ def test_ratio_tap_changer_constructor_default():
assert rtc.step_voltage_increment is None
-@given(**ratio_tap_changer_kwargs)
+@given(**ratio_tap_changer_kwargs())
def test_ratio_tap_changer_constructor_kwargs(transformer_end, step_voltage_increment, **kwargs):
assume_step_values(kwargs["high_step"], kwargs["low_step"], kwargs["neutral_step"], kwargs["normal_step"], kwargs["step"])
diff --git a/test/cim/iec61970/base/wires/test_reactive_capability_curve.py b/test/cim/iec61970/base/wires/test_reactive_capability_curve.py
index f1b55597f..7aeb188f4 100644
--- a/test/cim/iec61970/base/wires/test_reactive_capability_curve.py
+++ b/test/cim/iec61970/base/wires/test_reactive_capability_curve.py
@@ -3,12 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from zepben.ewb import ReactiveCapabilityCurve
-from cim.iec61970.base.core.test_curve import curve_kwargs, curve_args, verify_curve_constructor_default, verify_curve_constructor_kwargs, \
+from cim.fill_fields import reactive_capability_curve_kwargs
+from cim.iec61970.base.core.test_curve import curve_args, verify_curve_constructor_default, verify_curve_constructor_kwargs, \
verify_curve_constructor_args
+from zepben.ewb import ReactiveCapabilityCurve
-reactive_capability_curve_kwargs = curve_kwargs
reactive_capability_curve_args = curve_args
@@ -16,7 +16,7 @@ def verify_reactive_capability_curve_constructor_default():
verify_curve_constructor_default(ReactiveCapabilityCurve())
-@given(**reactive_capability_curve_kwargs)
+@given(**reactive_capability_curve_kwargs())
def verify_reactive_capability_curve_constructor_kwargs(**kwargs):
verify_curve_constructor_kwargs(ReactiveCapabilityCurve(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/wires/test_recloser.py b/test/cim/iec61970/base/wires/test_recloser.py
index c4747c311..cc44b170f 100644
--- a/test/cim/iec61970/base/wires/test_recloser.py
+++ b/test/cim/iec61970/base/wires/test_recloser.py
@@ -4,11 +4,11 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
+from cim.fill_fields import recloser_kwargs
from cim.iec61970.base.wires.test_protected_switch import verify_protected_switch_constructor_default, \
- verify_protected_switch_constructor_kwargs, verify_protected_switch_constructor_args, protected_switch_kwargs, protected_switch_args
+ verify_protected_switch_constructor_kwargs, verify_protected_switch_constructor_args, protected_switch_args
from zepben.ewb import Recloser, generate_id
-recloser_kwargs = protected_switch_kwargs
recloser_args = protected_switch_args
@@ -16,7 +16,7 @@ def test_recloser_constructor_default():
verify_protected_switch_constructor_default(Recloser(mrid=generate_id()))
-@given(**recloser_kwargs)
+@given(**recloser_kwargs())
def test_recloser_constructor_kwargs(**kwargs):
verify_protected_switch_constructor_kwargs(Recloser(**kwargs), **kwargs)
diff --git a/test/cim/iec61970/base/wires/test_regulating_cond_eq.py b/test/cim/iec61970/base/wires/test_regulating_cond_eq.py
index 62082e7a3..2bdea61b4 100644
--- a/test/cim/iec61970/base/wires/test_regulating_cond_eq.py
+++ b/test/cim/iec61970/base/wires/test_regulating_cond_eq.py
@@ -3,19 +3,9 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import booleans, builds
-
-from util import mrid_strategy
-from zepben.ewb import RegulatingCondEq, RegulatingControl, generate_id
-
-from cim.iec61970.base.wires.test_energy_connection import energy_connection_kwargs, verify_energy_connection_constructor_default, \
+from cim.iec61970.base.wires.test_energy_connection import verify_energy_connection_constructor_default, \
verify_energy_connection_constructor_kwargs, verify_energy_connection_constructor_args, energy_connection_args
-
-regulating_cond_eq_kwargs = {
- **energy_connection_kwargs,
- "control_enabled": booleans(),
- "regulating_control": builds(RegulatingControl, mrid=mrid_strategy)
-}
+from zepben.ewb import RegulatingCondEq, RegulatingControl, generate_id
regulating_cond_eq_args = [*energy_connection_args, False, RegulatingControl(mrid=generate_id())]
diff --git a/test/cim/iec61970/base/wires/test_regulating_control.py b/test/cim/iec61970/base/wires/test_regulating_control.py
index ac8d1dc60..f9895da3b 100644
--- a/test/cim/iec61970/base/wires/test_regulating_control.py
+++ b/test/cim/iec61970/base/wires/test_regulating_control.py
@@ -2,32 +2,12 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import booleans, sampled_from, floats, builds, lists
-from cim.cim_creators import sampled_phase_code, FLOAT_MAX, FLOAT_MIN
from cim.iec61970.base.core.test_power_system_resource import power_system_resource_args, verify_power_system_resource_constructor_default, \
- verify_power_system_resource_constructor_kwargs, power_system_resource_kwargs, verify_power_system_resource_constructor_args
+ verify_power_system_resource_constructor_kwargs, verify_power_system_resource_constructor_args
from cim.private_collection_validator import validate_unordered
-from util import mrid_strategy
from zepben.ewb import RegulatingControlModeKind, Terminal, PowerElectronicsConnection, PhaseCode, RegulatingControl, RegulatingCondEq, generate_id
-regulating_control_kwargs = {
- **power_system_resource_kwargs,
- "discrete": booleans(),
- "mode": sampled_from(RegulatingControlModeKind),
- "monitored_phase": sampled_phase_code(),
- "target_deadband": floats(min_value=0.0, max_value=FLOAT_MAX),
- "target_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "enabled": booleans(),
- "max_allowed_target_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "min_allowed_target_value": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "rated_current": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "terminal": builds(Terminal, mrid=mrid_strategy),
- "ct_primary": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "min_target_deadband": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "regulating_conducting_equipment": lists(builds(PowerElectronicsConnection, mrid=mrid_strategy), max_size=2)
-}
-
regulating_control_args = [
*power_system_resource_args,
False,
@@ -119,7 +99,7 @@ def test_regulating_control_regulating_conducting_equipment():
# noinspection PyArgumentList
validate_unordered(
RegulatingControl,
- lambda mrid: RegulatingCondEq(mrid),
+ RegulatingCondEq,
RegulatingControl.regulating_conducting_equipment,
RegulatingControl.num_regulating_cond_eq,
RegulatingControl.get_regulating_cond_eq,
diff --git a/test/cim/iec61970/base/wires/test_rotating_machine.py b/test/cim/iec61970/base/wires/test_rotating_machine.py
index 6c6cafe14..09dd75e61 100644
--- a/test/cim/iec61970/base/wires/test_rotating_machine.py
+++ b/test/cim/iec61970/base/wires/test_rotating_machine.py
@@ -2,21 +2,9 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import floats, one_of, none, integers
-from zepben.ewb import RotatingMachine
-
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX, MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61970.base.wires.test_regulating_cond_eq import regulating_cond_eq_kwargs, regulating_cond_eq_args, \
+from cim.iec61970.base.wires.test_regulating_cond_eq import regulating_cond_eq_args, \
verify_regulating_cond_eq_constructor_default, verify_regulating_cond_eq_constructor_kwargs, verify_regulating_cond_eq_constructor_args
-
-rotating_machine_kwargs = {
- **regulating_cond_eq_kwargs,
- "rated_power_factor": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "rated_s": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "rated_u": one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)),
- "p": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "q": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
-}
+from zepben.ewb import RotatingMachine
rotating_machine_args = [*regulating_cond_eq_args, 1.1, 2.2, 3, 4.4, 5.5]
diff --git a/test/cim/iec61970/base/wires/test_series_compensator.py b/test/cim/iec61970/base/wires/test_series_compensator.py
index 5a08a56df..0378486de 100644
--- a/test/cim/iec61970/base/wires/test_series_compensator.py
+++ b/test/cim/iec61970/base/wires/test_series_compensator.py
@@ -4,22 +4,11 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats, integers
-from zepben.ewb import SeriesCompensator, generate_id
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX, MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
+from cim.fill_fields import series_compensator_kwargs
from cim.iec61970.base.core.test_conducting_equipment import verify_conducting_equipment_constructor_default, \
- verify_conducting_equipment_constructor_kwargs, verify_conducting_equipment_constructor_args, conducting_equipment_kwargs, conducting_equipment_args
-
-series_compensator_kwargs = {
- **conducting_equipment_kwargs,
- "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "r0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "varistor_rated_current": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "varistor_voltage_threshold": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
-}
+ verify_conducting_equipment_constructor_kwargs, verify_conducting_equipment_constructor_args, conducting_equipment_args
+from zepben.ewb import SeriesCompensator, generate_id
series_compensator_args = [*conducting_equipment_args, 1.1, 2.2, 3.3, 4.4, 5, 6]
@@ -36,7 +25,7 @@ def test_series_compensator_constructor_default():
assert sc.varistor_voltage_threshold is None
-@given(**series_compensator_kwargs)
+@given(**series_compensator_kwargs())
def test_series_compensator_constructor_kwargs(r, r0, x, x0, varistor_rated_current, varistor_voltage_threshold, **kwargs):
sc = SeriesCompensator(
r=r,
diff --git a/test/cim/iec61970/base/wires/test_shunt_compensator.py b/test/cim/iec61970/base/wires/test_shunt_compensator.py
index 29b87c506..c50c59054 100644
--- a/test/cim/iec61970/base/wires/test_shunt_compensator.py
+++ b/test/cim/iec61970/base/wires/test_shunt_compensator.py
@@ -3,24 +3,9 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import floats, booleans, integers, sampled_from, builds
-
-from util import mrid_strategy
-from zepben.ewb import ShuntCompensator, PhaseShuntConnectionKind, ShuntCompensatorInfo, Terminal, generate_id
-
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61970.base.wires.test_regulating_cond_eq import regulating_cond_eq_kwargs, verify_regulating_cond_eq_constructor_default, \
+from cim.iec61970.base.wires.test_regulating_cond_eq import verify_regulating_cond_eq_constructor_default, \
verify_regulating_cond_eq_constructor_kwargs, verify_regulating_cond_eq_constructor_args, regulating_cond_eq_args
-from cim.property_validator import validate_property_accessor
-
-shunt_compensator_kwargs = {
- **regulating_cond_eq_kwargs,
- "grounded": booleans(),
- "nom_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "phase_connection": sampled_from(PhaseShuntConnectionKind),
- "grounding_terminal": builds(Terminal, mrid=mrid_strategy),
- "sections": floats(min_value=-100.0, max_value=100.0),
-}
+from zepben.ewb import ShuntCompensator, PhaseShuntConnectionKind, Terminal, generate_id
shunt_compensator_args = [*regulating_cond_eq_args, True, 1, PhaseShuntConnectionKind.G, Terminal(mrid=generate_id()), 2.2]
@@ -52,7 +37,3 @@ def verify_shunt_compensator_constructor_args(sc: ShuntCompensator):
sc.grounding_terminal,
sc.sections,
]
-
-
-def test_shunt_compensator_info_accessor():
- validate_property_accessor(ShuntCompensator, ShuntCompensatorInfo, ShuntCompensator.shunt_compensator_info)
diff --git a/test/cim/iec61970/base/wires/test_static_var_compensator.py b/test/cim/iec61970/base/wires/test_static_var_compensator.py
index f5066ad96..bdea775d1 100644
--- a/test/cim/iec61970/base/wires/test_static_var_compensator.py
+++ b/test/cim/iec61970/base/wires/test_static_var_compensator.py
@@ -3,21 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats, integers, sampled_from
-from zepben.ewb import SVCControlMode, StaticVarCompensator, generate_id
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, FLOAT_MAX, FLOAT_MIN
-from cim.iec61970.base.wires.test_regulating_cond_eq import regulating_cond_eq_kwargs, verify_regulating_cond_eq_constructor_default, \
+from cim.fill_fields import static_var_compensator_kwargs
+from cim.iec61970.base.wires.test_regulating_cond_eq import verify_regulating_cond_eq_constructor_default, \
verify_regulating_cond_eq_constructor_kwargs, verify_regulating_cond_eq_constructor_args, regulating_cond_eq_args
-
-static_var_compensator_kwargs = {
- **regulating_cond_eq_kwargs,
- "capacitive_rating": floats(min_value=0, max_value=FLOAT_MAX),
- "inductive_rating": floats(min_value=FLOAT_MIN, max_value=0),
- "q": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "svc_control_mode": sampled_from(SVCControlMode),
- "voltage_set_point": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
-}
+from zepben.ewb import SVCControlMode, StaticVarCompensator, generate_id
static_var_compensator_args = [*regulating_cond_eq_args, 1.0, -1.0, 2.0, SVCControlMode.voltage, 3]
@@ -32,7 +22,7 @@ def test_static_var_compensator_constructor_default():
assert svc.voltage_set_point is None
-@given(**static_var_compensator_kwargs)
+@given(**static_var_compensator_kwargs())
def test_static_var_compensator_constructor_kwargs(capacitive_rating, inductive_rating, q, svc_control_mode, voltage_set_point, **kwargs):
svc = StaticVarCompensator(
capacitive_rating=capacitive_rating,
diff --git a/test/cim/iec61970/base/wires/test_switch.py b/test/cim/iec61970/base/wires/test_switch.py
index 6e592c63a..3dae36a38 100644
--- a/test/cim/iec61970/base/wires/test_switch.py
+++ b/test/cim/iec61970/base/wires/test_switch.py
@@ -2,20 +2,9 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from hypothesis.strategies import integers, floats
-from zepben.ewb import Switch, SinglePhaseKind, SwitchInfo, generate_id
-
-from cim.cim_creators import MAX_32_BIT_INTEGER
-from cim.iec61970.base.core.test_conducting_equipment import conducting_equipment_kwargs, verify_conducting_equipment_constructor_default, \
+from cim.iec61970.base.core.test_conducting_equipment import verify_conducting_equipment_constructor_default, \
verify_conducting_equipment_constructor_kwargs, verify_conducting_equipment_constructor_args, conducting_equipment_args
-from cim.property_validator import validate_property_accessor
-
-switch_kwargs = {
- **conducting_equipment_kwargs,
- "rated_current": floats(min_value=0, max_value=MAX_32_BIT_INTEGER),
- "_open": integers(min_value=0, max_value=15),
- "_normally_open": integers(min_value=0, max_value=15),
-}
+from zepben.ewb import Switch, SinglePhaseKind, generate_id
switch_args = [*conducting_equipment_args, 1.1, 2, 3]
@@ -46,10 +35,6 @@ def verify_switch_constructor_args(s: Switch):
]
-def test_switch_info_accessor():
- validate_property_accessor(Switch, SwitchInfo, Switch.switch_info)
-
-
def test_open_states():
_validate_open_phase(Switch.is_open, Switch.set_open)
_validate_open_phase(Switch.is_normally_open, Switch.set_normally_open)
diff --git a/test/cim/iec61970/base/wires/test_synchronous_machine.py b/test/cim/iec61970/base/wires/test_synchronous_machine.py
index 830f2efda..93f313aab 100644
--- a/test/cim/iec61970/base/wires/test_synchronous_machine.py
+++ b/test/cim/iec61970/base/wires/test_synchronous_machine.py
@@ -3,41 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats, one_of, none, booleans, integers, sampled_from, lists, builds
-from util import mrid_strategy
-from zepben.ewb import SynchronousMachine, SynchronousMachineKind, ReactiveCapabilityCurve
-
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX, MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61970.base.wires.test_rotating_machine import rotating_machine_kwargs, rotating_machine_args, \
+from cim.fill_fields import synchronous_machine_kwargs
+from cim.iec61970.base.wires.test_rotating_machine import rotating_machine_args, \
verify_rotating_machine_constructor_default, verify_rotating_machine_constructor_kwargs, verify_rotating_machine_constructor_args
from cim.private_collection_validator import validate_unordered
-
-synchronous_machine_kwargs = {
- **rotating_machine_kwargs,
- "curves": lists(builds(ReactiveCapabilityCurve, mrid=mrid_strategy), max_size=2),
- "base_q": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "condenser_p": one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)),
- "earthing": booleans(),
- "earthing_star_point_r": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "earthing_star_point_x": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "ikk": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "max_q": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "max_u": one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)),
- "min_q": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "min_u": one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)),
- "mu": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "r": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "r0": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "r2": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "sat_direct_subtrans_x": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "sat_direct_sync_x": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "sat_direct_trans_x": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "x0": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "x2": one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- "type": sampled_from(SynchronousMachineKind),
- "operating_mode": sampled_from(SynchronousMachineKind)
-}
+from zepben.ewb import SynchronousMachine, SynchronousMachineKind, ReactiveCapabilityCurve
synchronous_machine_args = [*rotating_machine_args, [ReactiveCapabilityCurve(mrid="rcc1"), ReactiveCapabilityCurve(mrid="rcc2")], 1.1, 2, True, 3.3, 4.4, 5.5,
6.6, 7, 8.8, 9, 10.10, 11.11, 12.12, 13.13, 14.14, 15.15, 16.16, 17.17, 18.18, SynchronousMachineKind.generatorOrMotor,
@@ -73,7 +44,7 @@ def verify_synchronous_machine_constructor_default():
# noinspection PyShadowingBuiltins
-@given(**synchronous_machine_kwargs)
+@given(**synchronous_machine_kwargs())
def verify_synchronous_machine_constructor_kwargs(
curves,
base_q,
@@ -183,7 +154,7 @@ def verify_synchronous_machine_constructor_args():
def test_curves_collection():
validate_unordered(
SynchronousMachine,
- lambda mrid: ReactiveCapabilityCurve(mrid),
+ ReactiveCapabilityCurve,
SynchronousMachine.curves,
SynchronousMachine.num_curves,
SynchronousMachine.get_curve,
diff --git a/test/cim/iec61970/base/wires/test_tap_changer.py b/test/cim/iec61970/base/wires/test_tap_changer.py
index fafb111ef..95cd4a25a 100644
--- a/test/cim/iec61970/base/wires/test_tap_changer.py
+++ b/test/cim/iec61970/base/wires/test_tap_changer.py
@@ -5,29 +5,13 @@
import re
from hypothesis import assume
-from hypothesis.strategies import floats, booleans, integers, builds
from pytest import raises
-from util import mrid_strategy
+from cim.iec61970.base.core.test_power_system_resource import verify_power_system_resource_constructor_default, \
+ verify_power_system_resource_constructor_kwargs, verify_power_system_resource_constructor_args, power_system_resource_args
from zepben.ewb import TapChangerControl, generate_id
from zepben.ewb.model.cim.iec61970.base.wires.tap_changer import TapChanger
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61970.base.core.test_power_system_resource import power_system_resource_kwargs, verify_power_system_resource_constructor_default, \
- verify_power_system_resource_constructor_kwargs, verify_power_system_resource_constructor_args, power_system_resource_args
-
-tap_changer_kwargs = {
- **power_system_resource_kwargs,
- "control_enabled": booleans(),
- "neutral_u": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "tap_changer_control": builds(TapChangerControl, mrid=mrid_strategy),
- "high_step": integers(min_value=100, max_value=MAX_32_BIT_INTEGER),
- "low_step": integers(min_value=MIN_32_BIT_INTEGER, max_value=-100),
- "neutral_step": integers(min_value=-100, max_value=100),
- "normal_step": integers(min_value=-100, max_value=100),
- "step": floats(min_value=-100.0, max_value=100.0)
-}
-
tap_changer_args = [*power_system_resource_args, False, 1, TapChangerControl(mrid=generate_id()), 10, 2, 3, 4, 5.5]
diff --git a/test/cim/iec61970/base/wires/test_tap_changer_control.py b/test/cim/iec61970/base/wires/test_tap_changer_control.py
index da5694d30..d4eae5be4 100644
--- a/test/cim/iec61970/base/wires/test_tap_changer_control.py
+++ b/test/cim/iec61970/base/wires/test_tap_changer_control.py
@@ -3,25 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import integers, floats
-from zepben.ewb import TapChangerControl, generate_id
-from cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, FLOAT_MIN, FLOAT_MAX, boolean_or_none
-from cim.iec61970.base.wires.test_regulating_control import regulating_control_kwargs, regulating_control_args, verify_regulating_control_constructor_default, \
+from cim.fill_fields import tap_changer_control_kwargs
+from cim.iec61970.base.wires.test_regulating_control import regulating_control_args, verify_regulating_control_constructor_default, \
verify_regulating_control_constructor_kwargs, verify_regulating_control_constructor_args
-
-tap_changer_control_kwargs = {
- **regulating_control_kwargs,
- "limit_voltage": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "line_drop_compensation": boolean_or_none(),
- "line_drop_r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "line_drop_x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "reverse_line_drop_r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "reverse_line_drop_x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "forward_ldc_blocking": boolean_or_none(),
- "time_delay": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "co_generation_enabled": boolean_or_none()
-}
+from zepben.ewb import TapChangerControl, generate_id
tap_changer_control_args = [*regulating_control_args, 1, False, 2.2, 3.3, 4.4, 5.5, True, 6.6, False]
@@ -42,7 +28,7 @@ def test_tap_changer_control_constructor_default():
assert tcc.co_generation_enabled is None
-@given(**tap_changer_control_kwargs)
+@given(**tap_changer_control_kwargs())
def test_tap_changer_control_constructor_kwargs(
limit_voltage,
line_drop_compensation,
diff --git a/test/cim/iec61970/base/wires/test_transformer_end.py b/test/cim/iec61970/base/wires/test_transformer_end.py
index 1422cad24..94adcb1ac 100644
--- a/test/cim/iec61970/base/wires/test_transformer_end.py
+++ b/test/cim/iec61970/base/wires/test_transformer_end.py
@@ -3,28 +3,12 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from pytest import raises
-from hypothesis.strategies import floats, booleans, builds, integers
-from util import mrid_strategy
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
+ verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
from zepben.ewb import Terminal, BaseVoltage, TransformerStarImpedance, PowerTransformer, Fuse, generate_id
-from zepben.ewb.model.cim.iec61970.base.wires.transformer_end import TransformerEnd
from zepben.ewb.model.cim.iec61970.base.wires.ratio_tap_changer import RatioTapChanger
-
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX, MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
- verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
-
-transformer_end_kwargs = {
- **identified_object_kwargs,
- "grounded": booleans(),
- "r_ground": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x_ground": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "ratio_tap_changer": builds(RatioTapChanger, mrid=mrid_strategy),
- "terminal": builds(Terminal, mrid=mrid_strategy),
- "base_voltage": builds(BaseVoltage, mrid=mrid_strategy),
- "end_number": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- "star_impedance": builds(TransformerStarImpedance, mrid=mrid_strategy)
-}
+from zepben.ewb.model.cim.iec61970.base.wires.transformer_end import TransformerEnd
transformer_end_args = [
*identified_object_args,
diff --git a/test/cim/iec61970/base/wires/test_transformer_star_impedance.py b/test/cim/iec61970/base/wires/test_transformer_star_impedance.py
index 3df767930..3b3983dd9 100644
--- a/test/cim/iec61970/base/wires/test_transformer_star_impedance.py
+++ b/test/cim/iec61970/base/wires/test_transformer_star_impedance.py
@@ -3,23 +3,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import floats, builds
-from util import mrid_strategy
-from zepben.ewb import TransformerStarImpedance, TransformerEndInfo, generate_id
-
-from cim.cim_creators import FLOAT_MIN, FLOAT_MAX
-from cim.iec61970.base.core.test_identified_object import identified_object_kwargs, verify_identified_object_constructor_default, \
+from cim.fill_fields import transformer_star_impedance_kwargs
+from cim.iec61970.base.core.test_identified_object import verify_identified_object_constructor_default, \
verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args
-
-transformer_star_impedance_kwargs = {
- **identified_object_kwargs,
- "r": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "r0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "x0": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- "transformer_end_info": builds(TransformerEndInfo, mrid=mrid_strategy)
-}
+from zepben.ewb import TransformerStarImpedance, TransformerEndInfo, generate_id
transformer_star_impedance_args = [*identified_object_args, 1.1, 2.2, 3.3, 4.4, TransformerEndInfo(mrid=generate_id())]
@@ -35,7 +23,7 @@ def test_transformer_star_impedance_constructor_default():
assert not tsi.transformer_end_info
-@given(**transformer_star_impedance_kwargs)
+@given(**transformer_star_impedance_kwargs())
def test_transformer_star_impedance_constructor_kwargs(r, r0, x, x0, transformer_end_info, **kwargs):
tsi = TransformerStarImpedance(
r=r,
diff --git a/test/cim/iec61970/infiec61970/feeder/test_circuit.py b/test/cim/iec61970/infiec61970/feeder/test_circuit.py
index 0a39e7012..5b2761b01 100644
--- a/test/cim/iec61970/infiec61970/feeder/test_circuit.py
+++ b/test/cim/iec61970/infiec61970/feeder/test_circuit.py
@@ -4,21 +4,12 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
-from hypothesis.strategies import builds, lists
-from util import mrid_strategy
-from zepben.ewb import Circuit, Loop, Terminal, Substation, generate_id
-
-from cim.iec61970.base.wires.test_line import verify_line_constructor_default, verify_line_constructor_kwargs, verify_line_constructor_args, line_kwargs, \
+from cim.fill_fields import circuit_kwargs
+from cim.iec61970.base.wires.test_line import verify_line_constructor_default, verify_line_constructor_kwargs, verify_line_constructor_args, \
line_args
from cim.private_collection_validator import validate_unordered
-
-circuit_kwargs = {
- **line_kwargs,
- "loop": builds(Loop, mrid=mrid_strategy),
- "end_terminals": lists(builds(Terminal, mrid=mrid_strategy)),
- "end_substations": lists(builds(Substation, mrid=mrid_strategy))
-}
+from zepben.ewb import Circuit, Loop, Terminal, Substation, generate_id
circuit_args = [*line_args, Loop(mrid=generate_id()), [Terminal(mrid=generate_id())], [Substation(mrid=generate_id())]]
@@ -32,7 +23,7 @@ def test_circuit_constructor_default():
assert not list(c.end_substations)
-@given(**circuit_kwargs)
+@given(**circuit_kwargs())
def test_circuit_constructor_kwargs(loop, end_terminals, end_substations, **kwargs):
c = Circuit(loop=loop, end_terminals=end_terminals, end_substations=end_substations, **kwargs)
diff --git a/test/cim/iec61970/infiec61970/wires/generation/production/test_ev_charging_unit.py b/test/cim/iec61970/infiec61970/wires/generation/production/test_ev_charging_unit.py
index 03fa927cd..fbc36baf7 100644
--- a/test/cim/iec61970/infiec61970/wires/generation/production/test_ev_charging_unit.py
+++ b/test/cim/iec61970/infiec61970/wires/generation/production/test_ev_charging_unit.py
@@ -4,11 +4,11 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from hypothesis import given
+from cim.fill_fields import ev_charging_unit_kwargs
from cim.iec61970.base.wires.generation.production.test_power_electronics_unit import verify_power_electronics_unit_constructor_default, \
- verify_power_electronics_unit_constructor_args, verify_power_electronics_unit_constructor_kwargs, power_electronics_unit_kwargs, power_electronics_unit_args
+ verify_power_electronics_unit_constructor_args, verify_power_electronics_unit_constructor_kwargs, power_electronics_unit_args
from zepben.ewb import EvChargingUnit, generate_id
-ev_charging_unit_kwargs = power_electronics_unit_kwargs
ev_charging_unit_args = power_electronics_unit_args
@@ -16,7 +16,7 @@ def test_ev_charging_unit_constructor_default():
verify_power_electronics_unit_constructor_default(EvChargingUnit(mrid=generate_id()))
-@given(**ev_charging_unit_kwargs)
+@given(**ev_charging_unit_kwargs())
def test_ev_charging_unit_constructor_kwargs(**kwargs):
verify_power_electronics_unit_constructor_kwargs(EvChargingUnit(**kwargs), **kwargs)
diff --git a/test/cim/private_collection_validator.py b/test/cim/private_collection_validator.py
index 372c4d5ca..5e2ed5b98 100644
--- a/test/cim/private_collection_validator.py
+++ b/test/cim/private_collection_validator.py
@@ -6,7 +6,6 @@
from collections import Counter
from enum import Enum
from typing import TypeVar, Callable, Generator, List, Dict, Union, Type, Tuple, Any
-from unittest import case
import pytest
@@ -37,44 +36,44 @@ class DuplicateBehaviour(Enum):
def validate_unordered(
- create_it: Union[Callable[[str], TIdentifiedObject], Type[IdentifiedObject]],
- create_other: Callable[[str], UIdentifiedObject],
- get_all: property, # Callable[[TIdentifiedObject], Generator[UIdentifiedObject, None, None]]
- num: Callable[..., int], # Callable[[TIdentifiedObject], int]
- get_by_id: Callable[..., UIdentifiedObject], # Callable[[TIdentifiedObject, str], UIdentifiedObject]
- add: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject, UIdentifiedObject], TIdentifiedObject]
- remove: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject, UIdentifiedObject], TIdentifiedObject]
- clear: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject], TIdentifiedObject]
+ create_it: Type[IdentifiedObject] | Callable[[str], TIdentifiedObject],
+ create_other: Type[UIdentifiedObject] | Callable[[str], UIdentifiedObject],
+ get_all: Callable[[TIdentifiedObject], Generator[UIdentifiedObject, None, None]] | Callable[[], Generator[UIdentifiedObject, None, None]] | property,
+ num: Callable[[TIdentifiedObject], int] | Callable[[], int],
+ get_by_id: Callable[[TIdentifiedObject, str], UIdentifiedObject] | Callable[[str], UIdentifiedObject],
+ add: Callable[[TIdentifiedObject, UIdentifiedObject], TIdentifiedObject] | Callable[[UIdentifiedObject], TIdentifiedObject],
+ remove: Callable[[TIdentifiedObject, UIdentifiedObject], TIdentifiedObject] | Callable[[UIdentifiedObject], TIdentifiedObject],
+ clear: Callable[[TIdentifiedObject], TIdentifiedObject] | Callable[[], TIdentifiedObject],
):
"""
Validate the internal collection for an associated :class:`IdentifiedObject` that has no order significance.
- NOTE: The callables using `...` do so to work around bugs in the type checking of both the IDE and mypy, where passing a reference to the
- class method doesn't recognise it needs the `self` parameter, and therefore marks the parameter as having the incorrect type. Actual
- signatures are stored in comments against the arguments.
+ NOTE: The callables below use unions with a second callable to work around bugs in the type checking of both the IDE and mypy, where passing a reference to
+ the class method doesn't recognise it needs the `self` parameter, and would otherwise mark the parameter as having the incorrect type. If we move to a
+ newer version where this is resolved, the second callable should be removed.
"""
_validate_unordered(create_it, create_other, get_all.fget, num, get_by_id, add, remove, clear)
def validate_unordered_other(
- create_it: Union[Callable[[str], TIdentifiedObject], Type[IdentifiedObject]],
+ create_it: Union[Callable[[str], TIdentifiedObject], Type[TIdentifiedObject]],
create_other: Callable[[int], UOther],
- get_all: property, # Callable[[TIdentifiedObject], Generator[UOther, None, None]]
- num: Callable[..., int], # Callable[[TIdentifiedObject], int]
- get_by_key: Callable[..., UOther], # Callable[[TIdentifiedObject, K], UOther]
- add: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject, UOther], TIdentifiedObject]
- remove: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject, UOther], TIdentifiedObject]
- clear: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject], TIdentifiedObject]
- get_key: Callable[..., K], # Callable[[UOther], K]
+ get_all: Callable[[TIdentifiedObject], Generator[UOther, None, None]] | Callable[[], Generator[UOther, None, None]] | property,
+ num: Callable[[TIdentifiedObject], int] | Callable[[], int],
+ get_by_key: Callable[[TIdentifiedObject, K], UOther] | Callable[[K], UOther],
+ add: Callable[[TIdentifiedObject, UOther], TIdentifiedObject] | Callable[[UOther], TIdentifiedObject],
+ remove: Callable[[TIdentifiedObject, UOther], TIdentifiedObject] | Callable[[UOther], TIdentifiedObject],
+ clear: Callable[[TIdentifiedObject], TIdentifiedObject] | Callable[[], TIdentifiedObject],
+ get_key: Callable[[UOther], K] | Callable[[], K],
key_to_str: Callable[[K], str] = str,
duplicate_behaviour: Type[DuplicateBehaviour] = DuplicateBehaviour.THROWS,
):
"""
Validate the internal collection for an associated object that is not an [IdentifiedObject] that has no order significance.
- NOTE: The callables using `...` do so to work around bugs in the type checking of both the IDE and mypy, where passing a reference to the
- class method doesn't recognise it needs the `self` parameter, and therefore marks the parameter as having the incorrect type. Actual
- signatures are stored in comments against the arguments.
+ NOTE: The callables below use unions with a second callable to work around bugs in the type checking of both the IDE and mypy, where passing a reference to
+ the class method doesn't recognise it needs the `self` parameter, and would otherwise mark the parameter as having the incorrect type. If we move to a
+ newer version where this is resolved, the second callable should be removed.
"""
_validate_unordered_other(create_it, create_other, get_all.fget, num, get_by_key, add, remove, clear, get_key, key_to_str, duplicate_behaviour)
@@ -82,14 +81,14 @@ class method doesn't recognise it needs the `self` parameter, and therefore mark
def validate_ordered(
create_it: Union[Callable[[str], TIdentifiedObject], Type[IdentifiedObject]],
create_other: Callable[[str, int], UIdentifiedObject],
- get_all: property, # Callable[[TIdentifiedObject], Generator[UIdentifiedObject, None, None]]
- num: Callable[..., int], # Callable[[TIdentifiedObject], int]
- get_by_id: Callable[..., UIdentifiedObject], # Callable[[TIdentifiedObject, str], UIdentifiedObject]
- get_by_index: Callable[..., UIdentifiedObject], # Callable[[TIdentifiedObject, int], UIdentifiedObject]
- add: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject, UIdentifiedObject], TIdentifiedObject]
- remove: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject, UIdentifiedObject], TIdentifiedObject]
- clear: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject], TIdentifiedObject]
- index_of: Callable[..., int], # Callable[[UIdentifiedObject], int]
+ get_all: Callable[[TIdentifiedObject], Generator[UIdentifiedObject, None, None]] | Callable[[], Generator[UIdentifiedObject, None, None]] | property,
+ num: Callable[[TIdentifiedObject], int] | Callable[[], int],
+ get_by_id: Callable[[TIdentifiedObject, str], UIdentifiedObject] | Callable[[str], UIdentifiedObject],
+ get_by_index: Callable[[TIdentifiedObject, int], UIdentifiedObject] | Callable[[int], UIdentifiedObject],
+ add: Callable[[TIdentifiedObject, UIdentifiedObject], TIdentifiedObject] | Callable[[UIdentifiedObject], TIdentifiedObject],
+ remove: Callable[[TIdentifiedObject, UIdentifiedObject], TIdentifiedObject] | Callable[[UIdentifiedObject], TIdentifiedObject],
+ clear: Callable[[TIdentifiedObject], TIdentifiedObject] | Callable[[], TIdentifiedObject],
+ index_of: Callable[[UIdentifiedObject], int] | Callable[[], int]
):
"""
Validate the internal collection for an associated :class:`IdentifiedObject` that has order significance, baked into the object itself, not just
@@ -97,9 +96,9 @@ def validate_ordered(
NOTE: Baked in index is expected to be 1-based, not 0-based.
- NOTE: The callables using `...` do so to work around bugs in the type checking of both the IDE and mypy, where passing a reference to the
- class method doesn't recognise it needs the `self` parameter, and therefore marks the parameter as having the incorrect type. Actual
- signatures are stored in comments against the arguments.
+ NOTE: The callables below use unions with a second callable to work around bugs in the type checking of both the IDE and mypy, where passing a reference to
+ the class method doesn't recognise it needs the `self` parameter, and would otherwise mark the parameter as having the incorrect type. If we move to a
+ newer version where this is resolved, the second callable should be removed.
"""
_validate_ordered(create_it, create_other, get_all.fget, num, get_by_id, get_by_index, add, remove, clear, index_of)
@@ -107,24 +106,24 @@ class method doesn't recognise it needs the `self` parameter, and therefore mark
def validate_ordered_other(
create_it: Union[Callable[[str], TIdentifiedObject], Type[IdentifiedObject]],
create_other: Callable[[int], UOther],
- get_all: property, # Callable[[TIdentifiedObject], Generator[UOther, None, None]]
- num: Callable[..., int], # Callable[[TIdentifiedObject], int]
- get_by_index: Callable[..., UOther], # Callable[[TIdentifiedObject, int], UOther]
- for_each: Callable[..., None], # Callable[[TIdentifiedObject, Callable[[int, UOther], None]], None]
- add: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject, UOther], TIdentifiedObject]
- add_with_index: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject, UOther, int], TIdentifiedObject]
- remove: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject, UOther], TIdentifiedObject]
- remove_at_index: Callable[..., UOther], # Callable[[TIdentifiedObject, int], UOther]
- clear: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject], TIdentifiedObject]
+ get_all: Callable[[TIdentifiedObject], Generator[UOther, None, None]] | Callable[[], Generator[UOther, None, None]] | property,
+ num: Callable[[TIdentifiedObject], int] | Callable[[], int],
+ get_by_index: Callable[[TIdentifiedObject, int], UOther] | Callable[[int], UOther],
+ for_each: Callable[[TIdentifiedObject, Callable[[int, UOther], Any]], Any] | Callable[[Callable[[int, UOther], None]], Any],
+ add: Callable[[TIdentifiedObject, UOther], TIdentifiedObject] | Callable[[UOther], TIdentifiedObject],
+ add_with_index: Callable[[TIdentifiedObject, UOther, int], TIdentifiedObject] | Callable[[UOther, int], TIdentifiedObject],
+ remove: Callable[[TIdentifiedObject, UOther], TIdentifiedObject] | Callable[[UOther], TIdentifiedObject],
+ remove_at_index: Callable[[TIdentifiedObject, int], UOther] | Callable[[int], UOther],
+ clear: Callable[[TIdentifiedObject], TIdentifiedObject] | Callable[[], TIdentifiedObject],
):
"""
Validate the internal collection for an associated object that is not an :class:`IdentifiedObject` that has order significance.
NOTE: Positional index is expected to be 0-based, not 1-based.
- NOTE: The callables using `...` do so to work around bugs in the type checking of both the IDE and mypy, where passing a reference to the
- class method doesn't recognise it needs the `self` parameter, and therefore marks the parameter as having the incorrect type. Actual
- signatures are stored in comments against the arguments.
+ NOTE: The callables below use unions with a second callable to work around bugs in the type checking of both the IDE and mypy, where passing a reference to
+ the class method doesn't recognise it needs the `self` parameter, and would otherwise mark the parameter as having the incorrect type. If we move to a
+ newer version where this is resolved, the second callable should be removed.
"""
_validate_ordered_other(create_it, create_other, get_all.fget, num, get_by_index, for_each, add, add_with_index, remove, remove_at_index, clear)
@@ -142,9 +141,9 @@ def _validate_unordered(
"""
Validate the internal collection for an associated :class:`IdentifiedObject` that has no order significance.
- NOTE: The callables using `...` do so to work around bugs in the type checking of both the IDE and mypy, where passing a reference to the
- class method doesn't recognise it needs the `self` parameter, and therefore marks the parameter as having the incorrect type. Actual
- signatures are stored in comments against the arguments.
+ NOTE: The callables below use unions with a second callable to work around bugs in the type checking of both the IDE and mypy, where passing a reference to
+ the class method doesn't recognise it needs the `self` parameter, and would otherwise mark the parameter as having the incorrect type. If we move to a
+ newer version where this is resolved, the second callable should be removed.
"""
it = create_it("test")
other1 = create_other("1")
@@ -187,26 +186,25 @@ def validate_after_removal():
)
-#
-# NOTE: The callables using `...` do so to work around bugs in the type checking of both the IDE and mypy, where passing a reference to the
-# class method doesn't recognise it needs the `self` parameter, and therefore marks the parameter as having the incorrect type. Actual
-# signatures are stored in comments against the arguments.
-#
def _validate_unordered_other(
create_it: Union[Callable[[str], TIdentifiedObject], Type[IdentifiedObject]],
create_other: Callable[[int], UOther],
get_all: Callable[[TIdentifiedObject], Generator[UOther, None, None]],
- num: Callable[..., int], # Callable[[TIdentifiedObject], int]
- get_by_key: Callable[..., UOther], # Callable[[TIdentifiedObject, K], UOther]
- add: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject, UOther], TIdentifiedObject]
- remove: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject, UOther], TIdentifiedObject]
- clear: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject], TIdentifiedObject]
- get_key: Callable[..., K], # Callable[[UOther], K]
+ num: Callable[[TIdentifiedObject], int] | Callable[[], int],
+ get_by_key: Callable[[TIdentifiedObject, K], UOther] | Callable[[K], UOther],
+ add: Callable[[TIdentifiedObject, UOther], TIdentifiedObject] | Callable[[UOther], TIdentifiedObject],
+ remove: Callable[[TIdentifiedObject, UOther], TIdentifiedObject] | Callable[[UOther], TIdentifiedObject],
+ clear: Callable[[TIdentifiedObject], TIdentifiedObject] | Callable[[], TIdentifiedObject],
+ get_key: Callable[[UOther], K] | Callable[[], K],
key_to_str: Callable[[K], str] = str,
duplicate_behaviour: Type[DuplicateBehaviour] = DuplicateBehaviour.THROWS
):
"""
Validate the internal collection for an associated object that is not an [IdentifiedObject] that has no order significance.
+
+ NOTE: The callables below use unions with a second callable to work around bugs in the type checking of both the IDE and mypy, where passing a reference to
+ the class method doesn't recognise it needs the `self` parameter, and would otherwise mark the parameter as having the incorrect type. If we move to a
+ newer version where this is resolved, the second callable should be removed.
"""
it = create_it("test")
other1 = create_other(1)
@@ -258,27 +256,26 @@ def duplicate_behaviour_func() -> Callable:
)
-#
-# NOTE: The callables using `...` do so to work around bugs in the type checking of both the IDE and mypy, where passing a reference to the
-# class method doesn't recognise it needs the `self` parameter, and therefore marks the parameter as having the incorrect type. Actual
-# signatures are stored in comments against the arguments.
-#
def _validate_ordered(
create_it: Union[Callable[[str], TIdentifiedObject], Type[IdentifiedObject]],
create_other: Callable[[str, int], UIdentifiedObject],
get_all: Callable[[TIdentifiedObject], Generator[UIdentifiedObject, None, None]],
- num: Callable[..., int], # Callable[[TIdentifiedObject], int]
- get_by_id: Callable[[..., str], UIdentifiedObject], # Callable[[TIdentifiedObject, str], UIdentifiedObject]
- get_by_index: Callable[[..., int], UIdentifiedObject], # Callable[[TIdentifiedObject, int], UIdentifiedObject]
- add: Callable[[..., UIdentifiedObject], TIdentifiedObject], # Callable[[TIdentifiedObject, UIdentifiedObject], TIdentifiedObject]
- remove: Callable[[..., UIdentifiedObject], TIdentifiedObject], # Callable[[TIdentifiedObject, UIdentifiedObject], TIdentifiedObject]
- clear: Callable[..., TIdentifiedObject], # Callable[[TIdentifiedObject], TIdentifiedObject]
- index_of: Callable[..., int], # Callable[[UIdentifiedObject], int]
+ num: Callable[[TIdentifiedObject], int] | Callable[[], int],
+ get_by_id: Callable[[TIdentifiedObject, str], UIdentifiedObject] | Callable[[str], UIdentifiedObject],
+ get_by_index: Callable[[TIdentifiedObject, int], UIdentifiedObject] | Callable[[int], UIdentifiedObject],
+ add: Callable[[TIdentifiedObject, UIdentifiedObject], TIdentifiedObject] | Callable[[UIdentifiedObject], TIdentifiedObject],
+ remove: Callable[[TIdentifiedObject, UIdentifiedObject], TIdentifiedObject] | Callable[[UIdentifiedObject], TIdentifiedObject],
+ clear: Callable[[TIdentifiedObject], TIdentifiedObject] | Callable[[], TIdentifiedObject],
+ index_of: Callable[[UIdentifiedObject], int] | Callable[[], int],
):
"""
Validate the internal collection for an associated :class:`IdentifiedObject` that has order significance, baked into the object itself, not just
the placement in the collection.
+ NOTE: The callables below use unions with a second callable to work around bugs in the type checking of both the IDE and mypy, where passing a reference to
+ the class method doesn't recognise it needs the `self` parameter, and would otherwise mark the parameter as having the incorrect type. If we move to a
+ newer version where this is resolved, the second callable should be removed.
+
NOTE: Baked in index is expected to be 1-based, not 0-based.
"""
it = create_it("test")
@@ -342,7 +339,7 @@ def _validate_ordered_other(
get_all: Callable[[TIdentifiedObject], Generator[UOther, None, None]],
num: Callable[[TIdentifiedObject], int],
get_by_index: Callable[[TIdentifiedObject, int], UOther],
- for_each: Callable[[TIdentifiedObject, Callable[[int, UOther], None]], None],
+ for_each: Callable[[TIdentifiedObject, Callable[[int, UOther], Any]], Any],
add: Callable[[TIdentifiedObject, UOther], TIdentifiedObject],
add_with_index: Callable[[TIdentifiedObject, UOther, int], TIdentifiedObject],
remove: Callable[[TIdentifiedObject, UOther], TIdentifiedObject],
@@ -434,10 +431,10 @@ def _validate(
add: Callable[[TIdentifiedObject, _U], TIdentifiedObject],
remove: Callable[[TIdentifiedObject, _U], TIdentifiedObject],
clear: Callable[[TIdentifiedObject], TIdentifiedObject],
- validate_collection: Callable[[Generator[_U, None, None], List[_U]], None],
- perform_duplicate_validation: Callable[[], None],
- before_removal_validation: Callable[[], None],
- after_removal_validation: Callable[[], None],
+ validate_collection: Callable[[Generator[_U, None, None], List[_U]], Any],
+ perform_duplicate_validation: Callable[[], Any],
+ before_removal_validation: Callable[[], Any],
+ after_removal_validation: Callable[[], Any],
others_have_order: bool
):
# Make sure all the objects are not equal.
@@ -516,7 +513,7 @@ def _create_duplicates_throw_validator(
it: TIdentifiedObject,
expected_duplicate_errors: Dict[_U, str],
add: Callable[[TIdentifiedObject, _U], TIdentifiedObject]
-) -> Callable[[], None]:
+) -> Callable[[], Any]:
def func():
for other_duplicate, expected_error in expected_duplicate_errors.items():
with pytest.raises(ValueError, match=expected_error):
@@ -532,8 +529,8 @@ def _create_duplicates_supported_validator(
num: Callable[[TIdentifiedObject], int],
add: Callable[[TIdentifiedObject, _U], TIdentifiedObject],
remove: Callable[[TIdentifiedObject, _U], bool],
- validate_collection: Callable[[Generator[_U, None, None], List[_U]], None],
-) -> Callable[[], None]:
+ validate_collection: Callable[[Generator[_U, None, None], List[_U]], Any],
+) -> Callable[[], Any]:
def func():
#
# NOTE: We add all the items a second time to allow us to clean it up, as the remove below will take the first instance out, changing
@@ -558,8 +555,8 @@ def _create_duplicates_ignored_validator(
get_all: Callable[[TIdentifiedObject], Generator[_U, None, None]],
num: Callable[[TIdentifiedObject], int],
add: Callable[[TIdentifiedObject, _U], TIdentifiedObject],
- validate_collection: Callable[[Generator[_U, None, None], List[_U]], None],
-) -> Callable[[], None]:
+ validate_collection: Callable[[Generator[_U, None, None], List[_U]], Any],
+) -> Callable[[], Any]:
def func():
for duplicate in others:
add(it, duplicate)
diff --git a/test/conftest.py b/test/conftest.py
index 8e142dbe9..44778bc07 100644
--- a/test/conftest.py
+++ b/test/conftest.py
@@ -8,7 +8,7 @@
import pytest
from zepben.ewb.dataclassy import dataclass
-from hypothesis import settings, Verbosity
+from hypothesis import settings, Verbosity, Phase
from pytest import fixture
from zepben.ewb import Terminal, ConnectivityNode, IdentifiedObject
@@ -18,9 +18,25 @@
# noinspection PyUnresolvedReferences
from .network_fixtures import *
-settings.register_profile("ci", max_examples=1000)
-settings.register_profile("dev", max_examples=10)
-settings.register_profile("debug", max_examples=10, verbosity=Verbosity.verbose)
+#
+# NOTE: Hypothesis is very helpful and wants to give you as much information to help you narrow down any issues as it
+# possibly can. The unfortunate side effect of this is when:
+# * you have a very large object being generated for you test (OK, it doesn't need to be that large).
+# * your test can't ever succeed (that bug you introduced and the reason you have a test in the first place).
+#
+# Hypothesis, in its infinite wisdom, spends your entire Pytest time budget trying to come up with an example of
+# your test passing. The intent is to give you a better error message. The outcome is you loose all details of
+# why the test failed, and get a Pytest timeout instead (after waiting of course).
+#
+# To prevent this, we skip the Hypothesis shrink phase. This means you will have to put up with only getting a
+# single example of where the test failed, with a call stack that tells you where this was, and a massive speed
+# improvement in all failing tests...
+#
+no_shrink_phases = [p for p in Phase if p != Phase.shrink]
+
+settings.register_profile("ci", max_examples=1000, phases=no_shrink_phases)
+settings.register_profile("dev", max_examples=10, phases=no_shrink_phases)
+settings.register_profile("debug", max_examples=10, phases=[p for p in Phase], verbosity=Verbosity.debug)
settings.load_profile(os.getenv(u'HYPOTHESIS_PROFILE', 'dev'))
diff --git a/test/database/sqlite/common/cim_database_schema_common_tests.py b/test/database/sqlite/common/cim_database_schema_common_tests.py
index 3383c3696..4068ee1f4 100644
--- a/test/database/sqlite/common/cim_database_schema_common_tests.py
+++ b/test/database/sqlite/common/cim_database_schema_common_tests.py
@@ -9,7 +9,7 @@
from abc import ABC, abstractmethod
from collections import Counter
from sqlite3 import Connection
-from typing import TypeVar, Optional, Callable, Generic
+from typing import TypeVar, Optional, Callable, Generic, Any
import pytest
@@ -98,7 +98,7 @@ async def _validate_write_read(
self,
write_service: Optional[TService] = None,
read_service: Optional[TService] = None,
- validate_read: Optional[Callable[[TService], None]] = None,
+ validate_read: Optional[Callable[[TService], Any]] = None,
):
write_service = write_service or self.create_service()
read_service = read_service or self.create_service()
@@ -120,7 +120,7 @@ async def _validate_write_read(
else:
assert not status, "Database read should have failed"
- async def _validate_unresolved_failure(self, expected_source: str, expected_target: str, add_deferred_reference: Callable[[TService], None]):
+ async def _validate_unresolved_failure(self, expected_source: str, expected_target: str, add_deferred_reference: Callable[[TService], Any]):
service = self.create_service()
# Add an unresolved reference that should trigger the post load check.
add_deferred_reference(service)
diff --git a/test/database/sqlite/customer/test_customer_database_schema.py b/test/database/sqlite/customer/test_customer_database_schema.py
index 9b611fb8e..5853de8f9 100644
--- a/test/database/sqlite/customer/test_customer_database_schema.py
+++ b/test/database/sqlite/customer/test_customer_database_schema.py
@@ -7,7 +7,7 @@
from hypothesis import given, settings, HealthCheck
-from cim.cim_creators import create_organisation, create_customer, create_customer_agreement, create_pricing_structure, create_tariffs
+from cim.fill_fields import create_organisation, create_customer, create_customer_agreement, create_pricing_structure, create_tariff
from database.sqlite.common.cim_database_schema_common_tests import CimDatabaseSchemaCommonTests, TComparator, TService, TReader, TWriter
from database.sqlite.schema_utils import SchemaNetworks
from zepben.ewb import IdentifiedObject, CustomerAgreement, PricingStructure, Tariff, Organisation, Customer, CustomerDatabaseReader, \
@@ -64,6 +64,6 @@ async def test_schema_pricing_structure(self, pricing_structure):
await self._validate_schema(SchemaNetworks().customer_services_of(PricingStructure, pricing_structure))
@settings(deadline=2000, suppress_health_check=[HealthCheck.function_scoped_fixture, HealthCheck.too_slow])
- @given(tariffs=create_tariffs(False))
+ @given(tariffs=create_tariff(False))
async def test_schema_tariffs(self, tariffs):
await self._validate_schema(SchemaNetworks().customer_services_of(Tariff, tariffs))
diff --git a/test/database/sqlite/diagram/test_diagram_database_schema.py b/test/database/sqlite/diagram/test_diagram_database_schema.py
index 781ab9169..593df8d46 100644
--- a/test/database/sqlite/diagram/test_diagram_database_schema.py
+++ b/test/database/sqlite/diagram/test_diagram_database_schema.py
@@ -7,7 +7,7 @@
from hypothesis import given, settings, HealthCheck
-from cim.cim_creators import create_diagram, create_diagram_object
+from cim.fill_fields import create_diagram, create_diagram_object
from database.sqlite.common.cim_database_schema_common_tests import CimDatabaseSchemaCommonTests, TComparator, TService, TReader, TWriter
from database.sqlite.schema_utils import SchemaNetworks
from zepben.ewb import IdentifiedObject, DiagramDatabaseReader, DiagramDatabaseWriter, DiagramService
diff --git a/test/database/sqlite/generate_sqlite_sql.py b/test/database/sqlite/generate_sqlite_sql.py
index 48beb8fa1..8981fc3c3 100644
--- a/test/database/sqlite/generate_sqlite_sql.py
+++ b/test/database/sqlite/generate_sqlite_sql.py
@@ -5,7 +5,7 @@
"""
Helpers to simply print the database SQL statements
"""
-from typing import Callable
+from typing import Callable, Any
from zepben.ewb import SqliteTable, CustomerDatabaseTables, DiagramDatabaseTables, NetworkDatabaseTables
@@ -29,7 +29,7 @@ def print_database_update_statements(table: SqliteTable):
print_statement(table.prepared_update_sql)
-def print_statements(action: Callable[[SqliteTable], None]):
+def print_statements(action: Callable[[SqliteTable], Any]):
print("******** Customer Database ********")
print("")
CustomerDatabaseTables().for_each_table(action)
diff --git a/test/database/sqlite/network/test_network_database_schema.py b/test/database/sqlite/network/test_network_database_schema.py
index fbc1ecf47..236b67979 100644
--- a/test/database/sqlite/network/test_network_database_schema.py
+++ b/test/database/sqlite/network/test_network_database_schema.py
@@ -13,7 +13,7 @@
import pytest
from hypothesis import given, settings, HealthCheck, assume
-from cim.cim_creators import create_cable_info, create_no_load_test, create_open_circuit_test, create_overhead_wire_info, create_power_transformer_info, \
+from cim.fill_fields import create_cable_info, create_no_load_test, create_open_circuit_test, create_overhead_wire_info, create_power_transformer_info, \
create_short_circuit_test, create_shunt_compensator_info, create_transformer_end_info, create_transformer_tank_info, create_asset_owner, create_pole, \
create_streetlight, create_location, create_organisation, create_meter, create_usage_point, create_operational_restriction, create_fault_indicator, \
create_base_voltage, create_connectivity_node, create_feeder, create_geographical_region, create_site, create_sub_geographical_region, create_substation, \
diff --git a/test/database/sqlite/schema_utils.py b/test/database/sqlite/schema_utils.py
index e9b4e9f2e..aa0704d60 100644
--- a/test/database/sqlite/schema_utils.py
+++ b/test/database/sqlite/schema_utils.py
@@ -8,14 +8,12 @@
from hypothesis import assume
from zepben.ewb import MetadataCollection, NetworkService, DiagramService, CustomerService, NameType, DataSource, IdentifiedObject, EnergyConsumer, \
- EnergySourcePhase, EnergySource, BaseService, PowerTransformerInfo, TransformerEndInfo, TransformerTankInfo, Asset, Pole, Streetlight, \
- OrganisationRole, Customer, CustomerAgreement, PricingStructure, OperationalRestriction, AuxiliaryEquipment, ConductingEquipment, \
- ConnectivityNode, Equipment, EquipmentContainer, Name, PowerSystemResource, Substation, Terminal, \
- Control, Measurement, RemoteControl, RemoteSource, PowerElectronicsUnit, AcLineSegment, PowerElectronicsConnection, \
- PowerTransformer, ShuntCompensator, TransformerStarImpedance, \
- Circuit, Loop, LvFeeder, ProtectedSwitch, CurrentTransformer, PotentialTransformer, RegulatingCondEq, RegulatingControl, \
- ProtectionRelayFunction, Sensor, ProtectionRelayScheme, ProtectionRelaySystem, Fuse, TBaseService, TIdentifiedObject, SynchronousMachine, BatteryUnit, \
- generate_id, LinearShuntCompensator
+ EnergySourcePhase, EnergySource, BaseService, PowerTransformerInfo, TransformerEndInfo, TransformerTankInfo, Asset, Pole, Streetlight, OrganisationRole, \
+ Customer, CustomerAgreement, PricingStructure, OperationalRestriction, AuxiliaryEquipment, ConductingEquipment, ConnectivityNode, Equipment, \
+ EquipmentContainer, Name, PowerSystemResource, Substation, Terminal, Control, Measurement, RemoteControl, RemoteSource, PowerElectronicsUnit, \
+ AcLineSegment, PowerElectronicsConnection, PowerTransformer, TransformerStarImpedance, Circuit, Loop, LvFeeder, ProtectedSwitch, RegulatingCondEq, \
+ RegulatingControl, ProtectionRelayFunction, Sensor, ProtectionRelayScheme, ProtectionRelaySystem, Fuse, TBaseService, TIdentifiedObject, \
+ SynchronousMachine, BatteryUnit, generate_id, LinearShuntCompensator
from zepben.ewb.model.cim.iec61968.common.street_address import StreetAddress
from zepben.ewb.model.cim.iec61968.metering.end_device import EndDevice
from zepben.ewb.model.cim.iec61968.metering.usage_point import UsagePoint
@@ -26,7 +24,6 @@
from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object import DiagramObject
from zepben.ewb.model.cim.iec61970.base.wires.ac_line_segment_phase import AcLineSegmentPhase
from zepben.ewb.model.cim.iec61970.base.wires.clamp import Clamp
-from zepben.ewb.model.cim.iec61970.base.wires.conductor import Conductor
from zepben.ewb.model.cim.iec61970.base.wires.cut import Cut
from zepben.ewb.model.cim.iec61970.base.wires.energy_consumer_phase import EnergyConsumerPhase
from zepben.ewb.model.cim.iec61970.base.wires.power_electronics_connection_phase import PowerElectronicsConnectionPhase
@@ -52,7 +49,7 @@ def create_name_test_services(service_type: Type[TBaseService], object_type: Typ
name_type.description = "type description"
services.add_name_type(name_type)
- obj: object_type
+ obj: TIdentifiedObject
try:
obj = object_type(mrid="obj1")
except Exception as ex:
@@ -172,7 +169,6 @@ def _add_with_references(filled: T, service: BaseService):
for it in filled.schemes:
it.add_function(filled)
service.add(it)
- service.add(filled.relay_info)
if isinstance(filled, ProtectionRelayScheme):
if filled.system is not None:
@@ -314,12 +310,6 @@ def _add_with_references(filled: T, service: BaseService):
if isinstance(filled, AuxiliaryEquipment):
service.add(filled.terminal)
- if isinstance(filled, CurrentTransformer):
- service.add(filled.asset_info)
-
- if isinstance(filled, PotentialTransformer):
- service.add(filled.asset_info)
-
######################
# IEC61970 Base Core #
######################
@@ -369,6 +359,8 @@ def _add_with_references(filled: T, service: BaseService):
service.add_name_type(filled.type)
if isinstance(filled, PowerSystemResource):
+ if filled.asset_info is not None:
+ service.add(filled.asset_info)
service.add(filled.location)
for it in filled.assets:
it.add_power_system_resource(filled)
@@ -484,8 +476,6 @@ def _add_with_references(filled: T, service: BaseService):
service.add(it)
if isinstance(filled, AcLineSegmentPhase):
- if filled.asset_info is not None:
- service.add(filled.asset_info)
filled.ac_line_segment.add_phase(filled)
service.add(filled.ac_line_segment)
@@ -493,9 +483,6 @@ def _add_with_references(filled: T, service: BaseService):
filled.ac_line_segment.add_clamp(filled)
service.add(filled.ac_line_segment)
- if isinstance(filled, Conductor):
- service.add(filled.asset_info)
-
if isinstance(filled, Cut):
filled.ac_line_segment.add_cut(filled)
service.add(filled.ac_line_segment)
@@ -548,7 +535,6 @@ def _add_with_references(filled: T, service: BaseService):
service.add(filled.power_electronics_connection)
if isinstance(filled, PowerTransformer):
- service.add(filled.asset_info)
for it in filled.ends:
it.power_transformer = filled
service.add(it)
@@ -567,9 +553,6 @@ def _add_with_references(filled: T, service: BaseService):
service.add(filled.transformer_end)
service.add(filled.tap_changer_control)
- if isinstance(filled, ShuntCompensator):
- service.add(filled.asset_info)
-
if isinstance(filled, SynchronousMachine):
# The curves use a one way link, so we just need to add them.
for it in filled.curves:
diff --git a/test/run_streaming.py b/test/run_streaming.py
index f66f792b7..5ca805ee9 100644
--- a/test/run_streaming.py
+++ b/test/run_streaming.py
@@ -6,7 +6,7 @@
import platform
import traceback
from time import perf_counter, process_time
-from typing import Callable
+from typing import Callable, Any
from zepben.ewb import connect_insecure
from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
@@ -66,10 +66,10 @@ def run_network_hierarchy(client: SyncNetworkConsumerClient):
_log(f"Num loops: {len(network_hierarchy.loops)}")
-def _time_client(client: SyncNetworkConsumerClient, desc: str, run: Callable[[SyncNetworkConsumerClient], None]):
+def _time_client(client: SyncNetworkConsumerClient, desc: str, run: Callable[[SyncNetworkConsumerClient], Any]):
_time(desc, lambda: run(client))
-def _time(desc: str, run: Callable[[], None]):
+def _time(desc: str, run: Callable[[], Any]):
start_perf = perf_counter()
start_proc = process_time()
diff --git a/test/services/common/service_comparator_validator.py b/test/services/common/service_comparator_validator.py
index 90eb294b1..1424dbe6c 100644
--- a/test/services/common/service_comparator_validator.py
+++ b/test/services/common/service_comparator_validator.py
@@ -3,7 +3,7 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from types import MemberDescriptorType
-from typing import Optional, Any, Callable, TypeVar, Union, Type, Set
+from typing import Optional, Any, Callable, TypeVar, Union, Type, Set, Generic, TypeAlias
from zepben.ewb import (IdentifiedObject, TIdentifiedObject, ObjectDifference, BaseService, CollectionDifference,
Difference, ReferenceDifference, ValueDifference, IndexedDifference)
@@ -15,14 +15,18 @@
R = TypeVar("R")
Property = Union[MemberDescriptorType, property]
+TAddr: TypeAlias = Callable[[TIdentifiedObject, R], TIdentifiedObject] | Callable[[R], TIdentifiedObject]
#
-# NOTE: The callables below that use `...` do so to work around bugs in the type checking of both the IDE and mypy.
-# Ideally they should have `add: Callable[[TIdentifiedObject, R], Any]`.
+# NOTE: Should be using the following with TCreator[TIdentifiedObject] in the functions, but Python
+# 3.10 and PyCharm don't like passing TCreator[TIdentifiedObject] to bind correctly, so until
+# we move on to a new version of Python, it looks like we are stuck repeating ourselves.
+#
+# TCreator: TypeAlias = Type[TIdentifiedObject] | Callable[[str], TIdentifiedObject]
#
-class ServiceComparatorValidator(object):
+class ServiceComparatorValidator(Generic[TService, C]):
create_service: Callable[[], TService]
create_comparator: Callable[[NetworkServiceComparatorOptions], C]
@@ -64,8 +68,8 @@ def validate_name_types(
def validate_compare(
self,
- source: Any,
- target: Any,
+ source: R,
+ target: R,
expect_modification: Optional[ObjectDifference] = None,
options: NetworkServiceComparatorOptions = NetworkServiceComparatorOptions(),
options_stop_compare: bool = False,
@@ -86,8 +90,8 @@ def validate_compare(
def validate_property(
self,
- prop: Any, # should be Property but it types are not interpreted correctly so it gives a lot of errors.
- creator: Type[TIdentifiedObject],
+ prop: Property | R, # Isn't actually R, but that is what the type checker thinks when passing class member references.
+ creator: Type[TIdentifiedObject] | Callable[[str], TIdentifiedObject], # Update to TCreator[TIdentifiedObject] when available.
create_value: Callable[[TIdentifiedObject], R],
create_other_value: Callable[[TIdentifiedObject], R],
options: NetworkServiceComparatorOptions = NetworkServiceComparatorOptions(),
@@ -112,10 +116,10 @@ def validate_property(
def validate_val_property(
self,
- prop: Any, # should be Property but it types are not interpreted correctly so it gives a lot of errors.
- creator: Any, # should be Optional[Type[TIdentifiedObject] | Callable[[str], TIdentifiedObject]] but that doesn't work,
- change_state: Callable[[TIdentifiedObject, R], None],
- other_change_state: Callable[[TIdentifiedObject, R], None],
+ prop: Property,
+ creator: Type[TIdentifiedObject] | Callable[[str], TIdentifiedObject], # Update to TCreator[TIdentifiedObject] when available.
+ change_state: Callable[[TIdentifiedObject, R], Any],
+ other_change_state: Callable[[TIdentifiedObject, R], Any],
options: NetworkServiceComparatorOptions = NetworkServiceComparatorOptions(),
options_stop_compare: bool = False,
expected_differences: Set[str] = None
@@ -138,8 +142,8 @@ def validate_val_property(
def validate_collection(
self,
prop: Property,
- add_to_collection: Callable[..., Any],
- creator: Type[TIdentifiedObject],
+ add_to_collection: TAddr[TIdentifiedObject, R],
+ creator: Type[TIdentifiedObject] | Callable[[str], TIdentifiedObject], # Update to TCreator[TIdentifiedObject] when available.
create_item: Callable[[TIdentifiedObject], R],
create_other_item: Callable[[TIdentifiedObject], R],
options: NetworkServiceComparatorOptions = NetworkServiceComparatorOptions(),
@@ -179,16 +183,16 @@ def validate_collection(
def validate_name_collection(
self,
- creator: [[str], TIdentifiedObject],
+ creator: Type[TIdentifiedObject] | Callable[[str], TIdentifiedObject], # Update to TCreator[TIdentifiedObject] when available.
options: NetworkServiceComparatorOptions = NetworkServiceComparatorOptions(),
options_stop_compare: bool = False,
expected_differences: Set[str] = None
):
- source_empty: IdentifiedObject = creator("mRID")
- target_empty: IdentifiedObject = creator("mRID")
- in_source: IdentifiedObject = creator("mRID")
- in_target: IdentifiedObject = creator("mRID")
- in_target_difference: IdentifiedObject = creator("mRID")
+ source_empty = creator("mRID")
+ target_empty = creator("mRID")
+ in_source = creator("mRID")
+ in_target = creator("mRID")
+ in_target_difference = creator("mRID")
# noinspection PyArgumentList
name_type = NameType("type")
@@ -221,8 +225,8 @@ def validate_name_collection(
def validate_indexed_collection(
self,
prop: Property,
- add_to_collection: Callable[..., Any],
- creator: [[str], TIdentifiedObject],
+ add_to_collection: TAddr,
+ creator: Type[TIdentifiedObject] | Callable[[str], TIdentifiedObject], # Update to TCreator[TIdentifiedObject] when available.
create_item: Callable[[TIdentifiedObject], R],
create_other_item: Callable[[TIdentifiedObject], R],
options: NetworkServiceComparatorOptions = NetworkServiceComparatorOptions(),
@@ -242,7 +246,7 @@ def validate_indexed_collection(
self.validate_compare(source_empty, target_empty, options=options, options_stop_compare=options_stop_compare)
self.validate_compare(in_source, in_target, options=options, options_stop_compare=options_stop_compare)
- def get_item(obj) -> Optional[Any]:
+ def get_item(obj) -> Optional[R]:
return next(_get_prop(obj, prop), None)
diff = ObjectDifference(in_source, target_empty, {
@@ -272,15 +276,15 @@ def get_item(obj) -> Optional[Any]:
def validate_unordered_collection(
self,
prop: Property,
- add_to_collection: Callable[..., Any],
- creator: [[str], TIdentifiedObject],
+ add_to_collection: TAddr,
+ creator: Type[TIdentifiedObject] | Callable[[str], TIdentifiedObject], # Update to TCreator[TIdentifiedObject] when available.
create_item_1: Callable[[K], R],
create_item_2: Callable[[K], R],
create_diff_item_1: Callable[[K], R],
options: NetworkServiceComparatorOptions = NetworkServiceComparatorOptions(),
options_stop_compare: bool = False,
expected_differences: Set[str] = None
- ):
+ ) -> TIdentifiedObject:
source_empty = creator("mRID")
target_empty = creator("mRID")
self.validate_compare(source_empty, target_empty, options=options, options_stop_compare=options_stop_compare)
@@ -346,6 +350,9 @@ def get_item_2(it):
})
self._validate_expected(diff, options, options_stop_compare, expected_differences=expected_differences)
+ # This is being returned to bind the TIdentifiedObject correctly.
+ return source_empty
+
@staticmethod
def _get_value_or_reference_difference(source: Optional[R], target: Optional[R]) -> Difference:
if isinstance(source, IdentifiedObject) or isinstance(target, IdentifiedObject):
diff --git a/test/services/common/test_base_service.py b/test/services/common/test_base_service.py
index 3168f0c10..163e453bc 100644
--- a/test/services/common/test_base_service.py
+++ b/test/services/common/test_base_service.py
@@ -179,7 +179,7 @@ def test_unresolved_references(service: BaseService):
assert service.num_unresolved_references() == 4
_add_and_check(service, plsi1, acls1, "per_length_impedance")
assert service.num_unresolved_references() == 3
- _add_and_check(service, ci1, acls1, "wire_info")
+ _add_and_check(service, ci1, acls1, "asset_info")
assert service.num_unresolved_references() == 2
_add_and_check(service, t1, acls1, "terminals")
assert service.num_unresolved_references() == 1
diff --git a/test/services/common/translator/base_test_translator.py b/test/services/common/translator/base_test_translator.py
index 43a169193..e0543a8e1 100644
--- a/test/services/common/translator/base_test_translator.py
+++ b/test/services/common/translator/base_test_translator.py
@@ -56,6 +56,7 @@ def validate_service_translations(
try:
for desc, cim_builder in types_to_test.items():
print(desc)
+ processing = f"generating given {desc}"
@given(cim_builder)
def run_test(cim):
diff --git a/test/services/customer/test_customer_service_comparator.py b/test/services/customer/test_customer_service_comparator.py
index e9c011876..26f503c8b 100644
--- a/test/services/customer/test_customer_service_comparator.py
+++ b/test/services/customer/test_customer_service_comparator.py
@@ -12,7 +12,10 @@
class TestCustomerServiceComparator(TestBaseServiceComparator):
- validator = ServiceComparatorValidator(lambda: CustomerService(), lambda _: CustomerServiceComparator())
+ validator = ServiceComparatorValidator[CustomerService, CustomerServiceComparator](
+ create_service=lambda: CustomerService(),
+ create_comparator=lambda _: CustomerServiceComparator()
+ )
def test_compare_customer(self):
self._compare_organisation_role(Customer)
diff --git a/test/services/customer/translator/test_customer_translator.py b/test/services/customer/translator/test_customer_translator.py
index 08d25d27e..4887362bb 100644
--- a/test/services/customer/translator/test_customer_translator.py
+++ b/test/services/customer/translator/test_customer_translator.py
@@ -9,7 +9,7 @@
from zepben.ewb.services.common.translator.base_proto2cim import get_nullable
from zepben.ewb.services.customer.customer_service_comparator import CustomerServiceComparator
-from cim.cim_creators import *
+from cim.fill_fields import *
from services.common.translator.base_test_translator import validate_service_translations
T = TypeVar("T", bound=IdentifiedObject)
@@ -29,7 +29,7 @@
"create_customer": create_customer(),
"create_customer_agreement": create_customer_agreement(),
"create_pricing_structure": create_pricing_structure(),
- "create_tariffs": create_tariffs(),
+ "create_tariff": create_tariff(),
}
diff --git a/test/services/diagram/test_diagram_service_comparator.py b/test/services/diagram/test_diagram_service_comparator.py
index 29024e156..13747e779 100644
--- a/test/services/diagram/test_diagram_service_comparator.py
+++ b/test/services/diagram/test_diagram_service_comparator.py
@@ -13,7 +13,10 @@
class TestDiagramServiceComparator(TestBaseServiceComparator):
- validator = ServiceComparatorValidator(lambda: DiagramService(), lambda _: DiagramServiceComparator())
+ validator = ServiceComparatorValidator[DiagramService, DiagramServiceComparator](
+ create_service=lambda: DiagramService(),
+ create_comparator=lambda _: DiagramServiceComparator()
+ )
def test_compare_diagram_attributes(self):
self._compare_identified_object(Diagram)
@@ -21,7 +24,8 @@ def test_compare_diagram_attributes(self):
self.validator.validate_property(Diagram.diagram_style, Diagram, lambda _: DiagramStyle.SCHEMATIC, lambda _: DiagramStyle.GEOGRAPHIC)
self.validator.validate_property(Diagram.orientation_kind, Diagram, lambda _: OrientationKind.POSITIVE, lambda _: OrientationKind.NEGATIVE)
self.validator.validate_collection(
- Diagram.diagram_objects, Diagram.add_diagram_object,
+ Diagram.diagram_objects,
+ Diagram.add_diagram_object,
Diagram,
lambda it: DiagramObject(mrid="1", diagram=it),
lambda it: DiagramObject(mrid="2", diagram=it))
diff --git a/test/services/diagram/translator/test_diagram_translator.py b/test/services/diagram/translator/test_diagram_translator.py
index 568201262..0401967cf 100644
--- a/test/services/diagram/translator/test_diagram_translator.py
+++ b/test/services/diagram/translator/test_diagram_translator.py
@@ -8,7 +8,7 @@
from zepben.ewb.services.common.translator.base_proto2cim import get_nullable
from zepben.ewb.services.diagram.diagram_service_comparator import DiagramServiceComparator
-from cim.cim_creators import *
+from cim.fill_fields import *
from services.common.translator.base_test_translator import validate_service_translations
T = TypeVar("T", bound=IdentifiedObject)
diff --git a/test/services/network/test_network_service_comparator.py b/test/services/network/test_network_service_comparator.py
index b1d9c0794..2d9825d13 100644
--- a/test/services/network/test_network_service_comparator.py
+++ b/test/services/network/test_network_service_comparator.py
@@ -27,8 +27,7 @@
TransformerCoolingType, ProtectionRelayFunction, ProtectionRelayScheme, RelaySetting, DistanceRelay, VoltageRelay, ProtectionKind, \
ProtectionRelaySystem, Ground, GroundDisconnector, SeriesCompensator, BatteryControl, BatteryControlMode, AssetFunction, PanDemandResponseFunction, \
StaticVarCompensator, SVCControlMode, PerLengthPhaseImpedance, ReactiveCapabilityCurve, Curve, CurveData, \
- PhaseImpedanceData, EarthFaultCompensator, GroundingImpedance, PetersenCoil, RotatingMachine, SynchronousMachine, SynchronousMachineKind, LvSubstation, \
- PhaseStatus
+ PhaseImpedanceData, EarthFaultCompensator, GroundingImpedance, PetersenCoil, RotatingMachine, SynchronousMachine, SynchronousMachineKind, LvSubstation
from zepben.ewb.model.cim.extensions.iec61970.base.core.hv_customer import HvCustomer
from zepben.ewb.model.cim.extensions.iec61970.base.protection.directional_current_relay import DirectionalCurrentRelay
from zepben.ewb.model.cim.extensions.iec61970.base.protection.polarizing_quantity_type import PolarizingQuantityType
@@ -71,7 +70,10 @@
class TestNetworkServiceComparator(TestBaseServiceComparator):
- validator = ServiceComparatorValidator(lambda: NetworkService(), lambda options: NetworkServiceComparator(options))
+ validator = ServiceComparatorValidator[NetworkService, NetworkServiceComparator](
+ create_service=lambda: NetworkService(),
+ create_comparator=lambda options: NetworkServiceComparator(options),
+ )
##################################
# Extensions IEC61968 Asset Info #
@@ -87,7 +89,7 @@ def test_compare_relay_info(self):
RelayInfo.add_delay,
RelayInfo,
lambda _: [0.1, 0.2],
- lambda _: [0.1, 0.3]
+ lambda _: [0.1, 0.3],
)
################################
@@ -101,7 +103,7 @@ def test_compare_pan_demand_response_function(self):
PanDemandResponseFunction.kind,
PanDemandResponseFunction,
lambda _: EndDeviceFunctionKind.demandResponse,
- lambda _: EndDeviceFunctionKind.onRequestRead
+ lambda _: EndDeviceFunctionKind.onRequestRead,
)
self.validator.validate_property(PanDemandResponseFunction._appliance_bitmask, PanDemandResponseFunction, lambda _: 1, lambda _: 2)
@@ -129,34 +131,39 @@ def test_compare_loop(self):
Loop.add_energizing_substation,
Loop,
lambda _: Substation(mrid="s1"),
- lambda _: Substation(mrid="s2")
+ lambda _: Substation(mrid="s2"),
)
def test_compare_lv_feeder(self):
self._compare_equipment_container(LvFeeder)
self.validator.validate_property(LvFeeder.normal_head_terminal, LvFeeder, lambda _: Terminal(mrid="t1"), lambda _: Terminal(mrid="t2"))
- self.validator.validate_property(LvFeeder.normal_energizing_lv_substation, LvFeeder, lambda _: LvSubstation(mrid="lvs1"), lambda _: LvSubstation(mrid="lvs2"))
+ self.validator.validate_property(
+ LvFeeder.normal_energizing_lv_substation,
+ LvFeeder,
+ lambda _: LvSubstation(mrid="lvs1"),
+ lambda _: LvSubstation(mrid="lvs2"),
+ )
self.validator.validate_collection(
LvFeeder.normal_energizing_feeders,
LvFeeder.add_normal_energizing_feeder,
LvFeeder,
lambda _: Feeder(mrid="f1"),
- lambda _: Feeder(mrid="f2")
+ lambda _: Feeder(mrid="f2"),
)
self.validator.validate_collection(
LvFeeder.current_energizing_feeders,
LvFeeder.add_current_energizing_feeder,
LvFeeder,
lambda _: Feeder(mrid="f1"),
- lambda _: Feeder(mrid="f2")
+ lambda _: Feeder(mrid="f2"),
)
self.validator.validate_collection(
LvFeeder.current_equipment,
LvFeeder.add_current_equipment,
LvFeeder,
lambda _: Junction(mrid="j1"),
- lambda _: Junction(mrid="j2")
+ lambda _: Junction(mrid="j2"),
)
def test_compare_lv_substation(self):
@@ -167,21 +174,21 @@ def test_compare_lv_substation(self):
LvSubstation.add_normal_energizing_feeder,
LvSubstation,
lambda _: Feeder(mrid="lvf1"),
- lambda _: Feeder(mrid="lvf2")
+ lambda _: Feeder(mrid="lvf2"),
)
self.validator.validate_collection(
LvSubstation.current_energizing_feeders,
LvSubstation.add_current_energizing_feeder,
LvSubstation,
lambda _: Feeder(mrid="lvf1"),
- lambda _: Feeder(mrid="lvf2")
+ lambda _: Feeder(mrid="lvf2"),
)
self.validator.validate_collection(
LvSubstation.normal_energized_lv_feeders,
LvSubstation.add_normal_energized_lv_feeder,
LvSubstation,
- lambda _: Feeder(mrid="lvf1"),
- lambda _: Feeder(mrid="lvf2")
+ lambda _: LvFeeder(mrid="lvf1"),
+ lambda _: LvFeeder(mrid="lvf2"),
)
##################################################
@@ -201,7 +208,7 @@ def test_compare_directional_current_relay(self):
DirectionalCurrentRelay.polarizing_quantity_type,
DirectionalCurrentRelay,
lambda _: PolarizingQuantityType.NEGATIVE_SEQUENCE_VOLTAGE,
- lambda _: PolarizingQuantityType.QUADRATURE_VOLTAGE
+ lambda _: PolarizingQuantityType.QUADRATURE_VOLTAGE,
)
self.validator.validate_property(DirectionalCurrentRelay.relay_element_phase, DirectionalCurrentRelay, lambda _: PhaseCode.A, lambda _: PhaseCode.B)
self.validator.validate_property(DirectionalCurrentRelay.minimum_pickup_current, DirectionalCurrentRelay, lambda _: 1.1, lambda _: 2.2)
@@ -231,7 +238,7 @@ def _compare_protection_relay_function(self, creator: Type[ProtectionRelayFuncti
ProtectionRelayFunction.protection_kind,
creator,
lambda _: ProtectionKind.JGGG,
- lambda _: ProtectionKind.NEGATIVE_OVERCURRENT
+ lambda _: ProtectionKind.NEGATIVE_OVERCURRENT,
)
self.validator.validate_property(ProtectionRelayFunction.relay_delay_time, creator, lambda _: 1.1, lambda _: 2.2)
self.validator.validate_property(ProtectionRelayFunction.directable, creator, lambda _: False, lambda _: True)
@@ -239,7 +246,7 @@ def _compare_protection_relay_function(self, creator: Type[ProtectionRelayFuncti
ProtectionRelayFunction.power_direction,
creator,
lambda _: PowerDirectionKind.FORWARD,
- lambda _: PowerDirectionKind.REVERSE
+ lambda _: PowerDirectionKind.REVERSE,
)
self.validator.validate_collection(
@@ -247,7 +254,7 @@ def _compare_protection_relay_function(self, creator: Type[ProtectionRelayFuncti
ProtectionRelayFunction.add_sensor,
creator,
lambda _: CurrentTransformer(mrid="ct1"),
- lambda _: CurrentTransformer(mrid="ct2")
+ lambda _: CurrentTransformer(mrid="ct2"),
)
self.validator.validate_collection(
@@ -255,7 +262,7 @@ def _compare_protection_relay_function(self, creator: Type[ProtectionRelayFuncti
ProtectionRelayFunction.add_protected_switch,
creator,
lambda _: Breaker(mrid="b1"),
- lambda _: Breaker(mrid="b2")
+ lambda _: Breaker(mrid="b2"),
)
self.validator.validate_collection(
@@ -263,7 +270,7 @@ def _compare_protection_relay_function(self, creator: Type[ProtectionRelayFuncti
ProtectionRelayFunction.add_scheme,
creator,
lambda _: ProtectionRelayScheme(mrid="prs1"),
- lambda _: ProtectionRelayScheme(mrid="prs2")
+ lambda _: ProtectionRelayScheme(mrid="prs2"),
)
self.validator.validate_indexed_collection(
@@ -287,15 +294,6 @@ def _compare_protection_relay_function(self, creator: Type[ProtectionRelayFuncti
creator,
lambda _: RelayInfo(mrid="ari1"),
lambda _: RelayInfo(mrid="ari2"),
- expected_differences={"relay_info"}
- )
-
- self.validator.validate_property(
- ProtectionRelayFunction.relay_info,
- creator,
- lambda _: RelayInfo(mrid="ri1"),
- lambda _: RelayInfo(mrid="ri2"),
- expected_differences={"asset_info"}
)
def test_compare_protection_relay_scheme(self):
@@ -304,7 +302,7 @@ def test_compare_protection_relay_scheme(self):
ProtectionRelayScheme.system,
ProtectionRelayScheme,
lambda _: ProtectionRelaySystem(mrid="prs1"),
- lambda _: ProtectionRelaySystem(mrid="prs2")
+ lambda _: ProtectionRelaySystem(mrid="prs2"),
)
self.validator.validate_collection(
@@ -312,7 +310,7 @@ def test_compare_protection_relay_scheme(self):
ProtectionRelayScheme.add_function,
ProtectionRelayScheme,
lambda _: ProtectionRelayFunction(mrid="prf1"),
- lambda _: ProtectionRelayFunction(mrid="prf2")
+ lambda _: ProtectionRelayFunction(mrid="prf2"),
)
def test_compare_protection_relay_system(self):
@@ -321,7 +319,7 @@ def test_compare_protection_relay_system(self):
ProtectionRelaySystem.protection_kind,
ProtectionRelaySystem,
lambda _: ProtectionKind.JDIFF,
- lambda _: ProtectionKind.SECTIONALIZER
+ lambda _: ProtectionKind.SECTIONALIZER,
)
self.validator.validate_collection(
@@ -329,7 +327,7 @@ def test_compare_protection_relay_system(self):
ProtectionRelaySystem.add_scheme,
ProtectionRelaySystem,
lambda _: ProtectionRelayScheme(mrid="prs1"),
- lambda _: ProtectionRelayScheme(mrid="prs2")
+ lambda _: ProtectionRelayScheme(mrid="prs2"),
)
def test_compare_voltage_relay(self):
@@ -345,8 +343,12 @@ def test_compare_battery_control(self):
self.validator.validate_property(BatteryControl.charging_rate, BatteryControl, lambda _: 1.0, lambda _: 2.0)
self.validator.validate_property(BatteryControl.discharging_rate, BatteryControl, lambda _: 1.0, lambda _: 2.0)
self.validator.validate_property(BatteryControl.reserve_percent, BatteryControl, lambda _: 1.0, lambda _: 2.0)
- self.validator.validate_property(BatteryControl.control_mode, BatteryControl, lambda _: BatteryControlMode.peakShaveCharge,
- lambda _: BatteryControlMode.peakShaveDischarge)
+ self.validator.validate_property(
+ BatteryControl.control_mode,
+ BatteryControl,
+ lambda _: BatteryControlMode.peakShaveCharge,
+ lambda _: BatteryControlMode.peakShaveDischarge,
+ )
#######################
# IEC61968 Asset Info #
@@ -384,7 +386,7 @@ def test_compare_power_transformer_info(self):
PowerTransformerInfo.add_transformer_tank_info,
PowerTransformerInfo,
lambda _: TransformerTankInfo(mrid="tti1"),
- lambda _: TransformerTankInfo(mrid="tti2")
+ lambda _: TransformerTankInfo(mrid="tti2"),
)
def test_compare_short_circuit_test(self):
@@ -429,7 +431,7 @@ def test_compare_transformer_end_info(self):
TransformerEndInfo.transformer_star_impedance,
TransformerEndInfo,
lambda _: TransformerStarImpedance(mrid="tsi1"),
- lambda _: TransformerStarImpedance(mrid="tsi2")
+ lambda _: TransformerStarImpedance(mrid="tsi2"),
)
def test_compare_transformer_tank_info(self):
@@ -440,7 +442,7 @@ def test_compare_transformer_tank_info(self):
TransformerTankInfo.add_transformer_end_info,
TransformerTankInfo,
lambda _: TransformerEndInfo(mrid="tei1"),
- lambda _: TransformerEndInfo(mrid="tei2")
+ lambda _: TransformerEndInfo(mrid="tei2"),
)
def _compare_transformer_test(self, creator: Type[TransformerTest]):
@@ -458,7 +460,12 @@ def _compare_wire_info(self, creator: Type[WireInfo]):
self.validator.validate_property(WireInfo.strand_count, creator, lambda _: "3", lambda _: "4")
self.validator.validate_property(WireInfo.core_strand_count, creator, lambda _: "5", lambda _: "6")
self.validator.validate_property(WireInfo.insulated, creator, lambda _: True, lambda _: False)
- self.validator.validate_property(WireInfo.insulation_material, creator, lambda _: WireInsulationKind.doubleWireArmour, lambda _: WireInsulationKind.beltedPilc)
+ self.validator.validate_property(
+ WireInfo.insulation_material,
+ creator,
+ lambda _: WireInsulationKind.doubleWireArmour,
+ lambda _: WireInsulationKind.beltedPilc,
+ )
self.validator.validate_property(WireInfo.insulation_thickness, creator, lambda _: 1.0, lambda _: 2.0)
###################
@@ -473,14 +480,14 @@ def _compare_asset(self, creator: Type[Asset]):
Asset.add_organisation_role,
creator,
lambda _: AssetOwner(mrid="a1"),
- lambda _: AssetOwner(mrid="a2")
+ lambda _: AssetOwner(mrid="a2"),
)
self.validator.validate_collection(
Asset.power_system_resources,
Asset.add_power_system_resource,
creator,
lambda _: Junction(mrid="j1"),
- lambda _: Junction(mrid="j2")
+ lambda _: Junction(mrid="j2"),
)
self.validator.validate_property(Asset.location, creator, lambda _: Location(mrid="l1"), lambda _: Location(mrid="l2"))
@@ -506,7 +513,7 @@ def test_compare_streetlight(self):
Streetlight.lamp_kind,
Streetlight,
lambda _: StreetlightLampKind.HIGH_PRESSURE_SODIUM,
- lambda _: StreetlightLampKind.MERCURY_VAPOR
+ lambda _: StreetlightLampKind.MERCURY_VAPOR,
)
self.validator.validate_property(Streetlight.light_rating, Streetlight, lambda _: 1, lambda _: 2)
self.validator.validate_property(Streetlight.pole, Streetlight, lambda _: Pole(mrid="x"), lambda _: Pole(mrid="y"))
@@ -526,7 +533,7 @@ def test_compare_location(self):
Location.main_address,
Location,
lambda _: StreetAddress("1234", TownDetail("town", "state")),
- lambda _: StreetAddress("1234", TownDetail("other", "state"))
+ lambda _: StreetAddress("1234", TownDetail("other", "state")),
)
# noinspection PyArgumentList
self.validator.validate_indexed_collection(
@@ -534,7 +541,7 @@ def test_compare_location(self):
Location.add_point,
Location,
lambda _: PositionPoint(1.0, 2.0),
- lambda _: PositionPoint(3.0, 4.0)
+ lambda _: PositionPoint(3.0, 4.0),
)
#####################################
@@ -593,7 +600,7 @@ def _compare_end_device(self, creator: Type[EndDevice]):
lambda _: UsagePoint(mrid="up1"),
lambda _: UsagePoint(mrid="up2"),
NetworkServiceComparatorOptions(compare_lv_simplification=False),
- options_stop_compare=True
+ options_stop_compare=True,
)
self.validator.validate_collection(
EndDevice.functions,
@@ -601,7 +608,7 @@ def _compare_end_device(self, creator: Type[EndDevice]):
creator,
lambda _: EndDeviceFunction(mrid="edf1"),
lambda _: EndDeviceFunction(mrid="edf2"),
- NetworkServiceComparatorOptions(compare_lv_simplification=False)
+ NetworkServiceComparatorOptions(compare_lv_simplification=False),
)
def _compare_end_device_function(self, creator: Type[EndDeviceFunction]):
@@ -627,7 +634,7 @@ def test_compare_usage_point(self):
lambda _: Meter(mrid="m1"),
lambda _: Meter(mrid="m2"),
NetworkServiceComparatorOptions(compare_lv_simplification=False),
- options_stop_compare=True
+ options_stop_compare=True,
)
self.validator.validate_collection(
UsagePoint.equipment,
@@ -636,7 +643,7 @@ def test_compare_usage_point(self):
lambda _: Junction(mrid="j1"),
lambda _: Junction(mrid="j2"),
NetworkServiceComparatorOptions(compare_lv_simplification=False),
- options_stop_compare=True
+ options_stop_compare=True,
)
#######################
@@ -651,7 +658,7 @@ def test_compare_operational_restriction(self):
OperationalRestriction.add_equipment,
OperationalRestriction,
lambda _: Junction(mrid="j1"),
- lambda _: Junction(mrid="j2")
+ lambda _: Junction(mrid="j2"),
)
#####################################
@@ -667,7 +674,7 @@ def _compare_auxiliary_equipment(self, creator: Type[AuxiliaryEquipment]):
lambda _: Terminal(mrid="t1"),
lambda _: Terminal(mrid="t2"),
NetworkServiceComparatorOptions(compare_terminals=False),
- options_stop_compare=True
+ options_stop_compare=True,
)
def test_compare_current_transformer(self):
@@ -679,14 +686,6 @@ def test_compare_current_transformer(self):
CurrentTransformer,
lambda _: CurrentTransformerInfo(mrid="acti1"),
lambda _: CurrentTransformerInfo(mrid="acti2"),
- expected_differences={"current_transformer_info"}
- )
- self.validator.validate_property(
- CurrentTransformer.current_transformer_info,
- CurrentTransformer,
- lambda _: CurrentTransformerInfo(mrid="acti1"),
- lambda _: CurrentTransformerInfo(mrid="acti2"),
- expected_differences={"asset_info"}
)
def test_compare_fault_indicator(self):
@@ -699,21 +698,13 @@ def test_compare_potential_transformer(self):
PotentialTransformer.type,
PotentialTransformer,
lambda _: PotentialTransformerKind.capacitiveCoupling,
- lambda _: PotentialTransformerKind.inductive
+ lambda _: PotentialTransformerKind.inductive,
)
self.validator.validate_property(
PotentialTransformer.asset_info,
PotentialTransformer,
lambda _: PotentialTransformerInfo(mrid="avti1"),
lambda _: PotentialTransformerInfo(mrid="avti2"),
- expected_differences={"potential_transformer_info"}
- )
- self.validator.validate_property(
- PotentialTransformer.potential_transformer_info,
- PotentialTransformer,
- lambda _: PotentialTransformerInfo(mrid="vti1"),
- lambda _: PotentialTransformerInfo(mrid="vti2"),
- expected_differences={"asset_info"}
)
def _compare_sensor(self, creator: Type[Sensor]):
@@ -722,7 +713,7 @@ def _compare_sensor(self, creator: Type[Sensor]):
Sensor.add_relay_function,
creator,
lambda _: ProtectionRelayFunction(mrid="prf1"),
- lambda _: ProtectionRelayFunction(mrid="prf2")
+ lambda _: ProtectionRelayFunction(mrid="prf2"),
)
self._compare_auxiliary_equipment(creator)
@@ -749,7 +740,7 @@ def _compare_conducting_equipment(self, creator: Type[ConductingEquipment]):
lambda _: Terminal(mrid="1"),
lambda _: Terminal(mrid="2"),
NetworkServiceComparatorOptions(compare_terminals=False),
- options_stop_compare=True
+ options_stop_compare=True,
)
def test_compare_connectivity_node(self):
@@ -760,7 +751,7 @@ def test_compare_connectivity_node(self):
ConnectivityNode.add_terminal,
ConnectivityNode,
lambda _: Terminal(mrid="1"),
- lambda _: Terminal(mrid="2")
+ lambda _: Terminal(mrid="2"),
)
def _compare_connectivity_node_container(self, creator: Type[ConnectivityNodeContainer]):
@@ -786,28 +777,28 @@ def _compare_equipment(self, creator: Type[Equipment]):
Equipment.commissioned_date,
creator,
lambda _: datetime.datetime.fromtimestamp(0),
- lambda _: datetime.datetime.fromtimestamp(1)
+ lambda _: datetime.datetime.fromtimestamp(1),
)
self.validator.validate_collection(Equipment.containers, Equipment.add_container, creator, lambda _: Site(mrid="s1"), lambda _: Site(mrid="s2"))
self.validator.validate_collection(
Equipment.usage_points,
Equipment.add_usage_point,
creator, lambda _: UsagePoint(mrid="u1"),
- lambda _: UsagePoint(mrid="u2")
+ lambda _: UsagePoint(mrid="u2"),
)
self.validator.validate_collection(
Equipment.operational_restrictions,
Equipment.add_operational_restriction,
creator,
lambda _: OperationalRestriction(mrid="o1"),
- lambda _: OperationalRestriction(mrid="o2")
+ lambda _: OperationalRestriction(mrid="o2"),
)
self.validator.validate_collection(
Equipment.current_containers,
Equipment.add_current_container,
creator,
lambda _: Feeder(mrid="f1"),
- lambda _: Feeder(mrid="f2")
+ lambda _: Feeder(mrid="f2"),
)
def _compare_equipment_container(self, creator: Type[EquipmentContainer]):
@@ -818,7 +809,7 @@ def _compare_equipment_container(self, creator: Type[EquipmentContainer]):
EquipmentContainer.add_equipment,
creator,
lambda _: Junction(mrid="j1"),
- lambda _: Junction(mrid="j2")
+ lambda _: Junction(mrid="j2"),
)
def test_compare_feeder(self):
@@ -831,35 +822,35 @@ def test_compare_feeder(self):
Feeder.add_current_equipment,
Feeder,
lambda _: Junction(mrid="j1"),
- lambda _: Junction(mrid="j2")
+ lambda _: Junction(mrid="j2"),
)
self.validator.validate_collection(
Feeder.normal_energized_lv_feeders,
Feeder.add_normal_energized_lv_feeder,
Feeder,
lambda _: LvFeeder(mrid="lvf1"),
- lambda _: LvFeeder(mrid="lvf2")
+ lambda _: LvFeeder(mrid="lvf2"),
)
self.validator.validate_collection(
Feeder.current_energized_lv_feeders,
Feeder.add_current_energized_lv_feeder,
Feeder,
lambda _: LvFeeder(mrid="lvf1"),
- lambda _: LvFeeder(mrid="lvf2")
+ lambda _: LvFeeder(mrid="lvf2"),
)
self.validator.validate_collection(
Feeder.normal_energized_lv_substations,
Feeder.add_normal_energized_lv_substation,
Feeder,
- lambda _: LvFeeder(mrid="lvs1"),
- lambda _: LvFeeder(mrid="lvs2")
+ lambda _: LvSubstation(mrid="lvs1"),
+ lambda _: LvSubstation(mrid="lvs2"),
)
self.validator.validate_collection(
Feeder.current_energized_lv_substations,
Feeder.add_current_energized_lv_substation,
Feeder,
- lambda _: LvFeeder(mrid="lvs1"),
- lambda _: LvFeeder(mrid="lvs2")
+ lambda _: LvSubstation(mrid="lvs1"),
+ lambda _: LvSubstation(mrid="lvs2"),
)
def test_compare_geographical_region(self):
@@ -870,7 +861,7 @@ def test_compare_geographical_region(self):
GeographicalRegion.add_sub_geographical_region,
GeographicalRegion,
lambda _: SubGeographicalRegion(mrid="sg1"),
- lambda _: SubGeographicalRegion(mrid="sg2")
+ lambda _: SubGeographicalRegion(mrid="sg2"),
)
def _compare_power_system_resource(self, creator: Type[PowerSystemResource]):
@@ -882,7 +873,7 @@ def _compare_power_system_resource(self, creator: Type[PowerSystemResource]):
PowerSystemResource.add_asset,
creator,
lambda _: Pole(mrid="p1"),
- lambda _: Pole(mrid="p2")
+ lambda _: Pole(mrid="p2"),
)
def test_compare_sub_geographical_region(self):
@@ -892,14 +883,14 @@ def test_compare_sub_geographical_region(self):
SubGeographicalRegion.geographical_region,
SubGeographicalRegion,
lambda _: GeographicalRegion(mrid="g1"),
- lambda _: GeographicalRegion(mrid="g2")
+ lambda _: GeographicalRegion(mrid="g2"),
)
self.validator.validate_collection(
SubGeographicalRegion.substations,
SubGeographicalRegion.add_substation,
SubGeographicalRegion,
lambda _: Substation(mrid="s1"),
- lambda _: Substation(mrid="s2")
+ lambda _: Substation(mrid="s2"),
)
def test_compare_substation(self):
@@ -909,7 +900,7 @@ def test_compare_substation(self):
Substation.sub_geographical_region,
Substation,
lambda _: SubGeographicalRegion(mrid="sg1"),
- lambda _: SubGeographicalRegion(mrid="sg2")
+ lambda _: SubGeographicalRegion(mrid="sg2"),
)
self.validator.validate_collection(Substation.feeders, Substation.add_feeder, Substation, lambda _: Feeder(mrid="f1"), lambda _: Feeder(mrid="f2"))
@@ -928,19 +919,15 @@ def test_compare_terminal(self):
self.validator.validate_property(Terminal.current_feeder_direction, Terminal, lambda _: FeederDirection.UPSTREAM, lambda _: FeederDirection.DOWNSTREAM)
def _change_state(prop, val):
- setattr(prop, '_phase_status_internal', val)
+ setattr(prop, '_phase_status_internal', val)
- for first, second in (
+ phase_difference_pairs = (
(0x00000001, 0x00000002),
(0x00000010, 0x00000020),
(0x00000100, 0x00000200),
(0x00001000, 0x00002000),
- ):
- #expected_diff = ObjectDifference()
- #expected_diff.differences["normal_phases"] = ValueDifference(1, 2)
-
- #self.validator.validate_compare(closed_switch, open_switch, expect_modification=difference)
-
+ )
+ for first, second in phase_difference_pairs:
for state in (Terminal.normal_phases, Terminal.current_phases):
self.validator.validate_val_property(
state,
@@ -953,7 +940,7 @@ def _change_state(prop, val):
Terminal.connectivity_node,
Terminal,
lambda terminal, _: terminal.connect(cn1),
- lambda terminal, _: terminal.connect(cn2)
+ lambda terminal, _: terminal.connect(cn2),
)
self.validator.validate_property(Terminal.conducting_equipment, Terminal, lambda _: Junction(mrid="j1"), lambda _: Junction(mrid="j2"))
@@ -1005,7 +992,7 @@ def _compare_power_electronics_unit(self, creator: Type[PowerElectronicsUnit]):
PowerElectronicsUnit.power_electronics_connection,
creator,
lambda _: PowerElectronicsConnection(mrid="pec1"),
- lambda _: PowerElectronicsConnection(mrid="pec2")
+ lambda _: PowerElectronicsConnection(mrid="pec2"),
)
self.validator.validate_property(PowerElectronicsUnit.max_p, creator, lambda _: 1, lambda _: 2)
self.validator.validate_property(PowerElectronicsUnit.min_p, creator, lambda _: 1, lambda _: 2)
@@ -1066,7 +1053,7 @@ def test_compare_remote_source(self):
RemoteSource.measurement,
RemoteSource,
lambda _: Measurement(mrid="m1"),
- lambda _: Measurement(mrid="m2")
+ lambda _: Measurement(mrid="m2"),
)
#######################
@@ -1080,28 +1067,28 @@ def test_compare_ac_line_segment(self):
AcLineSegment.per_length_impedance,
AcLineSegment,
lambda _: PerLengthSequenceImpedance(mrid="p1"),
- lambda _: PerLengthSequenceImpedance(mrid="p2")
+ lambda _: PerLengthSequenceImpedance(mrid="p2"),
)
self.validator.validate_collection(
AcLineSegment.cuts,
AcLineSegment.add_cut,
AcLineSegment,
lambda _: Cut(mrid="cut1"),
- lambda _: Cut(mrid="cut2")
+ lambda _: Cut(mrid="cut2"),
)
self.validator.validate_collection(
AcLineSegment.clamps,
AcLineSegment.add_clamp,
AcLineSegment,
lambda _: Clamp(mrid="clamp1"),
- lambda _: Clamp(mrid="clamp2")
+ lambda _: Clamp(mrid="clamp2"),
)
self.validator.validate_collection(
AcLineSegment.phases,
AcLineSegment.add_phase,
AcLineSegment,
lambda _: AcLineSegmentPhase(mrid="p1"),
- lambda _: AcLineSegmentPhase(mrid="p2")
+ lambda _: AcLineSegmentPhase(mrid="p2"),
)
def test_ac_line_segment_phase(self):
@@ -1111,7 +1098,7 @@ def test_ac_line_segment_phase(self):
AcLineSegmentPhase.ac_line_segment,
AcLineSegmentPhase,
lambda _: AcLineSegment(mrid="c1"),
- lambda _: AcLineSegment(mrid="c2")
+ lambda _: AcLineSegment(mrid="c2"),
)
self.validator.validate_property(AcLineSegmentPhase.asset_info, AcLineSegmentPhase, lambda _: CableInfo(mrid="c1"), lambda _: CableInfo(mrid="c2"))
self.validator.validate_property(AcLineSegmentPhase.phase, AcLineSegmentPhase, lambda _: SinglePhaseKind.A, lambda _: SinglePhaseKind.B)
@@ -1137,10 +1124,7 @@ def _compare_conductor(self, creator: Type[Conductor]):
self.validator.validate_property(Conductor.length, creator, lambda _: 1.0, lambda _: 2.0)
self.validator.validate_property(Conductor.design_temperature, creator, lambda _: 1, lambda _: 2)
self.validator.validate_property(Conductor.design_rating, creator, lambda _: 1.0, lambda _: 2.0)
- self.validator.validate_property(Conductor.asset_info, creator, lambda _: CableInfo(mrid="c1"), lambda _: CableInfo(mrid="c2"),
- expected_differences={"wire_info"})
- self.validator.validate_property(Conductor.wire_info, creator, lambda _: OverheadWireInfo(mrid="owi1"), lambda _: OverheadWireInfo(mrid="c2"),
- expected_differences={"asset_info"})
+ self.validator.validate_property(Conductor.asset_info, creator, lambda _: CableInfo(mrid="c1"), lambda _: CableInfo(mrid="c2"))
def _compare_connector(self, creator: Type[Connector]):
self._compare_conducting_equipment(creator)
@@ -1173,7 +1157,7 @@ def test_compare_energy_consumer(self):
EnergyConsumer.phase_connection,
EnergyConsumer,
lambda _: PhaseShuntConnectionKind.I,
- lambda _: PhaseShuntConnectionKind.D
+ lambda _: PhaseShuntConnectionKind.D,
)
self.validator.validate_property(EnergyConsumer.q, EnergyConsumer, lambda _: 1.0, lambda _: 2.0)
self.validator.validate_property(EnergyConsumer.q_fixed, EnergyConsumer, lambda _: 1.0, lambda _: 2.0)
@@ -1182,7 +1166,7 @@ def test_compare_energy_consumer(self):
EnergyConsumer.add_phase,
EnergyConsumer,
lambda _: EnergyConsumerPhase(mrid="ecp1"),
- lambda _: EnergyConsumerPhase(mrid="ecp2")
+ lambda _: EnergyConsumerPhase(mrid="ecp2"),
)
def test_compare_energy_consumer_phase(self):
@@ -1192,7 +1176,7 @@ def test_compare_energy_consumer_phase(self):
EnergyConsumerPhase.energy_consumer,
EnergyConsumerPhase,
lambda _: EnergyConsumer(mrid="ec1"),
- lambda _: EnergyConsumer(mrid="ec2")
+ lambda _: EnergyConsumer(mrid="ec2"),
)
self.validator.validate_property(EnergyConsumerPhase.phase, EnergyConsumerPhase, lambda _: SinglePhaseKind.A, lambda _: SinglePhaseKind.B)
self.validator.validate_property(EnergyConsumerPhase.p, EnergyConsumerPhase, lambda _: 1.0, lambda _: 2.0)
@@ -1233,7 +1217,7 @@ def test_compare_energy_source(self):
EnergySource.add_phase,
EnergySource,
lambda _: EnergySourcePhase(mrid="ecp1"),
- lambda _: EnergySourcePhase(mrid="ecp2")
+ lambda _: EnergySourcePhase(mrid="ecp2"),
)
def test_compare_energy_source_phase(self):
@@ -1244,7 +1228,7 @@ def test_compare_energy_source_phase(self):
EnergySourcePhase.energy_source,
EnergySourcePhase,
lambda _: EnergySource(mrid="es1"),
- lambda _: EnergySource(mrid="es2")
+ lambda _: EnergySource(mrid="es2"),
)
def test_compare_fuse(self):
@@ -1253,7 +1237,7 @@ def test_compare_fuse(self):
Fuse.function,
Fuse,
lambda _: ProtectionRelayFunction(mrid="prf1"),
- lambda _: ProtectionRelayFunction(mrid="prf2")
+ lambda _: ProtectionRelayFunction(mrid="prf2"),
)
def test_compare_ground(self):
@@ -1328,14 +1312,14 @@ def test_compare_power_electronics_connection(self):
PowerElectronicsConnection.add_phase,
PowerElectronicsConnection,
lambda _: PowerElectronicsConnectionPhase(mrid="pecp1"),
- lambda _: PowerElectronicsConnectionPhase(mrid="pecp2")
+ lambda _: PowerElectronicsConnectionPhase(mrid="pecp2"),
)
self.validator.validate_collection(
PowerElectronicsConnection.units,
PowerElectronicsConnection.add_unit,
PowerElectronicsConnection,
lambda _: PowerElectronicsUnit(mrid="peu1"),
- lambda _: PowerElectronicsUnit(mrid="peu2")
+ lambda _: PowerElectronicsUnit(mrid="peu2"),
)
self.validator.validate_property(PowerElectronicsConnection.max_i_fault, PowerElectronicsConnection, lambda _: 1, lambda _: 2)
self.validator.validate_property(PowerElectronicsConnection.max_q, PowerElectronicsConnection, lambda _: 1.0, lambda _: 2.0)
@@ -1376,13 +1360,13 @@ def test_compare_power_electronics_connection_phase(self):
PowerElectronicsConnectionPhase.phase,
PowerElectronicsConnectionPhase,
lambda _: SinglePhaseKind.A,
- lambda _: SinglePhaseKind.B
+ lambda _: SinglePhaseKind.B,
)
self.validator.validate_property(
PowerElectronicsConnectionPhase.power_electronics_connection,
PowerElectronicsConnectionPhase,
lambda _: PowerElectronicsConnection(mrid="pec1"),
- lambda _: PowerElectronicsConnection(mrid="pec2")
+ lambda _: PowerElectronicsConnection(mrid="pec2"),
)
def test_compare_power_transformer(self):
@@ -1390,10 +1374,18 @@ def test_compare_power_transformer(self):
self.validator.validate_property(PowerTransformer.vector_group, PowerTransformer, lambda _: VectorGroup.DYN11, lambda _: VectorGroup.D0)
self.validator.validate_property(PowerTransformer.transformer_utilisation, PowerTransformer, lambda _: 0.1, lambda _: 0.9)
- self.validator.validate_property(PowerTransformer.construction_kind, PowerTransformer, lambda _: TransformerConstructionKind.subway,
- lambda _: TransformerConstructionKind.overhead)
- self.validator.validate_property(PowerTransformer.function, PowerTransformer, lambda _: TransformerFunctionKind.isolationTransformer,
- lambda _: TransformerFunctionKind.voltageRegulator)
+ self.validator.validate_property(
+ PowerTransformer.construction_kind,
+ PowerTransformer,
+ lambda _: TransformerConstructionKind.subway,
+ lambda _: TransformerConstructionKind.overhead,
+ )
+ self.validator.validate_property(
+ PowerTransformer.function,
+ PowerTransformer,
+ lambda _: TransformerFunctionKind.isolationTransformer,
+ lambda _: TransformerFunctionKind.voltageRegulator,
+ )
self.validator.validate_indexed_collection(
PowerTransformer.ends,
PowerTransformer.add_end,
@@ -1407,15 +1399,6 @@ def test_compare_power_transformer(self):
PowerTransformer,
lambda _: PowerTransformerInfo(mrid="apti1"),
lambda _: PowerTransformerInfo(mrid="apti2"),
- expected_differences={"power_transformer_info"}
- )
-
- self.validator.validate_property(
- PowerTransformer.power_transformer_info,
- PowerTransformer,
- lambda _: PowerTransformerInfo(mrid="pti1"),
- lambda _: PowerTransformerInfo(mrid="pti2"),
- expected_differences={"asset_info"}
)
def test_compare_power_transformer_end(self):
@@ -1425,7 +1408,7 @@ def test_compare_power_transformer_end(self):
PowerTransformerEnd.power_transformer,
PowerTransformerEnd,
lambda _: PowerTransformer(mrid="pt1"),
- lambda _: PowerTransformer(mrid="pt2")
+ lambda _: PowerTransformer(mrid="pt2"),
)
self.validator.validate_property(PowerTransformerEnd.b, PowerTransformerEnd, lambda _: 1.0, lambda _: 2.0)
self.validator.validate_property(PowerTransformerEnd.b0, PowerTransformerEnd, lambda _: 1.0, lambda _: 2.0)
@@ -1450,7 +1433,7 @@ def test_compare_power_transformer_end(self):
PowerTransformerEnd,
lambda _: TransformerEndRatedS(TransformerCoolingType.UNKNOWN, 1),
lambda _: TransformerEndRatedS(TransformerCoolingType.UNKNOWN, 2),
- expected_differences={"rated_s"}
+ expected_differences={"rated_s"},
)
def _compare_protected_switch(self, creator: Type[ProtectedSwitch]):
@@ -1462,7 +1445,7 @@ def _compare_protected_switch(self, creator: Type[ProtectedSwitch]):
ProtectedSwitch.add_relay_function,
creator,
lambda _: CurrentRelay(mrid="cr1"),
- lambda _: CurrentRelay(mrid="cr2")
+ lambda _: CurrentRelay(mrid="cr2"),
)
def test_compare_ratio_tap_changer(self):
@@ -1472,7 +1455,7 @@ def test_compare_ratio_tap_changer(self):
RatioTapChanger.transformer_end,
RatioTapChanger,
lambda _: PowerTransformerEnd(mrid="pte1"),
- lambda _: PowerTransformerEnd(mrid="pte2")
+ lambda _: PowerTransformerEnd(mrid="pte2"),
)
self.validator.validate_property(RatioTapChanger.step_voltage_increment, RatioTapChanger, lambda _: 1.0, lambda _: 2.0)
@@ -1490,7 +1473,7 @@ def _compare_regulating_cond_eq(self, creator: Type[RegulatingCondEq]):
RegulatingCondEq.regulating_control,
creator,
lambda _: RegulatingControl(mrid="rc1"),
- lambda _: RegulatingControl(mrid="rc2")
+ lambda _: RegulatingControl(mrid="rc2"),
)
def _compare_regulating_control(self, creator: Type[RegulatingControl]):
@@ -1498,9 +1481,10 @@ def _compare_regulating_control(self, creator: Type[RegulatingControl]):
self.validator.validate_property(RegulatingControl.discrete, creator, lambda _: False, lambda _: True)
self.validator.validate_property(
- RegulatingControl.mode, creator,
+ RegulatingControl.mode,
+ creator,
lambda _: RegulatingControlModeKind.voltage,
- lambda _: RegulatingControlModeKind.currentFlow
+ lambda _: RegulatingControlModeKind.currentFlow,
)
self.validator.validate_property(RegulatingControl.monitored_phase, creator, lambda _: PhaseCode.ABC, lambda _: PhaseCode.ABCN)
self.validator.validate_property(RegulatingControl.target_deadband, creator, lambda _: 1.0, lambda _: 2.0)
@@ -1517,7 +1501,7 @@ def _compare_regulating_control(self, creator: Type[RegulatingControl]):
RegulatingControl.add_regulating_cond_eq,
creator,
lambda _: RegulatingCondEq(mrid="rce1"),
- lambda _: RegulatingCondEq(mrid="rce2")
+ lambda _: RegulatingCondEq(mrid="rce2"),
)
def _compare_rotating_machine(self, creator: Type[RotatingMachine]):
@@ -1548,13 +1532,15 @@ def _compare_shunt_compensator(self, creator: Type[ShuntCompensator]):
ShuntCompensator.phase_connection,
creator,
lambda _: PhaseShuntConnectionKind.D,
- lambda _: PhaseShuntConnectionKind.G
+ lambda _: PhaseShuntConnectionKind.G,
)
self.validator.validate_property(ShuntCompensator.sections, creator, lambda _: 1.0, lambda _: 2.0)
- self.validator.validate_property(ShuntCompensator.asset_info, creator, lambda _: ShuntCompensatorInfo(mrid="asci1"),
- lambda _: ShuntCompensatorInfo(mrid="asci2"), expected_differences={"shunt_compensator_info"})
- self.validator.validate_property(ShuntCompensator.shunt_compensator_info, creator, lambda _: ShuntCompensatorInfo(mrid="sci1"),
- lambda _: ShuntCompensatorInfo(mrid="sci2"), expected_differences={"asset_info"})
+ self.validator.validate_property(
+ ShuntCompensator.asset_info,
+ creator,
+ lambda _: ShuntCompensatorInfo(mrid="asci1"),
+ lambda _: ShuntCompensatorInfo(mrid="asci2"),
+ )
self.validator.validate_property(ShuntCompensator.grounding_terminal, creator, lambda _: Terminal(mrid="t1"), lambda _: Terminal(mrid="t2"))
def test_compare_static_var_compensator(self):
@@ -1567,7 +1553,7 @@ def test_compare_static_var_compensator(self):
StaticVarCompensator.svc_control_mode,
StaticVarCompensator,
lambda _: SVCControlMode.reactivePower,
- lambda _: SVCControlMode.voltage
+ lambda _: SVCControlMode.voltage,
)
self.validator.validate_property(StaticVarCompensator.voltage_set_point, StaticVarCompensator, lambda _: 1, lambda _: 2)
@@ -1575,10 +1561,7 @@ def _compare_switch(self, creator: Type[Switch]):
self._compare_conducting_equipment(creator)
self.validator.validate_property(Switch.rated_current, creator, lambda _: 1.1, lambda _: 2.2)
- self.validator.validate_property(Switch.asset_info, creator, lambda _: SwitchInfo(mrid="asi1"), lambda _: SwitchInfo(mrid="sai2"),
- expected_differences={"switch_info"})
- self.validator.validate_property(Switch.switch_info, creator, lambda _: SwitchInfo(mrid="si1"), lambda _: SwitchInfo(mrid="si2"),
- expected_differences={"asset_info"})
+ self.validator.validate_property(Switch.asset_info, creator, lambda _: SwitchInfo(mrid="asi1"), lambda _: SwitchInfo(mrid="sai2"))
closed_switch = Jumper(mrid="mRID")
closed_switch.set_normally_open(False)
@@ -1591,12 +1574,12 @@ def _compare_switch(self, creator: Type[Switch]):
difference = ObjectDifference(closed_switch, open_switch)
difference.differences["isNormallyOpen"] = ValueDifference(
{p: False for p in PhaseCode.ABCN.single_phases},
- {p: True for p in PhaseCode.ABCN.single_phases}
+ {p: True for p in PhaseCode.ABCN.single_phases},
)
difference.differences["isOpen"] = ValueDifference(
{p: True for p in PhaseCode.ABCN.single_phases},
- {p: False for p in PhaseCode.ABCN.single_phases}
+ {p: False for p in PhaseCode.ABCN.single_phases},
)
self.validator.validate_compare(closed_switch, open_switch, expect_modification=difference)
@@ -1623,17 +1606,25 @@ def test_compare_synchronous_machine(self):
self.validator.validate_property(SynchronousMachine.sat_direct_trans_x, SynchronousMachine, lambda _: 1.0, lambda _: 2.0)
self.validator.validate_property(SynchronousMachine.x0, SynchronousMachine, lambda _: 1.0, lambda _: 2.0)
self.validator.validate_property(SynchronousMachine.x2, SynchronousMachine, lambda _: 1.0, lambda _: 2.0)
- self.validator.validate_property(SynchronousMachine.type, SynchronousMachine, lambda _: SynchronousMachineKind.generator,
- lambda _: SynchronousMachineKind.motor)
- self.validator.validate_property(SynchronousMachine.operating_mode, SynchronousMachine, lambda _: SynchronousMachineKind.generator,
- lambda _: SynchronousMachineKind.motor)
+ self.validator.validate_property(
+ SynchronousMachine.type,
+ SynchronousMachine,
+ lambda _: SynchronousMachineKind.generator,
+ lambda _: SynchronousMachineKind.motor,
+ )
+ self.validator.validate_property(
+ SynchronousMachine.operating_mode,
+ SynchronousMachine,
+ lambda _: SynchronousMachineKind.generator,
+ lambda _: SynchronousMachineKind.motor,
+ )
self.validator.validate_collection(
SynchronousMachine.curves,
SynchronousMachine.add_curve,
SynchronousMachine,
lambda _: ReactiveCapabilityCurve(mrid="c1"),
- lambda _: ReactiveCapabilityCurve(mrid="c2")
+ lambda _: ReactiveCapabilityCurve(mrid="c2"),
)
def _compare_tap_changer(self, creator: Type[TapChanger]):
@@ -1646,8 +1637,12 @@ def _compare_tap_changer(self, creator: Type[TapChanger]):
self.validator.validate_property(TapChanger.neutral_u, creator, lambda _: 0, lambda _: 1)
self.validator.validate_property(TapChanger.normal_step, creator, lambda _: 0, lambda _: 1)
self.validator.validate_property(TapChanger.step, creator, lambda _: 0, lambda _: 1)
- self.validator.validate_property(TapChanger.tap_changer_control, creator, lambda _: TapChangerControl(mrid="tcc1"),
- lambda _: TapChangerControl(mrid="tcc2"))
+ self.validator.validate_property(
+ TapChanger.tap_changer_control,
+ creator,
+ lambda _: TapChangerControl(mrid="tcc1"),
+ lambda _: TapChangerControl(mrid="tcc2"),
+ )
def test_compare_tap_changer_control(self):
self._compare_regulating_control(TapChangerControl)
@@ -1673,15 +1668,19 @@ def _compare_transformer_end(self, creator: Type[TransformerEnd]):
TransformerEnd.ratio_tap_changer,
creator,
lambda _: RatioTapChanger(mrid="rtc1"),
- lambda _: RatioTapChanger(mrid="rtc2")
+ lambda _: RatioTapChanger(mrid="rtc2"),
+ )
+ self.validator.validate_property(
+ TransformerEnd.terminal,
+ creator,
+ lambda _: Terminal(mrid="t1", conducting_equipment=PowerTransformer(mrid="t1-pt1")),
+ lambda _: Terminal(mrid="t2", conducting_equipment=PowerTransformer(mrid="t2-pt2")),
)
- self.validator.validate_property(TransformerEnd.terminal, creator, lambda _: Terminal(mrid="t1", conducting_equipment=PowerTransformer(mrid="t1-pt1")),
- lambda _: Terminal(mrid="t2", conducting_equipment=PowerTransformer(mrid="t2-pt2")))
self.validator.validate_property(
TransformerEnd.star_impedance,
creator,
lambda _: TransformerStarImpedance(mrid="tsi1"),
- lambda _: TransformerStarImpedance(mrid="tsi2")
+ lambda _: TransformerStarImpedance(mrid="tsi2"),
)
def test_compare_transformer_star_impedance(self):
@@ -1691,8 +1690,12 @@ def test_compare_transformer_star_impedance(self):
self.validator.validate_property(TransformerStarImpedance.r0, TransformerStarImpedance, lambda _: 1.0, lambda _: 2.0)
self.validator.validate_property(TransformerStarImpedance.x, TransformerStarImpedance, lambda _: 1.0, lambda _: 2.0)
self.validator.validate_property(TransformerStarImpedance.x0, TransformerStarImpedance, lambda _: 1.0, lambda _: 2.0)
- self.validator.validate_property(TransformerStarImpedance.transformer_end_info, TransformerStarImpedance, lambda _: TransformerEndInfo(mrid="tei1"),
- lambda _: TransformerEndInfo(mrid="tei2"))
+ self.validator.validate_property(
+ TransformerStarImpedance.transformer_end_info,
+ TransformerStarImpedance,
+ lambda _: TransformerEndInfo(mrid="tei1"),
+ lambda _: TransformerEndInfo(mrid="tei2"),
+ )
###############################
# IEC61970 InfIEC61970 Feeder #
@@ -1707,12 +1710,12 @@ def test_compare_circuit(self):
Circuit.add_end_terminal,
Circuit,
lambda _: Terminal(mrid="t1"),
- lambda _: Terminal(mrid="t2")
+ lambda _: Terminal(mrid="t2"),
)
self.validator.validate_collection(
Circuit.end_substations,
Circuit.add_end_substation,
Circuit,
lambda _: Substation(mrid="s1"),
- lambda _: Substation(mrid="s2")
+ lambda _: Substation(mrid="s2"),
)
diff --git a/test/services/network/tracing/feeder/test_clear_direction.py b/test/services/network/tracing/feeder/test_clear_direction.py
index 6b735ea36..2af1a8178 100644
--- a/test/services/network/tracing/feeder/test_clear_direction.py
+++ b/test/services/network/tracing/feeder/test_clear_direction.py
@@ -252,7 +252,7 @@ async def test_clears_loops(self):
for term in head_terminals:
if not self.state_operators.is_open(term.conducting_equipment):
- await Tracing.set_direction().run_terminal(term, self.state_operators)
+ await Tracing.set_direction().run(term, self.state_operators)
_check_expected_direction(_get_t(n, 'b0', 1), NONE)
_check_expected_direction(_get_t(n, 'b0', 2), DOWNSTREAM)
diff --git a/test/services/network/tracing/feeder/test_set_direction.py b/test/services/network/tracing/feeder/test_set_direction.py
index a028db94a..c05375063 100644
--- a/test/services/network/tracing/feeder/test_set_direction.py
+++ b/test/services/network/tracing/feeder/test_set_direction.py
@@ -61,7 +61,7 @@ async def test_stops_at_open_points(self):
.to_acls() \
.network
- await SetDirection().run_terminal(self._get_t(n, "c0", 2))
+ await SetDirection().run(self._get_t(n, "c0", 2))
await log_directions(n["c0"])
self._check_expected_direction(self._get_t(n, "c0", 1), NONE)
@@ -267,7 +267,7 @@ async def test_dual_path_loop_top(self):
.network
sd = SetDirection()
- await sd.run_terminal(self._get_t(n, "j0", 1))
+ await sd.run(self._get_t(n, "j0", 1))
#print(sd.nodes['j0-t1'])
await log_directions(n["j0"])
@@ -340,7 +340,7 @@ async def test_dual_path_loop_bottom(self):
.connect("c10", "j2", 1, 2)
).network
- await SetDirection().run_terminal(self._get_t(n, "j0", 1))
+ await SetDirection().run(self._get_t(n, "j0", 1))
await log_directions(n["j0"])
# To avoid reprocessing all BOTH loops in larger networks we do not process anything with a direction already set. This means this test will apply
@@ -385,7 +385,7 @@ async def test_ignores_phase_pathing(self):
.to_acls(nominal_phases=PhaseCode.A) \
.network
- await SetDirection().run_terminal(self._get_t(n, "j0", 1))
+ await SetDirection().run(self._get_t(n, "j0", 1))
await log_directions(n["j0"])
self._check_expected_direction(self._get_t(n, "j0", 1), DOWNSTREAM)
@@ -406,7 +406,7 @@ async def test_works_without_phase(self):
.to_acls(nominal_phases=PhaseCode.NONE) \
.network
- await SetDirection().run_terminal(self._get_t(n, "j0", 1))
+ await SetDirection().run(self._get_t(n, "j0", 1))
await log_directions(n["j0"])
self._check_expected_direction(self._get_t(n, "j0", 1), DOWNSTREAM)
diff --git a/test/services/network/tracing/networktrace/actions/test_equipment_tree_builder.py b/test/services/network/tracing/networktrace/actions/test_equipment_tree_builder.py
index f104a42c5..f23756e96 100644
--- a/test/services/network/tracing/networktrace/actions/test_equipment_tree_builder.py
+++ b/test/services/network/tracing/networktrace/actions/test_equipment_tree_builder.py
@@ -29,8 +29,8 @@ async def test_equipment_tree_builder_leaves():
await Tracing.set_phases().run(n)
feeder_head = n.get("j0", ConductingEquipment)
- await Tracing.set_direction().run_terminal(feeder_head, network_state_operators=normal)
- await Tracing.set_direction().run_terminal(feeder_head, network_state_operators=current)
+ await Tracing.set_direction().run(feeder_head, network_state_operators=normal)
+ await Tracing.set_direction().run(feeder_head, network_state_operators=current)
await log_directions(n.get('j0', ConductingEquipment))
start = n.get("j1", ConductingEquipment)
@@ -59,8 +59,8 @@ async def test_downstream_tree():
await Tracing.set_phases().run(n)
feeder_head = n.get("j0", ConductingEquipment)
- await Tracing.set_direction().run_terminal(feeder_head, network_state_operators=normal)
- await Tracing.set_direction().run_terminal(feeder_head, network_state_operators=current)
+ await Tracing.set_direction().run(feeder_head, network_state_operators=normal)
+ await Tracing.set_direction().run(feeder_head, network_state_operators=current)
await log_directions(n.get('j0', ConductingEquipment))
visited_ce = []
@@ -89,7 +89,7 @@ async def test_downstream_tree():
pprint.pprint(visit_counts)
- root = tree_builder._roots[start]
+ root = tree_builder.roots[start]
assert root is not None
_verify_tree_asset(root, n["j1"], None, [n["ac1"], n["ac3"]])
diff --git a/test/services/network/translator/test_network_translator.py b/test/services/network/translator/test_network_translator.py
index fc3fa69c7..f28f7c8fe 100644
--- a/test/services/network/translator/test_network_translator.py
+++ b/test/services/network/translator/test_network_translator.py
@@ -6,9 +6,8 @@
import pytest
-from cim.cim_creators import create_directional_current_relay, create_hv_customer, create_ac_line_segment_phase, create_lv_substation
from services.common.translator.base_test_translator import validate_service_translations
-from test.cim.cim_creators import *
+from test.cim.fill_fields import *
from zepben.ewb import IdentifiedObject, PowerTransformerEnd, PowerTransformer, NetworkService, NetworkServiceComparator, NameType, \
NetworkDatabaseTables, TableAssetOrganisationRolesAssets, TableCircuitsSubstations, TableCircuitsTerminals, \
TableEquipmentEquipmentContainers, TableEquipmentOperationalRestrictions, TableEquipmentUsagePoints, TableLoopsSubstations, \
@@ -231,6 +230,7 @@
"create_circuit": create_circuit(),
}
+
@pytest.mark.timeout(20000)
def test_network_service_translations():
validate_service_translations(
@@ -273,6 +273,7 @@ def test_network_service_translations():
types_to_test=types_to_test,
)
+
# NOTE: NameType is not sent via any grpc messages at this stage, so test it separately
def test_creates_new_name_type():
# noinspection PyArgumentList, PyUnresolvedReferences
diff --git a/test/streaming/get/mock_server.py b/test/streaming/get/mock_server.py
index d2e335031..93ec14d24 100644
--- a/test/streaming/get/mock_server.py
+++ b/test/streaming/get/mock_server.py
@@ -4,12 +4,10 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import traceback
from dataclasses import dataclass
-from typing import Awaitable, Callable, List, TypeVar, Union, Optional, Iterable, Generator
+from typing import Awaitable, Callable, List, TypeVar, Optional, Iterable, Generator, Any
-# noinspection PyPackageRequirements
import grpc
import grpc_testing
-# noinspection PyPackageRequirements
from google.protobuf.descriptor import ServiceDescriptor
from streaming.get.catching_thread import CatchingThread
@@ -17,9 +15,11 @@
GrpcRequest = TypeVar('GrpcRequest')
GrpcResponse = TypeVar('GrpcResponse')
+class GrpcInteration:
+ pass
@dataclass
-class StreamGrpc:
+class StreamGrpc(GrpcInteration):
function: str
processors: List[Callable[[GrpcRequest], Generator[GrpcResponse, None, None]]]
"""
@@ -36,7 +36,7 @@ class StreamGrpc:
@dataclass
-class UnaryGrpc:
+class UnaryGrpc(GrpcInteration):
function: str
processor: Callable[[GrpcRequest], Generator[GrpcResponse, None, None]]
"""
@@ -48,9 +48,9 @@ class UnaryGrpc:
@dataclass
-class StreamUnaryGrpc:
+class StreamUnaryGrpc(GrpcInteration):
function: str
- request_validators: List[Callable[[GrpcRequest], None]]
+ request_validators: List[Callable[[GrpcRequest], Any]]
"""
Stream of requests.
@@ -64,7 +64,7 @@ class StreamUnaryGrpc:
@dataclass
-class UnaryStreamGrpc:
+class UnaryStreamGrpc(GrpcInteration):
function: str
processor: Callable[[GrpcRequest], Generator[GrpcResponse, None, None]]
"""
@@ -100,7 +100,7 @@ def __init__(self, channel: grpc_testing.Channel, grpc_service: ServiceDescripto
self.channel: grpc_testing.Channel = channel
self.grpc_service: ServiceDescriptor = grpc_service
- async def validate(self, client_test: Callable[[], Awaitable[None]], interactions: List[Union[StreamGrpc, UnaryGrpc, StreamUnaryGrpc, UnaryStreamGrpc]]):
+ async def validate(self, client_test: Callable[[], Awaitable[None]], interactions: List[GrpcInteration]):
"""
Run a server that mocks RPC requests by invoking the provided `interactions` in order.
@@ -114,11 +114,11 @@ async def validate(self, client_test: Callable[[], Awaitable[None]], interaction
# Send the client requests. We need to wrap this in an exception logging block to get any errors from asserts in the
# client test, as the pytest logging only give the outcome, not which line actually caused it.
- # noinspection PyBroadException
try:
await client_test()
- except Exception:
+ except Exception as ex:
print(traceback.format_exc())
+ raise ex
# Wait for the server to finish. If this times out your test, it indicates that not all expected requests were received, or the request stream
# wasn't closed/completed.
@@ -127,7 +127,7 @@ async def validate(self, client_test: Callable[[], Awaitable[None]], interaction
if server.exception:
raise server.exception
- def _run_server_logic(self, interactions: List[Union[StreamGrpc, UnaryGrpc]]):
+ def _run_server_logic(self, interactions: List[GrpcInteration]):
for i in interactions:
if isinstance(i, StreamGrpc):
self._run_stream_server_logic(i)
diff --git a/test/streaming/get/pb_creators.py b/test/streaming/get/pb_creators.py
index 092d7d7f6..35402cb11 100644
--- a/test/streaming/get/pb_creators.py
+++ b/test/streaming/get/pb_creators.py
@@ -3,1598 +3,14 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-__all__ = [
- # We only export the top level container classes, and a minimal set of classes for testing the consumers.
- 'network_identified_objects', 'ac_line_segment',
- 'customer_identified_objects', 'customer',
- 'diagram_identified_objects', 'diagram', 'diagram_object'
-]
+__all__ = ['network_identified_objects', 'customer_identified_objects', 'diagram_identified_objects']
-from typing import Optional, Dict
-
-# noinspection PyPackageRequirements,PyUnresolvedReferences
-from google.protobuf.struct_pb2 import NullValue
-# noinspection PyPackageRequirements,PyUnresolvedReferences
-from google.protobuf.timestamp_pb2 import Timestamp
-from hypothesis.strategies import builds, text, integers, sampled_from, lists as hypo_lists, floats as hypo_floats, booleans, composite, uuids, one_of, none
+from hypothesis.strategies import composite
from zepben.protobuf.cc.cc_data_pb2 import CustomerIdentifiedObject
-from zepben.protobuf.cim.extensions.iec61968.assetinfo.RelayInfo_pb2 import RelayInfo as PBRelayInfo
-from zepben.protobuf.cim.extensions.iec61968.metering.PanDemandResponseFunction_pb2 import PanDemandResponseFunction as PBPanDemandResponseFunction
-from zepben.protobuf.cim.extensions.iec61970.base.core.Site_pb2 import Site as PBSite
-from zepben.protobuf.cim.extensions.iec61970.base.feeder.Loop_pb2 import Loop as PBLoop
-from zepben.protobuf.cim.extensions.iec61970.base.feeder.LvFeeder_pb2 import LvFeeder as PBLvFeeder
-from zepben.protobuf.cim.extensions.iec61970.base.generation.production.EvChargingUnit_pb2 import EvChargingUnit as PBEvChargingUnit
-from zepben.protobuf.cim.extensions.iec61970.base.protection.DistanceRelay_pb2 import DistanceRelay as PBDistanceRelay
-from zepben.protobuf.cim.extensions.iec61970.base.protection.PowerDirectionKind_pb2 import PowerDirectionKind as PBPowerDirectionKind
-from zepben.protobuf.cim.extensions.iec61970.base.protection.ProtectionKind_pb2 import ProtectionKind as PBProtectionKind
-from zepben.protobuf.cim.extensions.iec61970.base.protection.ProtectionRelayFunction_pb2 import ProtectionRelayFunction as PBProtectionRelayFunction
-from zepben.protobuf.cim.extensions.iec61970.base.protection.ProtectionRelayScheme_pb2 import ProtectionRelayScheme as PBProtectionRelayScheme
-from zepben.protobuf.cim.extensions.iec61970.base.protection.ProtectionRelaySystem_pb2 import ProtectionRelaySystem as PBProtectionRelaySystem
-from zepben.protobuf.cim.extensions.iec61970.base.protection.RelaySetting_pb2 import RelaySetting as PBRelaySetting
-from zepben.protobuf.cim.extensions.iec61970.base.protection.VoltageRelay_pb2 import VoltageRelay as PBVoltageRelay
-from zepben.protobuf.cim.extensions.iec61970.base.wires.BatteryControlMode_pb2 import BatteryControlMode as PBBatteryControlMode
-from zepben.protobuf.cim.extensions.iec61970.base.wires.BatteryControl_pb2 import BatteryControl as PBBatteryControl
-from zepben.protobuf.cim.extensions.iec61970.base.wires.TransformerCoolingType_pb2 import TransformerCoolingType as PBTransformerCoolingType
-from zepben.protobuf.cim.extensions.iec61970.base.wires.TransformerEndRatedS_pb2 import TransformerEndRatedS as PBTransformerEndRatedS
-from zepben.protobuf.cim.extensions.iec61970.base.wires.VectorGroup_pb2 import VectorGroup as PBVectorGroup
-from zepben.protobuf.cim.iec61968.assetinfo.CableInfo_pb2 import CableInfo as PBCableInfo
-from zepben.protobuf.cim.iec61968.assetinfo.NoLoadTest_pb2 import NoLoadTest as PBNoLoadTest
-from zepben.protobuf.cim.iec61968.assetinfo.OpenCircuitTest_pb2 import OpenCircuitTest as PBOpenCircuitTest
-from zepben.protobuf.cim.iec61968.assetinfo.OverheadWireInfo_pb2 import OverheadWireInfo as PBOverheadWireInfo
-from zepben.protobuf.cim.iec61968.assetinfo.PowerTransformerInfo_pb2 import PowerTransformerInfo as PBPowerTransformerInfo
-from zepben.protobuf.cim.iec61968.assetinfo.ShortCircuitTest_pb2 import ShortCircuitTest as PBShortCircuitTest
-from zepben.protobuf.cim.iec61968.assetinfo.ShuntCompensatorInfo_pb2 import ShuntCompensatorInfo as PBShuntCompensatorInfo
-from zepben.protobuf.cim.iec61968.assetinfo.SwitchInfo_pb2 import SwitchInfo as PBSwitchInfo
-from zepben.protobuf.cim.iec61968.assetinfo.TransformerEndInfo_pb2 import TransformerEndInfo as PBTransformerEndInfo
-from zepben.protobuf.cim.iec61968.assetinfo.TransformerTankInfo_pb2 import TransformerTankInfo as PBTransformerTankInfo
-from zepben.protobuf.cim.iec61968.assetinfo.TransformerTest_pb2 import TransformerTest as PBTransformerTest
-from zepben.protobuf.cim.iec61968.assetinfo.WireInfo_pb2 import WireInfo as PBWireInfo
-from zepben.protobuf.cim.iec61968.assetinfo.WireMaterialKind_pb2 import WireMaterialKind as PBWireMaterialKind
-from zepben.protobuf.cim.iec61968.assets.AssetContainer_pb2 import AssetContainer as PBAssetContainer
-from zepben.protobuf.cim.iec61968.assets.AssetFunction_pb2 import AssetFunction as PBAssetFunction
-from zepben.protobuf.cim.iec61968.assets.AssetInfo_pb2 import AssetInfo as PBAssetInfo
-from zepben.protobuf.cim.iec61968.assets.AssetOrganisationRole_pb2 import AssetOrganisationRole as PBAssetOrganisationRole
-from zepben.protobuf.cim.iec61968.assets.AssetOwner_pb2 import AssetOwner as PBAssetOwner
-from zepben.protobuf.cim.iec61968.assets.Asset_pb2 import Asset as PBAsset
-from zepben.protobuf.cim.iec61968.assets.Streetlight_pb2 import Streetlight as PBStreetlight
-from zepben.protobuf.cim.iec61968.assets.Structure_pb2 import Structure as PBStructure
-from zepben.protobuf.cim.iec61968.common.Agreement_pb2 import Agreement as PBAgreement
-from zepben.protobuf.cim.iec61968.common.Document_pb2 import Document as PBDocument
-from zepben.protobuf.cim.iec61968.common.Location_pb2 import Location as PBLocation
-from zepben.protobuf.cim.iec61968.common.OrganisationRole_pb2 import OrganisationRole as PBOrganisationRole
-from zepben.protobuf.cim.iec61968.common.Organisation_pb2 import Organisation as PBOrganisation
-from zepben.protobuf.cim.iec61968.common.PositionPoint_pb2 import PositionPoint as PBPositionPoint
-from zepben.protobuf.cim.iec61968.common.StreetAddress_pb2 import StreetAddress as PBStreetAddress
-from zepben.protobuf.cim.iec61968.common.StreetDetail_pb2 import StreetDetail as PBStreetDetail
-from zepben.protobuf.cim.iec61968.common.TownDetail_pb2 import TownDetail as PBTownDetail
-from zepben.protobuf.cim.iec61968.customers.CustomerAgreement_pb2 import CustomerAgreement as PBCustomerAgreement
-from zepben.protobuf.cim.iec61968.customers.CustomerKind_pb2 import CustomerKind as PBCustomerKind
-from zepben.protobuf.cim.iec61968.customers.Customer_pb2 import Customer as PBCustomer
-from zepben.protobuf.cim.iec61968.customers.PricingStructure_pb2 import PricingStructure as PBPricingStructure
-from zepben.protobuf.cim.iec61968.customers.Tariff_pb2 import Tariff as PBTariff
-from zepben.protobuf.cim.iec61968.infiec61968.infassetinfo.CurrentTransformerInfo_pb2 import CurrentTransformerInfo as PBCurrentTransformerInfo
-from zepben.protobuf.cim.iec61968.infiec61968.infassetinfo.PotentialTransformerInfo_pb2 import PotentialTransformerInfo as PBPotentialTransformerInfo
-from zepben.protobuf.cim.iec61968.infiec61968.infassets.Pole_pb2 import Pole as PBPole
-from zepben.protobuf.cim.iec61968.infiec61968.infassets.StreetlightLampKind_pb2 import StreetlightLampKind as PBStreetlightLampKind
-from zepben.protobuf.cim.iec61968.infiec61968.infcommon.Ratio_pb2 import Ratio as PBRatio
-from zepben.protobuf.cim.iec61968.metering.EndDeviceFunctionKind_pb2 import EndDeviceFunctionKind as PBEndDeviceFunctionKind
-from zepben.protobuf.cim.iec61968.metering.EndDeviceFunction_pb2 import EndDeviceFunction as PBEndDeviceFunction
-from zepben.protobuf.cim.iec61968.metering.EndDevice_pb2 import EndDevice as PBEndDevice
-from zepben.protobuf.cim.iec61968.metering.Meter_pb2 import Meter as PBMeter
-from zepben.protobuf.cim.iec61968.metering.UsagePoint_pb2 import UsagePoint as PBUsagePoint
-from zepben.protobuf.cim.iec61968.operations.OperationalRestriction_pb2 import OperationalRestriction as PBOperationalRestriction
-from zepben.protobuf.cim.iec61970.base.auxiliaryequipment.AuxiliaryEquipment_pb2 import AuxiliaryEquipment as PBAuxiliaryEquipment
-from zepben.protobuf.cim.iec61970.base.auxiliaryequipment.CurrentTransformer_pb2 import CurrentTransformer as PBCurrentTransformer
-from zepben.protobuf.cim.iec61970.base.auxiliaryequipment.FaultIndicator_pb2 import FaultIndicator as PBFaultIndicator
-from zepben.protobuf.cim.iec61970.base.auxiliaryequipment.PotentialTransformerKind_pb2 import PotentialTransformerKind as PBPotentialTransformerKind
-from zepben.protobuf.cim.iec61970.base.auxiliaryequipment.PotentialTransformer_pb2 import PotentialTransformer as PBPotentialTransformer
-from zepben.protobuf.cim.iec61970.base.auxiliaryequipment.Sensor_pb2 import Sensor as PBSensor
-from zepben.protobuf.cim.iec61970.base.core.AcDcTerminal_pb2 import AcDcTerminal as PBAcDcTerminal
-from zepben.protobuf.cim.iec61970.base.core.BaseVoltage_pb2 import BaseVoltage as PBBaseVoltage
-from zepben.protobuf.cim.iec61970.base.core.ConductingEquipment_pb2 import ConductingEquipment as PBConductingEquipment
-from zepben.protobuf.cim.iec61970.base.core.ConnectivityNodeContainer_pb2 import ConnectivityNodeContainer as PBConnectivityNodeContainer
-from zepben.protobuf.cim.iec61970.base.core.ConnectivityNode_pb2 import ConnectivityNode as PBConnectivityNode
-from zepben.protobuf.cim.iec61970.base.core.CurveData_pb2 import CurveData as PBCurveData
-from zepben.protobuf.cim.iec61970.base.core.Curve_pb2 import Curve as PBCurve
-from zepben.protobuf.cim.iec61970.base.core.EquipmentContainer_pb2 import EquipmentContainer as PBEquipmentContainer
-from zepben.protobuf.cim.iec61970.base.core.Equipment_pb2 import Equipment as PBEquipment
-from zepben.protobuf.cim.iec61970.base.core.Feeder_pb2 import Feeder as PBFeeder
-from zepben.protobuf.cim.iec61970.base.core.GeographicalRegion_pb2 import GeographicalRegion as PBGeographicalRegion
-from zepben.protobuf.cim.iec61970.base.core.IdentifiedObject_pb2 import IdentifiedObject as PBIdentifiedObject
-from zepben.protobuf.cim.iec61970.base.core.PhaseCode_pb2 import PhaseCode as PBPhaseCode
-from zepben.protobuf.cim.iec61970.base.core.PowerSystemResource_pb2 import PowerSystemResource as PBPowerSystemResource
-from zepben.protobuf.cim.iec61970.base.core.SubGeographicalRegion_pb2 import SubGeographicalRegion as PBSubGeographicalRegion
-from zepben.protobuf.cim.iec61970.base.core.Substation_pb2 import Substation as PBSubstation
-from zepben.protobuf.cim.iec61970.base.core.Terminal_pb2 import Terminal as PBTerminal
-from zepben.protobuf.cim.iec61970.base.diagramlayout.DiagramObjectPoint_pb2 import DiagramObjectPoint as PBDiagramObjectPoint
-from zepben.protobuf.cim.iec61970.base.diagramlayout.DiagramObject_pb2 import DiagramObject as PBDiagramObject
-from zepben.protobuf.cim.iec61970.base.diagramlayout.DiagramStyle_pb2 import DiagramStyle as PBDiagramStyle
-from zepben.protobuf.cim.iec61970.base.diagramlayout.Diagram_pb2 import Diagram as PBDiagram
-from zepben.protobuf.cim.iec61970.base.diagramlayout.OrientationKind_pb2 import OrientationKind as PBOrientationKind
-from zepben.protobuf.cim.iec61970.base.domain.UnitSymbol_pb2 import UnitSymbol as PBUnitSymbol
-from zepben.protobuf.cim.iec61970.base.equivalents.EquivalentBranch_pb2 import EquivalentBranch as PBEquivalentBranch
-from zepben.protobuf.cim.iec61970.base.equivalents.EquivalentEquipment_pb2 import EquivalentEquipment as PBEquivalentEquipment
-from zepben.protobuf.cim.iec61970.base.generation.production.BatteryStateKind_pb2 import BatteryStateKind as PBBatteryStateKind
-from zepben.protobuf.cim.iec61970.base.generation.production.BatteryUnit_pb2 import BatteryUnit as PBBatteryUnit
-from zepben.protobuf.cim.iec61970.base.generation.production.PhotoVoltaicUnit_pb2 import PhotoVoltaicUnit as PBPhotoVoltaicUnit
-from zepben.protobuf.cim.iec61970.base.generation.production.PowerElectronicsUnit_pb2 import PowerElectronicsUnit as PBPowerElectronicsUnit
-from zepben.protobuf.cim.iec61970.base.generation.production.PowerElectronicsWindUnit_pb2 import PowerElectronicsWindUnit as PBPowerElectronicsWindUnit
-from zepben.protobuf.cim.iec61970.base.meas.Accumulator_pb2 import Accumulator as PBAccumulator
-from zepben.protobuf.cim.iec61970.base.meas.Analog_pb2 import Analog as PBAnalog
-from zepben.protobuf.cim.iec61970.base.meas.Control_pb2 import Control as PBControl
-from zepben.protobuf.cim.iec61970.base.meas.Discrete_pb2 import Discrete as PBDiscrete
-from zepben.protobuf.cim.iec61970.base.meas.IoPoint_pb2 import IoPoint as PBIoPoint
-from zepben.protobuf.cim.iec61970.base.meas.Measurement_pb2 import Measurement as PBMeasurement
-from zepben.protobuf.cim.iec61970.base.protection.CurrentRelay_pb2 import CurrentRelay as PBCurrentRelay
-from zepben.protobuf.cim.iec61970.base.scada.RemoteControl_pb2 import RemoteControl as PBRemoteControl
-from zepben.protobuf.cim.iec61970.base.scada.RemotePoint_pb2 import RemotePoint as PBRemotePoint
-from zepben.protobuf.cim.iec61970.base.scada.RemoteSource_pb2 import RemoteSource as PBRemoteSource
-from zepben.protobuf.cim.iec61970.base.wires.AcLineSegment_pb2 import AcLineSegment as PBAcLineSegment
-from zepben.protobuf.cim.iec61970.base.wires.Breaker_pb2 import Breaker as PBBreaker
-from zepben.protobuf.cim.iec61970.base.wires.BusbarSection_pb2 import BusbarSection as PBBusbarSection
-from zepben.protobuf.cim.iec61970.base.wires.Clamp_pb2 import Clamp as PBClamp
-from zepben.protobuf.cim.iec61970.base.wires.Conductor_pb2 import Conductor as PBConductor
-from zepben.protobuf.cim.iec61970.base.wires.Connector_pb2 import Connector as PBConnector
-from zepben.protobuf.cim.iec61970.base.wires.Cut_pb2 import Cut as PBCut
-from zepben.protobuf.cim.iec61970.base.wires.Disconnector_pb2 import Disconnector as PBDisconnector
-from zepben.protobuf.cim.iec61970.base.wires.EarthFaultCompensator_pb2 import EarthFaultCompensator as PBEarthFaultCompensator
-from zepben.protobuf.cim.iec61970.base.wires.EnergyConnection_pb2 import EnergyConnection as PBEnergyConnection
-from zepben.protobuf.cim.iec61970.base.wires.EnergyConsumerPhase_pb2 import EnergyConsumerPhase as PBEnergyConsumerPhase
-from zepben.protobuf.cim.iec61970.base.wires.EnergyConsumer_pb2 import EnergyConsumer as PBEnergyConsumer
-from zepben.protobuf.cim.iec61970.base.wires.EnergySourcePhase_pb2 import EnergySourcePhase as PBEnergySourcePhase
-from zepben.protobuf.cim.iec61970.base.wires.EnergySource_pb2 import EnergySource as PBEnergySource
-from zepben.protobuf.cim.iec61970.base.wires.Fuse_pb2 import Fuse as PBFuse
-from zepben.protobuf.cim.iec61970.base.wires.GroundDisconnector_pb2 import GroundDisconnector as PBGroundDisconnector
-from zepben.protobuf.cim.iec61970.base.wires.Ground_pb2 import Ground as PBGround
-from zepben.protobuf.cim.iec61970.base.wires.GroundingImpedance_pb2 import GroundingImpedance as PBGroundingImpedance
-from zepben.protobuf.cim.iec61970.base.wires.Jumper_pb2 import Jumper as PBJumper
-from zepben.protobuf.cim.iec61970.base.wires.Junction_pb2 import Junction as PBJunction
-from zepben.protobuf.cim.iec61970.base.wires.Line_pb2 import Line as PBLine
-from zepben.protobuf.cim.iec61970.base.wires.LinearShuntCompensator_pb2 import LinearShuntCompensator as PBLinearShuntCompensator
-from zepben.protobuf.cim.iec61970.base.wires.LoadBreakSwitch_pb2 import LoadBreakSwitch as PBLoadBreakSwitch
-from zepben.protobuf.cim.iec61970.base.wires.PerLengthImpedance_pb2 import PerLengthImpedance as PBPerLengthImpedance
-from zepben.protobuf.cim.iec61970.base.wires.PerLengthLineParameter_pb2 import PerLengthLineParameter as PBPerLengthLineParameter
-from zepben.protobuf.cim.iec61970.base.wires.PerLengthPhaseImpedance_pb2 import PerLengthPhaseImpedance as PBPerLengthPhaseImpedance
-from zepben.protobuf.cim.iec61970.base.wires.PerLengthSequenceImpedance_pb2 import PerLengthSequenceImpedance as PBPerLengthSequenceImpedance
-from zepben.protobuf.cim.iec61970.base.wires.PhaseImpedanceData_pb2 import PhaseImpedanceData as PBPhaseImpedanceData
-from zepben.protobuf.cim.iec61970.base.wires.PhaseShuntConnectionKind_pb2 import PhaseShuntConnectionKind as PBPhaseShuntConnectionKind
-from zepben.protobuf.cim.iec61970.base.wires.PowerElectronicsConnectionPhase_pb2 import PowerElectronicsConnectionPhase as PBPowerElectronicsConnectionPhase
-from zepben.protobuf.cim.iec61970.base.wires.PowerElectronicsConnection_pb2 import PowerElectronicsConnection as PBPowerElectronicsConnection
-from zepben.protobuf.cim.iec61970.base.wires.PowerTransformerEnd_pb2 import PowerTransformerEnd as PBPowerTransformerEnd
-from zepben.protobuf.cim.iec61970.base.wires.PowerTransformer_pb2 import PowerTransformer as PBPowerTransformer
-from zepben.protobuf.cim.iec61970.base.wires.ProtectedSwitch_pb2 import ProtectedSwitch as PBProtectedSwitch
-from zepben.protobuf.cim.iec61970.base.wires.RatioTapChanger_pb2 import RatioTapChanger as PBRatioTapChanger
-from zepben.protobuf.cim.iec61970.base.wires.ReactiveCapabilityCurve_pb2 import ReactiveCapabilityCurve as PBReactiveCapabilityCurve
-from zepben.protobuf.cim.iec61970.base.wires.Recloser_pb2 import Recloser as PBRecloser
-from zepben.protobuf.cim.iec61970.base.wires.RegulatingCondEq_pb2 import RegulatingCondEq as PBRegulatingCondEq
-from zepben.protobuf.cim.iec61970.base.wires.RegulatingControlModeKind_pb2 import RegulatingControlModeKind as PBRegulatingControlModeKind
-from zepben.protobuf.cim.iec61970.base.wires.RegulatingControl_pb2 import RegulatingControl as PBRegulatingControl
-from zepben.protobuf.cim.iec61970.base.wires.RotatingMachine_pb2 import RotatingMachine as PBRotatingMachine
-from zepben.protobuf.cim.iec61970.base.wires.SVCControlMode_pb2 import SVCControlMode as PBSVCControlMode
-from zepben.protobuf.cim.iec61970.base.wires.SeriesCompensator_pb2 import SeriesCompensator as PBSeriesCompensator
-from zepben.protobuf.cim.iec61970.base.wires.ShuntCompensator_pb2 import ShuntCompensator as PBShuntCompensator
-from zepben.protobuf.cim.iec61970.base.wires.SinglePhaseKind_pb2 import SinglePhaseKind as PBSinglePhaseKind
-from zepben.protobuf.cim.iec61970.base.wires.StaticVarCompensator_pb2 import StaticVarCompensator as PBStaticVarCompensator
-from zepben.protobuf.cim.iec61970.base.wires.Switch_pb2 import Switch as PBSwitch
-from zepben.protobuf.cim.iec61970.base.wires.SynchronousMachineKind_pb2 import SynchronousMachineKind as PBSynchronousMachineKind
-from zepben.protobuf.cim.iec61970.base.wires.SynchronousMachine_pb2 import SynchronousMachine as PBSynchronousMachine
-from zepben.protobuf.cim.iec61970.base.wires.TapChangerControl_pb2 import TapChangerControl as PBTapChangerControl
-from zepben.protobuf.cim.iec61970.base.wires.TapChanger_pb2 import TapChanger as PBTapChanger
-from zepben.protobuf.cim.iec61970.base.wires.TransformerEnd_pb2 import TransformerEnd as PBTransformerEnd
-from zepben.protobuf.cim.iec61970.base.wires.TransformerStarImpedance_pb2 import TransformerStarImpedance as PBTransformerStarImpedance
-from zepben.protobuf.cim.iec61970.base.wires.WindingConnection_pb2 import WindingConnection as PBWindingConnection
-from zepben.protobuf.cim.iec61970.infiec61970.feeder.Circuit_pb2 import Circuit as PBCircuit
from zepben.protobuf.dc.dc_data_pb2 import DiagramIdentifiedObject
from zepben.protobuf.nc.nc_data_pb2 import NetworkIdentifiedObject
-MIN_32_BIT_INTEGER = -2147483647 # _UNKNOWN_INT = -2147483648
-MAX_32_BIT_INTEGER = 2147483647
-MAX_32_BIT_UNSIGNED_INTEGER = 4294967294 # _UNKNOWN_UINT = 4294967295
-MAX_64_BIT_INTEGER = 9223372036854775807
-MIN_64_BIT_INTEGER = -9223372036854775807 # _UNKNOWN_LONG = -9223372036854775808
-TEXT_MAX_SIZE = 6
-FLOAT_MIN = -100.0
-FLOAT_MAX = 1000.0
-MAX_END_NUMBER = 3
-MAX_SEQUENCE_NUMBER = 40
-MIN_SEQUENCE_NUMBER = 1
-ALPHANUM = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
-
-
-##################################
-# Extensions IEC61968 Asset Info #
-##################################
-
-def floats(*args, **kwargs):
- kwargs.update({"width": 32})
- return hypo_floats(*args, **kwargs)
-
-def lists(*args, **kwargs):
- if kwargs.get("min_size") == 1:
- raise ValueError("min_size = 1 is not required as its the default. please dont make messy code.")
- kwargs.update({"min_size": 1})
- return hypo_lists(*args, **kwargs)
-
-def relay_info():
- return builds(
- PBRelayInfo,
- ai=asset_info(),
- curveSettingSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- **nullable_bool_settings("recloseFast"),
- recloseDelays=lists(floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), max_size=3)
- )
-
-
-################################
-# Extensions IEC61968 Metering #
-################################
-
-def pan_demand_response_function():
- return builds(
- PBPanDemandResponseFunction,
- edf=end_device_function(),
- kind=sampled_from(PBEndDeviceFunctionKind.values()),
- applianceSet=integers(min_value=0, max_value=4095),
- )
-
-
-#################################
-# Extensions IEC61970 Base Core #
-#################################
-
-def site():
- return builds(PBSite, ec=equipment_container())
-
-
-###################################
-# Extensions IEC61970 Base Feeder #
-###################################
-
-def loop():
- return builds(
- PBLoop,
- io=identified_object(),
- circuitMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- substationMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- normalEnergizingSubstationMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def lv_feeder():
- return builds(
- PBLvFeeder,
- ec=equipment_container(),
- normalHeadTerminalMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- normalEnergizingFeederMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-##################################################
-# Extensions IEC61970 Base Generation Production #
-##################################################
-
-def ev_charging_unit():
- return builds(PBEvChargingUnit, peu=power_electronics_unit())
-
-
-#######################################
-# Extensions IEC61970 Base Protection #
-#######################################
-
-def distance_relay():
- return builds(
- PBDistanceRelay,
- prf=protection_relay_function(),
- backwardBlindSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- backwardReachSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- backwardReactanceSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- forwardBlindSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- forwardReachSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- forwardReactanceSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- operationPhaseAngle1Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- operationPhaseAngle2Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- operationPhaseAngle3Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- )
-
-
-def protection_relay_function():
- return builds(
- PBProtectionRelayFunction,
- psr=power_system_resource(),
- modelSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- **nullable_bool_settings("reclosing"),
- relayDelayTimeSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- protectionKind=sampled_from(PBProtectionKind.values()),
- **nullable_bool_settings("directable"),
- powerDirection=sampled_from(PBPowerDirectionKind.values()),
- sensorMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- protectedSwitchMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- schemeMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- timeLimits=lists(floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)),
- thresholds=lists(relay_setting(), max_size=4)
- )
-
-
-def protection_relay_scheme():
- return builds(
- PBProtectionRelayScheme,
- io=identified_object(),
- systemMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- functionMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def protection_relay_system():
- return builds(
- PBProtectionRelaySystem,
- eq=equipment(),
- protectionKind=sampled_from(PBProtectionKind.values()),
- schemeMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def relay_setting():
- return builds(
- PBRelaySetting,
- nameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- unitSymbol=sampled_from(PBUnitSymbol.values()),
- value=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def voltage_relay():
- return builds(
- PBVoltageRelay,
- prf=protection_relay_function()
- )
-
-
-##################################
-# Extensions IEC61970 Base Wires #
-##################################
-
-def battery_control():
- return builds(
- PBBatteryControl,
- rc=regulating_control(),
- chargingRateSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- dischargingRateSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- reservePercentSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- controlMode=sampled_from(PBBatteryControlMode.values())
- )
-
-
-def transformer_end_rated_s():
- return builds(
- PBTransformerEndRatedS,
- coolingType=sampled_from(PBTransformerCoolingType.values()),
- ratedS=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- )
-
-
-#######################
-# IEC61968 Asset Info #
-#######################
-
-def cable_info():
- return builds(PBCableInfo, wi=wire_info())
-
-
-def no_load_test():
- return builds(
- PBNoLoadTest,
- tt=transformer_test(),
- energisedEndVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- excitingCurrentSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- excitingCurrentZeroSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- lossSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- lossZeroSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
- )
-
-
-def open_circuit_test():
- return builds(
- PBOpenCircuitTest,
- tt=transformer_test(),
- energisedEndStepSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- energisedEndVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- openEndStepSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- openEndVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- phaseShiftSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def overhead_wire_info():
- return builds(PBOverheadWireInfo, wi=wire_info())
-
-
-def power_transformer_info():
- return builds(
- PBPowerTransformerInfo,
- ai=asset_info(),
- transformerTankInfoMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def short_circuit_test():
- return builds(
- PBShortCircuitTest,
- tt=transformer_test(),
- currentSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- energisedEndStepSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- groundedEndStepSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- leakageImpedanceSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- leakageImpedanceZeroSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- lossSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- lossZeroSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- powerSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- voltageSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- voltageOhmicPartSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def shunt_compensator_info():
- return builds(
- PBShuntCompensatorInfo,
- ai=asset_info(),
- maxPowerLossSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- ratedCurrentSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- ratedReactivePowerSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- ratedVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- )
-
-
-def switch_info():
- return builds(
- PBSwitchInfo,
- ai=asset_info(),
- ratedInterruptingTimeSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def transformer_end_info():
- return builds(
- PBTransformerEndInfo,
- ai=asset_info(),
- connectionKind=sampled_from(PBWindingConnection.values()),
- emergencySSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- endNumber=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- insulationUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- phaseAngleClockSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- ratedSSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- ratedUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- shortTermSSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- transformerStarImpedanceMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- )
-
-
-def transformer_tank_info():
- return builds(
- PBTransformerTankInfo,
- ai=asset_info(),
- transformerEndInfoMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def transformer_test():
- return builds(
- PBTransformerTest,
- io=identified_object(),
- basePowerSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- temperatureSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def wire_info():
- return builds(
- PBWireInfo,
- ai=asset_info(),
- ratedCurrentSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- material=sampled_from(PBWireMaterialKind.values())
- )
-
-
-###################
-# IEC61968 Assets #
-###################
-
-def asset():
- return builds(
- PBAsset,
- io=identified_object(),
- locationMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- organisationRoleMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- powerSystemResourceMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def asset_container():
- return builds(PBAssetContainer, at=asset())
-
-
-def asset_function():
- return builds(PBAssetFunction, io=identified_object())
-
-
-def asset_info():
- return builds(PBAssetInfo, io=identified_object())
-
-
-def asset_organisation_role():
- d = {"or": organisation_role()} # To set field `or` that's a reserved word
- return builds(PBAssetOrganisationRole, **d)
-
-
-def asset_owner():
- return builds(PBAssetOwner, aor=asset_organisation_role())
-
-
-def streetlight():
- return builds(
- PBStreetlight,
- at=asset(),
- poleMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- lightRatingSet=integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- lampKind=sampled_from(PBStreetlightLampKind.values())
- )
-
-
-def structure():
- return builds(PBStructure, ac=asset_container())
-
-
-###################
-# IEC61968 Common #
-###################
-
-def agreement():
- return builds(PBAgreement, doc=document())
-
-
-def document():
- return builds(
- PBDocument,
- io=identified_object(),
- titleSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- createdDateTimeSet=timestamp(),
- authorNameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- typeSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- statusSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- commentSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- )
-
-
-def location():
- return builds(PBLocation, io=identified_object(), mainAddress=street_address(), positionPoints=lists(position_point(), max_size=2))
-
-
-def organisation():
- return builds(PBOrganisation, io=identified_object())
-
-
-def organisation_role():
- return builds(PBOrganisationRole, io=identified_object(), organisationMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE))
-
-
-def position_point():
- return builds(PBPositionPoint, xPosition=floats(min_value=-180.0, max_value=180.0), yPosition=floats(min_value=-90.0, max_value=90.0))
-
-
-def street_address():
- return builds(
- PBStreetAddress,
- postalCodeSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- townDetail=town_detail(),
- poBoxSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- streetDetail=street_detail()
- )
-
-
-def street_detail():
- return builds(
- PBStreetDetail,
- buildingNameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE).map(str),
- floorIdentificationSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE).map(str),
- nameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE).map(str),
- numberSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE).map(str),
- suiteNumberSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE).map(str),
- typeSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE).map(str),
- displayAddressSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE).map(str),
- buildingNumberSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE).map(str)
- )
-
-
-def town_detail():
- return builds(
- PBTownDetail,
- nameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE).map(str),
- stateOrProvinceSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE).map(str)
- )
-
-
-######################
-# IEC61968 Customers #
-######################
-
-
-def customer():
- d = {"or": organisation_role()} # To set field `or` that's a reserved word
- return builds(
- PBCustomer,
- kind=sampled_from(PBCustomerKind.values()),
- customerAgreementMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- **d
- )
-
-
-def customer_agreement():
- return builds(
- PBCustomerAgreement,
- agr=agreement(),
- customerMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- pricingStructureMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- )
-
-
-def pricing_structure():
- return builds(
- PBPricingStructure,
- doc=document(),
- tariffMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- )
-
-
-def tariff():
- return builds(
- PBTariff,
- doc=document(),
- )
-
-
-#####################################
-# IEC61968 InfIEC61968 InfAssetInfo #
-#####################################
-
-def current_transformer_info():
- return builds(
- PBCurrentTransformerInfo,
- ai=asset_info(),
- accuracyClassSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- accuracyLimitSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- coreCountSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- ctClassSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- kneePointVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- maxRatio=ratio(),
- nominalRatio=ratio(),
- primaryRatioSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- ratedCurrentSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- secondaryFlsRatingSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- secondaryRatioSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- usageSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- )
-
-
-def potential_transformer_info():
- return builds(
- PBPotentialTransformerInfo,
- ai=asset_info(),
- accuracyClassSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- nominalRatio=ratio(),
- primaryRatioSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- ptClassSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- ratedVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- secondaryRatioSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-##################################
-# IEC61968 InfIEC61968 InfAssets #
-##################################
-
-
-def pole():
- return builds(
- PBPole,
- st=structure(),
- streetlightMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- classificationSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- )
-
-
-##################################
-# IEC61968 InfIEC61968 InfCommon #
-##################################
-
-def ratio():
- return builds(PBRatio, denominator=floats(min_value=0.10000000149011612, max_value=1000.0), numerator=floats(min_value=0.0, max_value=1000.0))
-
-
-#####################
-# IEC61968 Metering #
-#####################
-
-def end_device():
- return builds(
- PBEndDevice,
- ac=asset_container(),
- usagePointMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- customerMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- serviceLocationMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- endDeviceFunctionMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- )
-
-
-def end_device_function():
- return builds(
- PBEndDeviceFunction,
- af=asset_function(),
- **nullable_bool_settings("enabled"),
- )
-
-
-def meter():
- return builds(PBMeter, ed=end_device())
-
-
-def usage_point():
- return builds(
- PBUsagePoint,
- io=identified_object(),
- usagePointLocationMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- equipmentMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- endDeviceMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- isVirtualSet=booleans(),
- connectionCategorySet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- ratedPowerSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- approvedInverterCapacitySet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
- )
-
-
-#######################
-# IEC61968 Operations #
-#######################
-
-def operational_restriction():
- return builds(PBOperationalRestriction, doc=document())
-
-
-#####################################
-# IEC61970 Base Auxiliary Equipment #
-#####################################
-
-def auxiliary_equipment():
- return builds(PBAuxiliaryEquipment, eq=equipment(), terminalMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE))
-
-
-def current_transformer():
- return builds(PBCurrentTransformer, sn=sensor(), coreBurdenSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER))
-
-
-def fault_indicator():
- return builds(PBFaultIndicator, ae=auxiliary_equipment())
-
-
-def potential_transformer():
- return builds(PBPotentialTransformer, sn=sensor(), type=sampled_from(PBPotentialTransformerKind.values()))
-
-
-def sensor():
- return builds(PBSensor, ae=auxiliary_equipment(), relayFunctionMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2))
-
-
-######################
-# IEC61970 Base Core #
-######################
-
-def ac_dc_terminal():
- return builds(PBAcDcTerminal, io=identified_object())
-
-
-def base_voltage():
- return builds(PBBaseVoltage, io=identified_object(), nominalVoltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER))
-
-
-def conducting_equipment():
- return builds(
- PBConductingEquipment,
- eq=equipment(),
- baseVoltageMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- terminalMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def connectivity_node():
- return builds(PBConnectivityNode, io=identified_object())
-
-
-def connectivity_node_container():
- return builds(PBConnectivityNodeContainer, psr=power_system_resource())
-
-
-def curve():
- return builds(
- PBCurve,
- io=identified_object(),
- curveData=lists(curve_data(), max_size=2)
- )
-
-
-def curve_data():
- return builds(
- PBCurveData,
- xValue=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- y1Value=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- y2ValueSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- y3ValueSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- )
-
-
-def equipment():
- return builds(
- PBEquipment,
- psr=power_system_resource(),
- inService=booleans(),
- normallyInService=booleans(),
- commissionedDateSet=timestamp(),
- equipmentContainerMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- usagePointMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- operationalRestrictionMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- currentContainerMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def equipment_container():
- return builds(PBEquipmentContainer, cnc=connectivity_node_container())
-
-
-def feeder():
- return builds(
- PBFeeder,
- ec=equipment_container(),
- normalHeadTerminalMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- normalEnergizingSubstationMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- normalEnergizedLvFeederMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def geographical_region():
- return builds(PBGeographicalRegion, io=identified_object(), subGeographicalRegionMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2))
-
-
-def identified_object():
- return builds(
- PBIdentifiedObject,
- mRID=uuids(version=4).map(lambda x: str(x)),
- nameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- descriptionSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- )
-
-
-def power_system_resource():
- return builds(
- PBPowerSystemResource,
- io=identified_object(),
- assetInfoMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- locationMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- assetMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def sub_geographical_region():
- return builds(
- PBSubGeographicalRegion,
- io=identified_object(),
- geographicalRegionMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- substationMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def substation():
- return builds(
- PBSubstation,
- ec=equipment_container(),
- subGeographicalRegionMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- normalEnergizedFeederMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- loopMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- normalEnergizedLoopMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- circuitMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def terminal():
- return builds(
- PBTerminal,
- ad=ac_dc_terminal(),
- conductingEquipmentMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- connectivityNodeMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- tracedPhases=integers(min_value=0, max_value=65535),
- phases=sampled_from(PBPhaseCode.values()),
- sequenceNumber=integers(min_value=MIN_SEQUENCE_NUMBER, max_value=MAX_SEQUENCE_NUMBER)
- )
-
-
-################################
-# IEC61970 Base Diagram Layout #
-################################
-
-
-def diagram():
- return builds(
- PBDiagram,
- io=identified_object(),
- diagramStyle=sampled_from(PBDiagramStyle.values()),
- orientationKind=sampled_from(PBOrientationKind.values()),
- diagramObjectMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def diagram_object():
- return builds(
- PBDiagramObject,
- io=identified_object(),
- diagramMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- diagramObjectStyleSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- rotation=floats(min_value=0.0, max_value=360.0),
- identifiedObjectMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- diagramObjectPoints=lists(diagram_object_point(), max_size=2)
- )
-
-
-def diagram_object_point():
- return builds(
- PBDiagramObjectPoint,
- xPosition=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- yPosition=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- )
-
-
-#############################
-# IEC61970 Base Equivalents #
-#############################
-
-def equivalent_branch():
- return builds(
- PBEquivalentBranch,
- ee=equivalent_equipment(),
- negativeR12Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- negativeR21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- negativeX12Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- negativeX21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- positiveR12Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- positiveR21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- positiveX12Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- positiveX21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- zeroR12Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- zeroR21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- zeroX12Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- zeroX21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def equivalent_equipment():
- return builds(PBEquivalentEquipment, ce=conducting_equipment())
-
-
-#######################################
-# IEC61970 Base Generation Production #
-#######################################
-
-def battery_unit():
- return builds(
- PBBatteryUnit,
- peu=power_electronics_unit(),
- batteryState=sampled_from(PBBatteryStateKind.values()),
- ratedESet=integers(min_value=0, max_value=MAX_64_BIT_INTEGER),
- storedESet=integers(min_value=0, max_value=MAX_64_BIT_INTEGER),
- batteryControlMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def photo_voltaic_unit():
- return builds(PBPhotoVoltaicUnit, peu=power_electronics_unit())
-
-
-def power_electronics_unit():
- return builds(
- PBPowerElectronicsUnit,
- eq=equipment(),
- powerElectronicsConnectionMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- maxPSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- minPSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
- )
-
-
-def power_electronics_wind_unit():
- return builds(PBPowerElectronicsWindUnit, peu=power_electronics_unit())
-
-
-######################
-# IEC61970 Base Meas #
-######################
-
-def accumulator():
- return builds(PBAccumulator, measurement=measurement())
-
-
-def analog():
- return builds(PBAnalog, measurement=measurement(), positiveFlowInSet=booleans())
-
-
-def control():
- return builds(
- PBControl,
- ip=io_point(),
- powerSystemResourceMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- remoteControlMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- )
-
-
-def discrete():
- return builds(PBDiscrete, measurement=measurement())
-
-
-def io_point():
- return builds(PBIoPoint, io=identified_object())
-
-
-def measurement():
- return builds(
- PBMeasurement,
- io=identified_object(),
- remoteSourceMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- powerSystemResourceMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- terminalMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- phases=sampled_from(PBPhaseCode.values()),
- unitSymbol=sampled_from(PBUnitSymbol.values())
- )
-
-
-############################
-# IEC61970 Base Protection #
-############################
-
-def current_relay():
- return builds(
- PBCurrentRelay,
- prf=protection_relay_function(),
- currentLimit1Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- **nullable_bool_settings("inverseTimeFlag"),
- timeDelay1Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-#######################
-# IEC61970 Base Scada #
-#######################
-
-def remote_control():
- return builds(PBRemoteControl, rp=remote_point(), controlMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE))
-
-
-def remote_point():
- return builds(PBRemotePoint, io=identified_object())
-
-
-def remote_source():
- return builds(PBRemoteSource, rp=remote_point(), measurementMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE))
-
-
-#######################
-# IEC61970 Base Wires #
-#######################
-
-def ac_line_segment():
- return builds(PBAcLineSegment, cd=conductor(), perLengthImpedanceMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE))
-
-
-def breaker():
- return builds(
- PBBreaker,
- sw=protected_switch(),
- inTransitTimeSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def busbar_section():
- return builds(PBBusbarSection, cn=connector())
-
-
-def clamp():
- return builds(
- PBClamp,
- ce=conducting_equipment(),
- lengthFromTerminal1Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- acLineSegmentMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- )
-
-
-def conductor():
- return builds(PBConductor, ce=conducting_equipment(), lengthSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
-
-
-def connector():
- return builds(PBConnector, ce=conducting_equipment())
-
-
-def cut():
- return builds(
- PBCut,
- sw=switch(),
- lengthFromTerminal1Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- acLineSegmentMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- )
-
-
-def disconnector():
- return builds(PBDisconnector, sw=switch())
-
-
-def earth_fault_compensator():
- return builds(PBEarthFaultCompensator, ce=conducting_equipment(), rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
-
-
-def energy_connection():
- return builds(PBEnergyConnection, ce=conducting_equipment())
-
-
-def energy_consumer():
- return builds(
- PBEnergyConsumer,
- ec=energy_connection(),
- energyConsumerPhasesMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- customerCountSet=integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- groundedSet=booleans(), pSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- pFixedSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- phaseConnection=sampled_from(PBPhaseShuntConnectionKind.values()),
- qSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- qFixedSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def energy_consumer_phase():
- return builds(
- PBEnergyConsumerPhase,
- psr=power_system_resource(),
- energyConsumerMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- phase=sampled_from(PBSinglePhaseKind.values()),
- pSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- pFixedSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- qSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- qFixedSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def energy_source():
- return builds(
- PBEnergySource,
- ec=energy_connection(),
- energySourcePhasesMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- activePowerSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- reactivePowerSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- voltageAngleSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- voltageMagnitudeSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- pMaxSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- pMinSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- rnSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- xnSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def energy_source_phase():
- return builds(
- PBEnergySourcePhase,
- psr=power_system_resource(),
- energySourceMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- phase=sampled_from(PBSinglePhaseKind.values())
- )
-
-
-def fuse():
- return builds(PBFuse, sw=switch(), functionMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE))
-
-
-def ground():
- return builds(PBGround, ce=conducting_equipment())
-
-
-def ground_disconnector():
- return builds(PBGroundDisconnector, sw=switch())
-
-
-def grounding_impedance():
- return builds(PBGroundingImpedance, efc=earth_fault_compensator(), xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX))
-
-
-def jumper():
- return builds(PBJumper, sw=switch())
-
-
-def junction():
- return builds(PBJunction, cn=connector())
-
-
-def line():
- return builds(PBLine, ec=equipment_container())
-
-
-def linear_shunt_compensator():
- return builds(
- PBLinearShuntCompensator,
- sc=shunt_compensator(),
- b0PerSectionSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- bPerSectionSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- g0PerSectionSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- gPerSectionSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def load_break_switch():
- return builds(PBLoadBreakSwitch, ps=protected_switch())
-
-
-def per_length_impedance():
- return builds(PBPerLengthImpedance, lp=per_length_line_parameter())
-
-
-def per_length_line_parameter():
- return builds(PBPerLengthLineParameter, io=identified_object())
-
-
-def per_length_phase_impedance():
- return builds(
- PBPerLengthPhaseImpedance,
- pli=per_length_impedance(),
- phaseImpedanceData=lists(phase_impedance_data(), max_size=2)
- )
-
-
-def per_length_sequence_impedance():
- return builds(
- PBPerLengthSequenceImpedance,
- pli=per_length_impedance(),
- rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- bchSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- gchSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- b0chSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- g0chSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def phase_impedance_data():
- return builds(
- PBPhaseImpedanceData,
- fromPhase=sampled_from(PBSinglePhaseKind.values()),
- toPhase=sampled_from(PBSinglePhaseKind.values()),
- bSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- gSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- )
-
-
-def power_electronics_connection():
- return builds(
- PBPowerElectronicsConnection,
- rce=regulating_cond_eq(),
- powerElectronicsUnitMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- powerElectronicsConnectionPhaseMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- maxIFaultSet=integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- maxQSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- minQSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- pSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- qSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- ratedSSet=integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- ratedUSet=integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- inverterStandardSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- sustainOpOvervoltLimitSet=integers(min_value=0, max_value=MAX_32_BIT_INTEGER),
- stopAtOverFreqSet=floats(min_value=51.0, max_value=52.0),
- stopAtUnderFreqSet=floats(min_value=47.0, max_value=49.0),
- **nullable_bool_settings("invVoltWattRespMode"),
- invWattRespV1Set=integers(min_value=200, max_value=300),
- invWattRespV2Set=integers(min_value=216, max_value=230),
- invWattRespV3Set=integers(min_value=235, max_value=255),
- invWattRespV4Set=integers(min_value=244, max_value=265),
- invWattRespPAtV1Set=floats(min_value=0.0, max_value=1.0),
- invWattRespPAtV2Set=floats(min_value=0.0, max_value=1.0),
- invWattRespPAtV3Set=floats(min_value=0.0, max_value=1.0),
- invWattRespPAtV4Set=floats(min_value=0.0, max_value=0.20000000298023224),
- **nullable_bool_settings("invVoltVarRespMode"),
- invVarRespV1Set=integers(min_value=200, max_value=300),
- invVarRespV2Set=integers(min_value=200, max_value=300),
- invVarRespV3Set=integers(min_value=200, max_value=300),
- invVarRespV4Set=integers(min_value=200, max_value=300),
- invVarRespQAtV1Set=floats(min_value=0.0, max_value=0.6000000238418579),
- invVarRespQAtV2Set=floats(min_value=-1.0, max_value=1.0),
- invVarRespQAtV3Set=floats(min_value=-1.0, max_value=1.0),
- invVarRespQAtV4Set=floats(min_value=-0.6000000238418579, max_value=0.0),
- **nullable_bool_settings("invReactivePowerMode"),
- invFixReactivePowerSet=floats(min_value=-1.0, max_value=1.0),
- )
-
-
-def power_electronics_connection_phase():
- return builds(
- PBPowerElectronicsConnectionPhase,
- psr=power_system_resource(), powerElectronicsConnectionMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- phase=sampled_from(PBSinglePhaseKind.values()),
- pSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- qSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def power_transformer():
- return builds(
- PBPowerTransformer,
- ce=conducting_equipment(),
- powerTransformerEndMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- vectorGroup=sampled_from(PBVectorGroup.values()),
- transformerUtilisationSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def power_transformer_end():
- return builds(
- PBPowerTransformerEnd,
- te=transformer_end(),
- powerTransformerMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- ratedUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- connectionKind=sampled_from(PBWindingConnection.values()),
- bSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- b0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- gSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- g0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- phaseAngleClockSet=integers(min_value=0, max_value=11),
- ratings=lists(transformer_end_rated_s(), max_size=3)
- )
-
-
-def protected_switch():
- return builds(
- PBProtectedSwitch,
- sw=switch(),
- breakingCapacitySet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- relayFunctionMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def ratio_tap_changer():
- return builds(
- PBRatioTapChanger,
- tc=tap_changer(),
- transformerEndMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- stepVoltageIncrementSet=floats(min_value=0.0, max_value=1.0)
- )
-
-
-def reactive_capability_curve():
- return builds(
- PBReactiveCapabilityCurve,
- c=curve(),
- )
-
-
-def recloser():
- return builds(PBRecloser, sw=protected_switch())
-
-
-def regulating_cond_eq():
- return builds(
- PBRegulatingCondEq,
- ec=energy_connection(),
- controlEnabledSet=booleans(),
- regulatingControlMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- )
-
-
-def regulating_control():
- return builds(
- PBRegulatingControl,
- psr=power_system_resource(),
- discreteSet=booleans(),
- mode=sampled_from(PBRegulatingControlModeKind.values()),
- monitoredPhase=sampled_from(PBPhaseCode.values()),
- targetDeadbandSet=floats(min_value=0.0, max_value=FLOAT_MAX),
- targetValueSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- enabledSet=booleans(),
- maxAllowedTargetValueSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- minAllowedTargetValueSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- ratedCurrentSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- terminalMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- regulatingCondEqMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-def rotating_machine():
- return builds(
- PBRotatingMachine,
- rce=regulating_cond_eq(),
- ratedPowerFactorSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- ratedSSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- ratedUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- pSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- qSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)
- )
-
-
-def series_compensator():
- return builds(
- PBSeriesCompensator,
- ce=conducting_equipment(),
- rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- varistorRatedCurrentSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- varistorVoltageThresholdSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- )
-
-
-def shunt_compensator():
- return builds(
- PBShuntCompensator,
- rce=regulating_cond_eq(),
- sectionsSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- groundedSet=booleans(),
- nomUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- phaseConnection=sampled_from(PBPhaseShuntConnectionKind.values())
- )
-
-
-def static_var_compensator():
- return builds(
- PBStaticVarCompensator,
- rce=regulating_cond_eq(),
- capacitiveRatingSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- inductiveRatingSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- qSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- svcControlMode=sampled_from(PBSVCControlMode.values()),
- voltageSetPointSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)
- )
-
-
-def switch():
- return builds(
- PBSwitch,
- ce=conducting_equipment(),
- ratedCurrentSet=integers(min_value=1, max_value=MAX_32_BIT_INTEGER),
- normalOpen=booleans(),
- open=booleans()
- )
-
-
-def synchronous_machine():
- return builds(
- PBSynchronousMachine,
- rm=rotating_machine(),
- baseQSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- condenserPSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- earthingSet=booleans(),
- earthingStarPointRSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- earthingStarPointXSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- ikkSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- maxQSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- maxUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- minQSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- minUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- muSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r2Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- satDirectSubtransXSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- satDirectSyncXSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- satDirectTransXSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x2Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- type=sampled_from(PBSynchronousMachineKind.values()),
- operatingMode=sampled_from(PBSynchronousMachineKind.values()),
- reactiveCapabilityCurveMRIDs=one_of(none(), text(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE))),
- )
-
-
-def tap_changer():
- return builds(
- PBTapChanger,
- psr=power_system_resource(),
- highStepSet=integers(min_value=10, max_value=15),
- lowStepSet=integers(min_value=0, max_value=2),
- stepSet=floats(min_value=2.0, max_value=10.0),
- neutralStepSet=integers(min_value=2, max_value=10),
- neutralUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- normalStepSet=integers(min_value=2, max_value=10),
- controlEnabledSet=booleans(),
- tapChangerControlMRID=text(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)),
- )
-
-
-def tap_changer_control():
- return builds(
- PBTapChangerControl,
- rc=regulating_control(),
- limitVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER),
- **nullable_bool_settings("lineDropCompensation"),
- lineDropRSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- lineDropXSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- reverseLineDropRSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- reverseLineDropXSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- **nullable_bool_settings("forwardLDCBlocking"),
- timeDelaySet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- **nullable_bool_settings("coGenerationEnabled")
- )
-
-
-def transformer_end():
- return builds(
- PBTransformerEnd,
- io=identified_object(),
- terminalMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- baseVoltageMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- ratioTapChangerMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- endNumber=integers(min_value=MIN_SEQUENCE_NUMBER, max_value=MAX_END_NUMBER),
- groundedSet=booleans(),
- rGroundSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- xGroundSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- starImpedanceMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- )
-
-
-def transformer_star_impedance():
- return builds(
- PBTransformerStarImpedance,
- io=identified_object(),
- rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- r0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- x0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX),
- transformerEndInfoMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)
- )
-
-
-###############################
-# IEC61970 InfIEC61970 Feeder #
-###############################
-
-def circuit():
- return builds(
- PBCircuit,
- l=line(),
- loopMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE),
- endTerminalMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2),
- endSubstationMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2)
- )
-
-
-#########
-# MODEL #
-#########
-
-def nullable_bool_settings(flag_name: str, value: Optional[bool] = sampled_from([False, True, None])) -> Dict:
- settings = {}
- if value is None:
- settings[f"{flag_name}Null"] = NullValue.NULL_VALUE
- else:
- settings[f"{flag_name}Set"] = value
-
- return settings
-
-
-def timestamp():
- return builds(Timestamp, seconds=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), nanos=integers(min_value=0, max_value=MAX_32_BIT_INTEGER))
+from cim.fill_fields import *
##############################
@@ -1608,201 +24,201 @@ def network_identified_objects(draw):
# Extensions IEC61968 Asset Info #
##################################
- draw(builds(NetworkIdentifiedObject, relayInfo=relay_info())),
+ draw(create_relay_info().map(lambda it: NetworkIdentifiedObject(relayInfo=it.to_pb()))),
################################
# Extensions IEC61968 Metering #
################################
- draw(builds(NetworkIdentifiedObject, panDemandResponseFunction=pan_demand_response_function())),
+ draw(create_pan_demand_response_function().map(lambda it: NetworkIdentifiedObject(panDemandResponseFunction=it.to_pb()))),
#################################
# Extensions IEC61970 Base Core #
#################################
- draw(builds(NetworkIdentifiedObject, site=site())),
+ draw(create_site().map(lambda it: NetworkIdentifiedObject(site=it.to_pb()))),
###################################
# Extensions IEC61970 Base Feeder #
###################################
- draw(builds(NetworkIdentifiedObject, loop=loop())),
- draw(builds(NetworkIdentifiedObject, lvFeeder=lv_feeder())),
+ draw(create_loop().map(lambda it: NetworkIdentifiedObject(loop=it.to_pb()))),
+ draw(create_lv_feeder().map(lambda it: NetworkIdentifiedObject(lvFeeder=it.to_pb()))),
##################################################
# Extensions IEC61970 Base Generation Production #
##################################################
- draw(builds(NetworkIdentifiedObject, evChargingUnit=ev_charging_unit())),
+ draw(create_ev_charging_unit().map(lambda it: NetworkIdentifiedObject(evChargingUnit=it.to_pb()))),
#######################################
# Extensions IEC61970 Base Protection #
#######################################
- draw(builds(NetworkIdentifiedObject, distanceRelay=distance_relay())),
- draw(builds(NetworkIdentifiedObject, protectionRelayScheme=protection_relay_scheme())),
- draw(builds(NetworkIdentifiedObject, protectionRelaySystem=protection_relay_system())),
- draw(builds(NetworkIdentifiedObject, voltageRelay=voltage_relay())),
+ draw(create_distance_relay().map(lambda it: NetworkIdentifiedObject(distanceRelay=it.to_pb()))),
+ draw(create_protection_relay_scheme().map(lambda it: NetworkIdentifiedObject(protectionRelayScheme=it.to_pb()))),
+ draw(create_protection_relay_system().map(lambda it: NetworkIdentifiedObject(protectionRelaySystem=it.to_pb()))),
+ draw(create_voltage_relay().map(lambda it: NetworkIdentifiedObject(voltageRelay=it.to_pb()))),
##################################
# Extensions IEC61970 Base Wires #
##################################
- draw(builds(NetworkIdentifiedObject, batteryControl=battery_control())),
+ draw(create_battery_control().map(lambda it: NetworkIdentifiedObject(batteryControl=it.to_pb()))),
#######################
# IEC61968 Asset Info #
#######################
- draw(builds(NetworkIdentifiedObject, cableInfo=cable_info())),
- draw(builds(NetworkIdentifiedObject, noLoadTest=no_load_test())),
- draw(builds(NetworkIdentifiedObject, openCircuitTest=open_circuit_test())),
- draw(builds(NetworkIdentifiedObject, overheadWireInfo=overhead_wire_info())),
- draw(builds(NetworkIdentifiedObject, powerTransformerInfo=power_transformer_info())),
- draw(builds(NetworkIdentifiedObject, shortCircuitTest=short_circuit_test())),
- draw(builds(NetworkIdentifiedObject, shuntCompensatorInfo=shunt_compensator_info())),
- draw(builds(NetworkIdentifiedObject, switchInfo=switch_info())),
- draw(builds(NetworkIdentifiedObject, transformerEndInfo=transformer_end_info())),
- draw(builds(NetworkIdentifiedObject, transformerTankInfo=transformer_tank_info())),
+ draw(create_cable_info().map(lambda it: NetworkIdentifiedObject(cableInfo=it.to_pb()))),
+ draw(create_no_load_test().map(lambda it: NetworkIdentifiedObject(noLoadTest=it.to_pb()))),
+ draw(create_open_circuit_test().map(lambda it: NetworkIdentifiedObject(openCircuitTest=it.to_pb()))),
+ draw(create_overhead_wire_info().map(lambda it: NetworkIdentifiedObject(overheadWireInfo=it.to_pb()))),
+ draw(create_power_transformer_info().map(lambda it: NetworkIdentifiedObject(powerTransformerInfo=it.to_pb()))),
+ draw(create_short_circuit_test().map(lambda it: NetworkIdentifiedObject(shortCircuitTest=it.to_pb()))),
+ draw(create_shunt_compensator_info().map(lambda it: NetworkIdentifiedObject(shuntCompensatorInfo=it.to_pb()))),
+ draw(create_switch_info().map(lambda it: NetworkIdentifiedObject(switchInfo=it.to_pb()))),
+ draw(create_transformer_end_info().map(lambda it: NetworkIdentifiedObject(transformerEndInfo=it.to_pb()))),
+ draw(create_transformer_tank_info().map(lambda it: NetworkIdentifiedObject(transformerTankInfo=it.to_pb()))),
###################
# IEC61968 Assets #
###################
- draw(builds(NetworkIdentifiedObject, assetOwner=asset_owner())),
- draw(builds(NetworkIdentifiedObject, streetlight=streetlight())),
+ draw(create_asset_owner().map(lambda it: NetworkIdentifiedObject(assetOwner=it.to_pb()))),
+ draw(create_streetlight().map(lambda it: NetworkIdentifiedObject(streetlight=it.to_pb()))),
###################
# IEC61968 Common #
###################
- draw(builds(NetworkIdentifiedObject, location=location())),
- draw(builds(NetworkIdentifiedObject, organisation=organisation())),
+ draw(create_location().map(lambda it: NetworkIdentifiedObject(location=it.to_pb()))),
+ draw(create_organisation().map(lambda it: NetworkIdentifiedObject(organisation=it.to_pb()))),
#####################################
# IEC61968 InfIEC61968 InfAssetInfo #
#####################################
- draw(builds(NetworkIdentifiedObject, currentTransformerInfo=current_transformer_info())),
- draw(builds(NetworkIdentifiedObject, potentialTransformerInfo=potential_transformer_info())),
+ draw(create_current_transformer_info().map(lambda it: NetworkIdentifiedObject(currentTransformerInfo=it.to_pb()))),
+ draw(create_potential_transformer_info().map(lambda it: NetworkIdentifiedObject(potentialTransformerInfo=it.to_pb()))),
##################################
# IEC61968 InfIEC61968 InfAssets #
##################################
- draw(builds(NetworkIdentifiedObject, pole=pole())),
+ draw(create_pole().map(lambda it: NetworkIdentifiedObject(pole=it.to_pb()))),
#####################
# IEC61968 Metering #
#####################
- draw(builds(NetworkIdentifiedObject, meter=meter())),
- draw(builds(NetworkIdentifiedObject, usagePoint=usage_point())),
+ draw(create_meter().map(lambda it: NetworkIdentifiedObject(meter=it.to_pb()))),
+ draw(create_usage_point().map(lambda it: NetworkIdentifiedObject(usagePoint=it.to_pb()))),
#######################
# IEC61968 Operations #
#######################
- draw(builds(NetworkIdentifiedObject, operationalRestriction=operational_restriction())),
+ draw(create_operational_restriction().map(lambda it: NetworkIdentifiedObject(operationalRestriction=it.to_pb()))),
#####################################
# IEC61970 Base Auxiliary Equipment #
#####################################
- draw(builds(NetworkIdentifiedObject, currentTransformer=current_transformer())),
- draw(builds(NetworkIdentifiedObject, faultIndicator=fault_indicator())),
- draw(builds(NetworkIdentifiedObject, potentialTransformer=potential_transformer())),
+ draw(create_current_transformer().map(lambda it: NetworkIdentifiedObject(currentTransformer=it.to_pb()))),
+ draw(create_fault_indicator().map(lambda it: NetworkIdentifiedObject(faultIndicator=it.to_pb()))),
+ draw(create_potential_transformer().map(lambda it: NetworkIdentifiedObject(potentialTransformer=it.to_pb()))),
######################
# IEC61970 Base Core #
######################
- draw(builds(NetworkIdentifiedObject, baseVoltage=base_voltage())),
- draw(builds(NetworkIdentifiedObject, connectivityNode=connectivity_node())),
- draw(builds(NetworkIdentifiedObject, feeder=feeder())),
- draw(builds(NetworkIdentifiedObject, geographicalRegion=geographical_region())),
- draw(builds(NetworkIdentifiedObject, subGeographicalRegion=sub_geographical_region())),
- draw(builds(NetworkIdentifiedObject, substation=substation())),
- draw(builds(NetworkIdentifiedObject, terminal=terminal())),
+ draw(create_base_voltage().map(lambda it: NetworkIdentifiedObject(baseVoltage=it.to_pb()))),
+ draw(create_connectivity_node().map(lambda it: NetworkIdentifiedObject(connectivityNode=it.to_pb()))),
+ draw(create_feeder().map(lambda it: NetworkIdentifiedObject(feeder=it.to_pb()))),
+ draw(create_geographical_region().map(lambda it: NetworkIdentifiedObject(geographicalRegion=it.to_pb()))),
+ draw(create_sub_geographical_region().map(lambda it: NetworkIdentifiedObject(subGeographicalRegion=it.to_pb()))),
+ draw(create_substation().map(lambda it: NetworkIdentifiedObject(substation=it.to_pb()))),
+ draw(create_terminal().map(lambda it: NetworkIdentifiedObject(terminal=it.to_pb()))),
#############################
# IEC61970 Base Equivalents #
#############################
- draw(builds(NetworkIdentifiedObject, equivalentBranch=equivalent_branch())),
+ draw(create_equivalent_branch().map(lambda it: NetworkIdentifiedObject(equivalentBranch=it.to_pb()))),
#######################################
# IEC61970 Base Generation Production #
#######################################
- draw(builds(NetworkIdentifiedObject, batteryUnit=battery_unit())),
- draw(builds(NetworkIdentifiedObject, photoVoltaicUnit=photo_voltaic_unit())),
- draw(builds(NetworkIdentifiedObject, powerElectronicsWindUnit=power_electronics_wind_unit())),
+ draw(create_battery_unit().map(lambda it: NetworkIdentifiedObject(batteryUnit=it.to_pb()))),
+ draw(create_photo_voltaic_unit().map(lambda it: NetworkIdentifiedObject(photoVoltaicUnit=it.to_pb()))),
+ draw(create_power_electronics_wind_unit().map(lambda it: NetworkIdentifiedObject(powerElectronicsWindUnit=it.to_pb()))),
######################
# IEC61970 Base Meas #
######################
- draw(builds(NetworkIdentifiedObject, accumulator=accumulator())),
- draw(builds(NetworkIdentifiedObject, analog=analog())),
- draw(builds(NetworkIdentifiedObject, control=control())),
- draw(builds(NetworkIdentifiedObject, discrete=discrete())),
+ draw(create_accumulator().map(lambda it: NetworkIdentifiedObject(accumulator=it.to_pb()))),
+ draw(create_analog().map(lambda it: NetworkIdentifiedObject(analog=it.to_pb()))),
+ draw(create_control().map(lambda it: NetworkIdentifiedObject(control=it.to_pb()))),
+ draw(create_discrete().map(lambda it: NetworkIdentifiedObject(discrete=it.to_pb()))),
############################
# IEC61970 Base Protection #
############################
- draw(builds(NetworkIdentifiedObject, currentRelay=current_relay())),
+ draw(create_current_relay().map(lambda it: NetworkIdentifiedObject(currentRelay=it.to_pb()))),
#######################
# IEC61970 Base Scada #
#######################
- draw(builds(NetworkIdentifiedObject, remoteControl=remote_control())),
- draw(builds(NetworkIdentifiedObject, remoteSource=remote_source())),
+ draw(create_remote_control().map(lambda it: NetworkIdentifiedObject(remoteControl=it.to_pb()))),
+ draw(create_remote_source().map(lambda it: NetworkIdentifiedObject(remoteSource=it.to_pb()))),
#######################
# IEC61970 Base Wires #
#######################
- draw(builds(NetworkIdentifiedObject, acLineSegment=ac_line_segment())),
- draw(builds(NetworkIdentifiedObject, breaker=breaker())),
- draw(builds(NetworkIdentifiedObject, busbarSection=busbar_section())),
- draw(builds(NetworkIdentifiedObject, clamp=clamp())),
- draw(builds(NetworkIdentifiedObject, cut=cut())),
- draw(builds(NetworkIdentifiedObject, disconnector=disconnector())),
- draw(builds(NetworkIdentifiedObject, energyConsumer=energy_consumer())),
- draw(builds(NetworkIdentifiedObject, energyConsumerPhase=energy_consumer_phase())),
- draw(builds(NetworkIdentifiedObject, energySource=energy_source())),
- draw(builds(NetworkIdentifiedObject, energySourcePhase=energy_source_phase())),
- draw(builds(NetworkIdentifiedObject, fuse=fuse())),
- draw(builds(NetworkIdentifiedObject, ground=ground())),
- draw(builds(NetworkIdentifiedObject, groundDisconnector=ground_disconnector())),
- draw(builds(NetworkIdentifiedObject, groundingImpedance=grounding_impedance())),
- draw(builds(NetworkIdentifiedObject, jumper=jumper())),
- draw(builds(NetworkIdentifiedObject, junction=junction())),
- draw(builds(NetworkIdentifiedObject, linearShuntCompensator=linear_shunt_compensator())),
- draw(builds(NetworkIdentifiedObject, loadBreakSwitch=load_break_switch())),
- draw(builds(NetworkIdentifiedObject, perLengthPhaseImpedance=per_length_phase_impedance())),
- draw(builds(NetworkIdentifiedObject, perLengthSequenceImpedance=per_length_sequence_impedance())),
- draw(builds(NetworkIdentifiedObject, powerElectronicsConnection=power_electronics_connection())),
- draw(builds(NetworkIdentifiedObject, powerElectronicsConnectionPhase=power_electronics_connection_phase())),
- draw(builds(NetworkIdentifiedObject, powerTransformer=power_transformer())),
- draw(builds(NetworkIdentifiedObject, powerTransformerEnd=power_transformer_end())),
- draw(builds(NetworkIdentifiedObject, ratioTapChanger=ratio_tap_changer())),
- draw(builds(NetworkIdentifiedObject, reactiveCapabilityCurve=reactive_capability_curve())),
- draw(builds(NetworkIdentifiedObject, recloser=recloser())),
- draw(builds(NetworkIdentifiedObject, seriesCompensator=series_compensator())),
- draw(builds(NetworkIdentifiedObject, staticVarCompensator=static_var_compensator())),
- draw(builds(NetworkIdentifiedObject, synchronousMachine=synchronous_machine())),
- draw(builds(NetworkIdentifiedObject, tapChangerControl=tap_changer_control())),
- draw(builds(NetworkIdentifiedObject, transformerStarImpedance=transformer_star_impedance())),
+ draw(create_ac_line_segment().map(lambda it: NetworkIdentifiedObject(acLineSegment=it.to_pb()))),
+ draw(create_breaker().map(lambda it: NetworkIdentifiedObject(breaker=it.to_pb()))),
+ draw(create_busbar_section().map(lambda it: NetworkIdentifiedObject(busbarSection=it.to_pb()))),
+ draw(create_clamp().map(lambda it: NetworkIdentifiedObject(clamp=it.to_pb()))),
+ draw(create_cut().map(lambda it: NetworkIdentifiedObject(cut=it.to_pb()))),
+ draw(create_disconnector().map(lambda it: NetworkIdentifiedObject(disconnector=it.to_pb()))),
+ draw(create_energy_consumer().map(lambda it: NetworkIdentifiedObject(energyConsumer=it.to_pb()))),
+ draw(create_energy_consumer_phase().map(lambda it: NetworkIdentifiedObject(energyConsumerPhase=it.to_pb()))),
+ draw(create_energy_source().map(lambda it: NetworkIdentifiedObject(energySource=it.to_pb()))),
+ draw(create_energy_source_phase().map(lambda it: NetworkIdentifiedObject(energySourcePhase=it.to_pb()))),
+ draw(create_fuse().map(lambda it: NetworkIdentifiedObject(fuse=it.to_pb()))),
+ draw(create_ground().map(lambda it: NetworkIdentifiedObject(ground=it.to_pb()))),
+ draw(create_ground_disconnector().map(lambda it: NetworkIdentifiedObject(groundDisconnector=it.to_pb()))),
+ draw(create_grounding_impedance().map(lambda it: NetworkIdentifiedObject(groundingImpedance=it.to_pb()))),
+ draw(create_jumper().map(lambda it: NetworkIdentifiedObject(jumper=it.to_pb()))),
+ draw(create_junction().map(lambda it: NetworkIdentifiedObject(junction=it.to_pb()))),
+ draw(create_linear_shunt_compensator().map(lambda it: NetworkIdentifiedObject(linearShuntCompensator=it.to_pb()))),
+ draw(create_load_break_switch().map(lambda it: NetworkIdentifiedObject(loadBreakSwitch=it.to_pb()))),
+ draw(create_per_length_phase_impedance().map(lambda it: NetworkIdentifiedObject(perLengthPhaseImpedance=it.to_pb()))),
+ draw(create_per_length_sequence_impedance().map(lambda it: NetworkIdentifiedObject(perLengthSequenceImpedance=it.to_pb()))),
+ draw(create_power_electronics_connection().map(lambda it: NetworkIdentifiedObject(powerElectronicsConnection=it.to_pb()))),
+ draw(create_power_electronics_connection_phase().map(lambda it: NetworkIdentifiedObject(powerElectronicsConnectionPhase=it.to_pb()))),
+ draw(create_power_transformer().map(lambda it: NetworkIdentifiedObject(powerTransformer=it.to_pb()))),
+ draw(create_power_transformer_end().map(lambda it: NetworkIdentifiedObject(powerTransformerEnd=it.to_pb()))),
+ draw(create_ratio_tap_changer().map(lambda it: NetworkIdentifiedObject(ratioTapChanger=it.to_pb()))),
+ draw(create_reactive_capability_curve().map(lambda it: NetworkIdentifiedObject(reactiveCapabilityCurve=it.to_pb()))),
+ draw(create_recloser().map(lambda it: NetworkIdentifiedObject(recloser=it.to_pb()))),
+ draw(create_series_compensator().map(lambda it: NetworkIdentifiedObject(seriesCompensator=it.to_pb()))),
+ draw(create_static_var_compensator().map(lambda it: NetworkIdentifiedObject(staticVarCompensator=it.to_pb()))),
+ draw(create_synchronous_machine().map(lambda it: NetworkIdentifiedObject(synchronousMachine=it.to_pb()))),
+ draw(create_tap_changer_control().map(lambda it: NetworkIdentifiedObject(tapChangerControl=it.to_pb()))),
+ draw(create_transformer_star_impedance().map(lambda it: NetworkIdentifiedObject(transformerStarImpedance=it.to_pb()))),
###############################
# IEC61970 InfIEC61970 Feeder #
###############################
- draw(builds(NetworkIdentifiedObject, circuit=circuit())),
+ draw(create_circuit().map(lambda it: NetworkIdentifiedObject(circuit=it.to_pb()))),
]
return nios
@@ -1819,8 +235,8 @@ def diagram_identified_objects(draw):
# IEC61970 Base Diagram Layout #
################################
- draw(builds(DiagramIdentifiedObject, diagram=diagram())),
- draw(builds(DiagramIdentifiedObject, diagramObject=diagram_object()))
+ draw(create_diagram().map(lambda it: DiagramIdentifiedObject(diagram=it.to_pb()))),
+ draw(create_diagram_object().map(lambda it: DiagramIdentifiedObject(diagramObject=it.to_pb())))
]
return dios
@@ -1837,15 +253,15 @@ def customer_identified_objects(draw):
# IEC61968 Common #
###################
- draw(builds(CustomerIdentifiedObject, organisation=organisation())),
+ draw(create_organisation().map(lambda it: CustomerIdentifiedObject(organisation=it.to_pb()))),
######################
# IEC61968 Customers #
######################
- draw(builds(CustomerIdentifiedObject, customer=customer())),
- draw(builds(CustomerIdentifiedObject, customerAgreement=customer_agreement())),
- draw(builds(CustomerIdentifiedObject, pricingStructure=pricing_structure())),
- draw(builds(CustomerIdentifiedObject, tariff=tariff())),
+ draw(create_customer().map(lambda it: CustomerIdentifiedObject(customer=it.to_pb()))),
+ draw(create_customer_agreement().map(lambda it: CustomerIdentifiedObject(customerAgreement=it.to_pb()))),
+ draw(create_pricing_structure().map(lambda it: CustomerIdentifiedObject(pricingStructure=it.to_pb()))),
+ draw(create_tariff().map(lambda it: CustomerIdentifiedObject(tariff=it.to_pb()))),
]
return dios
diff --git a/test/streaming/get/test_customer_consumer.py b/test/streaming/get/test_customer_consumer.py
index 22f79a6a7..1edfff529 100644
--- a/test/streaming/get/test_customer_consumer.py
+++ b/test/streaming/get/test_customer_consumer.py
@@ -7,18 +7,17 @@
import grpc_testing
import pytest
-# noinspection PyPackageRequirements
from hypothesis import given, settings, Phase
from zepben.protobuf.cc import cc_pb2
from zepben.protobuf.cc.cc_data_pb2 import CustomerIdentifiedObject
from zepben.protobuf.cc.cc_responses_pb2 import GetIdentifiedObjectsResponse, GetCustomersForContainerResponse
+from cim.fill_fields import create_customer
from streaming.get.data.metadata import create_metadata, create_metadata_response
-from streaming.get.pb_creators import customer_identified_objects, customer
-from zepben.ewb import CustomerConsumerClient, BaseService, IdentifiedObject, Customer
-
from streaming.get.grpcio_aio_testing.mock_async_channel import async_testing_channel
from streaming.get.mock_server import MockServer, StreamGrpc, stream_from_fixed, UnaryGrpc, unary_from_fixed
+from streaming.get.pb_creators import customer_identified_objects
+from zepben.ewb import CustomerConsumerClient, BaseService, IdentifiedObject, Customer
PBRequest = TypeVar('PBRequest')
GrpcResponse = TypeVar('GrpcResponse')
@@ -90,12 +89,15 @@ async def client_test():
response1 = GetIdentifiedObjectsResponse(identifiedObjects=[CustomerIdentifiedObject(customer=Customer(mrid="customer1").to_pb())])
response2 = GetIdentifiedObjectsResponse(identifiedObjects=[CustomerIdentifiedObject(customer=Customer(mrid="customer2").to_pb())])
- await self.mock_server.validate(client_test,
- [StreamGrpc('getIdentifiedObjects',
- stream_from_fixed(["customer1", "customer2", "customer3"], [response1, response2]))])
+ await self.mock_server.validate(
+ client_test,
+ [
+ StreamGrpc('getIdentifiedObjects', stream_from_fixed(["customer1", "customer2", "customer3"], [response1, response2])),
+ ],
+ )
@pytest.mark.asyncio
- @given(customer())
+ @given(create_customer().map(lambda it: it.to_pb()))
async def test_get_identified_object(self, customer_):
mrid = customer_.mrid()
@@ -123,7 +125,7 @@ async def client_test():
await self.mock_server.validate(client_test, [StreamGrpc('getIdentifiedObjects', stream_from_fixed([mrid], []))])
@pytest.mark.asyncio
- @given(customer())
+ @given(create_customer().map(lambda it: it.to_pb()))
@settings(max_examples=2, phases=(Phase.explicit, Phase.reuse, Phase.generate))
async def test_get_customers_for_container_returns_results(self, c):
mrid = c.mrid()
diff --git a/test/streaming/get/test_diagram_consumer.py b/test/streaming/get/test_diagram_consumer.py
index e82d0f8ab..30ee6b472 100644
--- a/test/streaming/get/test_diagram_consumer.py
+++ b/test/streaming/get/test_diagram_consumer.py
@@ -7,21 +7,20 @@
import grpc_testing
import pytest
-# noinspection PyPackageRequirements
from hypothesis import given, settings, Phase
from zepben.protobuf.dc import dc_pb2
from zepben.protobuf.dc.dc_data_pb2 import DiagramIdentifiedObject
from zepben.protobuf.dc.dc_responses_pb2 import GetIdentifiedObjectsResponse, GetDiagramObjectsResponse
+from cim.fill_fields import create_diagram, create_diagram_object
from streaming.get.data.metadata import create_metadata, create_metadata_response
-from streaming.get.pb_creators import diagram_identified_objects, diagram, diagram_object
+from streaming.get.grpcio_aio_testing.mock_async_channel import async_testing_channel
+from streaming.get.mock_server import MockServer, StreamGrpc, stream_from_fixed, UnaryGrpc, unary_from_fixed
+from streaming.get.pb_creators import diagram_identified_objects
from zepben.ewb import DiagramConsumerClient, BaseService, IdentifiedObject
from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram import Diagram
from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object import DiagramObject
-from streaming.get.grpcio_aio_testing.mock_async_channel import async_testing_channel
-from streaming.get.mock_server import MockServer, StreamGrpc, stream_from_fixed, UnaryGrpc, unary_from_fixed
-
PBRequest = TypeVar('PBRequest')
GrpcResponse = TypeVar('GrpcResponse')
@@ -92,11 +91,15 @@ async def client_test():
response1 = GetIdentifiedObjectsResponse(identifiedObjects=[DiagramIdentifiedObject(diagram=Diagram(mrid="diagram1").to_pb())])
response2 = GetIdentifiedObjectsResponse(identifiedObjects=[DiagramIdentifiedObject(diagram=Diagram(mrid="diagram2").to_pb())])
- await self.mock_server.validate(client_test,
- [StreamGrpc('getIdentifiedObjects', stream_from_fixed(["diagram1", "diagram2", "diagram3"], [response1, response2]))])
+ await self.mock_server.validate(
+ client_test,
+ [
+ StreamGrpc('getIdentifiedObjects', stream_from_fixed(["diagram1", "diagram2", "diagram3"], [response1, response2])),
+ ],
+ )
@pytest.mark.asyncio
- @given(diagram())
+ @given(create_diagram().map(lambda it: it.to_pb()))
async def test_get_identified_object(self, diagram_):
mrid = diagram_.mrid()
@@ -124,7 +127,7 @@ async def client_test():
await self.mock_server.validate(client_test, [StreamGrpc('getIdentifiedObjects', stream_from_fixed([mrid], []))])
@pytest.mark.asyncio
- @given(diagram_object())
+ @given(create_diagram_object().map(lambda it: it.to_pb()))
@settings(max_examples=2, phases=(Phase.explicit, Phase.reuse, Phase.generate))
async def test_get_diagram_objects_returns_objects_for_a_given_id(self, dio):
mrid = dio.mrid()
diff --git a/test/streaming/get/test_network_consumer.py b/test/streaming/get/test_network_consumer.py
index df216923c..8bb040cc7 100644
--- a/test/streaming/get/test_network_consumer.py
+++ b/test/streaming/get/test_network_consumer.py
@@ -3,34 +3,33 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from time import sleep
-from typing import Dict, Iterable, TypeVar, Generator, Callable, Optional
+from typing import Dict, Iterable, TypeVar, Generator, Callable, Optional, List
from unittest.mock import MagicMock
import grpc_testing
import pytest
-# noinspection PyPackageRequirements,PyUnresolvedReferences
from google.protobuf.any_pb2 import Any
from hypothesis import given, settings, Phase
from zepben.protobuf.nc import nc_pb2
from zepben.protobuf.nc.nc_data_pb2 import NetworkIdentifiedObject
-from zepben.protobuf.nc.nc_pb2_grpc import NetworkConsumer
from zepben.protobuf.nc.nc_requests_pb2 import GetIdentifiedObjectsRequest, GetEquipmentForContainersRequest, GetEquipmentForRestrictionRequest, \
GetTerminalsForNodeRequest, IncludedEnergizingContainers as PBIncludedEnergizingContainers, IncludedEnergizedContainers as PBIncludedEnergizedContainers, \
- NetworkState as PBNetworkState, GetNetworkHierarchyRequest
+ NetworkState as PBNetworkState
from zepben.protobuf.nc.nc_responses_pb2 import GetIdentifiedObjectsResponse, GetEquipmentForContainersResponse, \
GetEquipmentForRestrictionResponse, GetTerminalsForNodeResponse, GetNetworkHierarchyResponse
+from cim.fill_fields import create_ac_line_segment
from streaming.get.data.hierarchy import create_hierarchy_network
from streaming.get.data.loops import create_loops_network
from streaming.get.data.metadata import create_metadata, create_metadata_response
from streaming.get.grpcio_aio_testing.mock_async_channel import async_testing_channel
-from streaming.get.mock_server import MockServer, StreamGrpc, UnaryGrpc, stream_from_fixed, unary_from_fixed
-from streaming.get.pb_creators import network_identified_objects, ac_line_segment
+from streaming.get.mock_server import MockServer, StreamGrpc, UnaryGrpc, stream_from_fixed, unary_from_fixed, GrpcInteration
+from streaming.get.pb_creators import network_identified_objects
from zepben.ewb import NetworkConsumerClient, NetworkService, IdentifiedObject, AcLineSegment, Breaker, EnergySource, \
EnergySourcePhase, Junction, PowerTransformer, PowerTransformerEnd, ConnectivityNode, Feeder, Location, Substation, Terminal, EquipmentContainer, Equipment, \
BaseService, OperationalRestriction, TransformerStarImpedance, Circuit, Loop, \
UnsupportedOperationException, LvFeeder, TestNetworkBuilder, PerLengthPhaseImpedance, BatteryControl, \
- PanDemandResponseFunction, BatteryUnit, StaticVarCompensator, Pole, generate_id, GrpcResult, NetworkHierarchy, MultiObjectResult, LvSubstation
+ PanDemandResponseFunction, BatteryUnit, StaticVarCompensator, Pole, generate_id, LvSubstation
from zepben.ewb.model.cim.iec61968.assetinfo.cable_info import CableInfo
from zepben.ewb.model.cim.iec61968.assetinfo.overhead_wire_info import OverheadWireInfo
from zepben.ewb.model.cim.iec61970.base.core.geographical_region import GeographicalRegion
@@ -108,11 +107,13 @@ async def client_test():
await self.mock_server.validate(
client_test,
- [StreamGrpc('getIdentifiedObjects', stream_from_fixed(["acls1", "acls2", "acls3"], [response1, response2]))]
+ [
+ StreamGrpc('getIdentifiedObjects', stream_from_fixed(["acls1", "acls2", "acls3"], [response1, response2])),
+ ],
)
@pytest.mark.asyncio
- @given(ac_line_segment())
+ @given(create_ac_line_segment().map(lambda it: it.to_pb()))
async def test_get_identified_object(self, acls):
mrid = acls.mrid()
@@ -167,11 +168,8 @@ async def test_get_network_hierarchy(self):
async def client_test():
hierarchy = (await self.client.get_network_hierarchy()).throw_on_error().value
- try:
- _validate_hierarchy(hierarchy, expected_ns)
- _validate_hierarchy(hierarchy, self.service)
- except Exception:
- pytest.fail()
+ _validate_hierarchy(hierarchy, expected_ns)
+ _validate_hierarchy(hierarchy, self.service)
await self.mock_server.validate(client_test, [UnaryGrpc('getNetworkHierarchy', unary_from_fixed(None, _create_hierarchy_response(expected_ns)))])
@@ -190,11 +188,8 @@ async def _test_filtered_get_network_hierarchy(self, service: NetworkService, **
async def client_test():
hierarchy = (await self.client.get_network_hierarchy(**_filters)).throw_on_error().value
- try:
- _validate_hierarchy(hierarchy, service)
- _validate_hierarchy(hierarchy, self.service)
- except AssertionError:
- pytest.fail()
+ _validate_hierarchy(hierarchy, service)
+ _validate_hierarchy(hierarchy, self.service)
await self.mock_server.validate(client_test, [UnaryGrpc('getNetworkHierarchy', unary_from_fixed(None, _create_hierarchy_response(service)))])
@@ -296,13 +291,15 @@ async def client_test():
for io in self.service.objects():
assert io.mrid in ns
- interactions = [UnaryGrpc('getNetworkHierarchy', unary_from_fixed(None, _create_hierarchy_response(ns)))]
+ interactions: List[GrpcInteration] = [UnaryGrpc('getNetworkHierarchy', unary_from_fixed(None, _create_hierarchy_response(ns)))]
for _ in ns.objects(EquipmentContainer):
- interactions.extend([
- StreamGrpc('getEquipmentForContainers', [_create_container_equipment_responses(ns, containers)]),
- StreamGrpc('getIdentifiedObjects', [_create_object_responses(ns, assoc_objs)])
- ])
+ interactions.extend(
+ [
+ StreamGrpc('getEquipmentForContainers', [_create_container_equipment_responses(ns, containers)]),
+ StreamGrpc('getIdentifiedObjects', [_create_object_responses(ns, assoc_objs)]),
+ ],
+ )
await self.mock_server.validate(client_test, interactions)
@@ -333,7 +330,7 @@ async def client_test():
StreamGrpc('getEquipmentForContainers', [_create_container_responses(feeder_network)]),
StreamGrpc('getIdentifiedObjects', [object_responses]),
StreamGrpc('getIdentifiedObjects', [object_responses])
- ]
+ ],
)
@pytest.mark.asyncio
@@ -358,12 +355,12 @@ async def test_resolve_references_skips_resolvers_referencing_equipment_containe
async def client_test():
mor = (await self.client.get_equipment_container(feeder_mrid, LvFeeder)).throw_on_error().value
- # lvf5 wont be in the collection of returned objects as its part of the network hierarchy already
assert self.service.len_of() == 16
- assert len(mor.objects) == 15
- assert len({"tx0", "c1", "b2", "tx0-t2", "tx0-e1", "tx0-e2", "tx0-t1", "c1-t1", "c1-t2", "b2-t1",
- "b2-t2", "generated_cn_0", "generated_cn_1", "generated_cn_2"}.difference(mor.objects.keys())) == 0
- assert "tx4" not in mor.objects
+ assert len(mor.objects) == 16
+ assert {
+ "lvf5", "tx0", "c1", "b2", "tx0-t2", "tx0-e1", "tx0-e2", "tx0-t1", "c1-t1", "c1-t2", "b2-t1",
+ "b2-t2", "lvf6", "generated_cn_0", "generated_cn_1", "generated_cn_2"
+ } == set(mor.objects.keys())
with pytest.raises(KeyError):
self.service.get("tx4")
assert self.service.get("tx0") == mor.objects["tx0"]
@@ -378,7 +375,7 @@ async def client_test():
StreamGrpc('getEquipmentForContainers', [_create_container_equipment_responses(lv_feeders_with_open_point)]),
StreamGrpc('getIdentifiedObjects', [object_responses]),
StreamGrpc('getIdentifiedObjects', [object_responses]),
- ]
+ ],
)
@pytest.mark.asyncio
@@ -409,7 +406,8 @@ async def client_test():
assert self.service.len_of() == 11
assert len(mor.objects) == 11
assert len(
- {"lvf2", "tx0", "p2", "c1", "tx0-t2", "tx0-e1", "tx0-e2", "tx0-t1", "c1-t1", "c1-t2", "generated_cn_0"}.difference(mor.objects.keys())) == 0
+ {"lvf2", "tx0", "p2", "c1", "tx0-t2", "tx0-e1", "tx0-e2", "tx0-t1", "c1-t1", "c1-t2", "generated_cn_0"}.difference(mor.objects.keys()),
+ ) == 0
assert self.service.get("tx0") == mor.objects["tx0"]
received_pole: Pole = mor.objects["p2"]
assert self.service.get("p2") == received_pole
@@ -425,7 +423,7 @@ async def client_test():
StreamGrpc('getEquipmentForContainers', [_create_container_equipment_responses(lv_feeder_with_pole)]),
StreamGrpc('getIdentifiedObjects', [object_responses]),
StreamGrpc('getIdentifiedObjects', [object_responses]),
- ]
+ ],
)
@pytest.mark.asyncio
@@ -451,7 +449,7 @@ async def client_test():
Feeder,
IncludedEnergizingContainers.SUBSTATIONS,
IncludedEnergizedContainers.LV_FEEDERS,
- NetworkState.ALL
+ NetworkState.ALL,
)
object_responses = _create_object_responses(feeder_network)
@@ -460,17 +458,19 @@ async def client_test():
client_test,
[
UnaryGrpc('getNetworkHierarchy', unary_from_fixed(None, _create_hierarchy_response(feeder_network))),
- StreamGrpc('getEquipmentForContainers', [
- _create_container_responses(
- feeder_network,
- expected_include_energizing_containers=PBIncludedEnergizingContainers.INCLUDED_ENERGIZING_CONTAINERS_SUBSTATIONS,
- expected_include_energized_containers=PBIncludedEnergizedContainers.INCLUDED_ENERGIZED_CONTAINERS_LV_FEEDERS,
- network_state=PBNetworkState.NETWORK_STATE_ALL
- )
- ]),
+ StreamGrpc(
+ 'getEquipmentForContainers', [
+ _create_container_responses(
+ feeder_network,
+ expected_include_energizing_containers=PBIncludedEnergizingContainers.INCLUDED_ENERGIZING_CONTAINERS_SUBSTATIONS,
+ expected_include_energized_containers=PBIncludedEnergizedContainers.INCLUDED_ENERGIZED_CONTAINERS_LV_FEEDERS,
+ network_state=PBNetworkState.NETWORK_STATE_ALL,
+ )
+ ],
+ ),
StreamGrpc('getIdentifiedObjects', [object_responses]),
StreamGrpc('getIdentifiedObjects', [object_responses])
- ]
+ ],
)
@pytest.mark.asyncio
@@ -497,7 +497,7 @@ async def client_test():
feeder_network,
expected_include_energizing_containers=PBIncludedEnergizingContainers.INCLUDED_ENERGIZING_CONTAINERS_SUBSTATIONS,
expected_include_energized_containers=PBIncludedEnergizedContainers.INCLUDED_ENERGIZED_CONTAINERS_LV_FEEDERS,
- network_state=PBNetworkState.NETWORK_STATE_ALL
+ network_state=PBNetworkState.NETWORK_STATE_ALL,
)
await self.mock_server.validate(
@@ -505,7 +505,7 @@ async def client_test():
[
StreamGrpc('getEquipmentForContainers', [response]),
StreamGrpc('getEquipmentForContainers', [response])
- ]
+ ],
)
@pytest.mark.asyncio
@@ -528,7 +528,7 @@ async def client_test():
await self.mock_server.validate(
client_test,
- [StreamGrpc('getEquipmentForRestriction', [_create_restriction_equipment_responses(operational_restriction_with_equipment)])]
+ [StreamGrpc('getEquipmentForRestriction', [_create_restriction_equipment_responses(operational_restriction_with_equipment)])],
)
@pytest.mark.asyncio
@@ -566,10 +566,10 @@ async def client_test():
UnaryGrpc('getNetworkHierarchy', unary_from_fixed(None, _create_hierarchy_response(ns))),
StreamGrpc(
'getEquipmentForContainers',
- [_create_container_equipment_responses(ns, loop_containers, network_state=PBNetworkState.NETWORK_STATE_ALL)]
+ [_create_container_equipment_responses(ns, loop_containers, network_state=PBNetworkState.NETWORK_STATE_ALL)],
),
StreamGrpc('getIdentifiedObjects', [_create_object_responses(ns, assoc_objs)])
- ]
+ ],
)
@pytest.mark.asyncio
@@ -592,10 +592,10 @@ async def client_test():
UnaryGrpc('getNetworkHierarchy', unary_from_fixed(None, _create_hierarchy_response(ns))),
StreamGrpc(
'getEquipmentForContainers',
- [_create_container_equipment_responses(ns, loop_containers, network_state=PBNetworkState.NETWORK_STATE_ALL)]
+ [_create_container_equipment_responses(ns, loop_containers, network_state=PBNetworkState.NETWORK_STATE_ALL)],
),
StreamGrpc('getIdentifiedObjects', [_create_object_responses(ns, assoc_objs)])
- ]
+ ],
)
@pytest.mark.asyncio
@@ -725,7 +725,7 @@ def _create_container_equipment_responses(
mrids: Optional[Iterable[str]] = None,
expected_include_energizing_containers: Optional[int] = None,
expected_include_energized_containers: Optional[int] = None,
- network_state: NetworkState = None
+ network_state: NetworkState = None,
) -> Callable[[GetEquipmentForContainersRequest], Generator[GetEquipmentForContainersResponse, None, None]]:
valid: Dict[str, EquipmentContainer] = {mrid: ns[mrid] for mrid in mrids} if mrids else ns
@@ -815,7 +815,7 @@ def _validate_hierarchy(hierarchy, service):
def _create_object_responses(
ns: NetworkService,
- mrids: Optional[Iterable[str]] = None
+ mrids: Optional[Iterable[str]] = None,
) -> Callable[[GetIdentifiedObjectsRequest], Generator[GetIdentifiedObjectsResponse, None, None]]:
valid: Dict[str, IdentifiedObject] = {mrid: ns[mrid] for mrid in mrids} if mrids else ns
@@ -835,7 +835,7 @@ def _create_container_responses(
mrids: Optional[Iterable[str]] = None,
expected_include_energizing_containers: Optional[int] = None,
expected_include_energized_containers: Optional[int] = None,
- network_state: Optional[int] = None
+ network_state: Optional[int] = None,
) -> Callable[[GetEquipmentForContainersRequest], Generator[GetEquipmentForContainersResponse, None, None]]:
valid: Dict[str, EquipmentContainer] = {mrid: ns[mrid] for mrid in mrids} if mrids else ns
diff --git a/test/streaming/get/test_query_network_state_client.py b/test/streaming/get/test_query_network_state_client.py
index aca9e015a..26acf3b5a 100644
--- a/test/streaming/get/test_query_network_state_client.py
+++ b/test/streaming/get/test_query_network_state_client.py
@@ -3,7 +3,7 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from datetime import datetime, timedelta
-from typing import List, Callable, Generator
+from typing import List, Callable, Generator, Any
import grpc_testing
import pytest
@@ -61,7 +61,7 @@ async def client_test():
async def test_can_report_batch_status(self):
status = BatchSuccessful(1234)
- def mock_service() -> List[Callable[[GrpcRequest], None]]:
+ def mock_service() -> List[Callable[[GrpcRequest], Any]]:
def validate_request(request: GrpcRequest):
assert request.messageId == status.batch_id
diff --git a/test/testing/test_test_network_builder.py b/test/testing/test_test_network_builder.py
index 99c06c9ab..bb051fc8d 100644
--- a/test/testing/test_test_network_builder.py
+++ b/test/testing/test_test_network_builder.py
@@ -3,7 +3,7 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from collections import Counter
-from typing import Callable, List
+from typing import Callable, List, Any
import pytest
from pytest import raises
@@ -264,25 +264,25 @@ async def test_can_initialise_ends(self):
# 1 tx3 3
# 2
#
- def init_rated_u(val: int) -> Callable[[PowerTransformerEnd], None]:
+ def init_rated_u(val: int) -> Callable[[PowerTransformerEnd], Any]:
def set_rated_u(end: PowerTransformerEnd):
end.rated_u = val
return set_rated_u
- def init_rated_s(val: int) -> Callable[[PowerTransformerEnd], None]:
+ def init_rated_s(val: int) -> Callable[[PowerTransformerEnd], Any]:
def set_rated_s(end: PowerTransformerEnd):
end.rated_s = val
return set_rated_s
- def init_s_rating(cooling_type: TransformerCoolingType, rated_s: int) -> Callable[[PowerTransformerEnd], None]:
+ def init_s_rating(cooling_type: TransformerCoolingType, rated_s: int) -> Callable[[PowerTransformerEnd], Any]:
def add_s_rating(end: PowerTransformerEnd):
end.add_transformer_end_rated_s(TransformerEndRatedS(cooling_type, rated_s))
return add_s_rating
- def init_b(val: float) -> Callable[[PowerTransformerEnd], None]:
+ def init_b(val: float) -> Callable[[PowerTransformerEnd], Any]:
def set_b(end: PowerTransformerEnd):
end.b = val
@@ -375,7 +375,7 @@ def _validate_ends(n: NetworkService, mrid: str, expected_ends: List[PhaseCode])
assert end.terminal == terminal
@staticmethod
- def _validate_connectivity_node_override(add_with_connectivity_node: Callable[[TestNetworkBuilder, str, str], None]):
+ def _validate_connectivity_node_override(add_with_connectivity_node: Callable[[TestNetworkBuilder, str, str], Any]):
builder = TestNetworkBuilder()
ns = builder.network
diff --git a/test/util.py b/test/util.py
index 5b8718ad8..6f2254c9b 100644
--- a/test/util.py
+++ b/test/util.py
@@ -6,10 +6,13 @@
import importlib
import pkgutil
from concurrent import futures
+from typing import Generator, TypeVar, Callable, Any, Optional
import grpc
from hypothesis.strategies import uuids
+T = TypeVar("T")
+
def all_subclasses(cls, package):
"""
@@ -60,4 +63,17 @@ def grpc_aio_server():
return server, host
+def assert_or_empty(
+ gen: Generator[T, None, None],
+ arg: list[T] | None,
+ sorted_by: Optional[Callable[[T], Any]] = None,
+ sort_reversed: bool = False,
+) -> list[T] | None:
+ actual = list(gen)
+ expected = arg or []
+ if sorted_by:
+ expected.sort(key=sorted_by, reverse=sort_reversed)
+
+ assert actual == expected
+
mrid_strategy = uuids(version=4).map(lambda x: str(x))