From a9b4ff767b9adf19c716c6a8c6e3e6ed0de93a43 Mon Sep 17 00:00:00 2001 From: Juan Pablo Caram Date: Sun, 3 Jul 2016 15:59:25 -0400 Subject: [PATCH] Some cleanup to shell tests. --- FlatCAMApp.py | 13 ++++--- FlatCAMObj.py | 4 +++ tests/test_tcl_shell.py | 80 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 83 insertions(+), 14 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 62757efe..f069424a 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -789,28 +789,31 @@ class App(QtCore.QObject): def exec_command_test(self, text, reraise=True): """ + Same as exec_command(...) with additional control over exceptions. Handles input from the shell. See FlatCAMApp.setup_shell for shell commands. :param text: Input command - :param reraise: raise exception and not hide it, used mainly in unittests - :return: output if there was any + :param reraise: Re-raise TclError exceptions in Python (mostly for unitttests). + :return: Output from the command """ text = str(text) try: - self.shell.open_proccessing() + self.shell.open_proccessing() # Disables input box. result = self.tcl.eval(str(text)) if result != 'None': self.shell.append_output(result + '\n') + except Tkinter.TclError, e: - #this will display more precise answer if something in TCL shell fail + # This will display more precise answer if something in TCL shell fails result = self.tcl.eval("set errorInfo") self.log.error("Exec command Exception: %s" % (result + '\n')) self.shell.append_error('ERROR: ' + result + '\n') - #show error in console and just return or in test raise exception + # Show error in console and just return or in test raise exception if reraise: raise e + finally: self.shell.close_proccessing() pass diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 8860bcb9..0b1152d7 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -25,6 +25,7 @@ class FlatCAMObj(QtCore.QObject): def __init__(self, name): """ + Constructor. :param name: Name of the object given by the user. :return: FlatCAMObj @@ -57,6 +58,9 @@ class FlatCAMObj(QtCore.QObject): ``self.options`` is only updated, not overwritten. This ensures that options set by the app do not vanish when reading the objects from a project file. + + :param d: Dictionary with attributes to set. + :return: None """ for attr in self.ser_attrs: diff --git a/tests/test_tcl_shell.py b/tests/test_tcl_shell.py index 510a4911..59ac3340 100644 --- a/tests/test_tcl_shell.py +++ b/tests/test_tcl_shell.py @@ -43,6 +43,7 @@ class TclShellTest(unittest.TestCase): cls.setup = True cls.app = QtGui.QApplication(sys.argv) + # Create App, keep app defaults (do not load # user-defined defaults). cls.fc = App(user_defaults=False) @@ -54,6 +55,7 @@ class TclShellTest(unittest.TestCase): @classmethod def tearDownClass(cls): + cls.fc.tcl = None cls.app.closeAllWindows() del cls.fc @@ -61,46 +63,106 @@ class TclShellTest(unittest.TestCase): pass def test_set_get_units(self): + """ + Tests setting and getting units via the ``set_sys`` command, + and persistance after ``new`` command. + :return: None + """ + + # MM self.fc.exec_command_test('set_sys units MM') self.fc.exec_command_test('new') + # IN self.fc.exec_command_test('set_sys units IN') self.fc.exec_command_test('new') - units=self.fc.exec_command_test('get_sys units') + + #---------------------------------------- + # Units must be IN + #---------------------------------------- + units = self.fc.exec_command_test('get_sys units') self.assertEquals(units, "IN") + # MM self.fc.exec_command_test('set_sys units MM') self.fc.exec_command_test('new') - units=self.fc.exec_command_test('get_sys units') + + #---------------------------------------- + # Units must be MM + #---------------------------------------- + units = self.fc.exec_command_test('get_sys units') self.assertEquals(units, "MM") def test_gerber_flow(self): + """ + Typical workflow from Gerber to GCode. - # open gerber files top, bottom and cutout + :return: None + """ - self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_top_filename, self.gerber_top_name)) + gbr_cmd = 'open_gerber {path}/{filename} -outname {outname}' + + #----------------------------------------- + # Open top layer and check for object type + #----------------------------------------- + cmd = gbr_cmd.format( + path=self.gerber_files, + filename=self.copper_top_filename, + outname=self.gerber_top_name) + self.fc.exec_command_test(cmd) gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name) self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber), "Expected FlatCAMGerber, instead, %s is %s" % (self.gerber_top_name, type(gerber_top_obj))) - self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_bottom_filename, self.gerber_bottom_name)) + #-------------------------------------------- + # Open bottom layer and check for object type + #-------------------------------------------- + cmd = gbr_cmd.format( + path=self.gerber_files, + filename=self.copper_bottom_filename, + outname=self.gerber_bottom_name) + self.fc.exec_command_test(cmd) gerber_bottom_obj = self.fc.collection.get_by_name(self.gerber_bottom_name) self.assertTrue(isinstance(gerber_bottom_obj, FlatCAMGerber), "Expected FlatCAMGerber, instead, %s is %s" % (self.gerber_bottom_name, type(gerber_bottom_obj))) - self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.cutout_filename, self.gerber_cutout_name)) + #-------------------------------------------- + # Open cutout layer and check for object type + #-------------------------------------------- + cmd = gbr_cmd.format( + path=self.gerber_files, + filename=self.cutout_filename, + outname=self.gerber_cutout_name + ) + self.fc.exec_command_test(cmd) gerber_cutout_obj = self.fc.collection.get_by_name(self.gerber_cutout_name) self.assertTrue(isinstance(gerber_cutout_obj, FlatCAMGerber), "Expected FlatCAMGerber, instead, %s is %s" % (self.gerber_cutout_name, type(gerber_cutout_obj))) # exteriors delete and join geometries for top layer - self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_cutout_name, self.engraver_diameter)) - self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_iso', self.gerber_cutout_name + '_iso_exterior')) - self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso')) + cmd = 'isolate {objname} -dia {dia}'.format( + objname=self.gerber_cutout_name, + dia=self.engraver_diameter) + self.fc.exec_command_test(cmd) + + cmd = 'exteriors {objname} -outname {outname}'.format( + objname=self.gerber_cutout_name + '_iso', + outname=self.gerber_cutout_name + '_iso_exterior') + self.fc.exec_command_test(cmd) + + cmd = 'delete {objname}'.format( + objname=self.gerber_cutout_name + '_iso') + self.fc.exec_command_test(cmd) + + # TODO: Check deleteb object is gone. + + #-------------------------------------------- + # Exteriors of cutout layer, check type + #-------------------------------------------- obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_iso_exterior') self.assertTrue(isinstance(obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" %