From 3c9507ab63b7ad0468b4e3a997c0c1a958ebef11 Mon Sep 17 00:00:00 2001 From: Thomas Ferreira de Lima Date: Wed, 15 Feb 2023 11:01:06 -0500 Subject: [PATCH] added test for issue 1265 (writing and reading pngs) --- src/pya/unit_tests/pyaTests.cc | 2 +- testdata/pymod/pya_tests.py | 29 +++++++------- testdata/python/dbLayoutToNetlist.py | 27 +++++++------ testdata/python/dbLayoutVsSchematic.py | 7 ++-- testdata/python/layPixelBuffer.py | 52 ++++++++++++++++++++++++++ 5 files changed, 85 insertions(+), 32 deletions(-) create mode 100644 testdata/python/layPixelBuffer.py diff --git a/src/pya/unit_tests/pyaTests.cc b/src/pya/unit_tests/pyaTests.cc index 21a5a156c..c10a6d817 100644 --- a/src/pya/unit_tests/pyaTests.cc +++ b/src/pya/unit_tests/pyaTests.cc @@ -106,10 +106,10 @@ PYTHONTEST (dbLayoutToNetlist, "dbLayoutToNetlist.py") PYTHONTEST (dbLayoutVsSchematic, "dbLayoutVsSchematic.py") PYTHONTEST (dbNetlistCrossReference, "dbNetlistCrossReference.py") PYTHONTEST (layLayers, "layLayers.py") +PYTHONTEST (layPixelBuffer, "layPixelBuffer.py") PYTHONTEST (tlTest, "tlTest.py") #if defined(HAVE_QT) && defined(HAVE_QTBINDINGS) PYTHONTEST (qtbinding, "qtbinding.py") #endif #endif - diff --git a/testdata/pymod/pya_tests.py b/testdata/pymod/pya_tests.py index a0c12e856..1cf95af51 100644 --- a/testdata/pymod/pya_tests.py +++ b/testdata/pymod/pya_tests.py @@ -22,20 +22,23 @@ import dbLayoutToNetlist import dbLayoutVsSchematic import dbNetlistCrossReference import layLayers - +import layPixelBuffer + if __name__ == '__main__': - suite = unittest.TestLoader().loadTestsFromTestCase(tlTest.TLTest) - suite = unittest.TestLoader().loadTestsFromTestCase(dbPCells.DBPCellTests) - suite = unittest.TestLoader().loadTestsFromTestCase(dbLayoutTest.DBLayoutTest) - suite = unittest.TestLoader().loadTestsFromTestCase(dbPolygonTest.DBPolygonTests) - suite = unittest.TestLoader().loadTestsFromTestCase(dbReaders.DBReadersTests) - suite = unittest.TestLoader().loadTestsFromTestCase(dbRegionTest.DBRegionTest) - suite = unittest.TestLoader().loadTestsFromTestCase(dbTransTest.DBTransTests) - suite = unittest.TestLoader().loadTestsFromTestCase(dbLayoutToNetlist.DBLayoutToNetlistTests) - suite = unittest.TestLoader().loadTestsFromTestCase(dbLayoutVsSchematic.DBLayoutVsSchematicTests) - suite = unittest.TestLoader().loadTestsFromTestCase(dbNetlistCrossReference.DBNetlistCrossReferenceTests) - suite = unittest.TestLoader().loadTestsFromTestCase(layLayers.LAYLayersTests) + loader = unittest.TestLoader() + suite = unittest.TestSuite() + suite.addTests(loader.loadTestsFromTestCase(tlTest.TLTest)) + suite.addTests(loader.loadTestsFromTestCase(dbPCells.DBPCellTests)) + suite.addTests(loader.loadTestsFromTestCase(dbLayoutTest.DBLayoutTest)) + suite.addTests(loader.loadTestsFromTestCase(dbPolygonTest.DBPolygonTests)) + suite.addTests(loader.loadTestsFromTestCase(dbReaders.DBReadersTests)) + suite.addTests(loader.loadTestsFromTestCase(dbRegionTest.DBRegionTest)) + suite.addTests(loader.loadTestsFromTestCase(dbTransTest.DBTransTests)) + suite.addTests(loader.loadTestsFromTestCase(dbLayoutToNetlist.DBLayoutToNetlistTests)) + suite.addTests(loader.loadTestsFromTestCase(dbLayoutVsSchematic.DBLayoutVsSchematicTests)) + suite.addTests(loader.loadTestsFromTestCase(dbNetlistCrossReference.DBNetlistCrossReferenceTests)) + suite.addTests(loader.loadTestsFromTestCase(layLayers.LAYLayersTests)) + suite.addTests(loader.loadTestsFromTestCase(layPixelBuffer.LAYPixelBufferTests)) if not unittest.TextTestRunner(verbosity = 1).run(suite).wasSuccessful(): sys.exit(1) - diff --git a/testdata/python/dbLayoutToNetlist.py b/testdata/python/dbLayoutToNetlist.py index 2e881231f..87760f8ce 100644 --- a/testdata/python/dbLayoutToNetlist.py +++ b/testdata/python/dbLayoutToNetlist.py @@ -46,7 +46,7 @@ class DBLayoutToNetlistTests(unittest.TestCase): self.assertEqual(l2n.internal_layout().top_cell().name, ly.top_cell().name) self.assertEqual(l2n.internal_top_cell().name, ly.top_cell().name) - self.assertNotEqual(l2n.layer_of(r), ly.layer(6, 0)) # would be a strange coincidence ... + self.assertNotEqual(l2n.layer_of(r), ly.layer(6, 0)) # would be a strange coincidence ... cm = l2n.const_cell_mapping_into(ly, ly.top_cell()) for ci in range(0, l2n.internal_layout().cells()): @@ -80,7 +80,7 @@ class DBLayoutToNetlistTests(unittest.TestCase): rvia1 = l2n.make_polygon_layer( ly.layer(7, 0), "via1" ) rmetal2 = l2n.make_polygon_layer( ly.layer(8, 0), "metal2" ) rmetal2_lbl = l2n.make_text_layer( ly.layer(8, 1), "metal2_lbl" ) - + # Intra-layer l2n.connect(rmetal1) l2n.connect(rvia1) @@ -92,7 +92,7 @@ class DBLayoutToNetlistTests(unittest.TestCase): l2n.connect(rmetal1, rmetal1_lbl) # attaches labels l2n.connect(rmetal2, rmetal2_lbl) # attaches labels - # Perform netlist extraction + # Perform netlist extraction l2n.extract_netlist() self.assertEqual(str(l2n.netlist()), """circuit TRANS ($1=$1,$2=$2); @@ -137,7 +137,7 @@ end; self.assertEqual(",".join(a), "$2") self.assertEqual(str(t), "r0 *1 2.64,0") - self.assertEqual(str(l2n.shapes_of_net(n, rmetal1, True)), + self.assertEqual(str(l2n.shapes_of_net(n, rmetal1, True)), "(-980,-420;-980,2420;-620,2420;-620,-420);(-800,820;-800,1180;580,1180;580,820);(-980,2420;-980,3180;-620,3180;-620,2420);(-980,-380;-980,380;-620,380;-620,-380)") shapes = pya.Shapes() @@ -145,7 +145,7 @@ end; r = pya.Region() for s in shapes.each(): r.insert(s.polygon) - self.assertEqual(str(r), + self.assertEqual(str(r), "(-980,-420;-980,2420;-620,2420;-620,-420);(-800,820;-800,1180;580,1180;580,820);(-980,2420;-980,3180;-620,3180;-620,2420);(-980,-380;-980,380;-620,380;-620,-380)") def test_10_LayoutToNetlistExtractionWithoutDevices(self): @@ -169,7 +169,7 @@ end; rvia1 = l2n.make_polygon_layer( ly.layer(7, 0), "via1" ) rmetal2 = l2n.make_polygon_layer( ly.layer(8, 0), "metal2" ) rmetal2_lbl = l2n.make_text_layer( ly.layer(8, 1), "metal2_lbl" ) - + rsd = ractive - rpoly l2n.register(rsd, "sd") @@ -194,7 +194,7 @@ end; l2n.connect(rmetal1, rmetal1_lbl) # attaches labels l2n.connect(rmetal2, rmetal2_lbl) # attaches labels - # Perform netlist extraction + # Perform netlist extraction l2n.extract_netlist() self.assertEqual(str(l2n.netlist()), """circuit TRANS ($1=$1,$2=$2,$3=$3); @@ -247,7 +247,7 @@ end; rnactive = ractive - rnwell rngate = rnactive & rpoly rnsd = rnactive - rngate - + # PMOS transistor device extraction pmos_ex = pya.DeviceExtractorMOS3Transistor("PMOS") l2n.extract_devices(pmos_ex, { "SD": rpsd, "G": rpgate, "P": rpoly }) @@ -282,8 +282,8 @@ end; l2n.connect(rpoly, rpoly_lbl) # attaches labels l2n.connect(rmetal1, rmetal1_lbl) # attaches labels l2n.connect(rmetal2, rmetal2_lbl) # attaches labels - - # Perform netlist extraction + + # Perform netlist extraction l2n.extract_netlist() self.assertEqual(str(l2n.netlist()), """circuit RINGO (); @@ -397,8 +397,8 @@ end; # Global connections l2n.connect_global(rptie, "BULK") l2n.connect_global(rbulk, "BULK") - - # Perform netlist extraction + + # Perform netlist extraction l2n.extract_netlist() self.assertEqual(str(l2n.netlist()), """circuit RINGO (); @@ -455,7 +455,7 @@ end; def test_13_ReadAndWrite(self): ut_testsrc = os.getenv("TESTSRC") - ut_testtmp = os.getenv("TESTTMP") + ut_testtmp = os.getenv("TESTTMP", "") l2n = pya.LayoutToNetlist() @@ -725,4 +725,3 @@ if __name__ == '__main__': if not unittest.TextTestRunner(verbosity = 1).run(suite).wasSuccessful(): sys.exit(1) - diff --git a/testdata/python/dbLayoutVsSchematic.py b/testdata/python/dbLayoutVsSchematic.py index aff873f92..d512c300b 100644 --- a/testdata/python/dbLayoutVsSchematic.py +++ b/testdata/python/dbLayoutVsSchematic.py @@ -98,7 +98,7 @@ class DBLayoutVsSchematicTests(unittest.TestCase): lvs.connect(metal2) lvs.connect(ptie) lvs.connect(ntie) - + # inter-layer lvs.connect(psd, diff_cont) lvs.connect(nsd, diff_cont) @@ -113,7 +113,7 @@ class DBLayoutVsSchematicTests(unittest.TestCase): lvs.connect(poly, poly_lbl) # attaches labels lvs.connect(metal1, metal1_lbl) # attaches labels lvs.connect(metal2, metal2_lbl) # attaches labels - + # global lvs.connect_global(ptie, "BULK") lvs.connect_global(bulk, "BULK") @@ -144,7 +144,7 @@ class DBLayoutVsSchematicTests(unittest.TestCase): def test_3_ReadAndWrite(self): ut_testsrc = os.getenv("TESTSRC") - ut_testtmp = os.getenv("TESTTMP") + ut_testtmp = os.getenv("TESTTMP", "") lvs = pya.LayoutVsSchematic() @@ -181,4 +181,3 @@ if __name__ == '__main__': if not unittest.TextTestRunner(verbosity = 1).run(suite).wasSuccessful(): sys.exit(1) - diff --git a/testdata/python/layPixelBuffer.py b/testdata/python/layPixelBuffer.py new file mode 100644 index 000000000..a37e77f92 --- /dev/null +++ b/testdata/python/layPixelBuffer.py @@ -0,0 +1,52 @@ +# KLayout Layout Viewer +# Copyright (C) 2006-2023 Matthias Koefferlein +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +import pya +import unittest +import os +import sys + +class LAYPixelBufferTests(unittest.TestCase): + + def test_4(self): + pb = pya.PixelBuffer(10, 20) + pb.transparent = True + pb.fill(0xf0010203) + + png = pb.to_png_data() + + # some range because implementations may differ + self.assertGreater(len(png), 20) + self.assertLess(len(png), 200) + pb_copy = pya.PixelBuffer.from_png_data(png) + self.assertEqual(pb, pb_copy) + + ut_testtmp = os.getenv("TESTTMP", ".") + tmp = os.path.join(ut_testtmp, "tmp.png") + + pb.write_png(tmp) + pb_copy = pya.PixelBuffer.read_png(tmp) + self.assertEqual(pb, pb_copy) + + +# run unit tests +if __name__ == '__main__': + suite = unittest.TestLoader().loadTestsFromTestCase(LAYPixelBufferTests) + + if not unittest.TextTestRunner(verbosity = 1).run(suite).wasSuccessful(): + sys.exit(1)