From 7589cbb508ef1e336ea5231be17ca38d4aaece00 Mon Sep 17 00:00:00 2001 From: Anthony Charlton Date: Fri, 9 Jan 2026 11:10:52 +1100 Subject: [PATCH] Require `mrid` for all `IdentifiedObject` constructors. Signed-off-by: Anthony Charlton --- changelog.md | 3 + docs/docs/datamodel.mdx | 41 ++++++------- docs/docs/services.mdx | 26 ++++---- .../iec61970/base/core/identified_object.py | 7 ++- .../iec61970/base/wires/regulating_cond_eq.py | 3 +- .../common/translator/base_proto2cim.py | 2 +- .../services/network/network_extensions.py | 10 +-- src/zepben/ewb/util.py | 12 +--- test/cim/cim_creators.py | 21 ++++--- .../test_pan_demand_response_function.py | 16 ++--- .../base/wires/test_battery_control.py | 4 +- .../cim/iec61968/assetinfo/test_cable_info.py | 3 +- .../iec61968/assetinfo/test_no_load_test.py | 4 +- .../assetinfo/test_open_circuit_test.py | 4 +- .../assetinfo/test_overhead_wire_info.py | 3 +- .../assetinfo/test_power_transformer_info.py | 14 +++-- .../assetinfo/test_short_circuit_test.py | 4 +- .../assetinfo/test_shunt_compensator_info.py | 4 +- .../iec61968/assetinfo/test_switch_info.py | 4 +- .../assetinfo/test_transformer_end_info.py | 47 ++++++++++---- .../assetinfo/test_transformer_tank_info.py | 16 ++--- test/cim/iec61968/assets/test_asset.py | 18 +++--- test/cim/iec61968/assets/test_asset_owner.py | 3 +- test/cim/iec61968/assets/test_pole.py | 14 +++-- test/cim/iec61968/assets/test_streelight.py | 10 +-- test/cim/iec61968/common/test_location.py | 8 +-- .../iec61968/common/test_organisation_role.py | 8 ++- test/cim/iec61968/customers/test_customer.py | 13 ++-- .../customers/test_customer_agreement.py | 16 ++--- .../customers/test_pricing_structure.py | 14 +++-- test/cim/iec61968/customers/test_tariff.py | 4 +- .../test_current_transformer_info.py | 4 +- .../test_potential_transformer_info.py | 7 ++- .../infassetinfo/test_relay_info.py | 8 +-- test/cim/iec61968/metering/test_end_device.py | 15 ++--- .../metering/test_end_device_function.py | 3 +- test/cim/iec61968/metering/test_meter.py | 3 +- .../cim/iec61968/metering/test_usage_point.py | 20 +++--- .../test_operational_restriction.py | 14 +++-- .../test_auxiliary_equipment.py | 8 ++- .../test_current_transformer.py | 4 +- .../test_fault_indicator.py | 3 +- .../test_potential_transformer.py | 4 +- .../base/auxiliaryequipment/test_sensor.py | 12 ++-- .../iec61970/base/core/test_base_voltage.py | 4 +- .../base/core/test_conducting_equipment.py | 26 ++++---- .../base/core/test_connectivity_node.py | 14 +++-- test/cim/iec61970/base/core/test_curve.py | 10 +-- test/cim/iec61970/base/core/test_equipment.py | 34 +++++++---- .../base/core/test_equipment_container.py | 61 ++++++++++--------- test/cim/iec61970/base/core/test_feeder.py | 57 +++++++++-------- .../base/core/test_geographical_region.py | 13 ++-- .../base/core/test_identified_object.py | 12 ++-- test/cim/iec61970/base/core/test_name.py | 4 +- test/cim/iec61970/base/core/test_name_type.py | 24 ++++---- .../base/core/test_power_system_resource.py | 20 +++--- test/cim/iec61970/base/core/test_site.py | 6 +- .../base/core/test_sub_geographical_region.py | 16 ++--- .../cim/iec61970/base/core/test_substation.py | 36 ++++++----- test/cim/iec61970/base/core/test_terminal.py | 23 ++++--- .../base/diagramlayout/test_diagram.py | 17 +++--- .../base/diagramlayout/test_diagram_object.py | 18 +++--- .../equivalents/test_equivalent_branch.py | 4 +- .../iec61970/base/meas/test_accumulator.py | 3 +- test/cim/iec61970/base/meas/test_analog.py | 3 +- test/cim/iec61970/base/meas/test_control.py | 10 +-- test/cim/iec61970/base/meas/test_discrete.py | 3 +- .../iec61970/base/meas/test_measurement.py | 8 ++- .../base/protection/test_current_relay.py | 4 +- .../base/protection/test_distance_relay.py | 4 +- .../test_protection_relay_function.py | 41 ++++++++----- .../test_protection_relay_scheme.py | 20 +++--- .../test_protection_relay_system.py | 18 ++++-- .../base/protection/test_voltage_relay.py | 4 +- .../base/scada/test_remote_control.py | 10 +-- .../iec61970/base/scada/test_remote_source.py | 10 +-- .../production/test_battery_unit.py | 17 +++--- .../production/test_photo_voltaic_unit.py | 4 +- .../production/test_power_electronics_unit.py | 8 ++- .../test_power_electronics_wind_unit.py | 4 +- .../base/wires/test_ac_line_segment.py | 16 ++--- test/cim/iec61970/base/wires/test_breaker.py | 12 ++-- .../base/wires/test_busbar_section.py | 7 ++- .../cim/iec61970/base/wires/test_connector.py | 6 +- .../iec61970/base/wires/test_disconnector.py | 4 +- .../base/wires/test_energy_consumer.py | 14 +++-- .../iec61970/base/wires/test_energy_source.py | 43 ++++++++++--- test/cim/iec61970/base/wires/test_fuse.py | 9 +-- test/cim/iec61970/base/wires/test_ground.py | 4 +- .../base/wires/test_ground_disconnector.py | 4 +- test/cim/iec61970/base/wires/test_jumper.py | 4 +- test/cim/iec61970/base/wires/test_junction.py | 3 +- .../wires/test_linear_shunt_compensator.py | 4 +- .../base/wires/test_load_break_switch.py | 4 +- .../wires/test_per_length_phase_impedance.py | 10 +-- .../test_per_length_sequence_impedance.py | 4 +- .../test_power_electronics_connection.py | 55 ++++++++++++++--- .../base/wires/test_power_transformer.py | 18 ++++-- .../base/wires/test_power_transformer_end.py | 22 ++++--- .../base/wires/test_protected_switch.py | 12 ++-- .../base/wires/test_ratio_tap_changer.py | 9 ++- test/cim/iec61970/base/wires/test_recloser.py | 4 +- .../base/wires/test_regulating_cond_eq.py | 8 ++- .../base/wires/test_regulating_control.py | 30 ++++++--- .../base/wires/test_series_compensator.py | 6 +- .../base/wires/test_static_var_compensator.py | 4 +- test/cim/iec61970/base/wires/test_switch.py | 6 +- .../base/wires/test_synchronous_machine.py | 8 ++- .../iec61970/base/wires/test_tap_changer.py | 18 +++--- .../base/wires/test_tap_changer_control.py | 4 +- .../base/wires/test_transformer_end.py | 32 +++++++--- .../wires/test_transformer_star_impedance.py | 10 +-- .../infiec61970/feeder/test_circuit.py | 20 +++--- .../iec61970/infiec61970/feeder/test_loop.py | 22 ++++--- .../infiec61970/feeder/test_lv_feeder.py | 30 +++++---- .../production/test_ev_charging_unit.py | 4 +- test/cim/private_collection_validator.py | 32 +++++----- test/cim/property_validator.py | 4 +- .../customer/test_customer_database_schema.py | 2 +- .../customer/test_customer_service_writer.py | 4 +- .../diagram/test_diagram_database_schema.py | 2 +- .../diagram/test_diagram_service_writer.py | 4 +- .../sqlite/network/test_network_cim_writer.py | 4 +- .../network/test_network_database_schema.py | 2 +- .../network/test_network_service_writer.py | 4 +- test/database/sqlite/schema_utils.py | 7 ++- test/network_fixtures.py | 34 +++++------ test/services/common/test_base_service.py | 16 ++--- .../common/test_reference_resolvers.py | 16 ++--- .../common/translator/base_test_translator.py | 2 +- .../network/test_energy_source_phase.py | 4 +- test/services/network/test_network.py | 4 +- .../network/test_network_extensions.py | 33 +++++----- .../connectivity/test_connectivity_result.py | 6 +- .../test_terminal_connectivity_connected.py | 4 +- .../test_terminal_connectivity_internal.py | 8 +-- .../tracing/feeder/test_set_direction.py | 6 +- .../conditions/test_direction_condition.py | 14 ++--- .../test_feeder_direction_state_operators.py | 10 +-- .../operators/test_phase_state_operators.py | 4 +- .../networktrace/test_network_trace.py | 38 ++++++------ .../test_network_trace_step_path_provider.py | 3 +- .../tracing/phases/test_phase_status.py | 10 +-- .../network/tracing/test_assign_to_feeders.py | 9 +-- .../tracing/test_assign_to_lv_feeders.py | 29 ++++----- .../tracing/test_find_swer_equipment.py | 4 +- test/streaming/get/test_network_consumer.py | 4 +- test/test_util.py | 11 +++- test/util.py | 4 ++ 149 files changed, 1070 insertions(+), 769 deletions(-) diff --git a/changelog.md b/changelog.md index a167668e0..92273e69a 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,9 @@ ### Breaking Changes * Updated `EwbDataFilePaths` to be an abstract class that supports variants. Added `LocalEwbDataFilePaths` which is a local file system implementation of `EwbDataFilePaths`, and should be used in place of the old `EwbDataFilePaths`. +* `CopyableUUID` has been removed, and replaced with a new `generate_id` function. +* All `IdentifiedObject` classes now require an `mrid` to be passed to the constructor, it will no longer be generated by default. This brings the Python SDK + into alignment with the JVM SDK. You can use the new `generate_id` function if you can't provide a more meaningful mRID. ### New Features * None. diff --git a/docs/docs/datamodel.mdx b/docs/docs/datamodel.mdx index 494624f9b..425ae5128 100644 --- a/docs/docs/datamodel.mdx +++ b/docs/docs/datamodel.mdx @@ -43,14 +43,13 @@ Let's see how we create them: from zepben.ewb import EnergySource, AcLineSegment, Breaker # Create the energy source. Providing no ID will generate a UUID. -source = EnergySource() +source = EnergySource(mrid="source") # Create the conductor providing a specific ID. -acls = AcLineSegment("aclineseg1") +acls = AcLineSegment(mrid="aclineseg1") -# Create a circuit breaker. -# A UUID will be generated but we can give it a descriptive name. -breaker = Breaker(name="my circuit breaker") +# Create a circuit breaker with a descriptive name. +breaker = Breaker(mrid="breaker", name="my circuit breaker") ``` ## Creating Connectivity @@ -69,31 +68,31 @@ Now, lets redo the above code sample this time also creating connectivity betwee from zepben.ewb import EnergySource, AcLineSegment, Terminal, Breaker, ConnectivityNode # Create the energy source -source = EnergySource() +source = EnergySource(mrid="source") # Create the terminal for the energy source and associate it with the source -source_t1 = Terminal(conducting_equipment=source) +source_t1 = Terminal(mrid="source-t1", conducting_equipment=source) source.add_terminal(source_t1) # Create the conductor -acls = AcLineSegment() +acls = AcLineSegment(mrid="acls") # Create a terminal for each end of the conductor # and associate them with the conductor -acls_t1 = Terminal(conducting_equipment=acls) -acls_t2 = Terminal(conducting_equipment=acls) +acls_t1 = Terminal(mrid="acls-t1", conducting_equipment=acls) +acls_t2 = Terminal(mrid="acls-t2", conducting_equipment=acls) acls.add_terminal(acls_t1) acls.add_terminal(acls_t2) # Create a circuit breaker -breaker = Breaker() +breaker = Breaker(mrid="breaker") # Create a terminal for the breaker -breaker_t1 = Terminal(conducting_equipment=breaker) +breaker_t1 = Terminal(mrid="breaker-t1", conducting_equipment=breaker) # Now create a connectivity node to connect the source terminal # to the conductor's first terminal -cn1 = ConnectivityNode() +cn1 = ConnectivityNode(mrid="cn1") # Now associate the connectivity nodes to the terminals cn1.add_terminal(source_t1) @@ -103,7 +102,7 @@ acls_t1.connectivity_node = cn1 # Now create a connectivity node to connect the source terminal # to the conductor's first terminal -cn2 = ConnectivityNode() +cn2 = ConnectivityNode(mrid="cn2") # Now associate the connectivity nodes to the terminals cn2.add_terminal(acls_t2) @@ -124,7 +123,7 @@ analytics you may be running when using the model. from zepben.ewb import Breaker # Example of setting normal and current switch states -switch = Breaker() +switch = Breaker(mrid="switch") switch.set_normally_open(True) switch.set_open(False) ``` @@ -217,19 +216,19 @@ containers. ```python from zepben.ewb import GeographicalRegion, SubGeographicalRegion, PowerTransformer, Feeder, Breaker -region = GeographicalRegion() -sub_region = SubGeographicalRegion(geographical_region=region) +region = GeographicalRegion(mrid="COMPANY") +sub_region = SubGeographicalRegion(mrid="BSP1", geographical_region=region) region.add_sub_geographical_region(sub_region) -substation = Substation(sub_geographical_region=sub_region) +substation = Substation(mrid="ZONE", sub_geographical_region=sub_region) -sub_tx = PowerTransformer() +sub_tx = PowerTransformer(mrid="tx1") sub_tx.add_container(substation) substation.add_equipment(sub_tx) -feeder = Feeder(normal_energizing_substation=substation) +feeder = Feeder(mrid="ZONE001", normal_energizing_substation=substation) -feeder_cb = Breaker() +feeder_cb = Breaker(mrid="ZONE001-CB") feeder_cb.add_container(feeder) feeder.add_equipment(this) ``` diff --git a/docs/docs/services.mdx b/docs/docs/services.mdx index 3aa29b566..48655567c 100644 --- a/docs/docs/services.mdx +++ b/docs/docs/services.mdx @@ -36,11 +36,11 @@ will be present, which should be utilised to allow efficient querying of the typ from zepben.ewb import NetworkService, Breaker, Junction, IdentifiedObject service = NetworkService() -breaker = Breaker() +breaker = Breaker(mrid="breaker") service.add(breaker) # Note you can only add types that are intended for the corresponding service, for example, the following will fail on add: -diagram = Diagram() +diagram = Diagram(mrid="diagram") service.add(diagram) # throws exception. ``` @@ -70,8 +70,8 @@ from zepben.ewb import NetworkService, Breaker, Junction, ConductingEquipment service = NetworkService() -service.add(Breaker()) -service.add(Junction()) +service.add(Breaker(mrid="breaker")) +service.add(Junction(mrid="junction")) # service.objects() can be used to get a generator over the objects in the service, and supports selecting by type. for obj in service.objects(): # generator over all objects in service @@ -103,8 +103,8 @@ from zepben.ewb import NetworkService, Analog, Accumulator, Measurement service = NetworkService() -amps = Analog(power_system_resource_mrid="ASWITCH") -count = Accumulator(power_system_resource_mrid="ASWITCH") +amps = Analog(mrid="amps", power_system_resource_mrid="ASWITCH") +count = Accumulator(mrid="count", power_system_resource_mrid="ASWITCH") service.add(amps) service.add(count) @@ -141,13 +141,13 @@ from zepben.ewb import DiagramService, Diagram, DiagramObject service = DiagramService() -a_diagram = Diagram() +a_diagram = Diagram(mrid="diagram") -do1 = DiagramObject(diagram=a_diagram, identified_object_mrid="aSwitch", a_diagram.add_diagram_object(this)) +do1 = DiagramObject(mrid="do1", diagram=a_diagram, identified_object_mrid="aSwitch", a_diagram.add_diagram_object(this)) -do2 = DiagramObject(diagram=a_diagram, identified_object_mrid="aSwitch", a_diagram.add_diagram_object(this)) +do2 = DiagramObject(mrid="do2", diagram=a_diagram, identified_object_mrid="aSwitch", a_diagram.add_diagram_object(this)) -do3 = DiagramObject(diagram=a_diagram, identified_object_mrid="aSwitch", a_diagram.add_diagram_object(this)) +do3 = DiagramObject(mrid="do3", diagram=a_diagram, identified_object_mrid="aSwitch", a_diagram.add_diagram_object(this)) service.add(do1) service.add(do2) @@ -186,10 +186,10 @@ from zepben.ewb import NetworkService, Feeder, Breaker, resolver service = NetworkService() -feeder = Feeder("f") +feeder = Feeder(mrid="f") service.add(feeder) -switch = Breaker("b1") +switch = Breaker(mrid="b1") service.add(switch) # As the switch is already added to the service, this will be resolved immediately. @@ -197,7 +197,7 @@ service.resolve_or_defer_reference(resolver.ec_equipment(feeder), switch.mrid) print(feeder.equipment.contains(switch)) # true # Now if we try and resolve something not added it will be deferred -junction = Junction("j1") +junction = Junction(mrid="j1") service.resolve_or_defer_reference(resolver.ec_equipment(feeder), junction.mrid) print(feeder.equipment.contains(junction)) # false diff --git a/src/zepben/ewb/model/cim/iec61970/base/core/identified_object.py b/src/zepben/ewb/model/cim/iec61970/base/core/identified_object.py index 4010d8c63..364a6ae43 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/core/identified_object.py +++ b/src/zepben/ewb/model/cim/iec61970/base/core/identified_object.py @@ -14,7 +14,7 @@ from zepben.ewb.dataclassy import dataclass from zepben.ewb.model.cim.iec61970.base.core.name import Name from zepben.ewb.model.cim.iec61970.base.core.name_type import NameType -from zepben.ewb.util import require, CopyableUUID, nlen, ngen, safe_remove +from zepben.ewb.util import require, nlen, ngen, safe_remove logger = logging.getLogger(__name__) @@ -30,7 +30,7 @@ class IdentifiedObject(object, metaclass=ABCMeta): relation, however must be in snake case to keep the phases PEP compliant. """ - mrid: str = CopyableUUID() + mrid: str """Master resource identifier issued by a model authority. The mRID is unique within an exchange context. Global uniqueness is easily achieved by using a UUID, as specified in RFC 4122, for the mRID. The use of UUID is strongly recommended.""" @@ -46,6 +46,9 @@ class IdentifiedObject(object, metaclass=ABCMeta): def __init__(self, names: Optional[List[Name]] = None, **kwargs): super(IdentifiedObject, self).__init__(**kwargs) + if not self.mrid or not self.mrid.strip(): + raise ValueError("You must provide an mRID for this object.") + if names: for name in names: self.add_name(name.type, name.name) diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py b/src/zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py index 4cb35032f..ca2712ccf 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py +++ b/src/zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py @@ -28,7 +28,8 @@ class RegulatingCondEq(EnergyConnection): def __init__(self, regulating_control: Optional[RegulatingControl] = None, **kwargs): super(RegulatingCondEq, self).__init__(**kwargs) - self.regulating_control = regulating_control + if regulating_control: + self.regulating_control = regulating_control @property def regulating_control(self): diff --git a/src/zepben/ewb/services/common/translator/base_proto2cim.py b/src/zepben/ewb/services/common/translator/base_proto2cim.py index 1dfbf633c..6912f5532 100644 --- a/src/zepben/ewb/services/common/translator/base_proto2cim.py +++ b/src/zepben/ewb/services/common/translator/base_proto2cim.py @@ -79,7 +79,7 @@ def document_to_cim(pb: PBDocument, cim: Document, service: BaseService): @bind_to_cim @add_to_network_or_none def organisation_to_cim(pb: PBOrganisation, service: BaseService) -> Optional[Organisation]: - cim = Organisation() + cim = Organisation(mrid=pb.mrid()) identified_object_to_cim(pb.io, cim, service) return cim diff --git a/src/zepben/ewb/services/network/network_extensions.py b/src/zepben/ewb/services/network/network_extensions.py index 65d570bf4..7aca1eeab 100644 --- a/src/zepben/ewb/services/network/network_extensions.py +++ b/src/zepben/ewb/services/network/network_extensions.py @@ -18,7 +18,7 @@ from zepben.ewb.model.cim.iec61970.base.wires.power_transformer import PowerTransformer from zepben.ewb.model.cim.iec61970.base.wires.power_transformer_end import PowerTransformerEnd from zepben.ewb.services.network.network_service import NetworkService -from zepben.ewb.util import CopyableUUID +from zepben.ewb.util import generate_id # !! WARNING !! # @@ -39,7 +39,7 @@ def create_two_winding_power_transformer(network_service: NetworkService, cn1: C _connect_two_terminal_conducting_equipment(network_service=network_service, ce=power_transformer, cn1=cn1, cn2=cn2) # TODO: How to associated PowerTransformerEndInfo to a PowerTransformerInfo for i in range(1, 2): - end = PowerTransformerEnd(power_transformer=power_transformer) + end = PowerTransformerEnd(f"{power_transformer.mrid}-pte{i}", power_transformer=power_transformer) power_transformer.add_end(end) end.terminal = power_transformer.get_terminal_by_sn(i) return power_transformer @@ -69,7 +69,7 @@ def create_breaker(network_service: NetworkService, cn1: ConnectivityNode, cn2: def create_bus(network_service: NetworkService, **kwargs) -> Junction: bus = Junction(**kwargs) if 'mrid' not in kwargs: - bus.mrid = str(CopyableUUID()) + bus.mrid = generate_id() network_service.add(bus) _create_terminals(ce=bus, network=network_service) # TODO: Figure out how to add Voltage to Buses - Looks like we need to add topologicalNode to support the @@ -79,7 +79,7 @@ def create_bus(network_service: NetworkService, **kwargs) -> Junction: def _create_two_terminal_conducting_equipment(network_service: NetworkService, ce: ConductingEquipment, **kwargs): if 'mrid' not in kwargs: - ce.mrid = str(CopyableUUID()) + ce.mrid = generate_id() network_service.add(ce) _create_terminals(ce=ce, num_terms=2, network=network_service) @@ -92,7 +92,7 @@ def _connect_two_terminal_conducting_equipment(network_service: NetworkService, def _create_single_terminal_conducting_equipment(network_service: NetworkService, ce: ConductingEquipment, **kwargs): if 'mrid' not in kwargs: - ce.mrid = str(CopyableUUID()) + ce.mrid = generate_id() network_service.add(ce) _create_terminals(ce=ce, network=network_service) diff --git a/src/zepben/ewb/util.py b/src/zepben/ewb/util.py index 979be8f18..dedb73d3d 100644 --- a/src/zepben/ewb/util.py +++ b/src/zepben/ewb/util.py @@ -15,7 +15,7 @@ "is_none_or_empty", "require", "pb_or_none", - "CopyableUUID", + "generate_id", "datetime_to_timestamp", "none", "classproperty", @@ -170,14 +170,8 @@ def none(collection: Collection): raise ValueError("none() only supports collection types") -class CopyableUUID(UUID): - - def __init__(self): - super().__init__(bytes=os.urandom(16), version=4) - - @staticmethod - def copy(): - return str(UUID(bytes=os.urandom(16), version=4)) +def generate_id() -> str: + return str(UUID(bytes=os.urandom(16), version=4)) class classproperty(property): diff --git a/test/cim/cim_creators.py b/test/cim/cim_creators.py index e17ca1430..8fc838215 100644 --- a/test/cim/cim_creators.py +++ b/test/cim/cim_creators.py @@ -46,6 +46,7 @@ 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 @@ -181,12 +182,12 @@ def create_protection_relay_function(include_runtime: bool = True): "protection_kind": sampled_protection_kind(), "directable": boolean_or_none(), "power_direction": sampled_power_direction_kind(), - "sensors": lists(builds(CurrentTransformer), max_size=2), - "protected_switches": lists(builds(Breaker), max_size=2), - "schemes": lists(builds(ProtectionRelayScheme), max_size=2), + "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) + "relay_info": builds(RelayInfo, mrid=mrid_strategy) } @@ -194,8 +195,8 @@ def create_protection_relay_scheme(include_runtime: bool = True): return builds( ProtectionRelayScheme, **create_identified_object(include_runtime), - system=builds(ProtectionRelaySystem), - functions=lists(builds(CurrentRelay)) + system=builds(ProtectionRelaySystem, mrid=mrid_strategy), + functions=lists(builds(CurrentRelay, mrid=mrid_strategy)) ) @@ -204,7 +205,7 @@ def create_protection_relay_system(include_runtime: bool = True): ProtectionRelaySystem, **create_equipment(include_runtime), protection_kind=sampled_protection_kind(), - schemes=lists(builds(ProtectionRelayScheme)) + schemes=lists(builds(ProtectionRelayScheme, mrid=mrid_strategy)) ) @@ -741,7 +742,7 @@ def sampled_potential_transformer_kind(): def create_sensor(include_runtime: bool = True): return { **create_auxiliary_equipment(include_runtime), - "relay_functions": lists(builds(CurrentRelay), max_size=10) + "relay_functions": lists(builds(CurrentRelay, mrid=mrid_strategy), max_size=10) } @@ -1334,7 +1335,7 @@ def create_fuse(include_runtime: bool = True): return builds( Fuse, **create_switch(include_runtime), - function=builds(DistanceRelay) + function=builds(DistanceRelay, mrid=mrid_strategy) ) @@ -1533,7 +1534,7 @@ 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), min_size=1, max_size=2) + "relay_functions": lists(builds(CurrentRelay, mrid=mrid_strategy), min_size=1, max_size=2) } 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 f15ac8f9a..34a84e9ba 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 @@ -9,7 +9,7 @@ from cim.iec61968.metering.test_end_device_function import end_device_function_kwargs, 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 +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 = { @@ -22,7 +22,7 @@ def test_pan_demand_response_function_constructor_default(): - pdrf = PanDemandResponseFunction() + pdrf = PanDemandResponseFunction(mrid=generate_id()) verify_end_device_function_constructor_default(pdrf) @@ -50,14 +50,14 @@ def test_pan_demand_response_function_constructor_args(): def test_constructor_with_controlled_appliance(): ca = ControlledAppliance([Appliance.SMART_APPLIANCE, Appliance.IRRIGATION_PUMP]) - pdrf = PanDemandResponseFunction(appliances=ca) + pdrf = PanDemandResponseFunction(mrid=generate_id(), appliances=ca) assert pdrf.appliance == ca def test_appliance_setter(): ca = ControlledAppliance([Appliance.SMART_APPLIANCE, Appliance.IRRIGATION_PUMP]) - pdrf = PanDemandResponseFunction() + pdrf = PanDemandResponseFunction(mrid=generate_id()) pdrf.appliance = ca assert pdrf.appliance == ca @@ -66,7 +66,7 @@ def test_appliance_setter(): def test_add_remove_appliances(): - pdrf = PanDemandResponseFunction() + pdrf = PanDemandResponseFunction(mrid=generate_id()) assert pdrf.add_appliance(Appliance.WATER_HEATER), "should have added" validate_appliance(pdrf.appliance, is_water_heater=True) @@ -87,7 +87,7 @@ def test_add_remove_appliances(): def test_add_remove_multiple_appliances(): - pdrf = PanDemandResponseFunction() + pdrf = PanDemandResponseFunction(mrid=generate_id()) with raises(ValueError, match="You must provide at least one appliance to add"): pdrf.add_appliances([]) @@ -122,7 +122,7 @@ def test_add_remove_multiple_appliances(): def test_remove_appliance_initialises_bitmask(): - pdrf = PanDemandResponseFunction() + pdrf = PanDemandResponseFunction(mrid=generate_id()) assert pdrf._appliance_bitmask is None assert pdrf.appliance is None @@ -132,7 +132,7 @@ def test_remove_appliance_initialises_bitmask(): def test_removing_appliances_initialises_bitmask(): - pdrf = PanDemandResponseFunction() + pdrf = PanDemandResponseFunction(mrid=generate_id()) assert pdrf._appliance_bitmask is None assert pdrf.appliance is None 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 3e4ab5afa..c3852101b 100644 --- a/test/cim/extensions/iec61970/base/wires/test_battery_control.py +++ b/test/cim/extensions/iec61970/base/wires/test_battery_control.py @@ -8,7 +8,7 @@ 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, \ verify_regulating_control_constructor_kwargs, verify_regulating_control_constructor_args -from zepben.ewb import BatteryControl, BatteryControlMode +from zepben.ewb import BatteryControl, BatteryControlMode, generate_id battery_control_kwargs = { **regulating_control_kwargs, @@ -22,7 +22,7 @@ def test_battery_control_constructor_default(): - bc = BatteryControl() + bc = BatteryControl(mrid=generate_id()) verify_regulating_control_constructor_default(bc) diff --git a/test/cim/iec61968/assetinfo/test_cable_info.py b/test/cim/iec61968/assetinfo/test_cable_info.py index 971af1080..564b9dd9a 100644 --- a/test/cim/iec61968/assetinfo/test_cable_info.py +++ b/test/cim/iec61968/assetinfo/test_cable_info.py @@ -6,6 +6,7 @@ from cim.iec61968.assetinfo.test_wire_info import wire_info_kwargs, 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 @@ -13,7 +14,7 @@ def test_cable_info_constructor_default(): - verify_wire_info_constructor_default(CableInfo()) + verify_wire_info_constructor_default(CableInfo(mrid=generate_id())) @given(**cable_info_kwargs) diff --git a/test/cim/iec61968/assetinfo/test_no_load_test.py b/test/cim/iec61968/assetinfo/test_no_load_test.py index 98edfe06e..e346ffb88 100644 --- a/test/cim/iec61968/assetinfo/test_no_load_test.py +++ b/test/cim/iec61968/assetinfo/test_no_load_test.py @@ -4,7 +4,7 @@ # 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 +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, \ @@ -23,7 +23,7 @@ def test_no_load_test_constructor_default(): - nlt = NoLoadTest() + nlt = NoLoadTest(mrid=generate_id()) verify_transformer_test_constructor_default(nlt) assert nlt.energised_end_voltage is None diff --git a/test/cim/iec61968/assetinfo/test_open_circuit_test.py b/test/cim/iec61968/assetinfo/test_open_circuit_test.py index ee1cb7ec7..705af6abc 100644 --- a/test/cim/iec61968/assetinfo/test_open_circuit_test.py +++ b/test/cim/iec61968/assetinfo/test_open_circuit_test.py @@ -4,7 +4,7 @@ # 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 +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, \ @@ -23,7 +23,7 @@ def test_open_circuit_test_constructor_default(): - test = OpenCircuitTest() + test = OpenCircuitTest(mrid=generate_id()) verify_transformer_test_constructor_default(test) assert test.energised_end_step is None diff --git a/test/cim/iec61968/assetinfo/test_overhead_wire_info.py b/test/cim/iec61968/assetinfo/test_overhead_wire_info.py index f93ba7226..c86311b06 100644 --- a/test/cim/iec61968/assetinfo/test_overhead_wire_info.py +++ b/test/cim/iec61968/assetinfo/test_overhead_wire_info.py @@ -6,6 +6,7 @@ from cim.iec61968.assetinfo.test_wire_info import wire_info_kwargs, 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 @@ -13,7 +14,7 @@ def test_overhead_wire_info_constructor_default(): - verify_wire_info_constructor_default(OverheadWireInfo()) + verify_wire_info_constructor_default(OverheadWireInfo(mrid=generate_id())) @given(**overhead_wire_info_kwargs) diff --git a/test/cim/iec61968/assetinfo/test_power_transformer_info.py b/test/cim/iec61968/assetinfo/test_power_transformer_info.py index 3eb1ac455..9da98befd 100644 --- a/test/cim/iec61968/assetinfo/test_power_transformer_info.py +++ b/test/cim/iec61968/assetinfo/test_power_transformer_info.py @@ -4,22 +4,24 @@ # 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 PowerTransformerInfo, TransformerTankInfo + +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, \ verify_asset_info_constructor_kwargs, verify_asset_info_constructor_args, asset_info_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered power_transformer_info_kwargs = { **asset_info_kwargs, - "transformer_tank_infos": lists(builds(TransformerTankInfo), max_size=2) + "transformer_tank_infos": lists(builds(TransformerTankInfo, mrid=mrid_strategy), max_size=2) } -power_transformer_info_args = [*asset_info_args, [TransformerTankInfo(), TransformerTankInfo()]] +power_transformer_info_args = [*asset_info_args, [TransformerTankInfo(mrid=generate_id()), TransformerTankInfo(mrid=generate_id())]] def test_power_transformer_info_constructor_default(): - pti = PowerTransformerInfo() + pti = PowerTransformerInfo(mrid=generate_id()) verify_asset_info_constructor_default(pti) assert not list(pti.transformer_tank_infos) @@ -43,7 +45,7 @@ def test_power_transformer_info_constructor_args(): def test_transformer_tank_info_collection(): - validate_unordered_1234567890( + validate_unordered( PowerTransformerInfo, lambda mrid: TransformerTankInfo(mrid), PowerTransformerInfo.transformer_tank_infos, diff --git a/test/cim/iec61968/assetinfo/test_short_circuit_test.py b/test/cim/iec61968/assetinfo/test_short_circuit_test.py index 966ab165f..9193f2b42 100644 --- a/test/cim/iec61968/assetinfo/test_short_circuit_test.py +++ b/test/cim/iec61968/assetinfo/test_short_circuit_test.py @@ -4,7 +4,7 @@ # 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 +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, \ @@ -28,7 +28,7 @@ def test_short_circuit_test_constructor_default(): - sct = ShortCircuitTest() + sct = ShortCircuitTest(mrid=generate_id()) verify_transformer_test_constructor_default(sct) assert sct.current is None diff --git a/test/cim/iec61968/assetinfo/test_shunt_compensator_info.py b/test/cim/iec61968/assetinfo/test_shunt_compensator_info.py index 0ad40ea7a..e58310146 100644 --- a/test/cim/iec61968/assetinfo/test_shunt_compensator_info.py +++ b/test/cim/iec61968/assetinfo/test_shunt_compensator_info.py @@ -4,7 +4,7 @@ # 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 +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, \ @@ -22,7 +22,7 @@ def test_shunt_compensator_info_constructor_default(): - sci = ShuntCompensatorInfo() + sci = ShuntCompensatorInfo(mrid=generate_id()) verify_asset_info_constructor_default(sci) assert sci.max_power_loss is None diff --git a/test/cim/iec61968/assetinfo/test_switch_info.py b/test/cim/iec61968/assetinfo/test_switch_info.py index 7ddb87bf0..62a7c055a 100644 --- a/test/cim/iec61968/assetinfo/test_switch_info.py +++ b/test/cim/iec61968/assetinfo/test_switch_info.py @@ -4,7 +4,7 @@ # 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 +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, \ @@ -19,7 +19,7 @@ def test_switch_info_constructor_default(): - si = SwitchInfo() + si = SwitchInfo(mrid=generate_id()) verify_asset_info_constructor_default(si) assert si.rated_interrupting_time is None diff --git a/test/cim/iec61968/assetinfo/test_transformer_end_info.py b/test/cim/iec61968/assetinfo/test_transformer_end_info.py index 18de20980..2fa974ad5 100644 --- a/test/cim/iec61968/assetinfo/test_transformer_end_info.py +++ b/test/cim/iec61968/assetinfo/test_transformer_end_info.py @@ -6,13 +6,13 @@ from hypothesis import given from hypothesis.strategies import integers, floats -from zepben.ewb import TransformerEndInfo, WindingConnection, TransformerStarImpedance, TransformerTankInfo, ResistanceReactance, NoLoadTest, \ - ShortCircuitTest, OpenCircuitTest 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, \ 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, @@ -34,12 +34,29 @@ "energised_end_open_circuit_tests": create_open_circuit_test(), } -transformer_end_info_args = [*asset_info_args, WindingConnection.UNKNOWN, 1, 2, 3, 4, 5.0, 6, 7, 8, TransformerTankInfo(), TransformerStarImpedance(), - NoLoadTest(), ShortCircuitTest(), ShortCircuitTest(), OpenCircuitTest(), OpenCircuitTest()] +transformer_end_info_args = [ + *asset_info_args, + WindingConnection.UNKNOWN, + 1, + 2, + 3, + 4, + 5.0, + 6, + 7, + 8, + TransformerTankInfo(mrid=generate_id()), + TransformerStarImpedance(mrid=generate_id()), + NoLoadTest(mrid=generate_id()), + ShortCircuitTest(mrid=generate_id()), + ShortCircuitTest(mrid=generate_id()), + OpenCircuitTest(mrid=generate_id()), + OpenCircuitTest(mrid=generate_id()), +] def test_transformer_end_info_constructor_default(): - tei = TransformerEndInfo() + tei = TransformerEndInfo(mrid=generate_id()) verify_asset_info_constructor_default(tei) assert tei.connection_kind == WindingConnection.UNKNOWN @@ -130,7 +147,7 @@ def test_transformer_end_info_constructor_args(): def test_populates_resistance_reactance_off_end_star_impedance_if_available(): with patch.object(TransformerEndInfo, "calculate_resistance_reactance_from_tests") as method: - info = TransformerEndInfo(transformer_star_impedance=TransformerStarImpedance(r=1.1, x=1.2, r0=1.3, x0=1.4)) + info = TransformerEndInfo(mrid=generate_id(), transformer_star_impedance=TransformerStarImpedance(mrid=generate_id(), r=1.1, x=1.2, r0=1.3, x0=1.4)) validate_resistance_reactance(info.resistance_reactance(), 1.1, 1.2, 1.3, 1.4) method.assert_not_called() @@ -138,7 +155,7 @@ def test_populates_resistance_reactance_off_end_star_impedance_if_available(): def test_populates_resistance_reactance_off_end_info_tests_if_available(): with patch.object(TransformerEndInfo, "calculate_resistance_reactance_from_tests") as method: method.return_value = ResistanceReactance(2.1, 2.2, 2.3, 2.4) - info = TransformerEndInfo() + info = TransformerEndInfo(mrid=generate_id()) validate_resistance_reactance(info.resistance_reactance(), 2.1, 2.2, 2.3, 2.4) method.assert_called_once() @@ -146,17 +163,20 @@ def test_populates_resistance_reactance_off_end_info_tests_if_available(): def test_merges_resistance_reactance_if_required(): with patch.object(TransformerEndInfo, "calculate_resistance_reactance_from_tests") as method: method.return_value = ResistanceReactance(None, 2.2, None, None) - info = TransformerEndInfo(transformer_star_impedance=TransformerStarImpedance(r=1.1, x=None, r0=None, x0=None)) + info = TransformerEndInfo( + mrid=generate_id(), + transformer_star_impedance=TransformerStarImpedance(mrid=generate_id(), r=1.1, x=None, r0=None, x0=None) + ) validate_resistance_reactance(info.resistance_reactance(), 1.1, 2.2, None, None) method.assert_called_once() def test_calculates_resistance_reactance_of_end_info_tests_if_available(): - loss_test = ShortCircuitTest(loss=2020180, voltage=11.85) - loss_no_voltage_test = ShortCircuitTest(loss=2020180) - ohmic_test = ShortCircuitTest(voltage_ohmic_part=0.124, voltage=11.85) - ohmic_no_voltage_test = ShortCircuitTest(voltage_ohmic_part=0.124) - voltage_only_test = ShortCircuitTest(voltage=11.85) + loss_test = ShortCircuitTest(mrid=generate_id(), loss=2020180, voltage=11.85) + loss_no_voltage_test = ShortCircuitTest(mrid=generate_id(), loss=2020180) + ohmic_test = ShortCircuitTest(mrid=generate_id(), voltage_ohmic_part=0.124, voltage=11.85) + ohmic_no_voltage_test = ShortCircuitTest(mrid=generate_id(), voltage_ohmic_part=0.124) + voltage_only_test = ShortCircuitTest(mrid=generate_id(), voltage=11.85) # check via loss validate_resistance_reactance_from_test(400000, 1630000000, loss_test, loss_test, ResistanceReactance(0.12, 11.63, 0.12, 11.63)) @@ -180,6 +200,7 @@ def test_calculates_resistance_reactance_of_end_info_tests_if_available(): def validate_resistance_reactance_from_test(rated_u, rated_s, energised_test, grounded_test, expected_rr): info = TransformerEndInfo( + mrid=generate_id(), rated_u=rated_u, rated_s=rated_s, grounded_end_short_circuit_tests=grounded_test, diff --git a/test/cim/iec61968/assetinfo/test_transformer_tank_info.py b/test/cim/iec61968/assetinfo/test_transformer_tank_info.py index cda75a6ba..47f96c9b8 100644 --- a/test/cim/iec61968/assetinfo/test_transformer_tank_info.py +++ b/test/cim/iec61968/assetinfo/test_transformer_tank_info.py @@ -5,23 +5,25 @@ from hypothesis import given from hypothesis.strategies import lists, builds -from zepben.ewb import TransformerTankInfo, TransformerEndInfo, PowerTransformerInfo + +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, \ verify_asset_info_constructor_kwargs, verify_asset_info_constructor_args, asset_info_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered transformer_tank_info_kwargs = { **asset_info_kwargs, - "power_transformer_info": builds(PowerTransformerInfo), - "transformer_end_infos": lists(builds(TransformerEndInfo), max_size=2) + "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(), [TransformerEndInfo(), TransformerEndInfo()]] +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(): - tti = TransformerTankInfo() + tti = TransformerTankInfo(mrid=generate_id()) verify_asset_info_constructor_default(tti) assert not list(tti.transformer_end_infos) @@ -45,7 +47,7 @@ def test_transformer_tank_info_constructor_args(): def test_transformer_tank_info_collection(): - validate_unordered_1234567890( + validate_unordered( TransformerTankInfo, lambda mrid: TransformerEndInfo(mrid), TransformerTankInfo.transformer_end_infos, diff --git a/test/cim/iec61968/assets/test_asset.py b/test/cim/iec61968/assets/test_asset.py index 6351858e0..7aac37787 100644 --- a/test/cim/iec61968/assets/test_asset.py +++ b/test/cim/iec61968/assets/test_asset.py @@ -4,20 +4,22 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis.strategies import builds, lists -from zepben.ewb import Asset, Location, AssetOrganisationRole, PowerSystemResource + +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, \ verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered asset_kwargs = { **identified_object_kwargs, - "location": builds(Location), - "organisation_roles": lists(builds(AssetOrganisationRole), max_size=2), - "power_system_resources": lists(builds(PowerSystemResource), max_size=2) + "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) } -asset_args = [*identified_object_args, Location(), [AssetOrganisationRole()], [PowerSystemResource()]] +asset_args = [*identified_object_args, Location(mrid=generate_id()), [AssetOrganisationRole(mrid=generate_id())], [PowerSystemResource(mrid=generate_id())]] def verify_asset_constructor_default(a: Asset): @@ -44,7 +46,7 @@ def verify_asset_constructor_args(a: Asset): def test_organisation_roles_collection(): - validate_unordered_1234567890( + validate_unordered( Asset, lambda mrid: AssetOrganisationRole(mrid), Asset.organisation_roles, @@ -57,7 +59,7 @@ def test_organisation_roles_collection(): def test_power_system_resources_collection(): - validate_unordered_1234567890( + validate_unordered( Asset, lambda mrid: PowerSystemResource(mrid), Asset.power_system_resources, diff --git a/test/cim/iec61968/assets/test_asset_owner.py b/test/cim/iec61968/assets/test_asset_owner.py index 8c46f10d3..4ebce4906 100644 --- a/test/cim/iec61968/assets/test_asset_owner.py +++ b/test/cim/iec61968/assets/test_asset_owner.py @@ -6,6 +6,7 @@ from cim.iec61968.assets.test_asset_organisation_role import asset_organisation_role_kwargs, 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 @@ -13,7 +14,7 @@ def test_asset_owner_constructor_default(): - verify_asset_organisation_role_constructor_default(AssetOwner()) + verify_asset_organisation_role_constructor_default(AssetOwner(mrid=generate_id())) @given(**asset_owner_kwargs) diff --git a/test/cim/iec61968/assets/test_pole.py b/test/cim/iec61968/assets/test_pole.py index c6d4f657f..eea178705 100644 --- a/test/cim/iec61968/assets/test_pole.py +++ b/test/cim/iec61968/assets/test_pole.py @@ -4,24 +4,26 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis import given from hypothesis.strategies import text, lists, builds -from zepben.ewb import Pole, Streetlight + +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, \ verify_structure_constructor_kwargs, verify_structure_constructor_args, structure_args -from cim.private_collection_validator import validate_unordered_1234567890 +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), max_size=2) + "streetlights": lists(builds(Streetlight, mrid=mrid_strategy), max_size=2) } -pole_args = [*structure_args, "a", [Streetlight()]] +pole_args = [*structure_args, "a", [Streetlight(mrid=generate_id())]] def test_pole_constructor_default(): - p = Pole() + p = Pole(mrid=generate_id()) verify_structure_constructor_default(p) assert p.classification is None @@ -50,7 +52,7 @@ def test_pole_constructor_args(): def test_streetlights_collection(): - validate_unordered_1234567890( + validate_unordered( Pole, lambda mrid: Streetlight(mrid), Pole.streetlights, diff --git a/test/cim/iec61968/assets/test_streelight.py b/test/cim/iec61968/assets/test_streelight.py index 581a7a338..bbdb60605 100644 --- a/test/cim/iec61968/assets/test_streelight.py +++ b/test/cim/iec61968/assets/test_streelight.py @@ -4,7 +4,9 @@ # 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 zepben.ewb import Streetlight, Pole + +from util import mrid_strategy +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 @@ -13,16 +15,16 @@ streetlight_kwargs = { **asset_kwargs, - "pole": builds(Pole), + "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(), 1, StreetlightLampKind.HIGH_PRESSURE_SODIUM] +streetlight_args = [*asset_args, Pole(mrid=generate_id()), 1, StreetlightLampKind.HIGH_PRESSURE_SODIUM] def test_streetlight_constructor_default(): - p = Streetlight() + p = Streetlight(mrid=generate_id()) verify_asset_constructor_default(p) assert not p.pole diff --git a/test/cim/iec61968/common/test_location.py b/test/cim/iec61968/common/test_location.py index 8ee45f246..5d8ced813 100644 --- a/test/cim/iec61968/common/test_location.py +++ b/test/cim/iec61968/common/test_location.py @@ -4,14 +4,14 @@ # 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 +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, \ verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args -from cim.private_collection_validator import validate_ordered_other_1234567890 +from cim.private_collection_validator import validate_ordered_other location_kwargs = { **identified_object_kwargs, @@ -23,7 +23,7 @@ def test_location_constructor_default(): - loc = Location() + loc = Location(mrid=generate_id()) verify_identified_object_constructor_default(loc) assert not loc.main_address @@ -50,7 +50,7 @@ def test_location_constructor_args(): def test_points_collection(): - validate_ordered_other_1234567890( + validate_ordered_other( Location, lambda i: PositionPoint(i, i), Location.points, diff --git a/test/cim/iec61968/common/test_organisation_role.py b/test/cim/iec61968/common/test_organisation_role.py index a5e131c8a..44206cb79 100644 --- a/test/cim/iec61968/common/test_organisation_role.py +++ b/test/cim/iec61968/common/test_organisation_role.py @@ -4,17 +4,19 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis.strategies import builds -from zepben.ewb import OrganisationRole, Organisation + +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, \ verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args organisation_role_kwargs = { **identified_object_kwargs, - "organisation": builds(Organisation) + "organisation": builds(Organisation, mrid=mrid_strategy) } -organisation_role_args = [*identified_object_args, Organisation()] +organisation_role_args = [*identified_object_args, Organisation(mrid=generate_id())] def verify_organisation_role_constructor_default(or_: OrganisationRole): diff --git a/test/cim/iec61968/customers/test_customer.py b/test/cim/iec61968/customers/test_customer.py index 98753ab0b..9b4be5ee4 100644 --- a/test/cim/iec61968/customers/test_customer.py +++ b/test/cim/iec61968/customers/test_customer.py @@ -7,25 +7,26 @@ from hypothesis.strategies import lists, builds, sampled_from, text from cim.cim_creators import ALPHANUM, TEXT_MAX_SIZE -from zepben.ewb import Customer, CustomerKind, CustomerAgreement +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, \ verify_organisation_role_constructor_kwargs, \ verify_organisation_role_constructor_args, organisation_role_args -from cim.private_collection_validator import validate_unordered_1234567890 +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), max_size=2) + "customer_agreements": lists(builds(CustomerAgreement, mrid=mrid_strategy), max_size=2) } -customer_args = [*organisation_role_args, CustomerKind.residential, "special", [CustomerAgreement()]] +customer_args = [*organisation_role_args, CustomerKind.residential, "special", [CustomerAgreement(mrid=generate_id())]] def test_customer_constructor_default(): - c = Customer() + c = Customer(mrid=generate_id()) verify_organisation_role_constructor_default(c) assert c.kind == CustomerKind.UNKNOWN @@ -60,7 +61,7 @@ def test_customer_constructor_args(): def test_customer_agreements_collection(): - validate_unordered_1234567890( + validate_unordered( Customer, lambda mrid: CustomerAgreement(mrid), Customer.agreements, diff --git a/test/cim/iec61968/customers/test_customer_agreement.py b/test/cim/iec61968/customers/test_customer_agreement.py index 6ee633727..00812aa15 100644 --- a/test/cim/iec61968/customers/test_customer_agreement.py +++ b/test/cim/iec61968/customers/test_customer_agreement.py @@ -5,23 +5,25 @@ from hypothesis import given from hypothesis.strategies import lists, builds -from zepben.ewb import CustomerAgreement, Customer, PricingStructure + +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, \ verify_agreement_constructor_args, agreement_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered customer_agreement_kwargs = { **agreement_kwargs, - "customer": builds(Customer), - "pricing_structures": lists(builds(PricingStructure), max_size=2) + "customer": builds(Customer, mrid=mrid_strategy), + "pricing_structures": lists(builds(PricingStructure, mrid=mrid_strategy), max_size=2) } -customer_agreement_args = [*agreement_args, Customer(), [PricingStructure()]] +customer_agreement_args = [*agreement_args, Customer(mrid=generate_id()), [PricingStructure(mrid=generate_id())]] def test_customer_agreement_constructor_default(): - ca = CustomerAgreement() + ca = CustomerAgreement(mrid=generate_id()) verify_agreement_constructor_default(ca) assert not ca.customer @@ -52,7 +54,7 @@ def test_customer_agreement_constructor_args(): def test_pricing_structures_collection(): - validate_unordered_1234567890( + validate_unordered( CustomerAgreement, lambda mrid: PricingStructure(mrid), CustomerAgreement.pricing_structures, diff --git a/test/cim/iec61968/customers/test_pricing_structure.py b/test/cim/iec61968/customers/test_pricing_structure.py index 2bea59d8a..84da83898 100644 --- a/test/cim/iec61968/customers/test_pricing_structure.py +++ b/test/cim/iec61968/customers/test_pricing_structure.py @@ -5,22 +5,24 @@ from hypothesis import given from hypothesis.strategies import lists, builds -from zepben.ewb import PricingStructure, Tariff + +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, \ verify_document_constructor_args, document_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered pricing_structure_kwargs = { **document_kwargs, - "tariffs": lists(builds(Tariff), max_size=2), + "tariffs": lists(builds(Tariff, mrid=mrid_strategy), max_size=2), } -pricing_structure_args = [*document_args, [Tariff()]] +pricing_structure_args = [*document_args, [Tariff(mrid=generate_id())]] def test_pricing_structure_constructor_default(): - ps = PricingStructure() + ps = PricingStructure(mrid=generate_id()) verify_document_constructor_default(ps) assert not list(ps.tariffs) @@ -47,7 +49,7 @@ def test_pricing_structure_constructor_args(): def test_tariffs_collection(): - validate_unordered_1234567890( + validate_unordered( PricingStructure, lambda mrid: Tariff(mrid), PricingStructure.tariffs, diff --git a/test/cim/iec61968/customers/test_tariff.py b/test/cim/iec61968/customers/test_tariff.py index 00f5128d7..3b5d14145 100644 --- a/test/cim/iec61968/customers/test_tariff.py +++ b/test/cim/iec61968/customers/test_tariff.py @@ -7,14 +7,14 @@ from cim.iec61968.common.test_document import document_kwargs, verify_document_constructor_default, verify_document_constructor_kwargs, \ verify_document_constructor_args, document_args -from zepben.ewb import Tariff +from zepben.ewb import Tariff, generate_id tariff_kwargs = document_kwargs tariff_args = document_args def test_tariff_constructor_default(): - verify_document_constructor_default(Tariff()) + verify_document_constructor_default(Tariff(mrid=generate_id())) @given(**tariff_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 69f3da786..0c468c1e7 100644 --- a/test/cim/iec61968/infiec61968/infassetinfo/test_current_transformer_info.py +++ b/test/cim/iec61968/infiec61968/infassetinfo/test_current_transformer_info.py @@ -5,7 +5,7 @@ from hypothesis import given from hypothesis.strategies import builds, floats, integers, text -from zepben.ewb import CurrentTransformerInfo, Ratio +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, \ @@ -32,7 +32,7 @@ def test_current_transformer_info_constructor_default(): - cti = CurrentTransformerInfo() + cti = CurrentTransformerInfo(mrid=generate_id()) verify_asset_info_constructor_default(cti) assert cti.accuracy_class is None 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 bc949a72e..2108a1adc 100644 --- a/test/cim/iec61968/infiec61968/infassetinfo/test_potential_transformer_info.py +++ b/test/cim/iec61968/infiec61968/infassetinfo/test_potential_transformer_info.py @@ -5,7 +5,8 @@ from hypothesis import given from hypothesis.strategies import builds, floats, integers, text -from zepben.ewb import PotentialTransformerInfo, PowerTransformerInfo, Ratio + +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, \ @@ -13,7 +14,7 @@ potential_transformer_info_kwargs = { **asset_info_kwargs, - "accuracy_class": builds(PowerTransformerInfo), + "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), @@ -26,7 +27,7 @@ def test_potential_transformer_info_constructor_default(): - vti = PotentialTransformerInfo() + vti = PotentialTransformerInfo(mrid=generate_id()) verify_asset_info_constructor_default(vti) assert vti.accuracy_class is None diff --git a/test/cim/iec61968/infiec61968/infassetinfo/test_relay_info.py b/test/cim/iec61968/infiec61968/infassetinfo/test_relay_info.py index dc5df81a0..8845dae60 100644 --- a/test/cim/iec61968/infiec61968/infassetinfo/test_relay_info.py +++ b/test/cim/iec61968/infiec61968/infassetinfo/test_relay_info.py @@ -8,8 +8,8 @@ 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, \ verify_asset_info_constructor_args -from cim.private_collection_validator import validate_ordered_other_1234567890 -from zepben.ewb import RelayInfo +from cim.private_collection_validator import validate_ordered_other +from zepben.ewb import RelayInfo, generate_id relay_info_kwargs = { **asset_info_kwargs, @@ -23,7 +23,7 @@ def test_relay_info_constructor_default(): - ri = RelayInfo() + ri = RelayInfo(mrid=generate_id()) verify_asset_info_constructor_default(ri) assert ri.curve_setting is None @@ -56,7 +56,7 @@ def test_relay_info_constructor_args(): def test_relay_info_reclose_delays(): - validate_ordered_other_1234567890( + validate_ordered_other( RelayInfo, lambda i: float(i), RelayInfo.reclose_delays, diff --git a/test/cim/iec61968/metering/test_end_device.py b/test/cim/iec61968/metering/test_end_device.py index 14d470440..17e3f9611 100644 --- a/test/cim/iec61968/metering/test_end_device.py +++ b/test/cim/iec61968/metering/test_end_device.py @@ -8,8 +8,9 @@ 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, \ verify_asset_container_constructor_kwargs, verify_asset_container_constructor_args, asset_container_args -from cim.private_collection_validator import validate_unordered_1234567890 -from zepben.ewb import Location +from cim.private_collection_validator import validate_unordered +from util import mrid_strategy +from zepben.ewb import Location, generate_id 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 @@ -17,11 +18,11 @@ end_device_kwargs = { **asset_container_kwargs, "customer_mrid": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - "service_location": builds(Location), - "usage_points": lists(builds(UsagePoint), max_size=2) + "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(), [UsagePoint]] +end_device_args = [*asset_container_args, "a", Location(mrid=generate_id()), [UsagePoint(mrid=generate_id())]] def verify_end_device_constructor_default(ed: EndDevice): @@ -48,7 +49,7 @@ def verify_end_device_constructor_args(ed: EndDevice): def test_usage_points_collection(): - validate_unordered_1234567890( + validate_unordered( EndDevice, lambda mrid: UsagePoint(mrid), EndDevice.usage_points, @@ -61,7 +62,7 @@ def test_usage_points_collection(): def test_end_device_function_collection(): - validate_unordered_1234567890( + validate_unordered( EndDevice, lambda mrid: EndDeviceFunction(mrid), EndDevice.functions, diff --git a/test/cim/iec61968/metering/test_end_device_function.py b/test/cim/iec61968/metering/test_end_device_function.py index f374e1b03..ce9e07354 100644 --- a/test/cim/iec61968/metering/test_end_device_function.py +++ b/test/cim/iec61968/metering/test_end_device_function.py @@ -3,12 +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.strategies import builds, booleans +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, \ verify_asset_function_constructor_kwargs, verify_asset_function_constructor_args from zepben.ewb.model.cim.iec61968.metering.end_device_function import EndDeviceFunction -from zepben.ewb.model.cim.iec61968.metering.end_device import EndDevice end_device_function_kwargs = { **asset_function_kwargs, diff --git a/test/cim/iec61968/metering/test_meter.py b/test/cim/iec61968/metering/test_meter.py index c3cc724cd..a9ab68f9a 100644 --- a/test/cim/iec61968/metering/test_meter.py +++ b/test/cim/iec61968/metering/test_meter.py @@ -7,6 +7,7 @@ from cim.iec61968.metering.test_end_device import end_device_kwargs, 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 @@ -14,7 +15,7 @@ def test_meter_constructor_default(): - meter = Meter() + meter = Meter(mrid=generate_id()) verify_end_device_constructor_default(meter) assert meter.company_meter_id is None assert meter.name is None diff --git a/test/cim/iec61968/metering/test_usage_point.py b/test/cim/iec61968/metering/test_usage_point.py index 17c568887..713314029 100644 --- a/test/cim/iec61968/metering/test_usage_point.py +++ b/test/cim/iec61968/metering/test_usage_point.py @@ -5,32 +5,34 @@ from hypothesis import given from hypothesis.strategies import builds, lists, booleans, text, integers, sampled_from -from zepben.ewb import Location, Equipment, PhaseCode + +from util import mrid_strategy +from zepben.ewb import Location, Equipment, PhaseCode, generate_id from zepben.ewb.model.cim.iec61968.metering.usage_point import UsagePoint from zepben.ewb.model.cim.iec61968.metering.end_device import EndDevice 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_1234567890 +from cim.private_collection_validator import validate_unordered usage_point_kwargs = { **identified_object_kwargs, - "usage_point_location": builds(Location), + "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)), - "end_devices": lists(builds(EndDevice)) + "equipment": lists(builds(Equipment, mrid=mrid_strategy)), + "end_devices": lists(builds(EndDevice, mrid=mrid_strategy)) } -usage_point_args = [*identified_object_args, Location(), True, "1", 1, 2, PhaseCode.XYN, [Equipment()], [EndDevice()]] +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(): - up = UsagePoint() + up = UsagePoint(mrid=generate_id()) verify_identified_object_constructor_default(up) assert up.usage_point_location is None @@ -93,7 +95,7 @@ def test_usage_point_constructor_args(): def test_equipment_collection(): - validate_unordered_1234567890( + validate_unordered( UsagePoint, lambda mrid: Equipment(mrid), UsagePoint.equipment, @@ -106,7 +108,7 @@ def test_equipment_collection(): def test_end_devices_collection(): - validate_unordered_1234567890( + validate_unordered( UsagePoint, lambda mrid: EndDevice(mrid), UsagePoint.end_devices, diff --git a/test/cim/iec61968/operations/test_operational_restriction.py b/test/cim/iec61968/operations/test_operational_restriction.py index 23db310d7..cb79abcb6 100644 --- a/test/cim/iec61968/operations/test_operational_restriction.py +++ b/test/cim/iec61968/operations/test_operational_restriction.py @@ -5,22 +5,24 @@ from hypothesis import given from hypothesis.strategies import lists, builds -from zepben.ewb import OperationalRestriction, Equipment + +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, \ verify_document_constructor_args, document_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered operational_restriction_kwargs = { **document_kwargs, - "equipment": lists(builds(Equipment), max_size=2), + "equipment": lists(builds(Equipment, mrid=mrid_strategy), max_size=2), } -operational_restriction_args = [*document_args, [Equipment()]] +operational_restriction_args = [*document_args, [Equipment(mrid=generate_id())]] def test_operational_restriction_constructor_default(): - or_ = OperationalRestriction() + or_ = OperationalRestriction(mrid=generate_id()) verify_document_constructor_default(or_) assert not list(or_.equipment) @@ -47,7 +49,7 @@ def test_operational_restriction_constructor_args(): def test_equipment_collection(): - validate_unordered_1234567890( + validate_unordered( OperationalRestriction, lambda mrid: Equipment(mrid), OperationalRestriction.equipment, diff --git a/test/cim/iec61970/base/auxiliaryequipment/test_auxiliary_equipment.py b/test/cim/iec61970/base/auxiliaryequipment/test_auxiliary_equipment.py index f307f717b..f69f2a907 100644 --- a/test/cim/iec61970/base/auxiliaryequipment/test_auxiliary_equipment.py +++ b/test/cim/iec61970/base/auxiliaryequipment/test_auxiliary_equipment.py @@ -3,17 +3,19 @@ # 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 zepben.ewb import AuxiliaryEquipment, Terminal + +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, \ verify_equipment_constructor_kwargs, verify_equipment_constructor_args, equipment_args auxiliary_equipment_kwargs = { **equipment_kwargs, - "terminal": builds(Terminal) + "terminal": builds(Terminal, mrid=mrid_strategy) } -auxiliary_equipment_args = [*equipment_args, Terminal()] +auxiliary_equipment_args = [*equipment_args, Terminal(mrid=generate_id())] def verify_auxiliary_equipment_constructor_default(ae: AuxiliaryEquipment): diff --git a/test/cim/iec61970/base/auxiliaryequipment/test_current_transformer.py b/test/cim/iec61970/base/auxiliaryequipment/test_current_transformer.py index 4c7067624..0a7ba1b7f 100644 --- a/test/cim/iec61970/base/auxiliaryequipment/test_current_transformer.py +++ b/test/cim/iec61970/base/auxiliaryequipment/test_current_transformer.py @@ -5,7 +5,7 @@ from hypothesis import given from hypothesis.strategies import integers -from zepben.ewb import CurrentTransformer, CurrentTransformerInfo +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, \ @@ -20,7 +20,7 @@ def test_current_transformer_constructor_default(): - ct = CurrentTransformer() + ct = CurrentTransformer(mrid=generate_id()) verify_sensor_constructor_default(ct) assert ct.core_burden is None diff --git a/test/cim/iec61970/base/auxiliaryequipment/test_fault_indicator.py b/test/cim/iec61970/base/auxiliaryequipment/test_fault_indicator.py index 3957cb1fc..b8e1160f5 100644 --- a/test/cim/iec61970/base/auxiliaryequipment/test_fault_indicator.py +++ b/test/cim/iec61970/base/auxiliaryequipment/test_fault_indicator.py @@ -6,6 +6,7 @@ from cim.iec61970.base.auxiliaryequipment.test_auxiliary_equipment import auxiliary_equipment_kwargs, 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 @@ -13,7 +14,7 @@ def test_fault_indicator_constructor_default(): - verify_auxiliary_equipment_constructor_default(FaultIndicator()) + verify_auxiliary_equipment_constructor_default(FaultIndicator(mrid=generate_id())) @given(**fault_indicator_kwargs) diff --git a/test/cim/iec61970/base/auxiliaryequipment/test_potential_transformer.py b/test/cim/iec61970/base/auxiliaryequipment/test_potential_transformer.py index 4ebf2f250..9335382d2 100644 --- a/test/cim/iec61970/base/auxiliaryequipment/test_potential_transformer.py +++ b/test/cim/iec61970/base/auxiliaryequipment/test_potential_transformer.py @@ -5,7 +5,7 @@ from hypothesis import given from hypothesis.strategies import sampled_from -from zepben.ewb import PotentialTransformer, PotentialTransformerInfo, PotentialTransformerKind +from zepben.ewb import PotentialTransformer, PotentialTransformerInfo, PotentialTransformerKind, generate_id from cim.iec61970.base.auxiliaryequipment.test_sensor import sensor_kwargs, verify_sensor_constructor_default, \ verify_sensor_constructor_kwargs, verify_sensor_constructor_args, sensor_args @@ -19,7 +19,7 @@ def test_potential_transformer_constructor_default(): - vt = PotentialTransformer() + vt = PotentialTransformer(mrid=generate_id()) verify_sensor_constructor_default(vt) assert vt.type == PotentialTransformerKind.UNKNOWN diff --git a/test/cim/iec61970/base/auxiliaryequipment/test_sensor.py b/test/cim/iec61970/base/auxiliaryequipment/test_sensor.py index c6d68d578..84b6924e7 100644 --- a/test/cim/iec61970/base/auxiliaryequipment/test_sensor.py +++ b/test/cim/iec61970/base/auxiliaryequipment/test_sensor.py @@ -4,18 +4,20 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis.strategies import lists, builds -from zepben.ewb import Sensor, ProtectionRelayFunction + +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, \ verify_auxiliary_equipment_constructor_kwargs, verify_auxiliary_equipment_constructor_args, auxiliary_equipment_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered sensor_kwargs = { **auxiliary_equipment_kwargs, - "relay_functions": lists(builds(ProtectionRelayFunction), max_size=2) + "relay_functions": lists(builds(ProtectionRelayFunction, mrid=mrid_strategy), max_size=2) } -sensor_args = [*auxiliary_equipment_args, [ProtectionRelayFunction()]] +sensor_args = [*auxiliary_equipment_args, [ProtectionRelayFunction(mrid=generate_id())]] def verify_sensor_constructor_default(sn: Sensor): @@ -37,7 +39,7 @@ def verify_sensor_constructor_args(sn: Sensor): def test_relay_functions_collection(): - validate_unordered_1234567890( + validate_unordered( Sensor, lambda mrid: ProtectionRelayFunction(mrid), Sensor.relay_functions, diff --git a/test/cim/iec61970/base/core/test_base_voltage.py b/test/cim/iec61970/base/core/test_base_voltage.py index f8e312a60..71a374a08 100644 --- a/test/cim/iec61970/base/core/test_base_voltage.py +++ b/test/cim/iec61970/base/core/test_base_voltage.py @@ -4,7 +4,7 @@ # 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 +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, \ @@ -19,7 +19,7 @@ def test_base_voltage_constructor_default(): - bv = BaseVoltage() + bv = BaseVoltage(mrid=generate_id()) verify_identified_object_constructor_default(bv) assert bv.nominal_voltage == 0 diff --git a/test/cim/iec61970/base/core/test_conducting_equipment.py b/test/cim/iec61970/base/core/test_conducting_equipment.py index d3cfb90a9..f78011e69 100644 --- a/test/cim/iec61970/base/core/test_conducting_equipment.py +++ b/test/cim/iec61970/base/core/test_conducting_equipment.py @@ -6,19 +6,21 @@ import pytest from hypothesis.strategies import lists, builds -from zepben.ewb import ConductingEquipment, BaseVoltage, Terminal + +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, \ verify_equipment_constructor_kwargs, verify_equipment_constructor_args, equipment_args -from cim.private_collection_validator import validate_ordered_1234567890 +from cim.private_collection_validator import validate_ordered conducting_equipment_kwargs = { **equipment_kwargs, - "base_voltage": builds(BaseVoltage), - "terminals": lists(builds(Terminal), max_size=2) + "base_voltage": builds(BaseVoltage, mrid=mrid_strategy), + "terminals": lists(builds(Terminal, mrid=mrid_strategy), max_size=2) } -conducting_equipment_args = [*equipment_args, BaseVoltage(), [Terminal(), Terminal()]] +conducting_equipment_args = [*equipment_args, BaseVoltage(mrid=generate_id()), [Terminal(mrid=generate_id()), Terminal(mrid=generate_id())]] def verify_conducting_equipment_constructor_default(ce: ConductingEquipment): @@ -42,7 +44,7 @@ def verify_conducting_equipment_constructor_args(ce: ConductingEquipment): def test_terminals_collection(): - validate_ordered_1234567890( + validate_ordered( ConductingEquipment, lambda mrid, sn: Terminal(mrid, sequence_number=sn), ConductingEquipment.terminals, @@ -56,20 +58,20 @@ def test_terminals_collection(): ) def test_default_max_terminals_is_sys_maxsize(): - assert ConductingEquipment().max_terminals == 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() - ce.add_terminal(Terminal()) + ce = SingleTerminalCE(mrid=generate_id()) + ce.add_terminal(Terminal(mrid=generate_id())) with pytest.raises(ValueError): - ce.add_terminal(Terminal()) + ce.add_terminal(Terminal(mrid=generate_id())) def test_adding_terminal_twice_wont_cause_max_terminals_to_raise_exception(): - ce = SingleTerminalCE() - t = Terminal() + ce = SingleTerminalCE(mrid=generate_id()) + t = Terminal(mrid=generate_id()) ce.add_terminal(t) ce.add_terminal(t) diff --git a/test/cim/iec61970/base/core/test_connectivity_node.py b/test/cim/iec61970/base/core/test_connectivity_node.py index 0d8177c28..4abac7087 100644 --- a/test/cim/iec61970/base/core/test_connectivity_node.py +++ b/test/cim/iec61970/base/core/test_connectivity_node.py @@ -4,22 +4,24 @@ # 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 ConnectivityNode, Terminal + +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, \ verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered connectivity_node_kwargs = { **identified_object_kwargs, - "terminals": lists(builds(Terminal), max_size=2) + "terminals": lists(builds(Terminal, mrid=mrid_strategy), max_size=2) } -connectivity_node_args = [*identified_object_args, [Terminal()]] +connectivity_node_args = [*identified_object_args, [Terminal(mrid=generate_id())]] def test_connectivity_node_constructor_default(): - cn = ConnectivityNode() + cn = ConnectivityNode(mrid=generate_id()) verify_identified_object_constructor_default(cn) assert not list(cn.terminals) @@ -43,7 +45,7 @@ def test_connectivity_node_constructor_args(): def test_terminals_collection(): - validate_unordered_1234567890( + validate_unordered( ConnectivityNode, lambda mrid: Terminal(mrid), ConnectivityNode.terminals, diff --git a/test/cim/iec61970/base/core/test_curve.py b/test/cim/iec61970/base/core/test_curve.py index b31256a2b..0acd0f854 100644 --- a/test/cim/iec61970/base/core/test_curve.py +++ b/test/cim/iec61970/base/core/test_curve.py @@ -5,11 +5,11 @@ from typing import Callable from pytest import raises -from zepben.ewb import Curve, CurveData +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, \ verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args -from cim.private_collection_validator import validate_unordered_other_1234567890 +from cim.private_collection_validator import validate_unordered_other # todo curve data? curve_kwargs = identified_object_kwargs @@ -29,7 +29,7 @@ def verify_curve_constructor_args(curve: Curve): def test_curve_data_collection(): - validate_unordered_other_1234567890( + validate_unordered_other( Curve, lambda it: CurveData(it + 0.1, it + 0.2, it + 0.3, it + 0.4), Curve.data, @@ -43,7 +43,7 @@ def test_curve_data_collection(): def test_add_curve_data_by_passing_in_the_values_and_data_is_sorted_by_x_value_in_ascending_order_when_retrieved(): - curve = Curve() + curve = Curve(mrid=generate_id()) curve.add_data(4, 3, 2, 1) curve.add_data(2, 1, 2, 3) @@ -54,7 +54,7 @@ def test_add_curve_data_by_passing_in_the_values_and_data_is_sorted_by_x_value_i def test_cant_add_duplicate_curve_data(): - curve = Curve() + curve = Curve(mrid=generate_id()) curve.add_data(1, 1, 2, 3) _validate_duplicate_error(curve, 1, lambda it: it.add_data(1, 1.1, 2.1, 3.1)) diff --git a/test/cim/iec61970/base/core/test_equipment.py b/test/cim/iec61970/base/core/test_equipment.py index 0a52795d1..9ac1966c6 100644 --- a/test/cim/iec61970/base/core/test_equipment.py +++ b/test/cim/iec61970/base/core/test_equipment.py @@ -5,29 +5,37 @@ import datetime from hypothesis.strategies import booleans, lists, builds, datetimes -from zepben.ewb import Equipment, OperationalRestriction, EquipmentContainer -from zepben.ewb.model.cim.iec61968.metering.usage_point import UsagePoint -from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder 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, \ verify_power_system_resource_constructor_kwargs, verify_power_system_resource_constructor_args, power_system_resource_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered +from util import mrid_strategy +from zepben.ewb import Equipment, OperationalRestriction, EquipmentContainer, generate_id +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), max_size=2), + "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), 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, False, datetime.datetime(2023, 1, 2), [UsagePoint(), UsagePoint()], - [EquipmentContainer(), EquipmentContainer()], - [OperationalRestriction(), OperationalRestriction()], [Feeder(), Feeder()]] +equipment_args = [ + *power_system_resource_args, + False, + False, + datetime.datetime(2023, 1, 2), + [UsagePoint(mrid=generate_id()), UsagePoint(mrid=generate_id())], + [EquipmentContainer(mrid=generate_id()), EquipmentContainer(mrid=generate_id())], + [OperationalRestriction(mrid=generate_id()), OperationalRestriction(mrid=generate_id())], + [Feeder(mrid=generate_id()), Feeder(mrid=generate_id())] +] def verify_equipment_constructor_default(eq: Equipment): @@ -68,7 +76,7 @@ def verify_equipment_constructor_args(eq: Equipment): def test_usage_points_collection(): - validate_unordered_1234567890( + validate_unordered( Equipment, lambda mrid: UsagePoint(mrid), Equipment.usage_points, @@ -81,7 +89,7 @@ def test_usage_points_collection(): def test_equipment_containers_collection(): - validate_unordered_1234567890( + validate_unordered( Equipment, lambda mrid: EquipmentContainer(mrid), Equipment.containers, @@ -94,7 +102,7 @@ def test_equipment_containers_collection(): def test_operational_restrictions_collection(): - validate_unordered_1234567890( + validate_unordered( Equipment, lambda mrid: OperationalRestriction(mrid), Equipment.operational_restrictions, @@ -107,7 +115,7 @@ def test_operational_restrictions_collection(): def test_current_containers_collection(): - validate_unordered_1234567890( + validate_unordered( Equipment, lambda mrid: EquipmentContainer(mrid), Equipment.current_containers, diff --git a/test/cim/iec61970/base/core/test_equipment_container.py b/test/cim/iec61970/base/core/test_equipment_container.py index bfc4b8d0d..5ae32881b 100644 --- a/test/cim/iec61970/base/core/test_equipment_container.py +++ b/test/cim/iec61970/base/core/test_equipment_container.py @@ -7,16 +7,17 @@ from cim.iec61970.base.core.test_connectivity_node_container import connectivity_node_container_kwargs, \ 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_1234567890 -from zepben.ewb import EquipmentContainer, Equipment, LvFeeder, Substation +from cim.private_collection_validator import validate_unordered +from util import mrid_strategy +from zepben.ewb import EquipmentContainer, Equipment, LvFeeder, Substation, generate_id from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder equipment_container_kwargs = { **connectivity_node_container_kwargs, - "equipment": lists(builds(Equipment), max_size=2) + "equipment": lists(builds(Equipment, mrid=mrid_strategy), max_size=2) } -equipment_container_args = [*connectivity_node_container_args, {"e": Equipment()}] +equipment_container_args = [*connectivity_node_container_args, {"e": Equipment(mrid=generate_id())}] def verify_equipment_container_constructor_default(ec: EquipmentContainer): @@ -37,7 +38,7 @@ def verify_equipment_container_constructor_args(ec: EquipmentContainer): def test_equipment_collection(): - validate_unordered_1234567890( + validate_unordered( EquipmentContainer, lambda mrid: Equipment(mrid), EquipmentContainer.equipment, @@ -50,7 +51,7 @@ def test_equipment_collection(): def test_current_equipment_mirrors_normal_equipment(): - ec = EquipmentContainer() + ec = EquipmentContainer(mrid=generate_id()) eq1 = Equipment(mrid="eq1") eq2 = Equipment(mrid="eq2") @@ -62,56 +63,56 @@ def test_current_equipment_mirrors_normal_equipment(): def test_normal_feeders(): - fdr1, fdr2, fdr3 = Feeder(), Feeder(), Feeder() - substation = Substation() - lv_fdr = LvFeeder() + fdr1, fdr2, fdr3 = Feeder(mrid=generate_id()), Feeder(mrid=generate_id()), Feeder(mrid=generate_id()) + substation = Substation(mrid=generate_id()) + lv_fdr = LvFeeder(mrid=generate_id()) - eq1 = Equipment().add_container(fdr1).add_container(fdr2).add_container(substation) - eq2 = Equipment().add_container(fdr2).add_container(fdr3).add_container(lv_fdr) + eq1 = Equipment(mrid=generate_id()).add_container(fdr1).add_container(fdr2).add_container(substation) + eq2 = Equipment(mrid=generate_id()).add_container(fdr2).add_container(fdr3).add_container(lv_fdr) - equipment_container = EquipmentContainer().add_equipment(eq1).add_equipment(eq2) + equipment_container = EquipmentContainer(mrid=generate_id()).add_equipment(eq1).add_equipment(eq2) assert set(equipment_container.normal_feeders()) == {fdr1, fdr2, fdr3} assert set(equipment_container.current_feeders()) == set() def test_current_feeders(): - fdr1, fdr2, fdr3 = Feeder(), Feeder(), Feeder() - substation = Substation() - lv_fdr = LvFeeder() + fdr1, fdr2, fdr3 = Feeder(mrid=generate_id()), Feeder(mrid=generate_id()), Feeder(mrid=generate_id()) + substation = Substation(mrid=generate_id()) + lv_fdr = LvFeeder(mrid=generate_id()) - eq1 = Equipment().add_current_container(fdr1).add_current_container(fdr2).add_current_container(substation) - eq2 = Equipment().add_current_container(fdr2).add_current_container(fdr3).add_current_container(lv_fdr) + eq1 = Equipment(mrid=generate_id()).add_current_container(fdr1).add_current_container(fdr2).add_current_container(substation) + eq2 = Equipment(mrid=generate_id()).add_current_container(fdr2).add_current_container(fdr3).add_current_container(lv_fdr) - equipment_container = EquipmentContainer().add_equipment(eq1).add_equipment(eq2) + equipment_container = EquipmentContainer(mrid=generate_id()).add_equipment(eq1).add_equipment(eq2) assert set(equipment_container.normal_feeders()) == set() assert set(equipment_container.current_feeders()) == {fdr1, fdr2, fdr3} def test_normal_lv_feeders(): - lv_fdr1, lv_fdr2, lv_fdr3 = LvFeeder(), LvFeeder(), LvFeeder() - substation = Substation() - fdr = Feeder() + lv_fdr1, lv_fdr2, lv_fdr3 = LvFeeder(mrid=generate_id()), LvFeeder(mrid=generate_id()), LvFeeder(mrid=generate_id()) + substation = Substation(mrid=generate_id()) + fdr = Feeder(mrid=generate_id()) - eq1 = Equipment().add_container(lv_fdr1).add_container(lv_fdr2).add_container(substation) - eq2 = Equipment().add_container(lv_fdr2).add_container(lv_fdr3).add_container(fdr) + eq1 = Equipment(mrid=generate_id()).add_container(lv_fdr1).add_container(lv_fdr2).add_container(substation) + eq2 = Equipment(mrid=generate_id()).add_container(lv_fdr2).add_container(lv_fdr3).add_container(fdr) - equipment_container = EquipmentContainer().add_equipment(eq1).add_equipment(eq2) + equipment_container = EquipmentContainer(mrid=generate_id()).add_equipment(eq1).add_equipment(eq2) assert set(equipment_container.normal_lv_feeders()) == {lv_fdr1, lv_fdr2, lv_fdr3} assert set(equipment_container.current_lv_feeders()) == set() def test_current_lv_feeders(): - lv_fdr1, lv_fdr2, lv_fdr3 = LvFeeder(), LvFeeder(), LvFeeder() - substation = Substation() - fdr = Feeder() + lv_fdr1, lv_fdr2, lv_fdr3 = LvFeeder(mrid=generate_id()), LvFeeder(mrid=generate_id()), LvFeeder(mrid=generate_id()) + substation = Substation(mrid=generate_id()) + fdr = Feeder(mrid=generate_id()) - eq1 = Equipment().add_current_container(lv_fdr1).add_current_container(lv_fdr2).add_current_container(substation) - eq2 = Equipment().add_current_container(lv_fdr2).add_current_container(lv_fdr3).add_current_container(fdr) + eq1 = Equipment(mrid=generate_id()).add_current_container(lv_fdr1).add_current_container(lv_fdr2).add_current_container(substation) + eq2 = Equipment(mrid=generate_id()).add_current_container(lv_fdr2).add_current_container(lv_fdr3).add_current_container(fdr) - equipment_container = EquipmentContainer().add_equipment(eq1).add_equipment(eq2) + equipment_container = EquipmentContainer(mrid=generate_id()).add_equipment(eq1).add_equipment(eq2) assert set(equipment_container.normal_lv_feeders()) == set() assert set(equipment_container.current_lv_feeders()) == {lv_fdr1, lv_fdr2, lv_fdr3} diff --git a/test/cim/iec61970/base/core/test_feeder.py b/test/cim/iec61970/base/core/test_feeder.py index 26c219859..8a2d101da 100644 --- a/test/cim/iec61970/base/core/test_feeder.py +++ b/test/cim/iec61970/base/core/test_feeder.py @@ -5,27 +5,35 @@ from hypothesis import given from hypothesis.strategies import builds, lists from pytest import raises -from zepben.ewb import Terminal, Substation, Equipment, LvFeeder, Switch -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_1234567890 +from cim.private_collection_validator import validate_unordered +from util import mrid_strategy +from zepben.ewb import Terminal, Substation, Equipment, LvFeeder, Switch, generate_id +from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder feeder_kwargs = { **equipment_container_kwargs, - "normal_head_terminal": builds(Terminal), - "normal_energizing_substation": builds(Substation), - "normal_energized_lv_feeders": lists(builds(LvFeeder), max_size=2), - "current_equipment": lists(builds(Equipment), max_size=2), - "current_energized_lv_feeders": lists(builds(LvFeeder), max_size=2) + "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(), Substation(), {"lvf": LvFeeder()}, {"ce": Equipment()}, {"celvf": Equipment()}] +feeder_args = [ + *equipment_container_args, + Terminal(mrid=generate_id()), + Substation(mrid=generate_id()), + {"lvf": LvFeeder(mrid=generate_id())}, + {"ce": Equipment(mrid=generate_id())}, + {"celvf": Equipment(mrid=generate_id())} +] def test_feeder_constructor_default(): - f = Feeder() + f = Feeder(mrid=generate_id()) verify_equipment_container_constructor_default(f) assert not f.normal_head_terminal @@ -36,7 +44,8 @@ def test_feeder_constructor_default(): @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): +def test_feeder_constructor_kwargs(normal_head_terminal, normal_energizing_substation, normal_energized_lv_feeders, current_equipment, + current_energized_lv_feeders, **kwargs): f = Feeder(normal_head_terminal=normal_head_terminal, normal_energizing_substation=normal_energizing_substation, normal_energized_lv_feeders=normal_energized_lv_feeders, @@ -69,7 +78,7 @@ def test_feeder_constructor_args(): def test_current_equipment_collection(): - validate_unordered_1234567890( + validate_unordered( Feeder, lambda mrid: Equipment(mrid), Feeder.current_equipment, @@ -82,7 +91,7 @@ def test_current_equipment_collection(): def test_normal_energized_lv_feeder_collection(): - validate_unordered_1234567890( + validate_unordered( Feeder, lambda mrid: LvFeeder(mrid), Feeder.normal_energized_lv_feeders, @@ -95,7 +104,7 @@ def test_normal_energized_lv_feeder_collection(): def test_current_energized_lv_feeder_collection(): - validate_unordered_1234567890( + validate_unordered( Feeder, lambda mrid: LvFeeder(mrid), Feeder.current_energized_lv_feeders, @@ -108,9 +117,9 @@ def test_current_energized_lv_feeder_collection(): def test_can_update_normal_head_terminal_on_empty_feeder(): - empty_feeder = Feeder() - terminal1 = Terminal() - terminal2 = Terminal() + empty_feeder = Feeder(mrid=generate_id()) + terminal1 = Terminal(mrid=generate_id()) + terminal2 = Terminal(mrid=generate_id()) empty_feeder.normal_head_terminal = terminal1 assert empty_feeder.normal_head_terminal == terminal1 @@ -121,7 +130,7 @@ def test_can_update_normal_head_terminal_on_empty_feeder(): empty_feeder.normal_head_terminal = None assert empty_feeder.normal_head_terminal is None - equipment = Switch() + equipment = Switch(mrid=generate_id()) empty_feeder.add_equipment(equipment).add_current_equipment(equipment) empty_feeder.clear_equipment().clear_current_equipment() @@ -131,10 +140,10 @@ def test_can_update_normal_head_terminal_on_empty_feeder(): def test_block_normal_head_terminal_update_when_equipment_assigned(): feeder = Feeder(mrid="fdr") - terminal1 = Terminal() - terminal2 = Terminal() + terminal1 = Terminal(mrid=generate_id()) + terminal2 = Terminal(mrid=generate_id()) - equipment = Switch() + equipment = Switch(mrid=generate_id()) feeder.add_equipment(equipment) @@ -153,10 +162,10 @@ def test_block_normal_head_terminal_update_when_equipment_assigned(): def test_block_normal_head_terminal_update_when_current_equipment_assigned(): feeder = Feeder(mrid="fdr") - terminal1 = Terminal() - terminal2 = Terminal() + terminal1 = Terminal(mrid=generate_id()) + terminal2 = Terminal(mrid=generate_id()) - equipment = Switch() + equipment = Switch(mrid=generate_id()) feeder.add_current_equipment(equipment) diff --git a/test/cim/iec61970/base/core/test_geographical_region.py b/test/cim/iec61970/base/core/test_geographical_region.py index 26b249999..7d72b69c3 100644 --- a/test/cim/iec61970/base/core/test_geographical_region.py +++ b/test/cim/iec61970/base/core/test_geographical_region.py @@ -4,23 +4,26 @@ # 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, \ verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered geographical_region_kwargs = { **identified_object_kwargs, - "sub_geographical_regions": lists(builds(SubGeographicalRegion), max_size=2) + "sub_geographical_regions": lists(builds(SubGeographicalRegion, mrid=mrid_strategy), max_size=2) } -geographical_region_args = [*identified_object_args, [SubGeographicalRegion()]] +geographical_region_args = [*identified_object_args, [SubGeographicalRegion(mrid=generate_id())]] def test_geographical_region_constructor_default(): - gr = GeographicalRegion() + gr = GeographicalRegion(mrid=generate_id()) verify_identified_object_constructor_default(gr) assert not list(gr.sub_geographical_regions) @@ -44,7 +47,7 @@ def test_geographical_region_constructor_args(): def test_sub_geographical_regions_collection(): - validate_unordered_1234567890( + validate_unordered( GeographicalRegion, lambda mrid: SubGeographicalRegion(mrid), GeographicalRegion.sub_geographical_regions, diff --git a/test/cim/iec61970/base/core/test_identified_object.py b/test/cim/iec61970/base/core/test_identified_object.py index 7dabe5443..76ce1fe8b 100644 --- a/test/cim/iec61970/base/core/test_identified_object.py +++ b/test/cim/iec61970/base/core/test_identified_object.py @@ -7,7 +7,7 @@ import pytest from hypothesis.strategies import uuids, text, lists, builds -from zepben.ewb import IdentifiedObject +from zepben.ewb import IdentifiedObject, generate_id from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction # # NOTE: The following should be called in a chain through the inheritance hierarchy: @@ -31,7 +31,7 @@ } # noinspection PyArgumentList -identified_object_args = ["test_mrid", "test_name", "test_description", [Name("1", NameType("nt1"), Junction())]] +identified_object_args = ["test_mrid", "test_name", "test_description", [Name("1", NameType("nt1"), Junction(mrid=generate_id()))]] def verify_identified_object_constructor_default(io: IdentifiedObject): @@ -64,7 +64,7 @@ def verify_identified_object_constructor_args(io: IdentifiedObject): def test_user_can_add_names_to_identified_object(): - identified_object = IdentifiedObject() + identified_object = IdentifiedObject(mrid=generate_id()) # noinspection PyArgumentList name_type = NameType("type") assert identified_object.num_names() == 0 @@ -163,7 +163,7 @@ def test_clear_names_removes_all_names_from_the_identified_object_and_the_name_t def test_user_can_add_the_same_name_back_after_it_has_been_removed(): - identified_object = IdentifiedObject() + identified_object = IdentifiedObject(mrid=generate_id()) # noinspection PyArgumentList name_type = NameType("type") @@ -177,7 +177,7 @@ def test_user_can_add_the_same_name_back_after_it_has_been_removed(): def test_removing_name_from_empty_name_list_does_not_cause_any_issue(): - identified_object = IdentifiedObject() + identified_object = IdentifiedObject(mrid=generate_id()) # noinspection PyArgumentList name_type = NameType("type") @@ -195,7 +195,7 @@ def test_removing_name_from_empty_name_list_does_not_cause_any_issue(): def _create_multiple_base_names() -> Tuple[IdentifiedObject, NameType]: - identified_object = IdentifiedObject() + identified_object = IdentifiedObject(mrid=generate_id()) # noinspection PyArgumentList name_type = NameType("type") diff --git a/test/cim/iec61970/base/core/test_name.py b/test/cim/iec61970/base/core/test_name.py index def4270de..d76f4cc59 100644 --- a/test/cim/iec61970/base/core/test_name.py +++ b/test/cim/iec61970/base/core/test_name.py @@ -5,6 +5,8 @@ from hypothesis import given from hypothesis.strategies import text, builds + +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 @@ -19,7 +21,7 @@ } # noinspection PyArgumentList -name_args = ["1", NameType("nt1"), Junction()] +name_args = ["1", NameType("nt1"), Junction(mrid=generate_id())] # diff --git a/test/cim/iec61970/base/core/test_name_type.py b/test/cim/iec61970/base/core/test_name_type.py index c464e110f..9d7c0ef53 100644 --- a/test/cim/iec61970/base/core/test_name_type.py +++ b/test/cim/iec61970/base/core/test_name_type.py @@ -6,6 +6,8 @@ from hypothesis import given from hypothesis.strategies import text + +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 @@ -61,8 +63,8 @@ def test_get_or_add_names(): # noinspection PyArgumentList nt = NameType("nt") - j1 = Junction() - j2 = Junction() + j1 = Junction(mrid=generate_id()) + j2 = Junction(mrid=generate_id()) n1 = nt.get_or_add_name("n", j1) n2 = nt.get_or_add_name("n", j2) @@ -79,8 +81,8 @@ def test_names(): # noinspection PyArgumentList nt = NameType("nt") - j1 = Junction() - j2 = Junction() + j1 = Junction(mrid=generate_id()) + j2 = Junction(mrid=generate_id()) n1a = nt.get_or_add_name("n1", j1) n1b = nt.get_or_add_name("n1", j2) @@ -93,8 +95,8 @@ def test_get_names(): # noinspection PyArgumentList nt = NameType("nt") - j1 = Junction() - j2 = Junction() + j1 = Junction(mrid=generate_id()) + j2 = Junction(mrid=generate_id()) n1a = nt.get_or_add_name("n1", j1) n1b = nt.get_or_add_name("n1", j2) @@ -110,8 +112,8 @@ def test_removes_names(): # noinspection PyArgumentList nt = NameType("nt") - j1 = Junction() - j2 = Junction() + j1 = Junction(mrid=generate_id()) + j2 = Junction(mrid=generate_id()) n1a = nt.get_or_add_name("n1", j1) n1b = nt.get_or_add_name("n1", j2) @@ -130,8 +132,8 @@ def test_remove_name(): # noinspection PyArgumentList nt = NameType("nt") - j1 = Junction() - j2 = Junction() + j1 = Junction(mrid=generate_id()) + j2 = Junction(mrid=generate_id()) n1a = nt.get_or_add_name("n1", j1) n1b = nt.get_or_add_name("n1", j2) @@ -153,7 +155,7 @@ def test_clear_names(): # noinspection PyArgumentList nt = NameType("nt") - j1 = Junction() + j1 = Junction(mrid=generate_id()) n1 = nt.get_or_add_name("n1", j1) n2 = nt.get_or_add_name("n2", j1) 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 3e0a23f1e..f801e877f 100644 --- a/test/cim/iec61970/base/core/test_power_system_resource.py +++ b/test/cim/iec61970/base/core/test_power_system_resource.py @@ -4,22 +4,28 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis.strategies import builds, integers, lists -from cim.private_collection_validator import validate_unordered_1234567890 -from zepben.ewb import PowerSystemResource, Location, PowerTransformerInfo, Asset - 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, \ 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), + "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), max_size=2) + "assets": lists(builds(Asset, mrid=mrid_strategy), max_size=2) } -power_system_resource_args = [*identified_object_args, Location(), PowerTransformerInfo(), 1, [Asset()]] +power_system_resource_args = [ + *identified_object_args, + Location(mrid=generate_id()), + PowerTransformerInfo(mrid=generate_id()), + 1, + [Asset(mrid=generate_id())] +] def verify_power_system_resource_constructor_default(psr: PowerSystemResource): @@ -49,7 +55,7 @@ def verify_power_system_resource_constructor_args(psr: PowerSystemResource): def test_assets_collection(): - validate_unordered_1234567890( + validate_unordered( PowerSystemResource, lambda mrid: Asset(mrid), PowerSystemResource.assets, diff --git a/test/cim/iec61970/base/core/test_site.py b/test/cim/iec61970/base/core/test_site.py index 215f8d734..a0da510ed 100644 --- a/test/cim/iec61970/base/core/test_site.py +++ b/test/cim/iec61970/base/core/test_site.py @@ -7,14 +7,14 @@ 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 zepben.ewb import Site, TestNetworkBuilder, Equipment, AssignToLvFeeders, LvFeeder, NetworkStateOperators +from zepben.ewb import Site, TestNetworkBuilder, Equipment, AssignToLvFeeders, LvFeeder, NetworkStateOperators, generate_id site_kwargs = equipment_container_kwargs site_args = equipment_container_args def test_site_constructor_default(): - verify_equipment_container_constructor_default(Site()) + verify_equipment_container_constructor_default(Site(mrid=generate_id())) @given(**site_kwargs) @@ -31,7 +31,7 @@ async def test_find_lv_feeders_excludes_open_switches(): # tx0 21 b1(lvf5) 21--c2--2 # 21 b3(lvf6) 21--c4--2 # - site = Site() + site = Site(mrid=generate_id()) network = (TestNetworkBuilder() .from_power_transformer(action=lambda pt: _add_to_site(pt, site)) # tx0 .from_breaker(is_normally_open=True, is_open=True, action=lambda b: _add_to_site(b, site)) # b1 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 da292650e..5eb616938 100644 --- a/test/cim/iec61970/base/core/test_sub_geographical_region.py +++ b/test/cim/iec61970/base/core/test_sub_geographical_region.py @@ -4,25 +4,27 @@ # 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 Substation + +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, \ verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered sub_geographical_region_kwargs = { **identified_object_kwargs, - "geographical_region": builds(GeographicalRegion), - "substations": lists(builds(Substation), max_size=2) + "geographical_region": builds(GeographicalRegion, mrid=mrid_strategy), + "substations": lists(builds(Substation, mrid=mrid_strategy), max_size=2) } -sub_geographical_region_args = [*identified_object_args, GeographicalRegion(), [Substation()]] +sub_geographical_region_args = [*identified_object_args, GeographicalRegion(mrid=generate_id()), [Substation(mrid=generate_id())]] def test_sub_geographical_region_constructor_default(): - sgr = SubGeographicalRegion() + sgr = SubGeographicalRegion(mrid=generate_id()) verify_identified_object_constructor_default(sgr) assert not list(sgr.substations) @@ -50,7 +52,7 @@ def test_sub_geographical_region_constructor_args(): def test_substations_collection(): - validate_unordered_1234567890( + validate_unordered( SubGeographicalRegion, lambda mrid: Substation(mrid), SubGeographicalRegion.substations, diff --git a/test/cim/iec61970/base/core/test_substation.py b/test/cim/iec61970/base/core/test_substation.py index 35b33d387..b9cba8300 100644 --- a/test/cim/iec61970/base/core/test_substation.py +++ b/test/cim/iec61970/base/core/test_substation.py @@ -4,27 +4,35 @@ # 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 Substation, Feeder, Loop, Circuit -from zepben.ewb.model.cim.iec61970.base.core.sub_geographical_region import SubGeographicalRegion 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_1234567890 +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), - "normal_energized_feeders": lists(builds(Feeder), max_size=2), - "loops": lists(builds(Loop), max_size=2), - "energized_loops": lists(builds(Loop), max_size=2), - "circuits": lists(builds(Circuit), max_size=2) + "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, Substation(), [Feeder()], [Loop()], [Loop()], [Circuit()]] +substation_args = [ + *equipment_container_args, + Substation(mrid=generate_id()), + [Feeder(mrid=generate_id())], + [Loop(mrid=generate_id())], + [Loop(mrid=generate_id())], + [Circuit(mrid=generate_id())] +] def test_substation_constructor_default(): - cn = Substation() + cn = Substation(mrid=generate_id()) verify_equipment_container_constructor_default(cn) assert not cn.sub_geographical_region @@ -65,7 +73,7 @@ def test_substation_constructor_args(): def test_normal_energized_feeders_collection(): - validate_unordered_1234567890( + validate_unordered( Substation, lambda mrid: Feeder(mrid), Substation.feeders, @@ -78,7 +86,7 @@ def test_normal_energized_feeders_collection(): def test_loops_collection(): - validate_unordered_1234567890( + validate_unordered( Substation, lambda mrid: Loop(mrid), Substation.loops, @@ -91,7 +99,7 @@ def test_loops_collection(): def test_energized_loops_collection(): - validate_unordered_1234567890( + validate_unordered( Substation, lambda mrid: Loop(mrid), Substation.energized_loops, @@ -104,7 +112,7 @@ def test_energized_loops_collection(): def test_circuits_collection(): - validate_unordered_1234567890( + validate_unordered( Substation, lambda mrid: Circuit(mrid), Substation.circuits, diff --git a/test/cim/iec61970/base/core/test_terminal.py b/test/cim/iec61970/base/core/test_terminal.py index 22ec2bd4b..b49cd387e 100644 --- a/test/cim/iec61970/base/core/test_terminal.py +++ b/test/cim/iec61970/base/core/test_terminal.py @@ -4,31 +4,40 @@ # 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 zepben.ewb import Terminal, ConnectivityNode, TracedPhases, ConductingEquipment, PhaseCode -from zepben.ewb.services.network.tracing.feeder.feeder_direction import FeederDirection 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, \ 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, TracedPhases, ConductingEquipment, PhaseCode, generate_id +from zepben.ewb.services.network.tracing.feeder.feeder_direction import FeederDirection terminal_kwargs = { **ac_dc_terminal_kwargs, - "conducting_equipment": builds(ConductingEquipment), + "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), "traced_phases": builds(TracedPhases, phase_status=integers(min_value=0, max_value=15)), - "connectivity_node": builds(ConnectivityNode) + "connectivity_node": builds(ConnectivityNode, mrid=mrid_strategy) } # noinspection PyArgumentList -terminal_args = [*ac_dc_terminal_args, ConductingEquipment(), PhaseCode.XYN, TracedPhases(1), 1, FeederDirection.UPSTREAM, FeederDirection.DOWNSTREAM, - ConnectivityNode()] +terminal_args = [ + *ac_dc_terminal_args, + ConductingEquipment(mrid=generate_id()), + PhaseCode.XYN, + TracedPhases(1), + 1, + FeederDirection.UPSTREAM, + FeederDirection.DOWNSTREAM, + ConnectivityNode(mrid=generate_id()) +] def test_terminal_constructor_default(): - t = Terminal() + t = Terminal(mrid=generate_id()) verify_ac_dc_terminal_constructor_default(t) assert not t.conducting_equipment diff --git a/test/cim/iec61970/base/diagramlayout/test_diagram.py b/test/cim/iec61970/base/diagramlayout/test_diagram.py index 5fd9a8cd3..6d87e87f5 100644 --- a/test/cim/iec61970/base/diagramlayout/test_diagram.py +++ b/test/cim/iec61970/base/diagramlayout/test_diagram.py @@ -4,27 +4,28 @@ # 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 zepben.ewb import DiagramStyle, OrientationKind -from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram import Diagram -from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object import DiagramObject 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_1234567890 +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)) + "diagram_objects": lists(builds(DiagramObject, mrid=mrid_strategy)) } # noinspection PyArgumentList -diagram_args = [*identified_object_args, DiagramStyle.GEOGRAPHIC, OrientationKind.NEGATIVE, {"do": DiagramObject()}] +diagram_args = [*identified_object_args, DiagramStyle.GEOGRAPHIC, OrientationKind.NEGATIVE, {"do": DiagramObject(mrid=generate_id())}] def test_diagram_constructor_default(): - d = Diagram() + d = Diagram(mrid=generate_id()) verify_identified_object_constructor_default(d) assert d.diagram_style == DiagramStyle.SCHEMATIC @@ -58,7 +59,7 @@ def test_diagram_constructor_args(): def test_diagram_objects_collection(): - validate_unordered_1234567890( + validate_unordered( Diagram, lambda mrid: DiagramObject(mrid), Diagram.diagram_objects, diff --git a/test/cim/iec61970/base/diagramlayout/test_diagram_object.py b/test/cim/iec61970/base/diagramlayout/test_diagram_object.py index 7f9f3c48d..ec7c81a62 100644 --- a/test/cim/iec61970/base/diagramlayout/test_diagram_object.py +++ b/test/cim/iec61970/base/diagramlayout/test_diagram_object.py @@ -4,18 +4,20 @@ # 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 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 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, \ verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args, identified_object_args -from cim.private_collection_validator import validate_ordered_other_1234567890 +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), + "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), @@ -23,11 +25,11 @@ } # noinspection PyArgumentList -diagram_object_args = [*identified_object_args, Diagram(), "a", "CB", 1.1, [DiagramObjectPoint(1.1, 2.2)]] +diagram_object_args = [*identified_object_args, Diagram(mrid=generate_id()), "a", "CB", 1.1, [DiagramObjectPoint(1.1, 2.2)]] def test_diagram_object_constructor_default(): - do = DiagramObject() + do = DiagramObject(mrid=generate_id()) verify_identified_object_constructor_default(do) assert not do.diagram @@ -69,7 +71,7 @@ def test_diagram_object_constructor_args(): def test_points_collection(): # noinspection PyArgumentList - validate_ordered_other_1234567890( + validate_ordered_other( DiagramObject, lambda i: DiagramObjectPoint(i, i), DiagramObject.points, diff --git a/test/cim/iec61970/base/equivalents/test_equivalent_branch.py b/test/cim/iec61970/base/equivalents/test_equivalent_branch.py index ac6ece2ea..371dc0135 100644 --- a/test/cim/iec61970/base/equivalents/test_equivalent_branch.py +++ b/test/cim/iec61970/base/equivalents/test_equivalent_branch.py @@ -4,7 +4,7 @@ # 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 +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, \ @@ -34,7 +34,7 @@ def test_equivalent_branch_constructor_default(): - t = EquivalentBranch() + t = EquivalentBranch(mrid=generate_id()) verify_equivalent_equipment_constructor_default(t) assert not t.negative_r12 diff --git a/test/cim/iec61970/base/meas/test_accumulator.py b/test/cim/iec61970/base/meas/test_accumulator.py index 093b59ac2..7e8dc0631 100644 --- a/test/cim/iec61970/base/meas/test_accumulator.py +++ b/test/cim/iec61970/base/meas/test_accumulator.py @@ -6,6 +6,7 @@ from cim.iec61970.base.meas.test_measurement import measurement_kwargs, 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 @@ -13,7 +14,7 @@ def test_accumulator_constructor_default(): - verify_measurement_constructor_default(Accumulator()) + verify_measurement_constructor_default(Accumulator(mrid=generate_id())) @given(**accumulator_kwargs) diff --git a/test/cim/iec61970/base/meas/test_analog.py b/test/cim/iec61970/base/meas/test_analog.py index 54f0bef28..b45620ac4 100644 --- a/test/cim/iec61970/base/meas/test_analog.py +++ b/test/cim/iec61970/base/meas/test_analog.py @@ -6,6 +6,7 @@ from cim.iec61970.base.meas.test_measurement import measurement_kwargs, 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 @@ -13,7 +14,7 @@ def test_analog_constructor_default(): - analog = Analog() + analog = Analog(mrid=generate_id()) verify_measurement_constructor_default(analog) assert analog.positive_flow_in is None diff --git a/test/cim/iec61970/base/meas/test_control.py b/test/cim/iec61970/base/meas/test_control.py index 2b8fc7f63..b21276994 100644 --- a/test/cim/iec61970/base/meas/test_control.py +++ b/test/cim/iec61970/base/meas/test_control.py @@ -4,7 +4,9 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis import given from hypothesis.strategies import builds, text -from zepben.ewb import Control, RemoteControl + +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, \ @@ -13,14 +15,14 @@ control_kwargs = { **io_point_kwargs, "power_system_resource_mrid": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - "remote_control": builds(RemoteControl) + "remote_control": builds(RemoteControl, mrid=mrid_strategy) } -control_args = [*io_point_args, "a", RemoteControl()] +control_args = [*io_point_args, "a", RemoteControl(mrid=generate_id())] def test_control_constructor_default(): - c = Control() + c = Control(mrid=generate_id()) verify_io_point_constructor_default(c) assert not c.power_system_resource_mrid diff --git a/test/cim/iec61970/base/meas/test_discrete.py b/test/cim/iec61970/base/meas/test_discrete.py index 7ab1059ef..bf7a2f0a3 100644 --- a/test/cim/iec61970/base/meas/test_discrete.py +++ b/test/cim/iec61970/base/meas/test_discrete.py @@ -6,6 +6,7 @@ from cim.iec61970.base.meas.test_measurement import measurement_kwargs, 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 @@ -13,7 +14,7 @@ def test_discrete_constructor_default(): - verify_measurement_constructor_default(Discrete()) + verify_measurement_constructor_default(Discrete(mrid=generate_id())) @given(**discrete_kwargs) diff --git a/test/cim/iec61970/base/meas/test_measurement.py b/test/cim/iec61970/base/meas/test_measurement.py index 486e0dfaa..58753216b 100644 --- a/test/cim/iec61970/base/meas/test_measurement.py +++ b/test/cim/iec61970/base/meas/test_measurement.py @@ -4,7 +4,9 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis.strategies import text, builds, sampled_from -from zepben.ewb import Measurement, RemoteSource, PhaseCode, UnitSymbol + +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, \ @@ -13,13 +15,13 @@ measurement_kwargs = { **identified_object_kwargs, "power_system_resource_mrid": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - "remote_source": builds(RemoteSource), + "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) } -measurement_args = [*identified_object_args, "a", RemoteSource(), "b", PhaseCode.XYN, UnitSymbol.A] +measurement_args = [*identified_object_args, "a", RemoteSource(mrid=generate_id()), "b", PhaseCode.XYN, UnitSymbol.A] def verify_measurement_constructor_default(m: Measurement): diff --git a/test/cim/iec61970/base/protection/test_current_relay.py b/test/cim/iec61970/base/protection/test_current_relay.py index 5d795e9e5..734daed21 100644 --- a/test/cim/iec61970/base/protection/test_current_relay.py +++ b/test/cim/iec61970/base/protection/test_current_relay.py @@ -4,7 +4,7 @@ # 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 +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, \ @@ -21,7 +21,7 @@ def test_current_relay_constructor_default(): - cr = CurrentRelay() + cr = CurrentRelay(mrid=generate_id()) verify_protection_relay_function_constructor_default(cr) assert cr.current_limit_1 is None diff --git a/test/cim/iec61970/base/protection/test_distance_relay.py b/test/cim/iec61970/base/protection/test_distance_relay.py index 910de9654..e03a69cd2 100644 --- a/test/cim/iec61970/base/protection/test_distance_relay.py +++ b/test/cim/iec61970/base/protection/test_distance_relay.py @@ -4,7 +4,7 @@ # 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 +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, \ @@ -27,7 +27,7 @@ def test_distance_relay_constructor_default(): - dr = DistanceRelay() + dr = DistanceRelay(mrid=generate_id()) verify_protection_relay_function_constructor_default(dr) assert dr.backward_blind is None 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 9ddfec352..20a22bbc8 100644 --- a/test/cim/iec61970/base/protection/test_protection_relay_function.py +++ b/test/cim/iec61970/base/protection/test_protection_relay_function.py @@ -3,14 +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.strategies import floats, sampled_from, booleans, lists, builds, text -from zepben.ewb import ProtectionKind, PowerDirectionKind, ProtectedSwitch, ProtectionRelayFunction, RelayInfo, ProtectionRelayScheme, RelaySetting, Sensor, \ - UnitSymbol, unit_symbol_from_id 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, \ verify_power_system_resource_constructor_kwargs, verify_power_system_resource_constructor_args, power_system_resource_args -from cim.private_collection_validator import validate_unordered_1234567890, validate_ordered_other_1234567890 +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, \ + UnitSymbol, unit_symbol_from_id, generate_id protection_relay_function_kwargs = { **power_system_resource_kwargs, @@ -20,18 +21,28 @@ "protection_kind": sampled_from(ProtectionKind), "directable": booleans(), "power_direction": sampled_from(PowerDirectionKind), - "sensors": lists(builds(Sensor), max_size=2), - "protected_switches": lists(builds(ProtectedSwitch), max_size=2), - "schemes": lists(builds(ProtectionRelayScheme), max_size=2), + "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", False, 1.1, ProtectionKind.JG, True, PowerDirectionKind.FORWARD, [Sensor()], - [ProtectedSwitch()], [ProtectionRelayScheme()], [2.2, 3.3], - [RelaySetting(unit_symbol=UnitSymbol.METRES, value=1.1, name="rs1"), - RelaySetting(unit_symbol=UnitSymbol.GYPERS, value=2.2, name="rs2")]] +protection_relay_function_args = [ + *power_system_resource_args, + "model_string", + False, + 1.1, + ProtectionKind.JG, + True, + PowerDirectionKind.FORWARD, + [Sensor(mrid=generate_id())], + [ProtectedSwitch(mrid=generate_id())], + [ProtectionRelayScheme(mrid=generate_id())], + [2.2, 3.3], + [RelaySetting(unit_symbol=UnitSymbol.METRES, value=1.1, name="rs1"), RelaySetting(unit_symbol=UnitSymbol.GYPERS, value=2.2, name="rs2")] +] def verify_protection_relay_function_constructor_default(prf: ProtectionRelayFunction): @@ -95,7 +106,7 @@ def verify_protection_relay_function_constructor_args(prf: ProtectionRelayFuncti def test_sensors_collection(): - validate_unordered_1234567890( + validate_unordered( ProtectionRelayFunction, lambda mrid: Sensor(mrid), ProtectionRelayFunction.sensors, @@ -108,7 +119,7 @@ def test_sensors_collection(): def test_protected_switches_collection(): - validate_unordered_1234567890( + validate_unordered( ProtectionRelayFunction, lambda mrid: ProtectedSwitch(mrid), ProtectionRelayFunction.protected_switches, @@ -121,7 +132,7 @@ def test_protected_switches_collection(): def test_scheme_collection(): - validate_unordered_1234567890( + validate_unordered( ProtectionRelayFunction, lambda mrid: ProtectionRelayScheme(mrid), ProtectionRelayFunction.schemes, @@ -134,7 +145,7 @@ def test_scheme_collection(): def test_time_limits_collection(): - validate_ordered_other_1234567890( + validate_ordered_other( ProtectionRelayFunction, lambda i: float(i), ProtectionRelayFunction.time_limits, @@ -150,7 +161,7 @@ def test_time_limits_collection(): def test_thresholds_collection(): - validate_ordered_other_1234567890( + validate_ordered_other( ProtectionRelayFunction, lambda i: RelaySetting(unit_symbol_from_id(i), int(i), str(i)), ProtectionRelayFunction.thresholds, 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 10d549fd0..32f8056fe 100644 --- a/test/cim/iec61970/base/protection/test_protection_relay_scheme.py +++ b/test/cim/iec61970/base/protection/test_protection_relay_scheme.py @@ -4,23 +4,29 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis import given from hypothesis.strategies import builds, lists -from zepben.ewb import ProtectionRelaySystem, ProtectionRelayFunction, ProtectionRelayScheme + +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, \ verify_identified_object_constructor_kwargs, verify_identified_object_constructor_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered protection_relay_scheme_kwargs = { **identified_object_kwargs, - "system": builds(ProtectionRelaySystem), - "functions": lists(builds(ProtectionRelayFunction)) + "system": builds(ProtectionRelaySystem, mrid=mrid_strategy), + "functions": lists(builds(ProtectionRelayFunction, mrid=mrid_strategy)) } -protection_relay_scheme_args = [*identified_object_args, ProtectionRelaySystem(), [ProtectionRelayFunction(), ProtectionRelayFunction()]] +protection_relay_scheme_args = [ + *identified_object_args, + ProtectionRelaySystem(mrid=generate_id()), + [ProtectionRelayFunction(mrid=generate_id()), ProtectionRelayFunction(mrid=generate_id())] +] def test_protection_relay_scheme_constructor_default(): - prs = ProtectionRelayScheme() + prs = ProtectionRelayScheme(mrid=generate_id()) verify_identified_object_constructor_default(prs) assert prs.system is None @@ -51,7 +57,7 @@ def test_protection_relay_scheme_constructor_args(): def test_functions_collection(): - validate_unordered_1234567890( + validate_unordered( ProtectionRelayScheme, lambda mrid: ProtectionRelayFunction(mrid), ProtectionRelayScheme.functions, 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 9a2951a10..a94d92f97 100644 --- a/test/cim/iec61970/base/protection/test_protection_relay_system.py +++ b/test/cim/iec61970/base/protection/test_protection_relay_system.py @@ -5,23 +5,29 @@ from hypothesis import given from hypothesis.strategies import builds, lists, sampled_from -from zepben.ewb import ProtectionRelaySystem, ProtectionKind, ProtectionRelayScheme + +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, \ verify_equipment_constructor_kwargs, verify_equipment_constructor_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered protection_relay_system_kwargs = { **equipment_kwargs, "protection_kind": sampled_from(ProtectionKind), - "schemes": lists(builds(ProtectionRelayScheme)) + "schemes": lists(builds(ProtectionRelayScheme, mrid=mrid_strategy)) } -protection_relay_system_args = [*equipment_args, ProtectionKind.JDIFF, [ProtectionRelayScheme(), ProtectionRelayScheme(), ProtectionRelayScheme()]] +protection_relay_system_args = [ + *equipment_args, + ProtectionKind.JDIFF, + [ProtectionRelayScheme(mrid=generate_id()), ProtectionRelayScheme(mrid=generate_id()), ProtectionRelayScheme(mrid=generate_id())] +] def test_protection_relay_system_constructor_default(): - prs = ProtectionRelaySystem() + prs = ProtectionRelaySystem(mrid=generate_id()) verify_equipment_constructor_default(prs) assert prs.protection_kind == ProtectionKind.UNKNOWN @@ -52,7 +58,7 @@ def test_protection_relay_system_constructor_args(): def test_schemes_collection(): - validate_unordered_1234567890( + validate_unordered( ProtectionRelaySystem, lambda mrid: ProtectionRelayScheme(mrid), ProtectionRelaySystem.schemes, diff --git a/test/cim/iec61970/base/protection/test_voltage_relay.py b/test/cim/iec61970/base/protection/test_voltage_relay.py index 2293758ca..fc787df2f 100644 --- a/test/cim/iec61970/base/protection/test_voltage_relay.py +++ b/test/cim/iec61970/base/protection/test_voltage_relay.py @@ -6,7 +6,7 @@ from cim.iec61970.base.protection.test_protection_relay_function import protection_relay_function_kwargs, 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 +from zepben.ewb import VoltageRelay, generate_id voltage_relay_kwargs = { **protection_relay_function_kwargs @@ -16,7 +16,7 @@ def test_voltage_relay_constructor_default(): - vr = VoltageRelay() + vr = VoltageRelay(mrid=generate_id()) verify_protection_relay_function_constructor_default(vr) diff --git a/test/cim/iec61970/base/scada/test_remote_control.py b/test/cim/iec61970/base/scada/test_remote_control.py index 3d043c41c..11be11a8c 100644 --- a/test/cim/iec61970/base/scada/test_remote_control.py +++ b/test/cim/iec61970/base/scada/test_remote_control.py @@ -4,21 +4,23 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis import given from hypothesis.strategies import builds -from zepben.ewb import RemoteControl, Control + +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, \ verify_remote_point_constructor_kwargs, verify_remote_point_constructor_args, remote_point_args remote_control_kwargs = { **remote_point_kwargs, - "control": builds(Control) + "control": builds(Control, mrid=mrid_strategy) } -remote_control_args = [*remote_point_args, Control()] +remote_control_args = [*remote_point_args, Control(mrid=generate_id())] def test_remote_control_constructor_default(): - rc = RemoteControl() + rc = RemoteControl(mrid=generate_id()) verify_remote_point_constructor_default(rc) assert not rc.control diff --git a/test/cim/iec61970/base/scada/test_remote_source.py b/test/cim/iec61970/base/scada/test_remote_source.py index 26c604a88..10c7a7cc9 100644 --- a/test/cim/iec61970/base/scada/test_remote_source.py +++ b/test/cim/iec61970/base/scada/test_remote_source.py @@ -4,21 +4,23 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis import given from hypothesis.strategies import builds -from zepben.ewb import RemoteSource, Measurement + +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, \ verify_remote_point_constructor_kwargs, verify_remote_point_constructor_args, remote_point_args remote_source_kwargs = { **remote_point_kwargs, - "measurement": builds(Measurement) + "measurement": builds(Measurement, mrid=mrid_strategy) } -remote_source_args = [*remote_point_args, Measurement()] +remote_source_args = [*remote_point_args, Measurement(mrid=generate_id())] def test_remote_source_constructor_default(): - c = RemoteSource() + c = RemoteSource(mrid=generate_id()) verify_remote_point_constructor_default(c) assert not c.measurement 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 d7ef873c0..3815f7fee 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 @@ -9,22 +9,23 @@ from cim.iec61970.base.wires.generation.production.test_power_electronics_unit import power_electronics_unit_kwargs, \ 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_1234567890 -from zepben.ewb import BatteryUnit, BatteryStateKind, BatteryControl, BatteryControlMode +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), max_size=2) + "controls": lists(builds(BatteryControl, mrid=mrid_strategy), max_size=2) } -battery_unit_args = [*power_electronics_unit_args, BatteryStateKind.full, 1, 2, [BatteryControl()]] +battery_unit_args = [*power_electronics_unit_args, BatteryStateKind.full, 1, 2, [BatteryControl(mrid=generate_id())]] def test_battery_unit_constructor_default(): - b = BatteryUnit() + b = BatteryUnit(mrid=generate_id()) verify_power_electronics_unit_constructor_default(b) assert b.battery_state == BatteryStateKind.UNKNOWN @@ -63,7 +64,7 @@ def test_battery_unit_constructor_args(): def test_battery_control_collection(): - validate_unordered_1234567890( + validate_unordered( BatteryUnit, lambda mrid: BatteryControl(mrid), BatteryUnit.controls, @@ -76,8 +77,8 @@ def test_battery_control_collection(): def test_get_battery_control_with_mode(): - bu = BatteryUnit() - bc = BatteryControl() + bu = BatteryUnit(mrid=generate_id()) + bc = BatteryControl(mrid=generate_id()) bu.add_control(bc) 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 5cbd2a5b7..edf0d1586 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 @@ -7,14 +7,14 @@ from cim.iec61970.base.wires.generation.production.test_power_electronics_unit import power_electronics_unit_kwargs, \ 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 +from zepben.ewb import PhotoVoltaicUnit, generate_id photo_voltaic_unit_kwargs = power_electronics_unit_kwargs photo_voltaic_unit_args = power_electronics_unit_args def test_photo_voltaic_unit_constructor_default(): - verify_power_electronics_unit_constructor_default(PhotoVoltaicUnit()) + verify_power_electronics_unit_constructor_default(PhotoVoltaicUnit(mrid=generate_id())) @given(**photo_voltaic_unit_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 161e99065..4e9c2d024 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 @@ -3,7 +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 integers, builds -from zepben.ewb import PowerElectronicsUnit, PowerElectronicsConnection + +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, \ @@ -11,12 +13,12 @@ power_electronics_unit_kwargs = { **equipment_kwargs, - "power_electronics_connection": builds(PowerElectronicsConnection), + "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) } -power_electronics_unit_args = [*equipment_args, PowerElectronicsConnection(), 1, 2] +power_electronics_unit_args = [*equipment_args, PowerElectronicsConnection(mrid=generate_id()), 1, 2] def verify_power_electronics_unit_constructor_default(peu: PowerElectronicsUnit): 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 81eb63490..ac88d4951 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 @@ -7,14 +7,14 @@ from cim.iec61970.base.wires.generation.production.test_power_electronics_unit import power_electronics_unit_kwargs, \ 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 +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 def test_power_electronics_wind_unit_constructor_default(): - verify_power_electronics_unit_constructor_default(PowerElectronicsWindUnit()) + verify_power_electronics_unit_constructor_default(PowerElectronicsWindUnit(mrid=generate_id())) @given(**power_electronics_wind_unit_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 13705794e..88427bd1d 100644 --- a/test/cim/iec61970/base/wires/test_ac_line_segment.py +++ b/test/cim/iec61970/base/wires/test_ac_line_segment.py @@ -4,7 +4,9 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis import given from hypothesis.strategies import builds -from zepben.ewb import AcLineSegment + +from util import mrid_strategy +from zepben.ewb import AcLineSegment, generate_id 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, \ @@ -13,14 +15,14 @@ ac_line_segment_kwargs = { **conductor_kwargs, - "per_length_impedance": builds(PerLengthSequenceImpedance) + "per_length_impedance": builds(PerLengthSequenceImpedance, mrid=mrid_strategy) } -ac_line_segment_args = [*conductor_args, PerLengthSequenceImpedance()] +ac_line_segment_args = [*conductor_args, PerLengthSequenceImpedance(mrid=generate_id())] def test_ac_line_segment_constructor_default(): - als = AcLineSegment() + als = AcLineSegment(mrid=generate_id()) verify_conductor_constructor_default(als) assert not als.per_length_impedance @@ -48,9 +50,9 @@ def test_ac_line_segment_constructor_args(): def test_properties(): - acls = AcLineSegment() - plpi = PerLengthPhaseImpedance() - plsi = PerLengthSequenceImpedance() + acls = AcLineSegment(mrid=generate_id()) + plpi = PerLengthPhaseImpedance(mrid=generate_id()) + plsi = PerLengthSequenceImpedance(mrid=generate_id()) acls.per_length_phase_impedance = plpi assert acls.per_length_impedance == plpi diff --git a/test/cim/iec61970/base/wires/test_breaker.py b/test/cim/iec61970/base/wires/test_breaker.py index 1eb7aedcc..f8336d5bb 100644 --- a/test/cim/iec61970/base/wires/test_breaker.py +++ b/test/cim/iec61970/base/wires/test_breaker.py @@ -4,7 +4,7 @@ # 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 +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 @@ -19,7 +19,7 @@ def test_breaker_constructor_default(): - br = Breaker() + br = Breaker(mrid=generate_id()) verify_protected_switch_constructor_default(br) assert br.in_transit_time is None @@ -43,18 +43,18 @@ def test_breaker_constructor_args(): def test_is_substation_breaker_when_associated_with_a_substation_equipment(): - br = Breaker() + br = Breaker(mrid=generate_id()) assert not br.is_substation_breaker, "is_substation_breaker should return False for Breakers without containers" - br.add_container(Substation()) + br.add_container(Substation(mrid=generate_id())) assert br.is_substation_breaker, "is_substation_breaker should return True for Breakers with a Substation container" def test_is_feeder_head_breaker_when_a_terminal_is_a_feeder_head_terminal(): - br = Breaker().add_terminal(Terminal()).add_terminal(Terminal()) - fdr = Feeder(normal_head_terminal=Terminal()) + br = Breaker(mrid=generate_id()).add_terminal(Terminal(mrid=generate_id())).add_terminal(Terminal(mrid=generate_id())) + fdr = Feeder(mrid=generate_id(), normal_head_terminal=Terminal(mrid=generate_id())) assert not br.is_feeder_head_breaker, "is_feeder_head_breaker should return False for Breakers without feeder head terminals" diff --git a/test/cim/iec61970/base/wires/test_busbar_section.py b/test/cim/iec61970/base/wires/test_busbar_section.py index e607f133c..77693297d 100644 --- a/test/cim/iec61970/base/wires/test_busbar_section.py +++ b/test/cim/iec61970/base/wires/test_busbar_section.py @@ -7,19 +7,20 @@ 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 zepben.ewb import Terminal +from util import mrid_strategy +from zepben.ewb import Terminal, generate_id from zepben.ewb.model.cim.iec61970.base.wires.busbar_section import BusbarSection busbar_section_kwargs = { **connector_kwargs, - 'terminals': lists(builds(Terminal), max_size=1) # Busbar's can only have 1 terminal + 'terminals': lists(builds(Terminal, mrid=mrid_strategy), max_size=1) # Busbar's can only have 1 terminal } busbar_section_args = connector_args def test_busbar_section_constructor_default(): - verify_connector_constructor_default(BusbarSection()) + verify_connector_constructor_default(BusbarSection(mrid=generate_id())) @given(**busbar_section_kwargs) diff --git a/test/cim/iec61970/base/wires/test_connector.py b/test/cim/iec61970/base/wires/test_connector.py index b7c051186..fefaf22f3 100644 --- a/test/cim/iec61970/base/wires/test_connector.py +++ b/test/cim/iec61970/base/wires/test_connector.py @@ -5,7 +5,7 @@ from cim.iec61970.base.core.test_conducting_equipment import conducting_equipment_kwargs, 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 +from zepben.ewb import Connector, Conductor, CableInfo, generate_id connector_kwargs = conducting_equipment_kwargs connector_args = conducting_equipment_args @@ -24,8 +24,8 @@ def verify_connector_constructor_args(c: Connector): def test_is_underground(): - c = Conductor() + c = Conductor(mrid=generate_id()) assert not c.is_underground() - c.wire_info = CableInfo() + c.wire_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 e2957cc08..8a4f960fd 100644 --- a/test/cim/iec61970/base/wires/test_disconnector.py +++ b/test/cim/iec61970/base/wires/test_disconnector.py @@ -6,14 +6,14 @@ 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 zepben.ewb import Disconnector +from zepben.ewb import Disconnector, generate_id disconnector_kwargs = switch_kwargs disconnector_args = switch_args def test_disconnector_constructor_default(): - verify_switch_constructor_default(Disconnector()) + verify_switch_constructor_default(Disconnector(mrid=generate_id())) @given(**disconnector_kwargs) diff --git a/test/cim/iec61970/base/wires/test_energy_consumer.py b/test/cim/iec61970/base/wires/test_energy_consumer.py index 5eb9029b1..a91df63e8 100644 --- a/test/cim/iec61970/base/wires/test_energy_consumer.py +++ b/test/cim/iec61970/base/wires/test_energy_consumer.py @@ -4,17 +4,19 @@ # 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 zepben.ewb import EnergyConsumer, PhaseShuntConnectionKind + +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.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 -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered energy_consumer_kwargs = { **energy_connection_kwargs, - "energy_consumer_phases": lists(builds(EnergyConsumerPhase)), + "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), @@ -24,11 +26,11 @@ "q_fixed": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) } -energy_consumer_args = [*energy_connection_args, [EnergyConsumerPhase()], 1, True, PhaseShuntConnectionKind.Y, 2.2, 3.3, 4.4, 5.5] +energy_consumer_args = [*energy_connection_args, [EnergyConsumerPhase(mrid=generate_id())], 1, True, PhaseShuntConnectionKind.Y, 2.2, 3.3, 4.4, 5.5] def test_energy_consumer_constructor_default(): - ec = EnergyConsumer() + ec = EnergyConsumer(mrid=generate_id()) verify_energy_connection_constructor_default(ec) assert not list(ec.phases) @@ -83,7 +85,7 @@ def test_energy_consumer_constructor_args(): def test_phases_collection(): - validate_unordered_1234567890( + validate_unordered( EnergyConsumer, lambda mrid: EnergyConsumerPhase(mrid), EnergyConsumer.phases, diff --git a/test/cim/iec61970/base/wires/test_energy_source.py b/test/cim/iec61970/base/wires/test_energy_source.py index 48bca2e02..c645237af 100644 --- a/test/cim/iec61970/base/wires/test_energy_source.py +++ b/test/cim/iec61970/base/wires/test_energy_source.py @@ -4,16 +4,18 @@ # 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 zepben.ewb import EnergySource, EnergySourcePhase + +from util import mrid_strategy +from zepben.ewb import EnergySource, EnergySourcePhase, generate_id from cim.cim_creators import FLOAT_MIN, FLOAT_MAX 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 -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered energy_source_kwargs = { **energy_connection_kwargs, - "energy_source_phases": lists(builds(EnergySourcePhase)), + "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), @@ -41,12 +43,39 @@ "x0_max": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) } -energy_source_args = [*energy_connection_args, [EnergySourcePhase()], 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.01, 11.11, 12.21, True, - 13.31, 14.41, 15.51, 16.61, 17.71, 18.81, 19.91, 20.02, 21.12, 22.22, 23.32, 24.42] +energy_source_args = [ + *energy_connection_args, + [EnergySourcePhase(mrid=generate_id())], + 1.1, + 2.2, + 3.3, + 4.4, + 5.5, + 6.6, + 7.7, + 8.8, + 9.9, + 10.01, + 11.11, + 12.21, + True, + 13.31, + 14.41, + 15.51, + 16.61, + 17.71, + 18.81, + 19.91, + 20.02, + 21.12, + 22.22, + 23.32, + 24.42 +] def test_energy_source_constructor_default(): - es = EnergySource() + es = EnergySource(mrid=generate_id()) verify_energy_connection_constructor_default(es) assert not list(es.phases) @@ -175,7 +204,7 @@ def test_energy_source_constructor_args(): def test_phases_collection(): - validate_unordered_1234567890( + validate_unordered( EnergySource, lambda mrid: EnergySourcePhase(mrid), EnergySource.phases, diff --git a/test/cim/iec61970/base/wires/test_fuse.py b/test/cim/iec61970/base/wires/test_fuse.py index 716a7369d..7fdfc46a0 100644 --- a/test/cim/iec61970/base/wires/test_fuse.py +++ b/test/cim/iec61970/base/wires/test_fuse.py @@ -8,17 +8,18 @@ switch_kwargs, switch_args from hypothesis.strategies import builds -from zepben.ewb import Fuse, ProtectionRelayFunction +from util import mrid_strategy +from zepben.ewb import Fuse, ProtectionRelayFunction, generate_id fuse_kwargs = { **switch_kwargs, - "function": builds(ProtectionRelayFunction) + "function": builds(ProtectionRelayFunction, mrid=mrid_strategy) } -fuse_args = [*switch_args, ProtectionRelayFunction()] +fuse_args = [*switch_args, ProtectionRelayFunction(mrid=generate_id())] def test_fuse_constructor_default(): - f = Fuse() + f = Fuse(mrid=generate_id()) verify_switch_constructor_default(f) assert f.function is None diff --git a/test/cim/iec61970/base/wires/test_ground.py b/test/cim/iec61970/base/wires/test_ground.py index 8e6c1118c..9b56e4882 100644 --- a/test/cim/iec61970/base/wires/test_ground.py +++ b/test/cim/iec61970/base/wires/test_ground.py @@ -7,14 +7,14 @@ 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 zepben.ewb import Ground +from zepben.ewb import Ground, generate_id ground_kwargs = conducting_equipment_kwargs ground_args = conducting_equipment_args def test_ground_constructor_default(): - verify_conducting_equipment_constructor_default(Ground()) + verify_conducting_equipment_constructor_default(Ground(mrid=generate_id())) @given(**ground_kwargs) diff --git a/test/cim/iec61970/base/wires/test_ground_disconnector.py b/test/cim/iec61970/base/wires/test_ground_disconnector.py index ffc946b7b..0b8cdf763 100644 --- a/test/cim/iec61970/base/wires/test_ground_disconnector.py +++ b/test/cim/iec61970/base/wires/test_ground_disconnector.py @@ -6,14 +6,14 @@ 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 zepben.ewb import GroundDisconnector +from zepben.ewb import GroundDisconnector, generate_id ground_disconnector_kwargs = switch_kwargs ground_disconnector_args = switch_args def test_ground_disconnector_constructor_default(): - verify_switch_constructor_default(GroundDisconnector()) + verify_switch_constructor_default(GroundDisconnector(mrid=generate_id())) @given(**ground_disconnector_kwargs) diff --git a/test/cim/iec61970/base/wires/test_jumper.py b/test/cim/iec61970/base/wires/test_jumper.py index 461d32829..5786bcf5d 100644 --- a/test/cim/iec61970/base/wires/test_jumper.py +++ b/test/cim/iec61970/base/wires/test_jumper.py @@ -6,14 +6,14 @@ 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 zepben.ewb import Jumper +from zepben.ewb import Jumper, generate_id jumper_kwargs = switch_kwargs jumper_args = switch_args def test_jumper_constructor_default(): - verify_switch_constructor_default(Jumper()) + verify_switch_constructor_default(Jumper(mrid=generate_id())) @given(**jumper_kwargs) diff --git a/test/cim/iec61970/base/wires/test_junction.py b/test/cim/iec61970/base/wires/test_junction.py index b7a34066e..d454485e2 100644 --- a/test/cim/iec61970/base/wires/test_junction.py +++ b/test/cim/iec61970/base/wires/test_junction.py @@ -6,6 +6,7 @@ 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 zepben.ewb import generate_id from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction junction_kwargs = connector_kwargs @@ -13,7 +14,7 @@ def test_junction_constructor_default(): - verify_connector_constructor_default(Junction()) + verify_connector_constructor_default(Junction(mrid=generate_id())) @given(**junction_kwargs) 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 4d13c7b2a..ea6fe736e 100644 --- a/test/cim/iec61970/base/wires/test_linear_shunt_compensator.py +++ b/test/cim/iec61970/base/wires/test_linear_shunt_compensator.py @@ -5,6 +5,8 @@ from hypothesis import given from hypothesis.strategies import floats + +from zepben.ewb import generate_id from zepben.ewb.model.cim.iec61970.base.wires.linear_shunt_compensator import LinearShuntCompensator from cim.cim_creators import FLOAT_MIN, FLOAT_MAX @@ -23,7 +25,7 @@ def test_linear_shunt_compensator_constructor_default(): - lsc = LinearShuntCompensator() + lsc = LinearShuntCompensator(mrid=generate_id()) verify_shunt_compensator_constructor_default(lsc) assert lsc.b0_per_section is None 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 6da93c002..4d5929839 100644 --- a/test/cim/iec61970/base/wires/test_load_break_switch.py +++ b/test/cim/iec61970/base/wires/test_load_break_switch.py @@ -6,14 +6,14 @@ 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 -from zepben.ewb import LoadBreakSwitch +from zepben.ewb import LoadBreakSwitch, generate_id load_break_switch_kwargs = protected_switch_kwargs load_break_switch_args = protected_switch_args def test_load_break_switch_constructor_default(): - verify_protected_switch_constructor_default(LoadBreakSwitch()) + verify_protected_switch_constructor_default(LoadBreakSwitch(mrid=generate_id())) @given(**load_break_switch_kwargs) 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 404a0efcf..b400db267 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 @@ -6,8 +6,8 @@ from hypothesis import given from hypothesis.strategies import lists, builds -from cim.private_collection_validator import validate_unordered_other_1234567890 -from zepben.ewb import SinglePhaseKind, single_phase_kind_by_id +from cim.private_collection_validator import validate_unordered_other +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 @@ -23,7 +23,7 @@ def test_per_length_phase_impedance_constructor_default(): - plpi = PerLengthPhaseImpedance() + plpi = PerLengthPhaseImpedance(mrid=generate_id()) verify_per_length_impedance_constructor_default(plpi) assert not list(plpi.data) @@ -50,7 +50,7 @@ def test_per_length_phase_impedance_constructor_args(): @pytest.mark.timeout(10000) def test_phase_impedance_data(): - validate_unordered_other_1234567890( + validate_unordered_other( PerLengthPhaseImpedance, lambda it: PhaseImpedanceData(single_phase_kind_by_id(it), single_phase_kind_by_id(it + 1), it, it, it, it), PerLengthPhaseImpedance.data, @@ -73,7 +73,7 @@ def test_diagonals_returns_only_diagonals(): pid2 = PhaseImpedanceData(SinglePhaseKind.B, SinglePhaseKind.B) pid3 = PhaseImpedanceData(SinglePhaseKind.C, SinglePhaseKind.C) - plpi = PerLengthPhaseImpedance() + plpi = PerLengthPhaseImpedance(mrid=generate_id()) plpi.add_data(pi1) plpi.add_data(pi2) plpi.add_data(pi3) 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 56c655ab1..a3d4040fa 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 @@ -4,6 +4,8 @@ # 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.model.cim.iec61970.base.wires.per_length_sequence_impedance import PerLengthSequenceImpedance from cim.cim_creators import FLOAT_MIN, FLOAT_MAX @@ -26,7 +28,7 @@ def test_per_length_sequence_impedance_constructor_default(): - plsi = PerLengthSequenceImpedance() + plsi = PerLengthSequenceImpedance(mrid=generate_id()) verify_per_length_impedance_constructor_default(plsi) assert plsi.r is None 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 14f29d203..181e13355 100644 --- a/test/cim/iec61970/base/wires/test_power_electronics_connection.py +++ b/test/cim/iec61970/base/wires/test_power_electronics_connection.py @@ -7,13 +7,15 @@ from pytest import raises from hypothesis import given from hypothesis.strategies import integers, builds, lists, floats, text, booleans -from zepben.ewb import PowerElectronicsUnit, BatteryUnit, PowerElectronicsConnection + +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 cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, FLOAT_MIN, FLOAT_MAX, ALPHANUM, TEXT_MAX_SIZE 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 -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered power_electronics_connection_kwargs = { **regulating_cond_eq_kwargs, @@ -48,17 +50,50 @@ "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), max_size=2), - "power_electronics_connection_phases": lists(builds(PowerElectronicsConnectionPhase), max_size=2) + "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) } -power_electronics_connection_args = [*regulating_cond_eq_args, 1, 2.2, 3.3, 4.4, 5.5, 6, 7, "1", 208, 51.9, 47.10, False, - 211, 228, 248, 258, 0.15, 0.16, 0.17, 0.18, True, 219, 220, 221, 222, 0.23, 0.24, 0.25, 0.26, False, - 0.27, [BatteryUnit(), BatteryUnit()], [PowerElectronicsConnectionPhase(), PowerElectronicsConnectionPhase()]] +power_electronics_connection_args = [ + *regulating_cond_eq_args, + 1, + 2.2, + 3.3, + 4.4, + 5.5, + 6, + 7, + "1", + 208, + 51.9, + 47.10, + False, + 211, + 228, + 248, + 258, + 0.15, + 0.16, + 0.17, + 0.18, + True, + 219, + 220, + 221, + 222, + 0.23, + 0.24, + 0.25, + 0.26, + False, + 0.27, + [BatteryUnit(mrid=generate_id()), BatteryUnit(mrid=generate_id())], + [PowerElectronicsConnectionPhase(mrid=generate_id()), PowerElectronicsConnectionPhase(mrid=generate_id())] +] def test_power_electronics_connection_constructor_default(): - pec = PowerElectronicsConnection() + pec = PowerElectronicsConnection(mrid=generate_id()) verify_regulating_cond_eq_constructor_default(pec) assert pec.max_i_fault is None @@ -248,7 +283,7 @@ def test_power_electronics_connection_constructor_args(): def test_power_electronics_units_collection(): - validate_unordered_1234567890( + validate_unordered( PowerElectronicsConnection, lambda mrid: PowerElectronicsUnit(mrid), PowerElectronicsConnection.units, @@ -261,7 +296,7 @@ def test_power_electronics_units_collection(): def test_power_electronics_connection_phases_collection(): - validate_unordered_1234567890( + validate_unordered( PowerElectronicsConnection, lambda mrid: PowerElectronicsConnectionPhase(mrid), PowerElectronicsConnection.phases, diff --git a/test/cim/iec61970/base/wires/test_power_transformer.py b/test/cim/iec61970/base/wires/test_power_transformer.py index d00fc0e03..d422ab302 100644 --- a/test/cim/iec61970/base/wires/test_power_transformer.py +++ b/test/cim/iec61970/base/wires/test_power_transformer.py @@ -5,8 +5,10 @@ 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 + Terminal, generate_id from cim.cim_creators import FLOAT_MIN, FLOAT_MAX from cim.iec61970.base.core.test_conducting_equipment import verify_conducting_equipment_constructor_default, \ @@ -16,18 +18,24 @@ power_transformer_kwargs = { **conducting_equipment_kwargs, "vector_group": sampled_from(VectorGroup), - "power_transformer_ends": lists(builds(PowerTransformerEnd), max_size=2), + "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) } -power_transformer_args = [*conducting_equipment_args, VectorGroup.DD6, [PowerTransformerEnd()], 1.1, TransformerConstructionKind.padmountFeedThrough, - TransformerFunctionKind.secondaryTransformer] +power_transformer_args = [ + *conducting_equipment_args, + VectorGroup.DD6, + [PowerTransformerEnd(mrid=generate_id())], + 1.1, + TransformerConstructionKind.padmountFeedThrough, + TransformerFunctionKind.secondaryTransformer +] def test_power_transformer_constructor_default(): - pt = PowerTransformer() + pt = PowerTransformer(mrid=generate_id()) verify_conducting_equipment_constructor_default(pt) assert pt.vector_group == VectorGroup.UNKNOWN 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 2a5e87879..d20214776 100644 --- a/test/cim/iec61970/base/wires/test_power_transformer_end.py +++ b/test/cim/iec61970/base/wires/test_power_transformer_end.py @@ -8,17 +8,19 @@ from pytest import raises from hypothesis import given from hypothesis.strategies import builds, integers, floats, sampled_from -from zepben.ewb import PowerTransformerEnd, PowerTransformer, WindingConnection, TransformerCoolingType + +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 cim.cim_creators import MIN_32_BIT_INTEGER, MAX_32_BIT_INTEGER, FLOAT_MIN, FLOAT_MAX 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 -from cim.private_collection_validator import validate_unordered_other_1234567890 +from cim.private_collection_validator import validate_unordered_other power_transformer_end_kwargs = { **transformer_end_kwargs, - "power_transformer": builds(PowerTransformer), + "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), @@ -33,11 +35,11 @@ "phase_angle_clock": integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER) } -power_transformer_end_args = [*transformer_end_args, PowerTransformer(), 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(): - pte = PowerTransformerEnd() + pte = PowerTransformerEnd(mrid=generate_id()) verify_transformer_end_constructor_default(pte) assert not pte.power_transformer @@ -120,7 +122,7 @@ def test_power_transformer_end_constructor_args(): def test_power_transformer_end_s_ratings(): - validate_unordered_other_1234567890( + validate_unordered_other( PowerTransformerEnd, lambda i: TransformerEndRatedS(cooling_type=TransformerCoolingType(int(i)), rated_s=int(i)), # how python? PowerTransformerEnd.s_ratings, @@ -135,7 +137,7 @@ def test_power_transformer_end_s_ratings(): def test_power_transformer_cant_add_rating_with_same_cooling_type(): - pte = PowerTransformerEnd() + pte = PowerTransformerEnd(mrid=generate_id()) s_rating = TransformerEndRatedS(TransformerCoolingType.KNAF, 1) pte.add_transformer_end_rated_s(s_rating) @@ -147,7 +149,7 @@ def test_power_transformer_cant_add_rating_with_same_cooling_type(): def test_power_transformer_remove_rating_by_cooling_type(): - pte = PowerTransformerEnd() + pte = PowerTransformerEnd(mrid=generate_id()) for index, cooling_type in enumerate(TransformerCoolingType): pte.add_rating(index * 10, cooling_type) @@ -159,7 +161,7 @@ def test_power_transformer_remove_rating_by_cooling_type(): def test_power_transformer_rated_s_backwards_compatibility(): - pte = PowerTransformerEnd() + pte = PowerTransformerEnd(mrid=generate_id()) pte.rated_s = 1 assert pte.rated_s == 1 assert list(pte.s_ratings) == [TransformerEndRatedS(TransformerCoolingType.UNKNOWN, 1)] @@ -181,4 +183,4 @@ def test_power_transformer_rated_s_backwards_compatibility(): def test_power_transformer_s_ratings_backing_field_cant_through_the_constructor(): with raises(ValueError, match="Do not directly set s_ratings through the constructor. You have one more constructor parameter than expected."): - PowerTransformerEnd(_s_ratings=[TransformerEndRatedS(TransformerCoolingType.UNKNOWN, 4)]) + PowerTransformerEnd(mrid=generate_id(), _s_ratings=[TransformerEndRatedS(TransformerCoolingType.UNKNOWN, 4)]) diff --git a/test/cim/iec61970/base/wires/test_protected_switch.py b/test/cim/iec61970/base/wires/test_protected_switch.py index c4e559ff6..82bfa5248 100644 --- a/test/cim/iec61970/base/wires/test_protected_switch.py +++ b/test/cim/iec61970/base/wires/test_protected_switch.py @@ -3,19 +3,21 @@ # 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 zepben.ewb import ProtectionRelayFunction, ProtectedSwitch + +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, \ verify_switch_constructor_args, switch_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered 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), max_size=2) + "relay_functions": lists(builds(ProtectionRelayFunction, mrid=mrid_strategy), max_size=2) } -protected_switch_args = [*switch_args, 1, [ProtectionRelayFunction()]] +protected_switch_args = [*switch_args, 1, [ProtectionRelayFunction(mrid=generate_id())]] def verify_protected_switch_constructor_default(ps: ProtectedSwitch): @@ -42,7 +44,7 @@ def verify_protected_switch_constructor_args(ps: ProtectedSwitch): def test_relay_function_collection(): - validate_unordered_1234567890( + validate_unordered( ProtectedSwitch, lambda mrid: ProtectionRelayFunction(mrid), ProtectedSwitch.relay_functions, 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 10f16fc85..1c740d259 100644 --- a/test/cim/iec61970/base/wires/test_ratio_tap_changer.py +++ b/test/cim/iec61970/base/wires/test_ratio_tap_changer.py @@ -4,6 +4,9 @@ # 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 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 @@ -13,15 +16,15 @@ ratio_tap_changer_kwargs = { **tap_changer_kwargs, - "transformer_end": builds(TransformerEnd), + "transformer_end": builds(TransformerEnd, mrid=mrid_strategy), "step_voltage_increment": floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) } -ratio_tap_changer_args = [*tap_changer_args, TransformerEnd(), 1.1] +ratio_tap_changer_args = [*tap_changer_args, TransformerEnd(mrid=generate_id()), 1.1] def test_ratio_tap_changer_constructor_default(): - rtc = RatioTapChanger() + rtc = RatioTapChanger(mrid=generate_id()) verify_tap_changer_constructor_default(rtc) assert not rtc.transformer_end diff --git a/test/cim/iec61970/base/wires/test_recloser.py b/test/cim/iec61970/base/wires/test_recloser.py index c277efbb4..c4747c311 100644 --- a/test/cim/iec61970/base/wires/test_recloser.py +++ b/test/cim/iec61970/base/wires/test_recloser.py @@ -6,14 +6,14 @@ 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 -from zepben.ewb import Recloser +from zepben.ewb import Recloser, generate_id recloser_kwargs = protected_switch_kwargs recloser_args = protected_switch_args def test_recloser_constructor_default(): - verify_protected_switch_constructor_default(Recloser()) + verify_protected_switch_constructor_default(Recloser(mrid=generate_id())) @given(**recloser_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 9a302a08f..62082e7a3 100644 --- a/test/cim/iec61970/base/wires/test_regulating_cond_eq.py +++ b/test/cim/iec61970/base/wires/test_regulating_cond_eq.py @@ -4,7 +4,9 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis.strategies import booleans, builds -from zepben.ewb import RegulatingCondEq, RegulatingControl + +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, \ verify_energy_connection_constructor_kwargs, verify_energy_connection_constructor_args, energy_connection_args @@ -12,10 +14,10 @@ regulating_cond_eq_kwargs = { **energy_connection_kwargs, "control_enabled": booleans(), - "regulating_control": builds(RegulatingControl) + "regulating_control": builds(RegulatingControl, mrid=mrid_strategy) } -regulating_cond_eq_args = [*energy_connection_args, False, None] +regulating_cond_eq_args = [*energy_connection_args, False, RegulatingControl(mrid=generate_id())] def verify_regulating_cond_eq_constructor_default(rce: RegulatingCondEq): diff --git a/test/cim/iec61970/base/wires/test_regulating_control.py b/test/cim/iec61970/base/wires/test_regulating_control.py index a8eb0fe77..ac8d1dc60 100644 --- a/test/cim/iec61970/base/wires/test_regulating_control.py +++ b/test/cim/iec61970/base/wires/test_regulating_control.py @@ -7,8 +7,9 @@ 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 -from cim.private_collection_validator import validate_unordered_1234567890 -from zepben.ewb import RegulatingControlModeKind, Terminal, PowerElectronicsConnection, PhaseCode, RegulatingControl, RegulatingCondEq +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, @@ -21,15 +22,28 @@ "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), + "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), max_size=2) + "regulating_conducting_equipment": lists(builds(PowerElectronicsConnection, mrid=mrid_strategy), max_size=2) } -regulating_control_args = [*power_system_resource_args, False, RegulatingControlModeKind.voltage, PhaseCode.ABC, 1.1, 2.2, True, 3.3, 4.4, 5.5, Terminal(), 6.6, - 7.7, - [PowerElectronicsConnection()]] +regulating_control_args = [ + *power_system_resource_args, + False, + RegulatingControlModeKind.voltage, + PhaseCode.ABC, + 1.1, + 2.2, + True, + 3.3, + 4.4, + 5.5, + Terminal(mrid=generate_id()), + 6.6, + 7.7, + [PowerElectronicsConnection(mrid=generate_id())] +] def verify_regulating_control_constructor_default(rc: RegulatingControl): @@ -103,7 +117,7 @@ def verify_regulating_control_constructor_args(rc): def test_regulating_control_regulating_conducting_equipment(): # noinspection PyArgumentList - validate_unordered_1234567890( + validate_unordered( RegulatingControl, lambda mrid: RegulatingCondEq(mrid), RegulatingControl.regulating_conducting_equipment, diff --git a/test/cim/iec61970/base/wires/test_series_compensator.py b/test/cim/iec61970/base/wires/test_series_compensator.py index fafda1002..5a08a56df 100644 --- a/test/cim/iec61970/base/wires/test_series_compensator.py +++ b/test/cim/iec61970/base/wires/test_series_compensator.py @@ -5,7 +5,7 @@ from hypothesis import given from hypothesis.strategies import floats, integers -from zepben.ewb import SeriesCompensator +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.iec61970.base.core.test_conducting_equipment import verify_conducting_equipment_constructor_default, \ @@ -25,7 +25,7 @@ def test_series_compensator_constructor_default(): - sc = SeriesCompensator() + sc = SeriesCompensator(mrid=generate_id()) verify_conducting_equipment_constructor_default(sc) assert sc.r is None @@ -72,7 +72,7 @@ def test_series_compensator_constructor_args(): def test_varistor_present_flag(): - sc = SeriesCompensator(varistor_rated_current=None, varistor_voltage_threshold=None) + sc = SeriesCompensator(mrid=generate_id(), varistor_rated_current=None, varistor_voltage_threshold=None) assert sc.varistor_present() is False 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 2451af5b2..f5066ad96 100644 --- a/test/cim/iec61970/base/wires/test_static_var_compensator.py +++ b/test/cim/iec61970/base/wires/test_static_var_compensator.py @@ -4,7 +4,7 @@ # 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 +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, \ @@ -23,7 +23,7 @@ def test_static_var_compensator_constructor_default(): - svc = StaticVarCompensator() + svc = StaticVarCompensator(mrid=generate_id()) verify_regulating_cond_eq_constructor_default(svc) assert svc.capacitive_rating is None assert svc.inductive_rating is None diff --git a/test/cim/iec61970/base/wires/test_switch.py b/test/cim/iec61970/base/wires/test_switch.py index 224a0e53a..6e592c63a 100644 --- a/test/cim/iec61970/base/wires/test_switch.py +++ b/test/cim/iec61970/base/wires/test_switch.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 hypothesis.strategies import integers, floats -from zepben.ewb import Switch, SinglePhaseKind, SwitchInfo +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, \ @@ -56,7 +56,7 @@ def test_open_states(): def _validate_open_phase(is_open, set_open): - s = Switch() + s = Switch(mrid=generate_id()) s.set_normally_open(True) assert s.is_normally_open() @@ -65,7 +65,7 @@ def _validate_open_phase(is_open, set_open): valid_phases = list(SinglePhaseKind)[1:6] for phase in valid_phases: - s = Switch() + s = Switch(mrid=generate_id()) set_open(s, True, phase) for validate_phase in valid_phases: diff --git a/test/cim/iec61970/base/wires/test_synchronous_machine.py b/test/cim/iec61970/base/wires/test_synchronous_machine.py index 8a4231a3c..830f2efda 100644 --- a/test/cim/iec61970/base/wires/test_synchronous_machine.py +++ b/test/cim/iec61970/base/wires/test_synchronous_machine.py @@ -4,16 +4,18 @@ # 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, \ verify_rotating_machine_constructor_default, verify_rotating_machine_constructor_kwargs, verify_rotating_machine_constructor_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered synchronous_machine_kwargs = { **rotating_machine_kwargs, - "curves": lists(builds(ReactiveCapabilityCurve), max_size=2), + "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(), @@ -179,7 +181,7 @@ def verify_synchronous_machine_constructor_args(): def test_curves_collection(): - validate_unordered_1234567890( + validate_unordered( SynchronousMachine, lambda mrid: ReactiveCapabilityCurve(mrid), SynchronousMachine.curves, diff --git a/test/cim/iec61970/base/wires/test_tap_changer.py b/test/cim/iec61970/base/wires/test_tap_changer.py index 5c41d6247..fafb111ef 100644 --- a/test/cim/iec61970/base/wires/test_tap_changer.py +++ b/test/cim/iec61970/base/wires/test_tap_changer.py @@ -7,7 +7,9 @@ from hypothesis import assume from hypothesis.strategies import floats, booleans, integers, builds from pytest import raises -from zepben.ewb import TapChangerControl + +from util import mrid_strategy +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 @@ -18,7 +20,7 @@ **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), + "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), @@ -26,7 +28,7 @@ "step": floats(min_value=-100.0, max_value=100.0) } -tap_changer_args = [*power_system_resource_args, False, 1, TapChangerControl(), 10, 2, 3, 4, 5.5] +tap_changer_args = [*power_system_resource_args, False, 1, TapChangerControl(mrid=generate_id()), 10, 2, 3, 4, 5.5] def verify_tap_changer_constructor_default(tc: TapChanger): @@ -82,17 +84,17 @@ def test_detected_invalid_steps_via_constructor_args(): # args order: control_enabled, neutral_u, _high_step, _low_step, _neutral_step, _normal_step, _step with raises(ValueError, match=re.escape("High step [0] must be greater than low step [0]")): - TapChanger(*power_system_resource_args, True, 100, TapChangerControl(), 0, 0, 0, 0, 0.0) + TapChanger(*power_system_resource_args, True, 100, TapChangerControl(mrid=generate_id()), 0, 0, 0, 0, 0.0) with raises(ValueError, match=re.escape("Neutral step [2] must be between high step [1] and low step [0]")): - TapChanger(*power_system_resource_args, True, 100, TapChangerControl(), 1, 0, 2, 0, 0.0) + TapChanger(*power_system_resource_args, True, 100, TapChangerControl(mrid=generate_id()), 1, 0, 2, 0, 0.0) with raises(ValueError, match=re.escape("Normal step [2] must be between high step [1] and low step [0]")): - TapChanger(*power_system_resource_args, True, 100, TapChangerControl(), 1, 0, 0, 2, 0.0) + TapChanger(*power_system_resource_args, True, 100, TapChangerControl(mrid=generate_id()), 1, 0, 0, 2, 0.0) with raises(ValueError, match=re.escape("Step [1.1] must be between high step [1] and low step [0]")): - TapChanger(*power_system_resource_args, True, 100, TapChangerControl(), 1, 0, 0, 0, 1.1) + TapChanger(*power_system_resource_args, True, 100, TapChangerControl(mrid=generate_id()), 1, 0, 0, 0, 1.1) def test_validates_step_changes(): - tc = TapChanger(high_step=1, low_step=0, neutral_step=0, normal_step=0, step=0.0) + tc = TapChanger(mrid=generate_id(), high_step=1, low_step=0, neutral_step=0, normal_step=0, step=0.0) with raises(ValueError, match=re.escape("High step [0] must be greater than low step [0]")): tc.high_step = 0 with raises(ValueError, match=re.escape("Low step [2] must be less than high step [1]")): 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 9915015f3..da5694d30 100644 --- a/test/cim/iec61970/base/wires/test_tap_changer_control.py +++ b/test/cim/iec61970/base/wires/test_tap_changer_control.py @@ -4,7 +4,7 @@ # 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 +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, \ @@ -27,7 +27,7 @@ def test_tap_changer_control_constructor_default(): - tcc = TapChangerControl() + tcc = TapChangerControl(mrid=generate_id()) verify_regulating_control_constructor_default(tcc) diff --git a/test/cim/iec61970/base/wires/test_transformer_end.py b/test/cim/iec61970/base/wires/test_transformer_end.py index 5d8c0524f..1422cad24 100644 --- a/test/cim/iec61970/base/wires/test_transformer_end.py +++ b/test/cim/iec61970/base/wires/test_transformer_end.py @@ -4,7 +4,9 @@ # 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 zepben.ewb import Terminal, BaseVoltage, TransformerStarImpedance, PowerTransformer, Fuse + +from util import mrid_strategy +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 @@ -17,14 +19,24 @@ "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), - "terminal": builds(Terminal), - "base_voltage": builds(BaseVoltage), + "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) + "star_impedance": builds(TransformerStarImpedance, mrid=mrid_strategy) } -transformer_end_args = [*identified_object_args, True, 1.1, 2.2, RatioTapChanger(), Terminal(), BaseVoltage(), 3, TransformerStarImpedance()] +transformer_end_args = [ + *identified_object_args, + True, + 1.1, + 2.2, + RatioTapChanger(mrid=generate_id()), + Terminal(mrid=generate_id()), + BaseVoltage(mrid=generate_id()), + 3, + TransformerStarImpedance(mrid=generate_id()) +] def verify_transformer_end_constructor_default(te: TransformerEnd): @@ -67,9 +79,9 @@ def verify_transformer_end_constructor_args(te: TransformerEnd): def test_allow_terminal_with_no_conducting_equipment(): - te = TransformerEnd() + te = TransformerEnd(mrid=generate_id()) - terminal = Terminal() + terminal = Terminal(mrid=generate_id()) te.terminal = terminal assert te.terminal == terminal @@ -84,8 +96,8 @@ def test_terminal_must_belong_to_power_transformer(): r"Fuse\[fuse_mrid\] rather than a PowerTransformer."): te.terminal = t1 - t2 = Terminal() - t2.conducting_equipment = PowerTransformer() + t2 = Terminal(mrid=generate_id()) + t2.conducting_equipment = PowerTransformer(mrid=generate_id()) te.terminal = t2 assert te.terminal == t2 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 a2514c920..3df767930 100644 --- a/test/cim/iec61970/base/wires/test_transformer_star_impedance.py +++ b/test/cim/iec61970/base/wires/test_transformer_star_impedance.py @@ -4,7 +4,9 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis import given from hypothesis.strategies import floats, builds -from zepben.ewb import TransformerStarImpedance, TransformerEndInfo + +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, \ @@ -16,14 +18,14 @@ "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) + "transformer_end_info": builds(TransformerEndInfo, mrid=mrid_strategy) } -transformer_star_impedance_args = [*identified_object_args, 1.1, 2.2, 3.3, 4.4, TransformerEndInfo()] +transformer_star_impedance_args = [*identified_object_args, 1.1, 2.2, 3.3, 4.4, TransformerEndInfo(mrid=generate_id())] def test_transformer_star_impedance_constructor_default(): - tsi = TransformerStarImpedance() + tsi = TransformerStarImpedance(mrid=generate_id()) verify_identified_object_constructor_default(tsi) assert tsi.r is None diff --git a/test/cim/iec61970/infiec61970/feeder/test_circuit.py b/test/cim/iec61970/infiec61970/feeder/test_circuit.py index 6b3a61701..0a39e7012 100644 --- a/test/cim/iec61970/infiec61970/feeder/test_circuit.py +++ b/test/cim/iec61970/infiec61970/feeder/test_circuit.py @@ -5,24 +5,26 @@ from hypothesis import given from hypothesis.strategies import builds, lists -from zepben.ewb import Circuit, Loop, Terminal, Substation + +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, \ line_args -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered circuit_kwargs = { **line_kwargs, - "loop": builds(Loop), - "end_terminals": lists(builds(Terminal)), - "end_substations": lists(builds(Substation)) + "loop": builds(Loop, mrid=mrid_strategy), + "end_terminals": lists(builds(Terminal, mrid=mrid_strategy)), + "end_substations": lists(builds(Substation, mrid=mrid_strategy)) } -circuit_args = [*line_args, Loop(), [Terminal], [Substation]] +circuit_args = [*line_args, Loop(mrid=generate_id()), [Terminal(mrid=generate_id())], [Substation(mrid=generate_id())]] def test_circuit_constructor_default(): - c = Circuit() + c = Circuit(mrid=generate_id()) verify_line_constructor_default(c) assert not c.loop @@ -52,7 +54,7 @@ def test_circuit_constructor_args(): def test_end_terminals_collection(): - validate_unordered_1234567890( + validate_unordered( Circuit, lambda mrid: Terminal(mrid), Circuit.end_terminals, @@ -65,7 +67,7 @@ def test_end_terminals_collection(): def test_end_substations_collection(): - validate_unordered_1234567890( + validate_unordered( Circuit, lambda mrid: Substation(mrid), Circuit.end_substations, diff --git a/test/cim/iec61970/infiec61970/feeder/test_loop.py b/test/cim/iec61970/infiec61970/feeder/test_loop.py index 77196d445..043b3d8ac 100644 --- a/test/cim/iec61970/infiec61970/feeder/test_loop.py +++ b/test/cim/iec61970/infiec61970/feeder/test_loop.py @@ -4,24 +4,26 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis import given from hypothesis.strategies import builds, lists -from zepben.ewb import Loop, Circuit, Substation + +from util import mrid_strategy +from zepben.ewb import Loop, Circuit, Substation, generate_id 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 -from cim.private_collection_validator import validate_unordered_1234567890 +from cim.private_collection_validator import validate_unordered loop_kwargs = { **identified_object_kwargs, - "circuits": lists(builds(Circuit)), - "substations": lists(builds(Substation)), - "energizing_substations": lists(builds(Substation)) + "circuits": lists(builds(Circuit, mrid=mrid_strategy)), + "substations": lists(builds(Substation, mrid=mrid_strategy)), + "energizing_substations": lists(builds(Substation, mrid=mrid_strategy)) } -loop_args = [*identified_object_args, [Circuit()], [Substation()], [Substation()]] +loop_args = [*identified_object_args, [Circuit(mrid=generate_id())], [Substation(mrid=generate_id())], [Substation(mrid=generate_id())]] def test_loop_constructor_default(): - loop = Loop() + loop = Loop(mrid=generate_id()) verify_identified_object_constructor_default(loop) assert not list(loop.circuits) @@ -56,7 +58,7 @@ def test_loop_constructor_args(): def test_circuits_collection(): - validate_unordered_1234567890( + validate_unordered( Loop, lambda mrid: Circuit(mrid), Loop.circuits, @@ -69,7 +71,7 @@ def test_circuits_collection(): def test_substations_collection(): - validate_unordered_1234567890( + validate_unordered( Loop, lambda mrid: Substation(mrid), Loop.substations, @@ -82,7 +84,7 @@ def test_substations_collection(): def test_energizing_substations_collection(): - validate_unordered_1234567890( + validate_unordered( Loop, lambda mrid: Substation(mrid), Loop.energizing_substations, diff --git a/test/cim/iec61970/infiec61970/feeder/test_lv_feeder.py b/test/cim/iec61970/infiec61970/feeder/test_lv_feeder.py index a79c10010..8fb2f7ad8 100644 --- a/test/cim/iec61970/infiec61970/feeder/test_lv_feeder.py +++ b/test/cim/iec61970/infiec61970/feeder/test_lv_feeder.py @@ -4,26 +4,34 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from hypothesis import given from hypothesis.strategies import builds, lists -from zepben.ewb import Terminal, Equipment, LvFeeder + +from util import mrid_strategy +from zepben.ewb import Terminal, Equipment, LvFeeder, generate_id 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_1234567890 +from cim.private_collection_validator import validate_unordered lv_feeder_kwargs = { **equipment_container_kwargs, - "normal_head_terminal": builds(Terminal), - "normal_energizing_feeders": lists(builds(Feeder), max_size=2), - "current_equipment": lists(builds(Equipment), max_size=2), - "current_energizing_feeders": lists(builds(Feeder), max_size=2) + "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) } -lv_feeder_args = [*equipment_container_args, Terminal(), {"f": Feeder()}, {"ce": Equipment()}, {"cef": Feeder()}] +lv_feeder_args = [ + *equipment_container_args, + Terminal(mrid=generate_id()), + {"f": Feeder(mrid=generate_id())}, + {"ce": Equipment(mrid=generate_id())}, + {"cef": Feeder(mrid=generate_id())} +] def test_lv_feeder_constructor_default(): - lvf = LvFeeder() + lvf = LvFeeder(mrid=generate_id()) verify_equipment_container_constructor_default(lvf) assert not lvf.normal_head_terminal @@ -64,7 +72,7 @@ def test_lv_feeder_constructor_args(): def test_current_equipment_collection(): - validate_unordered_1234567890( + validate_unordered( LvFeeder, lambda mrid: Equipment(mrid), LvFeeder.current_equipment, @@ -77,7 +85,7 @@ def test_current_equipment_collection(): def test_normal_energizing_feeder_collection(): - validate_unordered_1234567890( + validate_unordered( LvFeeder, lambda mrid: Feeder(mrid), LvFeeder.normal_energizing_feeders, @@ -90,7 +98,7 @@ def test_normal_energizing_feeder_collection(): def test_current_energizing_feeder_collection(): - validate_unordered_1234567890( + validate_unordered( LvFeeder, lambda mrid: Feeder(mrid), LvFeeder.current_energizing_feeders, 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 e1f171268..03fa927cd 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 @@ -6,14 +6,14 @@ 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 -from zepben.ewb import EvChargingUnit +from zepben.ewb import EvChargingUnit, generate_id ev_charging_unit_kwargs = power_electronics_unit_kwargs ev_charging_unit_args = power_electronics_unit_args def test_ev_charging_unit_constructor_default(): - verify_power_electronics_unit_constructor_default(EvChargingUnit()) + verify_power_electronics_unit_constructor_default(EvChargingUnit(mrid=generate_id())) @given(**ev_charging_unit_kwargs) diff --git a/test/cim/private_collection_validator.py b/test/cim/private_collection_validator.py index 1b0f4aa05..f16d8495f 100644 --- a/test/cim/private_collection_validator.py +++ b/test/cim/private_collection_validator.py @@ -17,8 +17,8 @@ _U = Union[UIdentifiedObject, UOther] -def validate_unordered_1234567890( - create_it: Callable[[], TIdentifiedObject], +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] @@ -37,8 +37,8 @@ class method doesn't recognise it needs the `self` parameter, and therefore mark _validate_unordered(create_it, create_other, get_all.fget, num, get_by_id, add, remove, clear) -def validate_unordered_other_1234567890( - create_it: Callable[[], TIdentifiedObject], +def validate_unordered_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] @@ -59,8 +59,8 @@ class method doesn't recognise it needs the `self` parameter, and therefore mark _validate_unordered_other(create_it, create_other, get_all.fget, num, get_by_key, add, remove, clear, get_key, key_to_str) -def validate_ordered_1234567890( - create_it: Callable[[], TIdentifiedObject], +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] @@ -84,8 +84,8 @@ class method doesn't recognise it needs the `self` parameter, and therefore mark _validate_ordered(create_it, create_other, get_all.fget, num, get_by_id, get_by_index, add, remove, clear, index_of) -def validate_ordered_other_1234567890( - create_it: Callable[[], TIdentifiedObject], +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] @@ -110,7 +110,7 @@ class method doesn't recognise it needs the `self` parameter, and therefore mark def _validate_unordered( - create_it: Callable[[], TIdentifiedObject], + create_it: Union[Callable[[str], TIdentifiedObject], Type[IdentifiedObject]], create_other: Callable[[str], UIdentifiedObject], get_all: Callable[[TIdentifiedObject], Generator[UIdentifiedObject, None, None]], num: Callable[[TIdentifiedObject], int], @@ -126,7 +126,7 @@ def _validate_unordered( 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. """ - it = create_it() + it = create_it("test") other1 = create_other("1") other2 = create_other("2") other3 = create_other("3") @@ -167,7 +167,7 @@ def validate_after_removal(): # signatures are stored in comments against the arguments. # def _validate_unordered_other( - create_it: Callable[[], TIdentifiedObject], + 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] @@ -181,7 +181,7 @@ def _validate_unordered_other( """ Validate the internal collection for an associated object that is not an [IdentifiedObject] that has no order significance. """ - it = create_it() + it = create_it("test") other1 = create_other(1) other2 = create_other(2) other3 = create_other(3) @@ -227,7 +227,7 @@ def validate_after_removal(): # signatures are stored in comments against the arguments. # def _validate_ordered( - create_it: Callable[[], TIdentifiedObject], + 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] @@ -244,7 +244,7 @@ def _validate_ordered( NOTE: Baked in index is expected to be 1-based, not 0-based. """ - it = create_it() + it = create_it("test") other1 = create_other("1", 1) other2 = create_other("2", 2) other_auto = create_other("3", 0) @@ -300,7 +300,7 @@ def validate_after_removal(): def _validate_ordered_other( - create_it: Callable[[], TIdentifiedObject], + create_it: Union[Callable[[str], TIdentifiedObject], Type[IdentifiedObject]], create_other: Callable[[int], UOther], get_all: Callable[[TIdentifiedObject], Generator[UOther, None, None]], num: Callable[[TIdentifiedObject], int], @@ -312,7 +312,7 @@ def _validate_ordered_other( remove_at_index: Callable[[TIdentifiedObject, int], UOther], clear: Callable[[TIdentifiedObject], TIdentifiedObject], ): - it = create_it() + it = create_it("test") other1 = create_other(1) other2 = create_other(2) other3 = create_other(3) diff --git a/test/cim/property_validator.py b/test/cim/property_validator.py index 46f4de264..0aa41009d 100644 --- a/test/cim/property_validator.py +++ b/test/cim/property_validator.py @@ -7,10 +7,10 @@ def validate_property_accessor(t, info, prop): - obj = t() + obj = t("test") assert getattr(obj, prop.fget.__name__) is None - iobj = info() + iobj = info("info") setattr(obj, prop.fset.__name__, iobj) assert getattr(obj, prop.fget.__name__) is iobj diff --git a/test/database/sqlite/customer/test_customer_database_schema.py b/test/database/sqlite/customer/test_customer_database_schema.py index 311a3c14b..9b611fb8e 100644 --- a/test/database/sqlite/customer/test_customer_database_schema.py +++ b/test/database/sqlite/customer/test_customer_database_schema.py @@ -33,7 +33,7 @@ def create_comparator(self) -> TComparator: return CustomerServiceComparator() def create_identified_object(self) -> IdentifiedObject: - return Customer() + return Customer(mrid="test") ################### # IEC61968 Common # diff --git a/test/database/sqlite/customer/test_customer_service_writer.py b/test/database/sqlite/customer/test_customer_service_writer.py index f9299e56b..f6c1bbd2b 100644 --- a/test/database/sqlite/customer/test_customer_service_writer.py +++ b/test/database/sqlite/customer/test_customer_service_writer.py @@ -5,7 +5,7 @@ from unittest.mock import create_autospec, call from capture_mock_sequence import CaptureMockSequence -from zepben.ewb import CustomerService, CustomerCimWriter, Customer, CustomerServiceWriter, CustomerDatabaseTables +from zepben.ewb import CustomerService, CustomerCimWriter, Customer, CustomerServiceWriter, CustomerDatabaseTables, generate_id class TestCustomerServiceWriter: @@ -26,7 +26,7 @@ def setup_method(self): ) def test_passes_objects_through_to_the_cim_writer(self): - customer = Customer() + customer = Customer(mrid=generate_id()) self.customer_service.add(customer) # NOTE: the save method will fail due to the relaxed mock returning false for all save operations, diff --git a/test/database/sqlite/diagram/test_diagram_database_schema.py b/test/database/sqlite/diagram/test_diagram_database_schema.py index bc6fae07e..781ab9169 100644 --- a/test/database/sqlite/diagram/test_diagram_database_schema.py +++ b/test/database/sqlite/diagram/test_diagram_database_schema.py @@ -34,7 +34,7 @@ def create_comparator(self) -> TComparator: return DiagramServiceComparator() def create_identified_object(self) -> IdentifiedObject: - return DiagramObject() + return DiagramObject(mrid="test") ################################ # IEC61970 Base Diagram Layout # diff --git a/test/database/sqlite/diagram/test_diagram_service_writer.py b/test/database/sqlite/diagram/test_diagram_service_writer.py index 8ebdc4466..c38a4e172 100644 --- a/test/database/sqlite/diagram/test_diagram_service_writer.py +++ b/test/database/sqlite/diagram/test_diagram_service_writer.py @@ -5,7 +5,7 @@ from unittest.mock import create_autospec, call from capture_mock_sequence import CaptureMockSequence -from zepben.ewb import DiagramService, DiagramCimWriter, DiagramServiceWriter, DiagramDatabaseTables +from zepben.ewb import DiagramService, DiagramCimWriter, DiagramServiceWriter, DiagramDatabaseTables, generate_id from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram import Diagram @@ -27,7 +27,7 @@ def setup_method(self): ) def test_passes_objects_through_to_the_cim_writer(self): - diagram = Diagram() + diagram = Diagram(mrid=generate_id()) self.diagram_service.add(diagram) # NOTE: the save method will fail due to the relaxed mock returning false for all save operations, diff --git a/test/database/sqlite/network/test_network_cim_writer.py b/test/database/sqlite/network/test_network_cim_writer.py index 2cf416c0c..e439ab5ff 100644 --- a/test/database/sqlite/network/test_network_cim_writer.py +++ b/test/database/sqlite/network/test_network_cim_writer.py @@ -7,7 +7,7 @@ from util import import_submodules, all_subclasses from zepben.ewb import TableEquipmentEquipmentContainers, PreparedStatement, NetworkDatabaseTables, NetworkCimWriter, EquipmentContainer, Site, Substation, \ - Circuit, Feeder, LvFeeder, Junction + Circuit, Feeder, LvFeeder, Junction, generate_id def test_only_exports_equipment_for_expected_equipment_containers(): @@ -31,7 +31,7 @@ def test_only_exports_equipment_for_expected_equipment_containers(): assert {it.__class__ for it in (should_export + should_ignore)} == all_equipment_container_classes, "Should be checking all EquipmentContainer subclasses" - junction = Junction() + junction = Junction(mrid=generate_id()) for it in should_export: junction.add_container(it) for it in should_ignore: diff --git a/test/database/sqlite/network/test_network_database_schema.py b/test/database/sqlite/network/test_network_database_schema.py index 85f599f90..f5410c76e 100644 --- a/test/database/sqlite/network/test_network_database_schema.py +++ b/test/database/sqlite/network/test_network_database_schema.py @@ -109,7 +109,7 @@ def create_comparator(self) -> TComparator: return NetworkServiceComparator() def create_identified_object(self) -> IdentifiedObject: - return Junction() + return Junction(mrid="test") @unittest.skip("Only load real files on demand, not as part of the actual test suite") @pytest.mark.timeout(65536) diff --git a/test/database/sqlite/network/test_network_service_writer.py b/test/database/sqlite/network/test_network_service_writer.py index f1e01fb8d..4a9a80965 100644 --- a/test/database/sqlite/network/test_network_service_writer.py +++ b/test/database/sqlite/network/test_network_service_writer.py @@ -5,7 +5,7 @@ from unittest.mock import create_autospec, call from capture_mock_sequence import CaptureMockSequence -from zepben.ewb import NetworkService, NetworkCimWriter, NetworkServiceWriter, NetworkDatabaseTables, Circuit +from zepben.ewb import NetworkService, NetworkCimWriter, NetworkServiceWriter, NetworkDatabaseTables, Circuit, generate_id class TestNetworkServiceWriter: @@ -26,7 +26,7 @@ def setup_method(self): ) def test_passes_objects_through_to_the_cim_writer(self): - circuit = Circuit() + circuit = Circuit(mrid=generate_id()) self.network_service.add(circuit) # NOTE: the save method will fail due to the relaxed mock returning false for all save operations, diff --git a/test/database/sqlite/schema_utils.py b/test/database/sqlite/schema_utils.py index ffad87391..33ee28c05 100644 --- a/test/database/sqlite/schema_utils.py +++ b/test/database/sqlite/schema_utils.py @@ -14,7 +14,8 @@ 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 + ProtectionRelayFunction, Sensor, ProtectionRelayScheme, ProtectionRelaySystem, Fuse, TBaseService, TIdentifiedObject, SynchronousMachine, BatteryUnit, \ + generate_id 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 @@ -101,12 +102,12 @@ def network_services_of(self, factory: Type[T], filled: T) -> NetworkService: @staticmethod def _fill_required(service: NetworkService, io: T) -> T: if isinstance(io, EnergyConsumerPhase): - ec = EnergyConsumer() + ec = EnergyConsumer(mrid=generate_id()) ec.add_phase(io) service.add(ec) io.energy_consumer = ec elif isinstance(io, EnergySourcePhase): - es = EnergySource() + es = EnergySource(mrid=generate_id()) es.add_phase(io) service.add(es) io.energy_source = es diff --git a/test/network_fixtures.py b/test/network_fixtures.py index 17624592f..dc03989ac 100644 --- a/test/network_fixtures.py +++ b/test/network_fixtures.py @@ -30,7 +30,7 @@ from zepben.ewb.model.cim.iec61970.base.wires.power_transformer_end import PowerTransformerEnd from zepben.ewb.services.network.tracing.feeder.assign_to_feeders import AssignToFeeders from zepben.ewb.testing.test_network_builder import TestNetworkBuilder -from zepben.ewb.util import CopyableUUID +from zepben.ewb.util import generate_id def create_terminals(network: NetworkService, ce: ConductingEquipment, num_terms: int, phases: PhaseCode = PhaseCode.ABCN) -> List[Terminal]: @@ -56,7 +56,7 @@ def create_terminal(network: NetworkService, ce: Optional[ConductingEquipment], terminal = Terminal(mrid=f"{ce.mrid}_t{len(list(ce.terminals)) + 1}", conducting_equipment=ce, phases=phases, sequence_number=sequence_number) ce.add_terminal(terminal) else: - terminal = Terminal(phases=phases, sequence_number=sequence_number) + terminal = Terminal(mrid=generate_id(), phases=phases, sequence_number=sequence_number) network.add(terminal) return terminal @@ -72,7 +72,7 @@ def create_connectivitynode_with_terminals(ns: NetworkService, mrid: str, *termi def create_junction_for_connecting(network: NetworkService, mrid: str = "", num_terms: int = 0, phases: PhaseCode = PhaseCode.ABCN) -> Junction: if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() junction = Junction(mrid=mrid, name="test junction") create_terminals(network, junction, num_terms, phases) @@ -82,11 +82,11 @@ def create_junction_for_connecting(network: NetworkService, mrid: str = "", num_ def create_source_for_connecting(network: NetworkService, mrid: str = "", num_terms: int = 0, phases: PhaseCode = PhaseCode.ABCN) -> EnergySource: if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() source = EnergySource(mrid=mrid) for phase in phases.single_phases: - esp = EnergySourcePhase(energy_source=source, phase=phase) + esp = EnergySourcePhase(mrid=f"{mrid}-{phase}", energy_source=source, phase=phase) source.add_phase(esp) network.add(esp) @@ -99,7 +99,7 @@ def create_source_for_connecting(network: NetworkService, mrid: str = "", num_te def create_switch_for_connecting(network: NetworkService, mrid: str = "", num_terms: int = 0, phases: PhaseCode = PhaseCode.ABC, normal_phase_states: List[bool] = None, current_phase_states: List[bool] = None) -> Breaker: if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() cb = Breaker(mrid=mrid, name="test breaker") create_terminals(network, cb, num_terms, phases) @@ -143,7 +143,7 @@ def create_asset_owner(network: NetworkService, company: str, customer_service: def create_meter(network: NetworkService, mrid: str = "") -> Meter: if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() meter = Meter(mrid=mrid, name=f"companyMeterId{mrid}") meter.add_organisation_role(create_asset_owner(network, f"company{mrid}")) @@ -158,7 +158,7 @@ def create_power_transformer_for_connecting(network: NetworkService, mrid: str = can be passed to the `PowerTransformerEnd` constructor. Keep in mind CIM recommends the HV end is first in the list. """ if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() pt = PowerTransformer(mrid=mrid, name="test powertransformer") terminals = create_terminals(network, pt, num_terms, phases) @@ -184,7 +184,7 @@ def create_acls_for_connecting(network: NetworkService, mrid: str = "", phases: plsi_mrid: str = "perLengthSequenceImepedance", wi_mrid: str = "wireInfo") -> AcLineSegment: if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() try: plsi = network.get(plsi_mrid, PerLengthSequenceImpedance) @@ -208,7 +208,7 @@ def create_acls_for_connecting(network: NetworkService, mrid: str = "", phases: def create_energy_consumer_for_connecting(network: NetworkService, mrid: str = "", num_terms: int = 0, phases: PhaseCode = PhaseCode.ABCN) -> EnergyConsumer: if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() ec = EnergyConsumer(mrid=mrid, name=f"{mrid}-name") create_terminals(network, ec, num_terms, phases) @@ -218,7 +218,7 @@ def create_energy_consumer_for_connecting(network: NetworkService, mrid: str = " def create_geographical_region(network: NetworkService, mrid: str = "", name: str = "") -> GeographicalRegion: if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() gr = GeographicalRegion(mrid=mrid, name=name) network.add(gr) @@ -227,7 +227,7 @@ def create_geographical_region(network: NetworkService, mrid: str = "", name: st def create_subgeographical_region(network: NetworkService, mrid: str = "", name: str = "", gr: GeographicalRegion = None) -> SubGeographicalRegion: if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() sgr = SubGeographicalRegion(mrid=mrid, name=name) if gr is not None: @@ -240,7 +240,7 @@ def create_subgeographical_region(network: NetworkService, mrid: str = "", name: def create_substation(network: NetworkService, mrid: str = "", name: str = "", sgr: SubGeographicalRegion = None) -> Substation: if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() sub = Substation(mrid=mrid, name=name, sub_geographical_region=sgr) if sgr is not None: @@ -256,7 +256,7 @@ def create_feeder(network: NetworkService, mrid: str = "", name: str = "", sub: `equipment_mrids` Equipment to fetch from the network and add to this feeder. """ if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() feeder = Feeder(mrid=mrid, name=name, normal_head_terminal=head_terminal, normal_energizing_substation=sub) if sub: sub.add_feeder(feeder) @@ -276,7 +276,7 @@ def create_lv_feeder(network: NetworkService, mrid: str = "", name: str = "", fe `equipment_mrids` Equipment to fetch from the network and add to this feeder. """ if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() lv_feeder = LvFeeder(mrid=mrid, name=name, normal_head_terminal=head_terminal, normal_energizing_feeders=[feeder] if feeder is not None else None) if feeder: feeder.add_normal_energized_lv_feeder(lv_feeder) @@ -292,7 +292,7 @@ def create_lv_feeder(network: NetworkService, mrid: str = "", name: str = "", fe def create_operational_restriction(network: NetworkService, mrid: str = "", name: str = "", *equipment_mrids: str, **document_kwargs): if not mrid: - mrid = str(CopyableUUID()) + mrid = generate_id() restriction = OperationalRestriction(mrid=mrid, name=name, **document_kwargs) network.add(restriction) @@ -309,7 +309,7 @@ def add_location(network: NetworkService, psr: PowerSystemResource, *coords: flo `coords` XY/longlats to use for the PositionPoint for this location. Must be an even number of coords. :return: """ - loc = Location() + loc = Location(mrid=f"{psr.mrid}-loc") # noinspection PyTypeChecker for i in range(0, len(coords), 2): # noinspection PyArgumentList, PyUnresolvedReferences diff --git a/test/services/common/test_base_service.py b/test/services/common/test_base_service.py index dca83df21..0fa611c77 100644 --- a/test/services/common/test_base_service.py +++ b/test/services/common/test_base_service.py @@ -16,7 +16,7 @@ Circuit, Substation, ConnectivityNodeContainer, Equipment, EnergySourcePhase, ConnectivityNode, BaseVoltage, \ Control, RemoteControl, RemoteSource, Loop, AssetInfo, \ OrganisationRole, Document, LvFeeder, EvChargingUnit, TapChangerControl, BatteryControl, PanDemandResponseFunction, \ - StaticVarCompensator + StaticVarCompensator, generate_id from zepben.ewb.model.cim.iec61970.base.wires.linear_shunt_compensator import LinearShuntCompensator from zepben.ewb.model.cim.iec61970.base.wires.power_electronics_connection_phase import PowerElectronicsConnectionPhase from zepben.ewb.model.cim.iec61970.base.wires.per_length_sequence_impedance import PerLengthSequenceImpedance @@ -223,9 +223,9 @@ def test_objects(): def test_objects_exclude(service: BaseService): - b1 = Breaker() - acls1 = AcLineSegment() - j1 = Junction() + b1 = Breaker(mrid=generate_id()) + acls1 = AcLineSegment(mrid=generate_id()) + j1 = Junction(mrid=generate_id()) service.add(b1) service.add(acls1) @@ -235,7 +235,7 @@ def test_objects_exclude(service: BaseService): def test_contains(service: BaseService): - breaker = Breaker() + breaker = Breaker(mrid=generate_id()) service.add(breaker) assert breaker.mrid in service @@ -243,7 +243,7 @@ def test_contains(service: BaseService): def test_unresolved_references_by_id(service: BaseService): - breaker = Breaker() + breaker = Breaker(mrid=generate_id()) service.add(breaker) service.resolve_or_defer_reference(resolver.ce_terminals(breaker), "terminal") @@ -269,8 +269,8 @@ def _add_and_check(service: BaseService, to_add, to_check: Union[IdentifiedObjec def _create_objects_test(service, type_): - obj = type_() - io = IdentifiedObject() + obj = type_(mrid=generate_id()) + io = IdentifiedObject(mrid=generate_id()) service.add(obj) service.add(io) for obj in service.objects(type_): diff --git a/test/services/common/test_reference_resolvers.py b/test/services/common/test_reference_resolvers.py index b505e2402..ac5e61b0e 100644 --- a/test/services/common/test_reference_resolvers.py +++ b/test/services/common/test_reference_resolvers.py @@ -3,15 +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 zepben.ewb import NetworkService, AcLineSegment, Pole, Streetlight, PowerTransformerInfo, PowerTransformer -from zepben.ewb.model.cim.iec61970.base.wires.per_length_sequence_impedance import PerLengthSequenceImpedance +from zepben.ewb import NetworkService, AcLineSegment, Pole, Streetlight, PowerTransformerInfo, PowerTransformer, generate_id from zepben.ewb import resolver +from zepben.ewb.model.cim.iec61970.base.wires.per_length_sequence_impedance import PerLengthSequenceImpedance def test_resolves_acls_plsi(): ns = NetworkService() - plsi = PerLengthSequenceImpedance() - acls = AcLineSegment(per_length_impedance=plsi) + plsi = PerLengthSequenceImpedance(mrid=generate_id()) + acls = AcLineSegment(mrid=generate_id(), per_length_impedance=plsi) br = resolver.per_length_impedance(acls) ns.resolve_or_defer_reference(br, plsi.mrid) assert plsi.mrid in ns.get_unresolved_reference_mrids_by_resolver(br) @@ -30,8 +30,8 @@ def test_resolves_acls_plsi(): def test_resolves_pt_pti(): ns = NetworkService() - pti = PowerTransformerInfo() - pt = PowerTransformer() + pti = PowerTransformerInfo(mrid=generate_id()) + pt = PowerTransformer(mrid=generate_id()) pt.asset_info = pti br = resolver.power_transformer_info(pt) @@ -54,8 +54,8 @@ def test_resolves_pt_pti(): def test_resolves_pole_streetlight(): ns = NetworkService() - pole = Pole() - streetlight = Streetlight(pole=pole) + pole = Pole(mrid=generate_id()) + streetlight = Streetlight(mrid=generate_id(), pole=pole) pole.add_streetlight(streetlight) br = resolver.streetlights(pole) ns.resolve_or_defer_reference(br, streetlight.mrid) diff --git a/test/services/common/translator/base_test_translator.py b/test/services/common/translator/base_test_translator.py index ebfa2b970..ff1536a3c 100644 --- a/test/services/common/translator/base_test_translator.py +++ b/test/services/common/translator/base_test_translator.py @@ -59,7 +59,7 @@ def validate_service_translations( def run_test(cim): nonlocal processing processing = f"blank {desc}" - blank = type(cim)() + blank = type(cim)(mrid="blank") # Convert the blank object to protobuf and ensure it didn't get converted to an instance of PBIdentifiedObject, # which indicates a missing `to_pb` implementation or import. diff --git a/test/services/network/test_energy_source_phase.py b/test/services/network/test_energy_source_phase.py index 401de986c..b07c6f2dc 100644 --- a/test/services/network/test_energy_source_phase.py +++ b/test/services/network/test_energy_source_phase.py @@ -2,7 +2,7 @@ # 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 zepben.ewb import NetworkService, EnergySourcePhase +from zepben.ewb import NetworkService, EnergySourcePhase, generate_id class TestNetworkService(object): @@ -10,7 +10,7 @@ class TestNetworkService(object): def test_objects(self): network = NetworkService() - esf = EnergySourcePhase() + esf = EnergySourcePhase(mrid=generate_id()) network.add(esf) for obj in network.objects(EnergySourcePhase): diff --git a/test/services/network/test_network.py b/test/services/network/test_network.py index 729f5935f..85c30cd0d 100644 --- a/test/services/network/test_network.py +++ b/test/services/network/test_network.py @@ -2,7 +2,7 @@ # 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 zepben.ewb import NetworkService, BaseVoltage +from zepben.ewb import NetworkService, BaseVoltage, generate_id class TestNetworkService(object): @@ -10,7 +10,7 @@ class TestNetworkService(object): def test_objects(self): network = NetworkService() - bv = BaseVoltage() + bv = BaseVoltage(mrid=generate_id()) network.add(bv) for obj in network.objects(BaseVoltage): diff --git a/test/services/network/test_network_extensions.py b/test/services/network/test_network_extensions.py index 89061d00f..d6622770a 100644 --- a/test/services/network/test_network_extensions.py +++ b/test/services/network/test_network_extensions.py @@ -8,7 +8,7 @@ from zepben.ewb import NetworkService, BaseVoltage, Terminal, EnergySource, \ PowerTransformer, AcLineSegment, EnergyConsumer, PowerTransformerInfo, Location, \ - ConnectivityNode, Breaker + ConnectivityNode, Breaker, generate_id from zepben.ewb.model.cim.iec61968.common.position_point import PositionPoint NetworkCreator = namedtuple("TestNetworkCreator", ["net", "bv", "cn1", "cn2", "pt_info", "loc1", "loc2", "loc3"]) @@ -17,22 +17,22 @@ @fixture() def tnc(): net = NetworkService() - bv = BaseVoltage() - cn1 = ConnectivityNode() - cn2 = ConnectivityNode() - pt_info = PowerTransformerInfo() + bv = BaseVoltage(mrid=generate_id()) + cn1 = ConnectivityNode(mrid=generate_id()) + cn2 = ConnectivityNode(mrid=generate_id()) + pt_info = PowerTransformerInfo(mrid=generate_id()) # noinspection PyArgumentList point1 = PositionPoint(x_position=149.12791965570293, y_position=-35.277592101000934) # noinspection PyArgumentList point2 = PositionPoint(x_position=149.12779472660375, y_position=-35.278183862759285) - loc1 = Location().add_point(point1) - loc2 = Location().add_point(point2) - loc3 = Location().add_point(point2).add_point(point2) + loc1 = Location(mrid=generate_id()).add_point(point1) + loc2 = Location(mrid=generate_id()).add_point(point2) + loc3 = Location(mrid=generate_id()).add_point(point2).add_point(point2) yield NetworkCreator(net=net, bv=bv, cn1=cn1, cn2=cn2, pt_info=pt_info, loc1=loc1, loc2=loc2, loc3=loc3) def test_create_energy_source(tnc): - ce1 = tnc.net.create_energy_source(cn=tnc.cn1) + ce1 = tnc.net.create_energy_source(mrid=generate_id(), cn=tnc.cn1) ce2 = tnc.net.get(ce1.mrid) assert ce1 is ce2 assert isinstance(ce1, EnergySource) @@ -43,7 +43,7 @@ def test_create_energy_source(tnc): def test_create_energy_consumer(tnc): - ce1 = tnc.net.create_energy_consumer(cn=tnc.cn1, location=tnc.loc1) + ce1 = tnc.net.create_energy_consumer(mrid=generate_id(), cn=tnc.cn1, location=tnc.loc1) ce2 = tnc.net.get(ce1.mrid) assert ce1 is ce2 assert ce2.num_terminals() == 1 @@ -55,8 +55,13 @@ def test_create_energy_consumer(tnc): def test_create_two_winding_power_transformer(tnc): - tnc.net.create_two_winding_power_transformer(cn1=tnc.cn1, cn2=tnc.cn2, asset_info=tnc.pt_info, - location=tnc.loc1) + tnc.net.create_two_winding_power_transformer( + mrid=generate_id(), + cn1=tnc.cn1, + cn2=tnc.cn2, + asset_info=tnc.pt_info, + location=tnc.loc1 + ) objects = tnc.net.objects(PowerTransformer) for ce in objects: pt: PowerTransformer = ce @@ -69,7 +74,7 @@ def test_create_two_winding_power_transformer(tnc): def test_create_ac_line_segment(tnc): - ce1 = tnc.net.create_ac_line_segment(cn1=tnc.cn1, cn2=tnc.cn2, location=tnc.loc3) + ce1 = tnc.net.create_ac_line_segment(mrid=generate_id(), cn1=tnc.cn1, cn2=tnc.cn2, location=tnc.loc3) ce2 = tnc.net.get(ce1.mrid) assert ce1 is ce2 t: Terminal = ce1.get_terminal_by_sn(1) @@ -81,7 +86,7 @@ def test_create_ac_line_segment(tnc): def test_create_breaker(tnc): - b1 = tnc.net.create_breaker(cn1=tnc.cn1, cn2=tnc.cn2, location=tnc.loc3) + b1 = tnc.net.create_breaker(mrid=generate_id(), cn1=tnc.cn1, cn2=tnc.cn2, location=tnc.loc3) b2 = tnc.net.get(b1.mrid) assert b1 is b2 assert isinstance(b1, Breaker) diff --git a/test/services/network/tracing/connectivity/test_connectivity_result.py b/test/services/network/tracing/connectivity/test_connectivity_result.py index b55a768e5..19dd345ab 100644 --- a/test/services/network/tracing/connectivity/test_connectivity_result.py +++ b/test/services/network/tracing/connectivity/test_connectivity_result.py @@ -4,13 +4,13 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from collections import Counter -from zepben.ewb import Terminal, PhaseCode, SinglePhaseKind, NominalPhasePath, ConnectivityResult +from zepben.ewb import Terminal, PhaseCode, SinglePhaseKind, NominalPhasePath, ConnectivityResult, generate_id from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction class TestConnectivityResult: - terminal11, terminal12 = Terminal(phases=PhaseCode.A), Terminal(phases=PhaseCode.A) - terminal21, terminal22 = Terminal(phases=PhaseCode.A), Terminal(phases=PhaseCode.A) + terminal11, terminal12 = Terminal(mrid=generate_id(), phases=PhaseCode.A), Terminal(mrid=generate_id(), phases=PhaseCode.A) + terminal21, terminal22 = Terminal(mrid=generate_id(), phases=PhaseCode.A), Terminal(mrid=generate_id(), phases=PhaseCode.A) asset1 = Junction(mrid="asset1", name="asset 1", terminals=[terminal11, terminal12]) asset2 = Junction(mrid="asset2", name="asset 2", terminals=[terminal21, terminal22]) diff --git a/test/services/network/tracing/connectivity/test_terminal_connectivity_connected.py b/test/services/network/tracing/connectivity/test_terminal_connectivity_connected.py index e66874b4e..67d402ef4 100644 --- a/test/services/network/tracing/connectivity/test_terminal_connectivity_connected.py +++ b/test/services/network/tracing/connectivity/test_terminal_connectivity_connected.py @@ -6,7 +6,7 @@ from typing import List, Tuple from zepben.ewb import NetworkService, PhaseCode, SinglePhaseKind as Phase, Terminal, ConnectivityNode, AcLineSegment, NominalPhasePath, \ - TerminalConnectivityConnected + TerminalConnectivityConnected, generate_id class TestTerminalConnectivityConnected: @@ -184,7 +184,7 @@ def _create_connected_terminals(self, *phase_codes: PhaseCode) -> List[Terminal] cn = self._get_next_connectivity_node() def create_terminal(phase_code: PhaseCode) -> Terminal: - terminal = Terminal(phases=phase_code) + terminal = Terminal(mrid=generate_id(), phases=phase_code) self._network_service.connect_by_mrid(terminal, cn.mrid) return terminal diff --git a/test/services/network/tracing/connectivity/test_terminal_connectivity_internal.py b/test/services/network/tracing/connectivity/test_terminal_connectivity_internal.py index 9250f0fd8..c893c5445 100644 --- a/test/services/network/tracing/connectivity/test_terminal_connectivity_internal.py +++ b/test/services/network/tracing/connectivity/test_terminal_connectivity_internal.py @@ -4,7 +4,7 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. from collections import Counter -from zepben.ewb import TerminalConnectivityInternal, PhaseCode, PowerTransformer, Terminal +from zepben.ewb import TerminalConnectivityInternal, PhaseCode, PowerTransformer, Terminal, generate_id class TestTerminalConnectivityInternal: @@ -255,9 +255,9 @@ def test_paths_through_lv2_swer_tx(self): def _validate_tx_paths(self, primary: PhaseCode, secondary: PhaseCode, traced: PhaseCode = None): traced = traced or secondary - primary_terminal = Terminal(phases=primary) - secondary_terminal = Terminal(phases=secondary) - PowerTransformer(terminals=[primary_terminal, secondary_terminal]) + primary_terminal = Terminal(mrid=generate_id(), phases=primary) + secondary_terminal = Terminal(mrid=generate_id(), phases=secondary) + PowerTransformer(mrid=generate_id(), terminals=[primary_terminal, secondary_terminal]) if traced != PhaseCode.NONE: assert Counter([it.to_phase for it in self._connectivity.between(primary_terminal, secondary_terminal).nominal_phase_paths]) == \ diff --git a/test/services/network/tracing/feeder/test_set_direction.py b/test/services/network/tracing/feeder/test_set_direction.py index a3da9ddc7..a028db94a 100644 --- a/test/services/network/tracing/feeder/test_set_direction.py +++ b/test/services/network/tracing/feeder/test_set_direction.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 typing import Type, Union +from typing import Union import pytest @@ -11,7 +11,7 @@ from services.network.test_data.phase_swap_loop_network import create_phase_swap_loop_network from services.network.tracing.feeder.direction_logger import log_directions from zepben.ewb import FeederDirection, TestNetworkBuilder, SetDirection, PhaseCode, NetworkService, Feeder, Terminal, ConductingEquipment, Substation, \ - NetworkStateOperators, Cut + NetworkStateOperators, Cut, generate_id UPSTREAM = FeederDirection.UPSTREAM DOWNSTREAM = FeederDirection.DOWNSTREAM @@ -167,7 +167,7 @@ async def test_stops_at_zone_transformers_incase_feeder_heads_are_missing(self): n = await TestNetworkBuilder() \ .from_breaker() \ .to_acls() \ - .to_power_transformer(action=lambda tx: tx.add_container(Substation())) \ + .to_power_transformer(action=lambda tx: tx.add_container(Substation(mrid=generate_id()))) \ .to_acls() \ .add_feeder("b0", 2) \ .build() diff --git a/test/services/network/tracing/networktrace/conditions/test_direction_condition.py b/test/services/network/tracing/networktrace/conditions/test_direction_condition.py index 36028e3f7..8f05d6b09 100644 --- a/test/services/network/tracing/networktrace/conditions/test_direction_condition.py +++ b/test/services/network/tracing/networktrace/conditions/test_direction_condition.py @@ -7,7 +7,7 @@ import pytest -from zepben.ewb import NetworkStateOperators, FeederDirection, NetworkTraceStep, Terminal +from zepben.ewb import NetworkStateOperators, FeederDirection, NetworkTraceStep, Terminal, generate_id from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction from services.network.test_data.cuts_and_clamps_network import CutsAndClampsNetwork from zepben.ewb.services.network.tracing.networktrace.conditions.direction_condition import DirectionCondition @@ -165,8 +165,8 @@ def _terminal_should_queue(condition: Tuple[FeederDirection, FeederDirection, bo next_path = MagicMock(spec=NetworkTraceStep.Path)() next_path.traced_internally = traced_internally - next_path.to_terminal = Terminal() - next_path.to_equipment = Junction() + next_path.to_terminal = Terminal(mrid=generate_id()) + next_path.to_equipment = Junction(mrid=generate_id()) next_path.did_traverse_ac_line_segment = False next_item = NetworkTraceStep(next_path, 0, 0, None) @@ -182,11 +182,11 @@ def _start_terminal_should_queue(condition: Tuple[FeederDirection, FeederDirecti next_path = MagicMock(spec=NetworkTraceStep.Path) next_path.configure_mock( - to_terminal=Terminal(), - to_equipment=Junction() + to_terminal=Terminal(mrid=generate_id()), + to_equipment=Junction(mrid=generate_id()) ) - next_path.to_terminal = Terminal() - next_path.to_equipment = Junction() + next_path.to_terminal = Terminal(mrid=generate_id()) + next_path.to_equipment = Junction(mrid=generate_id()) next_path.did_traverse_ac_line_segment = False next_item = NetworkTraceStep(next_path, 0, 0, None) diff --git a/test/services/network/tracing/networktrace/operators/test_feeder_direction_state_operators.py b/test/services/network/tracing/networktrace/operators/test_feeder_direction_state_operators.py index 177f9a2e3..ae7bf6e92 100644 --- a/test/services/network/tracing/networktrace/operators/test_feeder_direction_state_operators.py +++ b/test/services/network/tracing/networktrace/operators/test_feeder_direction_state_operators.py @@ -2,7 +2,7 @@ # 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 zepben.ewb import Terminal, FeederDirection +from zepben.ewb import Terminal, FeederDirection, generate_id from zepben.ewb.services.network.tracing.networktrace.operators.feeder_direction_state_operations import FeederDirectionStateOperations @@ -13,14 +13,14 @@ class TestFeederDirectionStateOperators: def test_get_direction(self): for operations, attr in ((self.normal, 'normal_feeder_direction'), (self.current, 'current_feeder_direction')): - terminal = Terminal() + terminal = Terminal(mrid=generate_id()) setattr(terminal, attr, FeederDirection.UPSTREAM) assert operations.get_direction(terminal) == FeederDirection.UPSTREAM def test_set_direction(self): for operations, attr in ((self.normal, 'normal_feeder_direction'), (self.current, 'current_feeder_direction')): - terminal = Terminal() + terminal = Terminal(mrid=generate_id()) setattr(terminal, attr, FeederDirection.NONE) assert operations.set_direction(terminal, FeederDirection.UPSTREAM) assert getattr(terminal, attr) == FeederDirection.UPSTREAM @@ -34,7 +34,7 @@ def test_set_direction(self): def test_add_direction(self): for operations, attr in ((self.normal, 'normal_feeder_direction'), (self.current, 'current_feeder_direction')): - terminal = Terminal() + terminal = Terminal(mrid=generate_id()) setattr(terminal, attr, FeederDirection.NONE) assert operations.add_direction(terminal, FeederDirection.UPSTREAM) assert getattr(terminal, attr) == FeederDirection.UPSTREAM @@ -48,7 +48,7 @@ def test_add_direction(self): def test_remove_direction(self): for operations, attr in ((self.normal, 'normal_feeder_direction'), (self.current, 'current_feeder_direction')): - terminal = Terminal() + terminal = Terminal(mrid=generate_id()) setattr(terminal, attr, FeederDirection.BOTH) assert operations.remove_direction(terminal, FeederDirection.UPSTREAM) assert getattr(terminal, attr) == FeederDirection.DOWNSTREAM diff --git a/test/services/network/tracing/networktrace/operators/test_phase_state_operators.py b/test/services/network/tracing/networktrace/operators/test_phase_state_operators.py index 672a38292..601f18cc6 100644 --- a/test/services/network/tracing/networktrace/operators/test_phase_state_operators.py +++ b/test/services/network/tracing/networktrace/operators/test_phase_state_operators.py @@ -2,7 +2,7 @@ # 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 zepben.ewb import Terminal +from zepben.ewb import Terminal, generate_id from zepben.ewb.services.network.tracing.networktrace.operators.phase_state_operators import PhaseStateOperators @@ -13,6 +13,6 @@ class TestPhaseStateOperators: def test_phase_status(self): for operators, attr in ((self.normal, 'normal_phases'), (self.current, 'current_phases')): - terminal = Terminal() + terminal = Terminal(mrid=generate_id()) # FIXME: should be comparing the actual PhaseStatus object, but Terminal makes a new one on every call assert operators.phase_status(terminal).terminal is getattr(terminal, attr).terminal diff --git a/test/services/network/tracing/networktrace/test_network_trace.py b/test/services/network/tracing/networktrace/test_network_trace.py index 0f04d259c..ef8a1a5e4 100644 --- a/test/services/network/tracing/networktrace/test_network_trace.py +++ b/test/services/network/tracing/networktrace/test_network_trace.py @@ -13,7 +13,7 @@ from services.network.tracing.networktrace.test_network_trace_step_path_provider import PathTerminal, _verify_paths from zepben.ewb import AcLineSegment, Clamp, Terminal, NetworkTraceStep, Cut, ConductingEquipment, TraversalQueue, Junction, ngen, NetworkTraceActionType, \ - Tracing, StepActionWithContextValue, EnergyConsumer + Tracing, StepActionWithContextValue, EnergyConsumer, generate_id from zepben.ewb.testing.test_network_builder import TestNetworkBuilder Terminal.__add__ = PathTerminal.__add__ @@ -25,8 +25,8 @@ class TestNetworkTrace: @pytest.mark.asyncio async def test_add_start_clamp_terminal_as_traversed_segment_path(self): trace = Tracing.network_trace() - segment = AcLineSegment() - clamp = Clamp().add_terminal(Terminal()) + segment = AcLineSegment(mrid=generate_id()) + clamp = Clamp(mrid=generate_id()).add_terminal(Terminal(mrid=generate_id())) segment.add_clamp(clamp) trace.add_start_item(clamp[1]) @@ -35,8 +35,8 @@ async def test_add_start_clamp_terminal_as_traversed_segment_path(self): @pytest.mark.asyncio def test_adds_start_whole_clamp_as_not_traversed_segment_path(self): trace = Tracing.network_trace() - segment = AcLineSegment() - clamp = Clamp().add_terminal(Terminal()) + segment = AcLineSegment(mrid=generate_id()) + clamp = Clamp(mrid=generate_id()).add_terminal(Terminal(mrid=generate_id())) segment.add_clamp(clamp) trace.add_start_item(clamp) @@ -45,26 +45,26 @@ def test_adds_start_whole_clamp_as_not_traversed_segment_path(self): @pytest.mark.asyncio def test_adds_start_AcLineSegment_terminals_cut_terminals_and_clamp_terminals_as_traversed_segment(self): trace = Tracing.network_trace() - segment = AcLineSegment() \ - .add_terminal(Terminal()) \ - .add_terminal(Terminal()) + segment = AcLineSegment(mrid=generate_id()) \ + .add_terminal(Terminal(mrid=generate_id())) \ + .add_terminal(Terminal(mrid=generate_id())) - clamp1 = Clamp() \ - .add_terminal(Terminal()) + clamp1 = Clamp(mrid=generate_id()) \ + .add_terminal(Terminal(mrid=generate_id())) segment.add_clamp(clamp1) - clamp2 = Clamp() \ - .add_terminal(Terminal()) + clamp2 = Clamp(mrid=generate_id()) \ + .add_terminal(Terminal(mrid=generate_id())) segment.add_clamp(clamp2) - cut1 = Cut() \ - .add_terminal(Terminal()) \ - .add_terminal(Terminal()) + cut1 = Cut(mrid=generate_id()) \ + .add_terminal(Terminal(mrid=generate_id())) \ + .add_terminal(Terminal(mrid=generate_id())) segment.add_cut(cut1) - cut2 = Cut() \ - .add_terminal(Terminal()) \ - .add_terminal(Terminal()) + cut2 = Cut(mrid=generate_id()) \ + .add_terminal(Terminal(mrid=generate_id())) \ + .add_terminal(Terminal(mrid=generate_id())) segment.add_cut(cut2) trace.add_start_item(segment) @@ -330,5 +330,3 @@ def compute_initial_value(self, item: NetworkTraceStep): assert len(data_capture) == 2 assert data_capture == [('ec3', ['c0', 'c0', 'c1', 'c1', 'c2', 'c2']), ('ec5', ['c0', 'c0', 'c1', 'c1-clamp1', 'c4', 'c4'])] - - diff --git a/test/services/network/tracing/networktrace/test_network_trace_step_path_provider.py b/test/services/network/tracing/networktrace/test_network_trace_step_path_provider.py index 9a5467832..3247467f0 100644 --- a/test/services/network/tracing/networktrace/test_network_trace_step_path_provider.py +++ b/test/services/network/tracing/networktrace/test_network_trace_step_path_provider.py @@ -11,8 +11,7 @@ from zepben.ewb.model.cim.iec61970.base.core.phase_code import PhaseCode from zepben.ewb.model.cim.iec61970.base.wires.single_phase_kind import SinglePhaseKind from zepben.ewb.services.network.network_service import NetworkService -from zepben.ewb import NetworkStateOperators, TestNetworkBuilder, NetworkTraceStep, Terminal, NominalPhasePath, Breaker, AcLineSegment, Clamp, Cut, \ - ConductingEquipment +from zepben.ewb import NetworkStateOperators, TestNetworkBuilder, NetworkTraceStep, Terminal, NominalPhasePath, Breaker, AcLineSegment, Clamp, Cut from zepben.ewb.services.network.tracing.networktrace.network_trace_step_path_provider import NetworkTraceStepPathProvider class PathTerminal(Terminal): diff --git a/test/services/network/tracing/phases/test_phase_status.py b/test/services/network/tracing/phases/test_phase_status.py index a2456b3bf..1f0978699 100644 --- a/test/services/network/tracing/phases/test_phase_status.py +++ b/test/services/network/tracing/phases/test_phase_status.py @@ -3,11 +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 zepben.ewb import Terminal, SinglePhaseKind, PhaseCode, NetworkStateOperators, NormalPhases, CurrentPhases +from zepben.ewb import Terminal, SinglePhaseKind, PhaseCode, NetworkStateOperators, NormalPhases, CurrentPhases, generate_id def test_normal_and_current_phases(): - terminal = Terminal(phases=PhaseCode.ABCN) + terminal = Terminal(mrid=generate_id(), phases=PhaseCode.ABCN) normal_phases = NetworkStateOperators.NORMAL.phase_status(terminal) current_phases = NetworkStateOperators.CURRENT.phase_status(terminal) @@ -33,7 +33,7 @@ def test_normal_and_current_phases(): def test_normal_and_current_phase_codes_three(): - terminal = Terminal(phases=PhaseCode.ABCN) + terminal = Terminal(mrid=generate_id(), phases=PhaseCode.ABCN) normal_phases = NormalPhases(terminal) current_phases = CurrentPhases(terminal) @@ -66,7 +66,7 @@ def test_normal_and_current_phase_codes_three(): def test_normal_and_current_phase_codes_single(): - terminal = Terminal(phases=PhaseCode.BC) + terminal = Terminal(mrid=generate_id(), phases=PhaseCode.BC) normal_phases = NormalPhases(terminal) current_phases = CurrentPhases(terminal) @@ -93,7 +93,7 @@ def test_normal_and_current_phase_codes_single(): def test_normal_and_current_phase_codes_none(): - terminal = Terminal(phases=PhaseCode.NONE) + terminal = Terminal(mrid=generate_id(), phases=PhaseCode.NONE) normal_phases = NormalPhases(terminal) current_phases = CurrentPhases(terminal) diff --git a/test/services/network/tracing/test_assign_to_feeders.py b/test/services/network/tracing/test_assign_to_feeders.py index 9f496e089..4831062b5 100644 --- a/test/services/network/tracing/test_assign_to_feeders.py +++ b/test/services/network/tracing/test_assign_to_feeders.py @@ -5,8 +5,9 @@ from typing import Iterable import pytest -from zepben.ewb import Equipment, TestNetworkBuilder, BaseVoltage, Tracing, NetworkStateOperators, CurrentTransformer, ProtectedSwitch, CurrentRelay, ProtectionRelayScheme, ProtectionRelaySystem, PhotoVoltaicUnit, PowerElectronicsConnection, \ - ConductingEquipment +from zepben.ewb import Equipment, TestNetworkBuilder, BaseVoltage, Tracing, NetworkStateOperators, CurrentTransformer, ProtectedSwitch, CurrentRelay, \ + ProtectionRelayScheme, ProtectionRelaySystem, PhotoVoltaicUnit, PowerElectronicsConnection, \ + ConductingEquipment, generate_id from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.fault_indicator import FaultIndicator from zepben.ewb.model.cim.iec61970.base.wires.power_transformer_end import PowerTransformerEnd @@ -22,8 +23,8 @@ def validate_equipment(equipment: Iterable[Equipment], *expected_mrids: str): class TestAssignToFeeders: - bv_hv = BaseVoltage(nominal_voltage=11000) - bv_lv = BaseVoltage(nominal_voltage=400) + bv_hv = BaseVoltage(mrid=generate_id(), nominal_voltage=11000) + bv_lv = BaseVoltage(mrid=generate_id(), nominal_voltage=400) @staticmethod def base_voltage(ce: ConductingEquipment, voltage: BaseVoltage): diff --git a/test/services/network/tracing/test_assign_to_lv_feeders.py b/test/services/network/tracing/test_assign_to_lv_feeders.py index 0a9af1d48..fd4ab100d 100644 --- a/test/services/network/tracing/test_assign_to_lv_feeders.py +++ b/test/services/network/tracing/test_assign_to_lv_feeders.py @@ -5,7 +5,8 @@ from typing import Iterable, Type import pytest -from zepben.ewb import Equipment, TestNetworkBuilder, BaseVoltage, LvFeeder, NetworkStateOperators, CurrentTransformer, ProtectedSwitch, CurrentRelay, ProtectionRelayScheme, ProtectionRelaySystem, PhotoVoltaicUnit, PowerElectronicsConnection, ConductingEquipment, Breaker +from zepben.ewb import Equipment, TestNetworkBuilder, BaseVoltage, LvFeeder, NetworkStateOperators, CurrentTransformer, ProtectedSwitch, CurrentRelay, \ + ProtectionRelayScheme, ProtectionRelaySystem, PhotoVoltaicUnit, PowerElectronicsConnection, ConductingEquipment, Breaker, generate_id from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.fault_indicator import FaultIndicator from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder from zepben.ewb.services.network.tracing.networktrace.tracing import Tracing @@ -20,8 +21,8 @@ def validate_equipment(equipment: Iterable[Equipment], *expected_mrids: str): class TestAssignToLvFeeders: - bv_hv = BaseVoltage(nominal_voltage=11000) - bv_lv = BaseVoltage(nominal_voltage=400) + bv_hv = BaseVoltage(mrid=generate_id(), nominal_voltage=11000) + bv_lv = BaseVoltage(mrid=generate_id(), nominal_voltage=400) @staticmethod def base_voltage(ce: ConductingEquipment, voltage: BaseVoltage): @@ -59,8 +60,8 @@ async def test_assigns_equipment_to_feeders_with_loops(self, caplog, loop_under_ @pytest.mark.asyncio async def test_stops_at_hv_equipment(self): - bv_hv = BaseVoltage(nominal_voltage=11000) - bv_lv = BaseVoltage(nominal_voltage=400) + bv_hv = BaseVoltage(mrid=generate_id(), nominal_voltage=11000) + bv_lv = BaseVoltage(mrid=generate_id(), nominal_voltage=400) # noinspection PyArgumentList network_service = (TestNetworkBuilder() @@ -80,8 +81,8 @@ async def test_stops_at_hv_equipment(self): @pytest.mark.asyncio async def test_includes_transformers(self): - bv_hv = BaseVoltage(nominal_voltage=11000) - bv_lv = BaseVoltage(nominal_voltage=400) + bv_hv = BaseVoltage(mrid=generate_id(), nominal_voltage=11000) + bv_lv = BaseVoltage(mrid=generate_id(), nominal_voltage=400) # noinspection PyArgumentList network_service = (TestNetworkBuilder() @@ -102,8 +103,8 @@ async def test_includes_transformers(self): @pytest.mark.asyncio async def test_only_powered_via_head_equipment(self): - bv_hv = BaseVoltage(nominal_voltage=11000) - bv_lv = BaseVoltage(nominal_voltage=400) + bv_hv = BaseVoltage(mrid=generate_id(), nominal_voltage=11000) + bv_lv = BaseVoltage(mrid=generate_id(), nominal_voltage=400) # noinspection PyArgumentList network_service = (TestNetworkBuilder() @@ -300,7 +301,7 @@ async def run_with_operators(operators: Type[NetworkStateOperators]): b7: Breaker = network['b7'] - feeder = Feeder() + feeder = Feeder(mrid=generate_id()) lv_feeder8 = network['lvf8'] operators.associate_energizing_feeder(feeder, lv_feeder8) lv_feeder9 = network['lvf9'] @@ -310,8 +311,8 @@ async def run_with_operators(operators: Type[NetworkStateOperators]): # We create an LV feeder to assign from b7 with its associated energizing feeder, which we will test is assigned to all LV feeders # in the dist substation site, not just the one on b5. - back_feed = Feeder() - lv_feeder = LvFeeder() + back_feed = Feeder(mrid=generate_id()) + lv_feeder = LvFeeder(mrid=generate_id()) operators.associate_energizing_feeder(back_feed, lv_feeder) await Tracing.assign_equipment_to_lv_feeders().run( @@ -345,8 +346,8 @@ async def test_assigns_normal_and_current_energising_feeders_based_on_state(self .add_lv_feeder('b0') # lvf1 ).network - normal_feeder = Feeder() - current_feeder = Feeder() + normal_feeder = Feeder(mrid=generate_id()) + current_feeder = Feeder(mrid=generate_id()) breaker = network['b0'] lv_feeder = network['lvf1'] diff --git a/test/services/network/tracing/test_find_swer_equipment.py b/test/services/network/tracing/test_find_swer_equipment.py index e81e36cfd..70193616d 100644 --- a/test/services/network/tracing/test_find_swer_equipment.py +++ b/test/services/network/tracing/test_find_swer_equipment.py @@ -6,7 +6,7 @@ import pytest -from zepben.ewb import FindSwerEquipment, TestNetworkBuilder, PhaseCode, BaseVoltage, ConductingEquipment, NetworkStateOperators +from zepben.ewb import FindSwerEquipment, TestNetworkBuilder, PhaseCode, BaseVoltage, ConductingEquipment, NetworkStateOperators, generate_id class TestFindSwerEquipment: @@ -190,7 +190,7 @@ def _check_showing_simple_diff(results, expected): @staticmethod def _make_bv(ce: ConductingEquipment, volts: int): - bv = BaseVoltage() + bv = BaseVoltage(mrid=generate_id()) bv.nominal_voltage = volts ce.base_voltage = bv diff --git a/test/streaming/get/test_network_consumer.py b/test/streaming/get/test_network_consumer.py index 900acda68..515048c49 100644 --- a/test/streaming/get/test_network_consumer.py +++ b/test/streaming/get/test_network_consumer.py @@ -29,7 +29,7 @@ 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 + PanDemandResponseFunction, BatteryUnit, StaticVarCompensator, Pole, generate_id 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 @@ -538,7 +538,7 @@ async def client_test(): def responses(_): nio = Any() # noinspection PyUnresolvedReferences - nio.Pack(Diagram().to_pb()) + nio.Pack(Diagram(mrid=generate_id()).to_pb()) yield GetIdentifiedObjectsResponse(identifiedObjects=[NetworkIdentifiedObject(other=nio)]) await self.mock_server.validate(client_test, [StreamGrpc('getEquipmentForContainers', [responses])]) diff --git a/test/test_util.py b/test/test_util.py index e02d9e861..f824c52ba 100644 --- a/test/test_util.py +++ b/test/test_util.py @@ -2,7 +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 zepben.ewb.util import none +from uuid import UUID + +from zepben.ewb.util import none, generate_id def test_none(): @@ -17,3 +19,10 @@ def test_none(): assert none([0, 0, 0]) assert none([[], [], []]) assert not none([[], [False], []]) + +def test_generate_id(): + # make sure our generated ID is a valid UUID. + UUID(generate_id()) + + # Make sure each call gives a new UUID. + assert generate_id() != generate_id() diff --git a/test/util.py b/test/util.py index f00d180a0..5b8718ad8 100644 --- a/test/util.py +++ b/test/util.py @@ -8,6 +8,7 @@ from concurrent import futures import grpc +from hypothesis.strategies import uuids def all_subclasses(cls, package): @@ -57,3 +58,6 @@ def grpc_aio_server(): server.add_insecure_port(host) return server, host + + +mrid_strategy = uuids(version=4).map(lambda x: str(x))