Procházet zdrojové kódy

Some cleanup to shell tests.

Juan Pablo Caram před 9 roky
rodič
revize
a9b4ff767b
3 změnil soubory, kde provedl 85 přidání a 16 odebrání
  1. 8 5
      FlatCAMApp.py
  2. 4 0
      FlatCAMObj.py
  3. 73 11
      tests/test_tcl_shell.py

+ 8 - 5
FlatCAMApp.py

@@ -789,28 +789,31 @@ class App(QtCore.QObject):
 
 
     def exec_command_test(self, text, reraise=True):
     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.
         Handles input from the shell. See FlatCAMApp.setup_shell for shell commands.
 
 
         :param text: Input command
         :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)
         text = str(text)
 
 
         try:
         try:
-            self.shell.open_proccessing()
+            self.shell.open_proccessing()  # Disables input box.
             result = self.tcl.eval(str(text))
             result = self.tcl.eval(str(text))
             if result != 'None':
             if result != 'None':
                 self.shell.append_output(result + '\n')
                 self.shell.append_output(result + '\n')
+
         except Tkinter.TclError, e:
         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")
             result = self.tcl.eval("set errorInfo")
             self.log.error("Exec command Exception: %s" % (result + '\n'))
             self.log.error("Exec command Exception: %s" % (result + '\n'))
             self.shell.append_error('ERROR: ' + 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:
             if reraise:
                 raise e
                 raise e
+
         finally:
         finally:
             self.shell.close_proccessing()
             self.shell.close_proccessing()
             pass
             pass

+ 4 - 0
FlatCAMObj.py

@@ -25,6 +25,7 @@ class FlatCAMObj(QtCore.QObject):
 
 
     def __init__(self, name):
     def __init__(self, name):
         """
         """
+        Constructor.
 
 
         :param name: Name of the object given by the user.
         :param name: Name of the object given by the user.
         :return: FlatCAMObj
         :return: FlatCAMObj
@@ -57,6 +58,9 @@ class FlatCAMObj(QtCore.QObject):
         ``self.options`` is only updated, not overwritten. This ensures that
         ``self.options`` is only updated, not overwritten. This ensures that
         options set by the app do not vanish when reading the objects
         options set by the app do not vanish when reading the objects
         from a project file.
         from a project file.
+
+        :param d: Dictionary with attributes to set.
+        :return: None
         """
         """
 
 
         for attr in self.ser_attrs:
         for attr in self.ser_attrs:

+ 73 - 11
tests/test_tcl_shell.py

@@ -43,6 +43,7 @@ class TclShellTest(unittest.TestCase):
 
 
         cls.setup = True
         cls.setup = True
         cls.app = QtGui.QApplication(sys.argv)
         cls.app = QtGui.QApplication(sys.argv)
+
         # Create App, keep app defaults (do not load
         # Create App, keep app defaults (do not load
         # user-defined defaults).
         # user-defined defaults).
         cls.fc = App(user_defaults=False)
         cls.fc = App(user_defaults=False)
@@ -54,6 +55,7 @@ class TclShellTest(unittest.TestCase):
 
 
     @classmethod
     @classmethod
     def tearDownClass(cls):
     def tearDownClass(cls):
+
         cls.fc.tcl = None
         cls.fc.tcl = None
         cls.app.closeAllWindows()
         cls.app.closeAllWindows()
         del cls.fc
         del cls.fc
@@ -61,46 +63,106 @@ class TclShellTest(unittest.TestCase):
         pass
         pass
 
 
     def test_set_get_units(self):
     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('set_sys units MM')
         self.fc.exec_command_test('new')
         self.fc.exec_command_test('new')
 
 
+        # IN
         self.fc.exec_command_test('set_sys units IN')
         self.fc.exec_command_test('set_sys units IN')
         self.fc.exec_command_test('new')
         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")
         self.assertEquals(units, "IN")
 
 
+        # MM
         self.fc.exec_command_test('set_sys units MM')
         self.fc.exec_command_test('set_sys units MM')
         self.fc.exec_command_test('new')
         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")
         self.assertEquals(units, "MM")
 
 
     def test_gerber_flow(self):
     def test_gerber_flow(self):
-
-        # open  gerber files top, bottom and cutout
-
-        self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_top_filename, self.gerber_top_name))
+        """
+        Typical workflow from Gerber to GCode.
+
+        :return: None
+        """
+
+        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)
         gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name)
         self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
         self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
                         "Expected FlatCAMGerber, instead, %s is %s" %
                         "Expected FlatCAMGerber, instead, %s is %s" %
                         (self.gerber_top_name, type(gerber_top_obj)))
                         (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)
         gerber_bottom_obj = self.fc.collection.get_by_name(self.gerber_bottom_name)
         self.assertTrue(isinstance(gerber_bottom_obj, FlatCAMGerber),
         self.assertTrue(isinstance(gerber_bottom_obj, FlatCAMGerber),
                         "Expected FlatCAMGerber, instead, %s is %s" %
                         "Expected FlatCAMGerber, instead, %s is %s" %
                         (self.gerber_bottom_name, type(gerber_bottom_obj)))
                         (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)
         gerber_cutout_obj = self.fc.collection.get_by_name(self.gerber_cutout_name)
         self.assertTrue(isinstance(gerber_cutout_obj, FlatCAMGerber),
         self.assertTrue(isinstance(gerber_cutout_obj, FlatCAMGerber),
                         "Expected FlatCAMGerber, instead, %s is %s" %
                         "Expected FlatCAMGerber, instead, %s is %s" %
                         (self.gerber_cutout_name, type(gerber_cutout_obj)))
                         (self.gerber_cutout_name, type(gerber_cutout_obj)))
 
 
         # exteriors delete and join geometries for top layer
         # 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')
         obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_iso_exterior')
         self.assertTrue(isinstance(obj, FlatCAMGeometry),
         self.assertTrue(isinstance(obj, FlatCAMGeometry),
                         "Expected FlatCAMGeometry, instead, %s is %s" %
                         "Expected FlatCAMGeometry, instead, %s is %s" %