Skip to content

Commit 1673c4e

Browse files
committed
add testing
B1342786: add some more unit testing
1 parent fd28fdf commit 1673c4e

File tree

4 files changed

+137
-61
lines changed

4 files changed

+137
-61
lines changed

src/ansys/aedt/core/emit_core/nodes/emit_node.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,12 @@ def _parent(self):
109109
Returns
110110
-------
111111
EmitNode
112-
Parent node name.
112+
Parent node.
113113
"""
114-
return self._get_property("Parent", True)
114+
parent_name = self._get_property("Parent", True)
115+
parent_name = parent_name.replace("NODE-*-", "")
116+
node_id = self._oRevisionData.GetTopLevelNodeID(0, parent_name)
117+
return self._get_node(node_id)
115118

116119
@property
117120
def properties(self) -> dict:
@@ -127,7 +130,7 @@ def properties(self) -> dict:
127130
return props
128131

129132
@property
130-
def node_warnings(self) -> str:
133+
def warnings(self) -> str:
131134
"""Warnings for the node, if any.
132135
133136
Returns
@@ -191,13 +194,16 @@ def _get_node(self, node_id: int):
191194
# type_class = EmitterNode
192195
# else:
193196
# type_class = ReadOnlyEmitterNode
194-
node = type_class(self._emit_obj, self._result_id, node_id)
195197
elif node_type == "Band" and props["IsEmitterBand"] == "true":
196198
type_class = getattr(generated, f"{prefix}Waveform")
197-
node = type_class(self._emit_obj, self._result_id, node_id)
199+
elif node_type == "TxSpectralProfNode":
200+
if self.properties['IsEmitterBand'] == 'true':
201+
type_class = getattr(generated, f"{prefix}TxSpectralProfEmitterNode")
202+
else:
203+
type_class = getattr(generated, f"{prefix}TxSpectralProfNode")
198204
else:
199205
type_class = getattr(generated, f"{prefix}{node_type}")
200-
node = type_class(self._emit_obj, self._result_id, node_id)
206+
node = type_class(self._emit_obj, self._result_id, node_id)
201207
except AttributeError:
202208
node = EmitNode(self._emit_obj, self._result_id, node_id)
203209
return node

src/ansys/aedt/core/emit_core/nodes/emitter_node.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@
2626

2727
from ansys.aedt.core.emit_core.nodes.emit_node import EmitNode
2828
from ansys.aedt.core.emit_core.nodes.generated import AntennaNode
29+
from ansys.aedt.core.emit_core.nodes.generated import Band
30+
from ansys.aedt.core.emit_core.nodes.generated import BandFolder
2931
from ansys.aedt.core.emit_core.nodes.generated import RadioNode
3032
from ansys.aedt.core.emit_core.nodes.generated import Waveform
3133

3234

35+
3336
class EmitterNode(EmitNode):
3437
"""
3538
Provides the EmitterNode object.
@@ -65,6 +68,18 @@ def __init__(self, emit_obj, result_id, node_id):
6568
ant_id = self._oRevisionData.GetChildNodeID(result_id, scene_node_id, ant)
6669
self._antenna_node = AntennaNode(emit_obj, result_id, ant_id)
6770

71+
def node_type(self) -> str:
72+
"""The type of this emit node"""
73+
return "EmitterNode"
74+
75+
def duplicate(self, new_name: str):
76+
"""Duplicate this node"""
77+
return self._duplicate(new_name)
78+
79+
def delete(self):
80+
"""Delete this node"""
81+
self._delete()
82+
6883
def get_radio(self) -> RadioNode:
6984
"""Get the radio associated with this Emitter.
7085
@@ -93,6 +108,20 @@ def get_antenna(self) -> AntennaNode:
93108
"""
94109
return self._antenna_node
95110

111+
def children(self):
112+
"""Overridden to return the Waveforms
113+
114+
Returns
115+
-------
116+
waveforms: list[Waveform]
117+
list of waveform nodes defined for the Emitter.
118+
119+
Examples
120+
--------
121+
>>> waveforms = emitter.get_waveforms()
122+
"""
123+
return self.get_waveforms()
124+
96125
def get_waveforms(self) -> list[Waveform]:
97126
"""Get the waveform nodes for the Emitter.
98127
@@ -110,12 +139,12 @@ def get_waveforms(self) -> list[Waveform]:
110139
waveforms = []
111140
# check for folders and recurse them if needed
112141
for child in radio_children:
113-
if child.type == "BandFolder":
142+
if isinstance(child, BandFolder):
114143
grandchildren = child.children
115144
for grandchild in grandchildren:
116-
# don't allow nested folders, so can add these
145+
# we don't allow nested folders, so can add these
117146
# directly to the waveform list
118147
waveforms.append(cast(Waveform, grandchild))
119-
elif child.type == "Band":
148+
elif isinstance(child, Waveform):
120149
waveforms.append(cast(Waveform, child))
121150
return waveforms

src/ansys/aedt/core/emit_core/results/revision.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from ansys.aedt.core.emit_core.nodes.generated import CouplingsNode
3535
from ansys.aedt.core.emit_core.nodes.generated import EmitSceneNode
3636
from ansys.aedt.core.emit_core.nodes.generated import ResultPlotNode
37+
from ansys.aedt.core.emit_core.nodes.generated import Waveform
3738
from ansys.aedt.core.generic.general_methods import pyaedt_function_handler
3839
from ansys.aedt.core.internal.checks import min_aedt_version
3940

@@ -1021,13 +1022,18 @@ def _get_node(self, node_id: int) -> EmitNode:
10211022
# type_class = EmitterNode
10221023
# else:
10231024
# type_class = ReadOnlyEmitterNode
1024-
node = type_class(self.emit_project, self.results_index, node_id)
10251025
elif node_type == "Band" and props["IsEmitterBand"] == "true":
10261026
type_class = getattr(generated, f"{prefix}Waveform")
1027-
node = type_class(self.emit_project, self.results_index, node_id)
1027+
elif node_type == "TxSpectralProfNode":
1028+
parent_name = props["Parent"]
1029+
parent_name = parent_name.replace("NODE-*-", "")
1030+
node_id = self._emit_com.GetTopLevelNodeID(0, parent_name)
1031+
parent_node = self._get_node(node_id)
1032+
if isinstance(parent_node, Waveform):
1033+
type_class = getattr(generated, f"{prefix}TxSpectralProfEmitterNode")
10281034
else:
10291035
type_class = getattr(generated, f"{prefix}{node_type}")
1030-
node = type_class(self.emit_project, self.results_index, node_id)
1036+
node = type_class(self.emit_project, self.results_index, node_id)
10311037
except AttributeError:
10321038
node = EmitNode(self.emit_project, self.results_index, node_id)
10331039
return node

tests/system/emit/test_emit.py

Lines changed: 84 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,17 @@
5252
from ansys.aedt.core.emit_core.emit_constants import TxRxMode
5353
from ansys.aedt.core.emit_core.nodes import generated
5454
from ansys.aedt.core.emit_core.nodes.emit_node import EmitNode
55+
from ansys.aedt.core.emit_core.nodes.emitter_node import EmitterNode
5556
from ansys.aedt.core.emit_core.nodes.generated import Amplifier
57+
from ansys.aedt.core.emit_core.nodes.generated import AntennaNode
5658
from ansys.aedt.core.emit_core.nodes.generated import Band
5759
from ansys.aedt.core.emit_core.nodes.generated import Filter
5860
from ansys.aedt.core.emit_core.nodes.generated import RadioNode
5961
from ansys.aedt.core.emit_core.nodes.generated import SamplingNode
6062
from ansys.aedt.core.emit_core.nodes.generated import TxBbEmissionNode
6163
from ansys.aedt.core.emit_core.nodes.generated import TxSpectralProfNode
64+
from ansys.aedt.core.emit_core.nodes.generated import TxSpectralProfEmitterNode
65+
from ansys.aedt.core.emit_core.nodes.generated import Waveform
6266
from ansys.aedt.core.modeler.circuits.primitives_emit import EmitAntennaComponent
6367
from ansys.aedt.core.modeler.circuits.primitives_emit import EmitComponent
6468
from ansys.aedt.core.modeler.circuits.primitives_emit import EmitComponents
@@ -1807,7 +1811,7 @@ def test_fm_fsk_freq_deviation(self, emit_app):
18071811
band_node.freq_deviation = 1e4
18081812
assert band_node.freq_deviation == 1e4
18091813

1810-
@pytest.mark.skipif(config["desktopVersion"] <= "2025.2", reason="Skipped on versions earlier than 2025 R2.")
1814+
@pytest.mark.skipif(config["desktopVersion"] < "2025.2", reason="Skipped on versions earlier than 2025 R2.")
18111815
def test_tables(self, emit_app):
18121816
# Emit has 2 different types of tables: Node Prop Tables and ColumnData Tables
18131817
# this test confirms that the table_data properties work for both
@@ -1844,40 +1848,71 @@ def test_tables(self, emit_app):
18441848
# Get the amplifier table and verify the data was set properly
18451849
assert amp.table_data == amp_data
18461850

1847-
# Test BB Emissions Node since it can be either a NodeProp or
1848-
# ColumnData Table
1849-
radio2 = emit_app.schematic.create_component("New Radio")
1850-
radio2 = cast(RadioNode, radio2)
1851+
if config["desktopVersion"] < "2026.1":
1852+
# Test BB Emissions Node since it can be either a NodeProp or
1853+
# ColumnData Table
1854+
radio2 = emit_app.schematic.create_component("New Radio")
1855+
radio2 = cast(RadioNode, radio2)
18511856

1852-
children = radio2.children
1853-
tx_spec = None
1854-
for child in children:
1855-
if child.node_type == "Band":
1856-
band_children = child.children
1857-
for band_child in band_children:
1858-
if band_child.node_type == "TxSpectralProfNode":
1859-
tx_spec = cast(TxSpectralProfNode, band_child)
1857+
children = radio2.children
1858+
tx_spec = None
1859+
for child in children:
1860+
if child.node_type == "Band":
1861+
band_children = child.children
1862+
for band_child in band_children:
1863+
if band_child.node_type == "TxSpectralProfNode":
1864+
tx_spec = cast(TxSpectralProfNode, band_child)
1865+
1866+
bb_noise = tx_spec.add_tx_broadband_noise_profile()
1867+
bb_noise = cast(TxBbEmissionNode, bb_noise)
1868+
1869+
# verify the table is empty by default
1870+
assert bb_noise.table_data == []
1871+
1872+
# Set the ColumnData Table
1873+
bb_data = [(100000.0, -170.0), (100000000.0, -160.0), (200000000.0, -170.0)]
1874+
bb_noise.table_data = bb_data
1875+
1876+
# Verify the ColumnData Table was set
1877+
assert bb_noise.table_data == bb_data
1878+
1879+
# Change it to a NodeProp Table (Equation based)
1880+
bb_data = [("RF+10", -160), ("RF+100", -166)]
1881+
bb_noise.noise_behavior = TxBbEmissionNode.NoiseBehaviorOption.EQUATION
1882+
bb_noise.table_data = bb_data
1883+
1884+
# Verify the NodeProp Table was set
1885+
assert bb_noise.table_data == bb_data
18601886

1861-
bb_noise = tx_spec.add_tx_broadband_noise_profile()
1862-
bb_noise = cast(TxBbEmissionNode, bb_noise)
1887+
@pytest.mark.skipif(config["desktopVersion"] < "2025.2", reason="Skipped on versions earlier than 2025 R2.")
1888+
def test_emitters_radios(self, emit_app):
1889+
emitter_node: EmitterNode = emit_app.schematic.create_component("New Emitter", "Emitters")
1890+
1891+
# Test that you can get the emitter's radio and antenna nodes
1892+
emitter_radio: RadioNode = emitter_node.get_radio()
1893+
assert isinstance(emitter_radio, RadioNode)
1894+
1895+
emitter_ant: AntennaNode = emitter_node.get_antenna()
1896+
assert isinstance(emitter_ant, AntennaNode)
1897+
1898+
emitter_band: Waveform = emitter_node.get_waveforms()[0]
1899+
assert emitter_band.warnings == ""
1900+
1901+
assert emitter_node.children() == emitter_node.get_waveforms()
18631902

1864-
# verify the table is empty by default
1865-
assert bb_noise.table_data == []
1903+
emitter_band.waveform = Waveform.WaveformOption.PRBS
1904+
assert emitter_band.waveform == Waveform.WaveformOption.PRBS
18661905

1867-
# Set the ColumnData Table
1868-
bb_data = [(100000.0, -170.0), (100000000.0, -160.0), (200000000.0, -170.0)]
1869-
bb_noise.table_data = bb_data
1906+
tx_spec: TxSpectralProfEmitterNode = emitter_band.children[0]
1907+
assert isinstance(tx_spec, TxSpectralProfEmitterNode)
18701908

1871-
# Verify the ColumnData Table was set
1872-
assert bb_noise.table_data == bb_data
1909+
radio_node: RadioNode = emit_app.schematic.create_component("New Radio", "Radios")
18731910

1874-
# Change it to a NodeProp Table (Equation based)
1875-
bb_data = [("RF+10", -160), ("RF+100", -166)]
1876-
bb_noise.noise_behavior = TxBbEmissionNode.NoiseBehaviorOption.EQUATION
1877-
bb_noise.table_data = bb_data
1911+
band: Band = radio_node.children[0]
1912+
assert isinstance(band, Band)
18781913

1879-
# Verify the NodeProp Table was set
1880-
assert bb_noise.table_data == bb_data
1914+
radio_tx_spec: TxSpectralProfNode = band.children[0]
1915+
assert isinstance(radio_tx_spec, TxSpectralProfNode)
18811916

18821917
@pytest.mark.skipif(config["desktopVersion"] <= "2025.1", reason="Skipped on versions earlier than 2026 R1.")
18831918
def test_units(self, emit_app):
@@ -1913,7 +1948,7 @@ def test_units(self, emit_app):
19131948
cable.length = "0.0031 mile"
19141949
assert round(cable.length, 4) == 4.9890
19151950

1916-
@pytest.mark.skipif(config["desktopVersion"] <= "2025.2", reason="Skipped on versions earlier than 2026 R1.")
1951+
@pytest.mark.skipif(config["desktopVersion"] < "2025.2", reason="Skipped on versions earlier than 2026 R1.")
19171952
def test_27_components_catalog(self, emit_app):
19181953
comp_list = emit_app.modeler.components.components_catalog["LTE"]
19191954
assert len(comp_list) == 14
@@ -1929,28 +1964,28 @@ def test_27_components_catalog(self, emit_app):
19291964
default_antenna = emit_app.schematic.create_component("Antenna")
19301965

19311966
for comp in comp_list.components:
1967+
library_name = comp.split(":")[0]
19321968
comp_to_add = comp.split(":")[1]
19331969
# try to add just based on the CompName
1934-
comp_added = emit_app.schematic.create_component(comp_to_add)
1935-
if not comp_added:
1936-
# if CompName has multiple matches, then we need to
1937-
# also specify the library
1938-
library_name = comp.split(":")[0]
1939-
try:
1940-
comp_added = emit_app.schematic.create_component(component_type=comp_to_add, library=library_name)
1941-
assert comp_added
1942-
1943-
# connect the component
1944-
if comp_added._node_type == "AntennaNode" or comp_added._node_type == "Terminator":
1945-
emit_app.schematic.connect_components(default_radio.name, comp_added.name)
1946-
else:
1947-
emit_app.schematic.connect_components(comp_added.name, default_antenna.name)
1948-
1949-
# Delete the component
1950-
emit_app.schematic.delete_component(comp_added.name)
1951-
1952-
except Exception as e:
1953-
print(f"Failed to create component: {comp_to_add} from library {library_name}. Error: {e}")
1970+
try:
1971+
comp_added = emit_app.schematic.create_component(component_type=comp_to_add, library=library_name)
1972+
assert comp_added
1973+
1974+
# connect the component
1975+
if comp_added.node_type == "EmitterNode":
1976+
# can't connect Emitters since they have no ports
1977+
continue
1978+
elif comp_added._node_type == "AntennaNode" or comp_added._node_type == "Terminator":
1979+
emit_app.schematic.connect_components(default_radio.name, comp_added.name)
1980+
else:
1981+
emit_app.schematic.connect_components(comp_added.name, default_antenna.name)
1982+
1983+
# Delete the component
1984+
print(comp_added.name)
1985+
emit_app.schematic.delete_component(comp_added.name)
1986+
1987+
except Exception as e:
1988+
print(f"Failed to create component: {comp_to_add} from library {library_name}. Error: {e}")
19541989

19551990
rev = emit_app.results.analyze()
19561991
comps_in_schematic = rev.get_all_component_nodes()

0 commit comments

Comments
 (0)