# *************************************************************************** # * Copyright (c) 2025 sliptonic * # * * # * This program is free software; you can redistribute it and/or modify * # * it under the terms of the GNU Lesser General Public License (LGPL) * # * as published by the Free Software Foundation; either version 2 of * # * the License, or (at your option) any later version. * # * for detail see the LICENCE text file. * # * * # * 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 Library General Public License for more details. * # * * # * You should have received a copy of the GNU Library General Public * # * License along with this program; if not, write to the Free Software * # * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * # * USA * # * * # *************************************************************************** """Mock objects for postprocessor testing. This module provides mock objects that simulate FreeCAD CAM job structure without requiring disk I/O or loading actual FreeCAD documents. """ import Path class MockTool: def __init__(self): self.ShapeName = "endmill" class MockToolController: """Mock ToolController for operations.""" def __init__( self, tool_number=1, label="TC: Default Tool", spindle_speed=1000, spindle_dir="Forward", ): self.Tool = MockTool() self.ToolNumber = tool_number self.Label = label self.SpindleSpeed = spindle_speed self.SpindleDir = spindle_dir self.Name = f"TC{tool_number}" # Create a simple path with tool change commands self.Path = Path.Path() self.Path.addCommands( [Path.Command(f"M6 T{tool_number}"), Path.Command(f"M3 S{spindle_speed}")] ) def InList(self): return [] class MockOperation: """Mock Operation object for testing postprocessors.""" def __init__(self, name="Operation", label=None, tool_controller=None, active=True): self.Name = name self.Label = label or name self.Active = active self.ToolController = tool_controller # Create an empty path by default self.Path = Path.Path() def InList(self): """Mock InList - operations belong to a job.""" return [] class MockStock: """Mock Stock object with BoundBox.""" def __init__(self, xmin=0.0, xmax=100.0, ymin=0.0, ymax=100.0, zmin=0.0, zmax=10.0): self.Shape = type( "obj", (object,), { "BoundBox": type( "obj", (object,), { "XMin": xmin, "XMax": xmax, "YMin": ymin, "YMax": ymax, "ZMin": zmin, "ZMax": zmax, }, )() }, )() class MockSetupSheet: """Mock SetupSheet object.""" def __init__(self, clearance_height=5.0, safe_height=3.0): self.ClearanceHeightOffset = type("obj", (object,), {"Value": clearance_height})() self.SafeHeightOffset = type("obj", (object,), {"Value": safe_height})() class MockJob: """Mock Job object for testing postprocessors.""" def __init__(self): # Create mock Stock with BoundBox self.Stock = MockStock() # Create mock SetupSheet self.SetupSheet = MockSetupSheet() # Create mock Operations group self.Operations = type("obj", (object,), {"Group": []})() # Create mock Tools group self.Tools = type("obj", (object,), {"Group": []})() # Create mock Model group self.Model = type("obj", (object,), {"Group": []})() # Basic properties self.Label = "MockJob" self.PostProcessor = "" self.PostProcessorArgs = "" self.PostProcessorOutputFile = "" self.Fixtures = ["G54"] self.OrderOutputBy = "Tool" self.SplitOutput = False def InList(self): """Mock InList for fixture setup.""" return [] def create_default_job_with_operation(): """Create a mock job with a default tool controller and operation. This is a convenience function for common test scenarios. Returns: (job, operation, tool_controller) """ job = MockJob() # Create default tool controller tc = MockToolController(tool_number=1, label="TC: Default Tool", spindle_speed=1000) job.Tools.Group = [tc] # Create default operation op = MockOperation(name="Profile", label="Profile", tool_controller=tc) job.Operations.Group = [op] return job, op, tc