382 lines
12 KiB
Python
382 lines
12 KiB
Python
import unittest
|
|
from Path.Tool.library import Library
|
|
from Path.Tool.toolbit import ToolBitEndmill, ToolBitDrill, ToolBitVBit
|
|
from Path.Tool.shape import (
|
|
ToolBitShapeEndmill,
|
|
ToolBitShapeDrill,
|
|
ToolBitShapeVBit,
|
|
)
|
|
|
|
|
|
class TestPathToolLibrary(unittest.TestCase):
|
|
def test_init(self):
|
|
library = Library("Test Library")
|
|
self.assertEqual(library.label, "Test Library")
|
|
self.assertIsNotNone(library.id)
|
|
self.assertEqual(len(library._bits), 0)
|
|
self.assertEqual(len(library._bit_nos), 0)
|
|
|
|
def test_str(self):
|
|
library = Library("My Library", "123-abc")
|
|
self.assertEqual(str(library), '123-abc "My Library"')
|
|
|
|
def test_eq(self):
|
|
library1 = Library("Lib1", "same-id")
|
|
library2 = Library("Lib2", "same-id")
|
|
library3 = Library("Lib3", "different-id")
|
|
self.assertEqual(library1, library2)
|
|
self.assertNotEqual(library1, library3)
|
|
|
|
def test_iter(self):
|
|
library = Library("Test Library")
|
|
# Create ToolBitShape instances with required parameters
|
|
shape1 = ToolBitShapeEndmill(
|
|
id="dummy_endmill",
|
|
CuttingEdgeHeight=10.0,
|
|
Diameter=10.0,
|
|
Flutes=2,
|
|
Length=50.0,
|
|
ShankDiameter=10.0,
|
|
)
|
|
shape2 = ToolBitShapeDrill(
|
|
id="dummy_drill",
|
|
Diameter=5.0,
|
|
Length=40.0,
|
|
ShankDiameter=5.0,
|
|
Flutes=2,
|
|
TipAngle=118.0,
|
|
)
|
|
bit1 = ToolBitEndmill(shape1)
|
|
bit2 = ToolBitDrill(shape2)
|
|
library.add_bit(bit1)
|
|
library.add_bit(bit2)
|
|
_bits_list = list(library)
|
|
self.assertEqual(len(_bits_list), 2)
|
|
self.assertIn(bit1, _bits_list)
|
|
self.assertIn(bit2, _bits_list)
|
|
|
|
def test_get_next_bit_no(self):
|
|
library = Library("Test Library")
|
|
self.assertEqual(library.get_next_bit_no(), 1)
|
|
# Using ToolBit instances in _bit_nos with ToolBitShape
|
|
shape_a = ToolBitShapeEndmill(
|
|
id="dummy_a",
|
|
CuttingEdgeHeight=1.0,
|
|
Diameter=1.0,
|
|
Flutes=1,
|
|
Length=10.0,
|
|
ShankDiameter=1.0,
|
|
)
|
|
shape_b = ToolBitShapeDrill(
|
|
id="dummy_b",
|
|
Diameter=2.0,
|
|
Length=20.0,
|
|
ShankDiameter=2.0,
|
|
Flutes=2,
|
|
TipAngle=118.0,
|
|
)
|
|
shape_c = ToolBitShapeVBit(
|
|
id="dummy_c",
|
|
Diameter=3.0,
|
|
Angle=90.0,
|
|
Length=30.0,
|
|
ShankDiameter=3.0,
|
|
CuttingEdgeAngle=30.0,
|
|
CuttingEdgeHeight=10.0,
|
|
Flutes=2,
|
|
TipDiameter=1.0,
|
|
)
|
|
library._bit_nos = {
|
|
1: ToolBitEndmill(shape_a),
|
|
5: ToolBitDrill(shape_b),
|
|
2: ToolBitVBit(shape_c),
|
|
}
|
|
self.assertEqual(library.get_next_bit_no(), 6)
|
|
library._bit_nos = {}
|
|
self.assertEqual(library.get_next_bit_no(), 1)
|
|
|
|
def test_get_bit_no_from_bit(self):
|
|
library = Library("Test Library")
|
|
shape1 = ToolBitShapeEndmill(
|
|
id="dummy_endmill_1",
|
|
CuttingEdgeHeight=10.0,
|
|
Diameter=10.0,
|
|
Flutes=2,
|
|
Length=50.0,
|
|
ShankDiameter=10.0,
|
|
)
|
|
shape2 = ToolBitShapeDrill(
|
|
id="dummy_drill_1",
|
|
Diameter=5.0,
|
|
Length=40.0,
|
|
ShankDiameter=5.0,
|
|
Flutes=2,
|
|
TipAngle=118.0,
|
|
)
|
|
bit1 = ToolBitEndmill(shape1)
|
|
bit2 = ToolBitDrill(shape2)
|
|
library.add_bit(bit1, 1)
|
|
library.add_bit(bit2, 2)
|
|
self.assertEqual(library.get_bit_no_from_bit(bit1), 1)
|
|
self.assertEqual(library.get_bit_no_from_bit(bit2), 2)
|
|
shape_cutter = ToolBitShapeVBit(
|
|
id="dummy_cutter_1",
|
|
Diameter=3.0,
|
|
Angle=90.0,
|
|
Length=30.0,
|
|
ShankDiameter=3.0,
|
|
CuttingEdgeAngle=30.0,
|
|
CuttingEdgeHeight=10.0,
|
|
Flutes=2,
|
|
TipDiameter=1.0,
|
|
)
|
|
self.assertIsNone(library.get_bit_no_from_bit(ToolBitVBit(shape_cutter)))
|
|
|
|
def test_assign_new_bit_no(self):
|
|
library = Library("Test Library")
|
|
shape1 = ToolBitShapeEndmill(
|
|
id="dummy_endmill_2",
|
|
CuttingEdgeHeight=10.0,
|
|
Diameter=10.0,
|
|
Flutes=2,
|
|
Length=50.0,
|
|
ShankDiameter=10.0,
|
|
)
|
|
shape2 = ToolBitShapeDrill(
|
|
id="dummy_drill_2",
|
|
Diameter=5.0,
|
|
Length=40.0,
|
|
ShankDiameter=5.0,
|
|
Flutes=2,
|
|
TipAngle=118.0,
|
|
)
|
|
bit1 = ToolBitEndmill(shape1)
|
|
bit2 = ToolBitDrill(shape2)
|
|
|
|
# Assign bit1 without specifying number (should get 1)
|
|
library.add_bit(bit1)
|
|
self.assertEqual(len(library._bits), 1)
|
|
self.assertEqual(len(library._bit_nos), 1)
|
|
self.assertIn(1, library._bit_nos)
|
|
self.assertEqual(library._bit_nos[1], bit1)
|
|
|
|
# Assign bit2 to number 1 (should reassign bit1)
|
|
library.add_bit(bit2, 1)
|
|
self.assertEqual(len(library._bits), 2)
|
|
self.assertEqual(len(library._bit_nos), 2)
|
|
self.assertIn(1, library._bit_nos)
|
|
self.assertEqual(library._bit_nos[1], bit2)
|
|
# Check if bit1 was reassigned to a new bit number (should be 2)
|
|
self.assertIn(2, library._bit_nos)
|
|
self.assertEqual(library._bit_nos[2], bit1)
|
|
|
|
# Assign bit2 to number 10
|
|
library.assign_new_bit_no(bit2, 10)
|
|
self.assertEqual(len(library._bits), 2)
|
|
self.assertEqual(len(library._bit_nos), 2)
|
|
self.assertIn(10, library._bit_nos)
|
|
self.assertEqual(library._bit_nos[10], bit2)
|
|
self.assertNotIn(1, library._bit_nos) # bit2 should no longer be at 1
|
|
self.assertIn(2, library._bit_nos)
|
|
self.assertEqual(library._bit_nos[2], bit1)
|
|
|
|
# Assign bit1 to number 5
|
|
library.assign_new_bit_no(bit1, 5)
|
|
self.assertEqual(len(library._bits), 2)
|
|
self.assertEqual(len(library._bit_nos), 2)
|
|
self.assertIn(5, library._bit_nos)
|
|
self.assertEqual(library._bit_nos[5], bit1)
|
|
self.assertNotIn(2, library._bit_nos) # bit1 should no longer be at 2
|
|
self.assertIn(10, library._bit_nos)
|
|
self.assertEqual(library._bit_nos[10], bit2)
|
|
|
|
def test_add_bit(self):
|
|
library = Library("Test Library")
|
|
shape1 = ToolBitShapeEndmill(
|
|
id="dummy_endmill_3",
|
|
CuttingEdgeHeight=10.0,
|
|
Diameter=10.0,
|
|
Flutes=2,
|
|
Length=50.0,
|
|
ShankDiameter=10.0,
|
|
)
|
|
shape2 = ToolBitShapeDrill(
|
|
id="dummy_drill_3",
|
|
Diameter=5.0,
|
|
Length=40.0,
|
|
ShankDiameter=5.0,
|
|
Flutes=2,
|
|
TipAngle=118.0,
|
|
)
|
|
bit1 = ToolBitEndmill(shape1)
|
|
bit2 = ToolBitDrill(shape2)
|
|
|
|
library.add_bit(bit1)
|
|
self.assertEqual(len(library._bits), 1)
|
|
self.assertIn(bit1, library._bits)
|
|
self.assertEqual(len(library._bit_nos), 1)
|
|
self.assertIn(1, library._bit_nos)
|
|
self.assertEqual(library._bit_nos[1], bit1)
|
|
|
|
library.add_bit(bit2, 5)
|
|
self.assertEqual(len(library._bits), 2)
|
|
self.assertIn(bit1, library._bits)
|
|
self.assertIn(bit2, library._bits)
|
|
self.assertEqual(len(library._bit_nos), 2)
|
|
self.assertIn(1, library._bit_nos)
|
|
self.assertEqual(library._bit_nos[1], bit1)
|
|
self.assertIn(5, library._bit_nos)
|
|
self.assertEqual(library._bit_nos[5], bit2)
|
|
|
|
# Add bit1 again (should not increase bit count in _bits list)
|
|
library.add_bit(bit1, 10)
|
|
self.assertEqual(len(library._bits), 2)
|
|
self.assertIn(bit1, library._bits)
|
|
self.assertIn(bit2, library._bits)
|
|
self.assertEqual(len(library._bit_nos), 2) # _bit_nos count remains 2
|
|
self.assertIn(10, library._bit_nos)
|
|
self.assertEqual(library._bit_nos[10], bit1)
|
|
self.assertIn(5, library._bit_nos)
|
|
self.assertEqual(library._bit_nos[5], bit2)
|
|
self.assertNotIn(1, library._bit_nos) # bit1 should no longer be at 1
|
|
|
|
def test_get_bits(self):
|
|
library = Library("Test Library")
|
|
shape1 = ToolBitShapeEndmill(
|
|
id="dummy_endmill_4",
|
|
CuttingEdgeHeight=10.0,
|
|
Diameter=10.0,
|
|
Flutes=2,
|
|
Length=50.0,
|
|
ShankDiameter=10.0,
|
|
)
|
|
shape2 = ToolBitShapeDrill(
|
|
id="dummy_drill_4",
|
|
Diameter=5.0,
|
|
Length=40.0,
|
|
ShankDiameter=5.0,
|
|
Flutes=2,
|
|
TipAngle=118.0,
|
|
)
|
|
bit1 = ToolBitEndmill(shape1)
|
|
bit2 = ToolBitDrill(shape2)
|
|
self.assertEqual(library.get_bits(), [])
|
|
library.add_bit(bit1)
|
|
library.add_bit(bit2)
|
|
_bits_list = library.get_bits()
|
|
self.assertEqual(len(_bits_list), 2)
|
|
self.assertIn(bit1, _bits_list)
|
|
self.assertIn(bit2, _bits_list)
|
|
|
|
def test_has_bit(self):
|
|
library = Library("Test Library")
|
|
shape1 = ToolBitShapeEndmill(
|
|
id="dummy_endmill_5",
|
|
CuttingEdgeHeight=10.0,
|
|
Diameter=10.0,
|
|
Flutes=2,
|
|
Length=50.0,
|
|
ShankDiameter=10.0,
|
|
)
|
|
shape2 = ToolBitShapeDrill(
|
|
id="dummy_drill_5",
|
|
Diameter=5.0,
|
|
Length=40.0,
|
|
ShankDiameter=5.0,
|
|
Flutes=2,
|
|
TipAngle=118.0,
|
|
)
|
|
bit1 = ToolBitEndmill(shape1)
|
|
bit2 = ToolBitDrill(shape2)
|
|
library.add_bit(bit1)
|
|
self.assertTrue(library.has_bit(bit1))
|
|
self.assertFalse(library.has_bit(bit2))
|
|
# Create a new ToolBit with the same properties but different instance
|
|
shape1_copy = ToolBitShapeEndmill(
|
|
id="dummy_endmill_5_copy", # Use a different ID for the copy
|
|
CuttingEdgeHeight=10.0,
|
|
Diameter=10.0,
|
|
Flutes=2,
|
|
Length=50.0,
|
|
ShankDiameter=10.0,
|
|
)
|
|
bit1_copy = ToolBitEndmill(shape1_copy)
|
|
self.assertFalse(library.has_bit(bit1_copy))
|
|
|
|
def test_remove_bit(self):
|
|
library = Library("Test Library")
|
|
shape1 = ToolBitShapeEndmill(
|
|
id="dummy_endmill_6",
|
|
CuttingEdgeHeight=10.0,
|
|
Diameter=10.0,
|
|
Flutes=2,
|
|
Length=50.0,
|
|
ShankDiameter=10.0,
|
|
)
|
|
shape2 = ToolBitShapeDrill(
|
|
id="dummy_drill_6",
|
|
Diameter=5.0,
|
|
Length=40.0,
|
|
ShankDiameter=5.0,
|
|
Flutes=2,
|
|
TipAngle=118.0,
|
|
)
|
|
shape3 = ToolBitShapeVBit(
|
|
id="dummy_cutter_6",
|
|
Diameter=3.0,
|
|
Angle=90.0,
|
|
Length=30.0,
|
|
ShankDiameter=3.0,
|
|
CuttingEdgeAngle=30.0,
|
|
CuttingEdgeHeight=10.0,
|
|
Flutes=2,
|
|
TipDiameter=1.0,
|
|
)
|
|
bit1 = ToolBitEndmill(shape1)
|
|
bit2 = ToolBitDrill(shape2)
|
|
bit3 = ToolBitVBit(shape3)
|
|
|
|
library.add_bit(bit1, 1)
|
|
library.add_bit(bit2, 2)
|
|
library.add_bit(bit3, 3)
|
|
self.assertEqual(len(library._bits), 3)
|
|
self.assertEqual(len(library._bit_nos), 3)
|
|
|
|
library.remove_bit(bit2)
|
|
self.assertEqual(len(library._bits), 2)
|
|
self.assertNotIn(bit2, library._bits)
|
|
self.assertEqual(len(library._bit_nos), 2)
|
|
self.assertNotIn(2, library._bit_nos)
|
|
self.assertNotIn(bit2, library._bit_nos.values())
|
|
|
|
library.remove_bit(bit1)
|
|
self.assertEqual(len(library._bits), 1)
|
|
self.assertNotIn(bit1, library._bits)
|
|
self.assertEqual(len(library._bit_nos), 1)
|
|
self.assertNotIn(1, library._bit_nos)
|
|
self.assertNotIn(bit1, library._bit_nos.values())
|
|
|
|
library.remove_bit(bit3)
|
|
self.assertEqual(len(library._bits), 0)
|
|
self.assertNotIn(bit3, library._bits)
|
|
self.assertEqual(len(library._bit_nos), 0)
|
|
self.assertNotIn(3, library._bit_nos)
|
|
self.assertNotIn(bit3, library._bit_nos.values())
|
|
|
|
# Removing a non-existent bit should not raise an error
|
|
shape_nonexistent = ToolBitShapeEndmill(
|
|
id="dummy_nonexistent_6",
|
|
CuttingEdgeHeight=99.0,
|
|
Diameter=99.0,
|
|
Flutes=1,
|
|
Length=99.0,
|
|
ShankDiameter=99.0,
|
|
)
|
|
library.remove_bit(ToolBitEndmill(shape_nonexistent))
|
|
self.assertEqual(len(library._bits), 0)
|
|
self.assertEqual(len(library._bit_nos), 0)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|