Skip to content

Commit 58c1803

Browse files
committed
Reworked unittests for Symbol classes.
1 parent 5342503 commit 58c1803

File tree

3 files changed

+167
-41
lines changed

3 files changed

+167
-41
lines changed

pyVHDLModel/DesignUnit.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -490,14 +490,16 @@ def Architectures(self) -> Dict[str, 'Architecture']:
490490
return self._architectures
491491

492492
def __str__(self) -> str:
493-
lib = self._library.Identifier + "?" if self._library is not None else ""
493+
lib = self._library.Identifier if self._library is not None else "%"
494+
archs = ', '.join(self._architectures.keys()) if self._architectures else "%"
494495

495-
return f"Entity: {lib}.{self.Identifier}({', '.join(self._architectures.keys())})"
496+
return f"Entity: '{lib}.{self.Identifier}({archs})'"
496497

497498
def __repr__(self) -> str:
498-
lib = self._library.Identifier + "?" if self._library is not None else ""
499+
lib = self._library.Identifier if self._library is not None else "%"
500+
archs = ', '.join(self._architectures.keys()) if self._architectures else "%"
499501

500-
return f"{lib}.{self.Identifier}({', '.join(self._architectures.keys())})"
502+
return f"{lib}.{self.Identifier}({archs})"
501503

502504

503505
@export
@@ -528,14 +530,14 @@ def Library(self, library: 'Library') -> None:
528530
self._library = library
529531

530532
def __str__(self) -> str:
531-
lib = self._library.Identifier + "?" if self._library is not None else ""
532-
ent = self._entity.Identifier + "?" if self._entity is not None else ""
533+
lib = self._library.Identifier if self._library is not None else "%"
534+
ent = self._entity.Identifier if self._entity is not None else "%"
533535

534536
return f"Architecture: {lib}.{ent}({self.Identifier})"
535537

536538
def __repr__(self) -> str:
537-
lib = self._library.Identifier + "?" if self._library is not None else ""
538-
ent = self._entity.Identifier + "?" if self._entity is not None else ""
539+
lib = self._library.Identifier if self._library is not None else "%"
540+
ent = self._entity.Identifier if self._entity is not None else "%"
539541

540542
return f"{lib}.{ent}({self.Identifier})"
541543

@@ -590,11 +592,11 @@ def __init__(self, identifier: str, contextItems: Iterable[Context] = None, docu
590592
DesignUnitWithContextMixin.__init__(self)
591593

592594
def __str__(self) -> str:
593-
lib = self._library.Identifier + "?" if self._library is not None else ""
595+
lib = self._library.Identifier if self._library is not None else "%"
594596

595597
return f"Configuration: {lib}.{self.Identifier}"
596598

597599
def __repr__(self) -> str:
598-
lib = self._library.Identifier + "?" if self._library is not None else ""
600+
lib = self._library.Identifier if self._library is not None else "%"
599601

600602
return f"{lib}.{self.Identifier}"

pyVHDLModel/Symbol.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -306,12 +306,15 @@ def Configuration(self, value: 'Configuration') -> None:
306306

307307

308308
@export
309-
class SimpleSubtypeSymbol(Symbol):
310-
"""A configuration reference in a configuration instantiation."""
311-
309+
class SubtypeSymbol(Symbol):
312310
def __init__(self, name: Name):
313311
super().__init__(name, PossibleReference.Subtype)
314312

313+
314+
@export
315+
class SimpleSubtypeSymbol(SubtypeSymbol):
316+
"""A configuration reference in a configuration instantiation."""
317+
315318
@property
316319
def Subtype(self) -> 'Subtype':
317320
return self._reference
@@ -322,20 +325,14 @@ def Subtype(self, value: 'Subtype') -> None:
322325

323326

324327
@export
325-
class ConstrainedScalarSubtypeSymbol(Symbol):
328+
class ConstrainedScalarSubtypeSymbol(SubtypeSymbol):
326329
"""A configuration reference in a configuration instantiation."""
327330

328-
def __init__(self, name: Name):
329-
super().__init__(name, PossibleReference.Subtype)
330-
331331

332332
@export
333-
class ConstrainedCompositeSubtypeSymbol(Symbol):
333+
class ConstrainedCompositeSubtypeSymbol(SubtypeSymbol):
334334
"""A configuration reference in a configuration instantiation."""
335335

336-
def __init__(self, name: Name):
337-
super().__init__(name, PossibleReference.Subtype)
338-
339336

340337
@export
341338
class SimpleObjectOrFunctionCallSymbol(Symbol):

tests/unit/Instantiate.py

Lines changed: 147 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
from pyVHDLModel import Design, Library, Document
3939
from pyVHDLModel.Base import Direction, Range
4040
from pyVHDLModel.Name import SelectedName, SimpleName, AllName, AttributeName
41-
from pyVHDLModel.Symbol import LibraryReferenceSymbol, PackageReferenceSymbol, PackageMembersReferenceSymbol
41+
from pyVHDLModel.Object import Constant, Signal
42+
from pyVHDLModel.Symbol import LibraryReferenceSymbol, PackageReferenceSymbol, PackageMembersReferenceSymbol, SimpleSubtypeSymbol
4243
from pyVHDLModel.Symbol import AllPackageMembersReferenceSymbol, ContextReferenceSymbol, EntitySymbol
4344
from pyVHDLModel.Symbol import ArchitectureSymbol, PackageSymbol, EntityInstantiationSymbol
4445
from pyVHDLModel.Symbol import ComponentInstantiationSymbol, ConfigurationInstantiationSymbol
@@ -171,45 +172,171 @@ def test_PackageReferenceSymbol(self):
171172
self.assertEqual("Package: 'liB.pacK'", str(symbol))
172173

173174
def test_PackageMembersReferenceSymbol(self):
174-
symbol = PackageMembersReferenceSymbol(SelectedName("obj", SelectedName("pack", SimpleName("Lib"))))
175+
name = SelectedName("Obj", SelectedName("Pack", SimpleName("Lib")))
176+
symbol = PackageMembersReferenceSymbol(name)
175177

176-
self.assertEqual("obj", symbol.Name.NormalizedIdentifier)
177-
self.assertEqual("pack", symbol.Name.Prefix.NormalizedIdentifier)
178-
self.assertEqual("lib", symbol.Name.Prefix.Prefix.NormalizedIdentifier)
178+
self.assertIs(name, symbol.Name)
179+
self.assertFalse(symbol.IsResolved)
180+
self.assertIsNone(symbol.Reference)
181+
self.assertIsNone(symbol.Member)
182+
self.assertEqual("PackageMembersReferenceSymbol: 'Lib.Pack.Obj' -> unresolved", repr(symbol))
183+
self.assertEqual("Lib.Pack.Obj?", str(symbol))
184+
185+
library = Library("liB")
186+
package = Package("pacK")
187+
package.Library = library
188+
constant = Constant(("obJ", ), SimpleSubtypeSymbol(SimpleName("Bool")))
189+
for id in constant.Identifiers:
190+
package.DeclaredItems.append(constant)
191+
package.Constants[id] = constant
192+
193+
symbol.Member = constant
194+
195+
self.assertTrue(symbol.IsResolved)
196+
self.assertIs(constant, symbol.Member)
197+
# self.assertEqual("PackageReferenceSymbol: 'Lib.Pack' -> Package: 'liB.pacK'", repr(symbol))
198+
# self.assertEqual("Constant: 'liB.pacK.obJ'", str(symbol))
179199

180200
def test_AllPackageMembersReferenceSymbol(self):
181-
symbol = AllPackageMembersReferenceSymbol(AllName(SelectedName("pack", SimpleName("Lib"))))
201+
name = AllName(SelectedName("Pack", SimpleName("Lib")))
202+
symbol = AllPackageMembersReferenceSymbol(name)
203+
204+
self.assertIs(name, symbol.Name)
205+
self.assertFalse(symbol.IsResolved)
206+
self.assertIsNone(symbol.Reference)
207+
self.assertIsNone(symbol.Members)
208+
self.assertEqual("AllPackageMembersReferenceSymbol: 'Lib.Pack.all' -> unresolved", repr(symbol))
209+
self.assertEqual("Lib.Pack.all?", str(symbol))
210+
211+
library = Library("liB")
212+
package = Package("pacK")
213+
package.Library = library
214+
constant = Constant(("obJ", ), SimpleSubtypeSymbol(SimpleName("Bool")))
215+
signal = Signal(("siG", ), SimpleSubtypeSymbol(SimpleName("Bit")))
216+
for id in constant.Identifiers:
217+
package.DeclaredItems.append(constant)
218+
package.Constants[id] = constant
219+
for id in signal.Identifiers:
220+
package.DeclaredItems.append(signal)
221+
package.Objects[id] = signal
182222

183-
self.assertEqual("all", symbol.Name.NormalizedIdentifier)
184-
self.assertEqual("pack", symbol.Name.Prefix.NormalizedIdentifier)
185-
self.assertEqual("lib", symbol.Name.Prefix.Prefix.NormalizedIdentifier)
223+
symbol.Members = (constant, signal)
224+
225+
self.assertTrue(symbol.IsResolved)
226+
self.assertTupleEqual((constant, signal), symbol.Members)
227+
# self.assertEqual("PackageReferenceSymbol: 'Lib.Pack' -> Package: 'liB.pacK'", repr(symbol))
228+
# self.assertEqual("Constant: 'liB.pacK.obJ'", str(symbol))
186229

187230
def test_ContextReferenceSymbol(self):
188-
symbol = ContextReferenceSymbol(SelectedName("ctx", SimpleName("Lib")))
231+
name = SelectedName("Ctx", SimpleName("Lib"))
232+
symbol = ContextReferenceSymbol(name)
233+
234+
self.assertIs(name, symbol.Name)
235+
self.assertFalse(symbol.IsResolved)
236+
self.assertIsNone(symbol.Reference)
237+
self.assertIsNone(symbol.Context)
238+
self.assertEqual("ContextReferenceSymbol: 'Lib.Ctx' -> unresolved", repr(symbol))
239+
self.assertEqual("Lib.Ctx?", str(symbol))
189240

190-
self.assertEqual("ctx", symbol.Name.NormalizedIdentifier)
191-
self.assertEqual("lib", symbol.Name.Prefix.NormalizedIdentifier)
241+
library = Library("liB")
242+
context = Context("ctX")
243+
context.Library = library
244+
symbol.Context = context
245+
246+
self.assertTrue(symbol.IsResolved)
247+
self.assertIs(context, symbol.Context)
248+
# self.assertEqual("PackageReferenceSymbol: 'Lib.Pack' -> Package: 'liB.pacK'", repr(symbol))
249+
# self.assertEqual("Package: 'liB.pacK'", str(symbol))
250+
251+
def test_SimpleEntitySymbol(self):
252+
name = SimpleName("Ent")
253+
symbol = EntitySymbol(name)
192254

193-
def test_EntitySymbol(self):
194-
symbol = EntitySymbol(SimpleName("ent"))
255+
self.assertIs(name, symbol.Name)
256+
self.assertFalse(symbol.IsResolved)
257+
self.assertIsNone(symbol.Reference)
258+
self.assertIsNone(symbol.Entity)
259+
self.assertEqual("EntitySymbol: 'Ent' -> unresolved", repr(symbol))
260+
self.assertEqual("Ent?", str(symbol))
195261

196-
self.assertEqual("ent", symbol.Name.NormalizedIdentifier)
262+
library = Library("liB")
263+
entity = Entity("enT")
264+
entity.Library = library
265+
symbol.Entity = entity
266+
267+
self.assertTrue(symbol.IsResolved)
268+
self.assertIs(entity, symbol.Entity)
269+
# self.assertEqual("PackageReferenceSymbol: 'Lib.Pack' -> Package: 'liB.pacK'", repr(symbol))
270+
# self.assertEqual("Package: 'liB.pacK'", str(symbol))
271+
272+
def test_SelectedEntitySymbol(self):
273+
name = SelectedName("Ent", SimpleName("Work"))
274+
symbol = EntitySymbol(name)
275+
276+
self.assertIs(name, symbol.Name)
277+
self.assertFalse(symbol.IsResolved)
278+
self.assertIsNone(symbol.Reference)
279+
self.assertIsNone(symbol.Entity)
280+
self.assertEqual("EntitySymbol: 'Work.Ent' -> unresolved", repr(symbol))
281+
self.assertEqual("Work.Ent?", str(symbol))
282+
283+
library = Library("liB")
284+
entity = Entity("enT")
285+
entity.Library = library
286+
symbol.Entity = entity
287+
288+
self.assertTrue(symbol.IsResolved)
289+
self.assertIs(entity, symbol.Entity)
290+
# self.assertEqual("PackageReferenceSymbol: 'Lib.Pack' -> Package: 'liB.pacK'", repr(symbol))
291+
# self.assertEqual("Package: 'liB.pacK'", str(symbol))
197292

198293
# def test_ArchitectureSymbol(self):
199294
# symbol = ArchitectureSymbol("rtl")
200295
#
201296
# self.assertEqual("rtl", symbol.NormalizedIdentifier)
202297

298+
# TODO: doe packages also support simple and selected names.
203299
def test_PackageSymbol(self):
204-
symbol = PackageSymbol(SimpleName("pack"))
300+
name = SimpleName("Pack")
301+
symbol = PackageSymbol(name)
205302

206-
self.assertEqual("pack", symbol.Name.NormalizedIdentifier)
303+
self.assertIs(name, symbol.Name)
304+
self.assertFalse(symbol.IsResolved)
305+
self.assertIsNone(symbol.Reference)
306+
self.assertIsNone(symbol.Package)
307+
self.assertEqual("PackageSymbol: 'Pack' -> unresolved", repr(symbol))
308+
self.assertEqual("Pack?", str(symbol))
309+
310+
library = Library("liB")
311+
package = Package("pacK")
312+
package.Library = library
313+
symbol.Package = package
314+
315+
self.assertTrue(symbol.IsResolved)
316+
self.assertIs(package, symbol.Package)
317+
self.assertEqual("PackageSymbol: 'Pack' -> Package: 'liB.pacK'", repr(symbol))
318+
self.assertEqual("Package: 'liB.pacK'", str(symbol))
207319

208320
def test_EntityInstantiationSymbol(self):
209-
symbol = EntityInstantiationSymbol(SelectedName("ent", SimpleName("Lib")))
321+
name = SelectedName("Ent", SimpleName("Lib"))
322+
symbol = EntityInstantiationSymbol(name)
210323

211-
self.assertEqual("ent", symbol.Name.NormalizedIdentifier)
212-
self.assertEqual("lib", symbol.Name.Prefix.NormalizedIdentifier)
324+
self.assertIs(name, symbol.Name)
325+
self.assertFalse(symbol.IsResolved)
326+
self.assertIsNone(symbol.Reference)
327+
self.assertIsNone(symbol.Entity)
328+
self.assertEqual("EntityInstantiationSymbol: 'Lib.Ent' -> unresolved", repr(symbol))
329+
self.assertEqual("Lib.Ent?", str(symbol))
330+
331+
library = Library("liB")
332+
entity = Entity("enT")
333+
entity.Library = library
334+
symbol.Entity = entity
335+
336+
self.assertTrue(symbol.IsResolved)
337+
self.assertIs(entity, symbol.Entity)
338+
self.assertEqual("EntityInstantiationSymbol: 'Lib.Ent' -> Entity: 'liB.enT(%)'", repr(symbol))
339+
self.assertEqual("Entity: 'liB.enT(%)'", str(symbol))
213340

214341
def test_ComponentInstantiationSymbol(self):
215342
symbol = ComponentInstantiationSymbol(SimpleName("comp"))

0 commit comments

Comments
 (0)