# SPDX-License-Identifier: LGPL-2.1-or-later

# ***************************************************************************
# *   Copyright (c) 2018 sliptonic <shopinthewoods@gmail.com>               *
# *                                                                         *
# *   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                                                                   *
# *                                                                         *
# ***************************************************************************

import Path
import Path.Op.Deburr as PathDeburr
import CAMTests.PathTestUtils as PathTestUtils

Path.Log.setLevel(Path.Log.Level.INFO, Path.Log.thisModule())
# Path.Log.trackModule(Path.Log.thisModule())


class MockToolBit(object):
    def __init__(self, name="t1", diameter=5.0):
        self.Diameter = diameter
        self.FlatRadius = 0
        self.CuttingEdgeAngle = 60


class TestPathOpDeburr(PathTestUtils.PathTestBase):
    def test00(self):
        """Verify chamfer depth and offset for an end mill."""
        tool = MockToolBit()
        tool.Diameter = 20
        tool.FlatRadius = 0
        tool.CuttingEdgeAngle = 180

        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0.01, tool, True)
        self.assertRoughly(0.01, depth)
        self.assertRoughly(9, offset)
        self.assertFalse(info)

        # legacy tools - no problem, same result
        tool.CuttingEdgeAngle = 0

        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0.01, tool, True)
        self.assertRoughly(0.01, depth)
        self.assertRoughly(9, offset)
        self.assertFalse(info)

    def test01(self):
        """Verify chamfer depth and offset for a 90 deg v-bit."""
        tool = MockToolBit()
        tool.FlatRadius = 0
        tool.CuttingEdgeAngle = 90

        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0, tool, True)
        self.assertRoughly(1, depth)
        self.assertRoughly(0, offset)
        self.assertFalse(info)

        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0.2, tool, True)
        self.assertRoughly(1.2, depth)
        self.assertRoughly(0.2, offset)
        self.assertFalse(info)

    def test02(self):
        """Verify chamfer depth and offset for a 90 deg v-bit with non 0 flat radius."""
        tool = MockToolBit()
        tool.FlatRadius = 0.3
        tool.CuttingEdgeAngle = 90

        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0, tool, True)
        self.assertRoughly(1, depth)
        self.assertRoughly(0.3, offset)
        self.assertFalse(info)

        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(2, 0.2, tool, True)
        self.assertRoughly(2.2, depth)
        self.assertRoughly(0.5, offset)
        self.assertFalse(info)

    def test03(self):
        """Verify chamfer depth and offset for a 60 deg v-bit with non 0 flat radius."""
        tool = MockToolBit()
        tool.FlatRadius = 0.1
        tool.CuttingEdgeAngle = 60

        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0.5, tool, True)
        self.assertRoughly(2.232051, depth)
        self.assertRoughly(0.388675, offset)
        self.assertFalse(info)

        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(3, 1, tool, True)
        self.assertRoughly(6.196153, depth)
        self.assertRoughly(0.677350, offset)
        self.assertFalse(info)

    def test04(self):
        """Verify chamfer depth and offset for a 30 deg v-bit with non 0 flat radius."""
        tool = MockToolBit()
        tool.FlatRadius = 0.1
        tool.CuttingEdgeAngle = 30

        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0.5, tool, True)
        self.assertRoughly(4.232051, depth)
        self.assertRoughly(0.233975, offset)
        self.assertFalse(info)

        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(3, 1, tool, True)
        self.assertRoughly(12.196155, depth)
        self.assertRoughly(0.367949, offset)
        self.assertFalse(info)

    def test10(self):
        """Verify missing cutting edge angle info prints only once."""

        class FakeEndmill(object):
            def __init__(self, dia):
                self.Diameter = dia

        tool = FakeEndmill(10)
        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0.1, tool, True)
        self.assertRoughly(0.1, depth)
        self.assertRoughly(4, offset)
        self.assertTrue(info)
        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0.1, tool, not info)
        self.assertRoughly(0.1, depth)
        self.assertRoughly(4, offset)
        self.assertTrue(info)
        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0.1, tool, not info)
        self.assertRoughly(0.1, depth)
        self.assertRoughly(4, offset)
        self.assertTrue(info)

    def test11(self):
        """Verify missing tip diameter info prints only once."""

        class FakePointyBit(object):
            def __init__(self, dia, angle):
                self.Diameter = dia
                self.CuttingEdgeAngle = angle

        tool = FakePointyBit(10, 90)
        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0.1, tool, True)
        self.assertRoughly(1.1, depth)
        self.assertRoughly(0.1, offset)
        self.assertTrue(info)
        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0.1, tool, not info)
        self.assertRoughly(1.1, depth)
        self.assertRoughly(0.1, offset)
        self.assertTrue(info)
        (depth, offset, __, info) = PathDeburr.toolDepthAndOffset(1, 0.1, tool, not info)
        self.assertRoughly(1.1, depth)
        self.assertRoughly(0.1, offset)
        self.assertTrue(info)
