#! /usr/bin/env python
# -*- coding: utf-8 -*-

# Author: Hamilton Kibbe <ham@hamiltonkib.be>

import pytest

from ..cam import CamFile, FileSettings


def test_filesettings_defaults():
    """ Test FileSettings default values
    """
    fs = FileSettings()
    assert fs.format == (2, 5)
    assert fs.notation == "absolute"
    assert fs.zero_suppression == "trailing"
    assert fs.units == "inch"


def test_filesettings_dict():
    """ Test FileSettings Dict
    """
    fs = FileSettings()
    assert fs["format"] == (2, 5)
    assert fs["notation"] == "absolute"
    assert fs["zero_suppression"] == "trailing"
    assert fs["units"] == "inch"


def test_filesettings_assign():
    """ Test FileSettings attribute assignment
    """
    fs = FileSettings()
    fs.units = "test1"
    fs.notation = "test2"
    fs.zero_suppression = "test3"
    fs.format = "test4"
    assert fs.units == "test1"
    assert fs.notation == "test2"
    assert fs.zero_suppression == "test3"
    assert fs.format == "test4"


def test_filesettings_dict_assign():
    """ Test FileSettings dict-style attribute assignment
    """
    fs = FileSettings()
    fs["units"] = "metric"
    fs["notation"] = "incremental"
    fs["zero_suppression"] = "leading"
    fs["format"] = (1, 2)
    assert fs.units == "metric"
    assert fs.notation == "incremental"
    assert fs.zero_suppression == "leading"
    assert fs.format == (1, 2)


def test_camfile_init():
    """ Smoke test CamFile test
    """
    cf = CamFile()


def test_camfile_settings():
    """ Test CamFile Default Settings
    """
    cf = CamFile()
    assert cf.settings == FileSettings()


def test_bounds_override_smoketest():
    cf = CamFile()
    cf.bounds


def test_zeros():
    """ Test zero/zero_suppression interaction
    """
    fs = FileSettings()
    assert fs.zero_suppression == "trailing"
    assert fs.zeros == "leading"

    fs["zero_suppression"] = "leading"
    assert fs.zero_suppression == "leading"
    assert fs.zeros == "trailing"

    fs.zero_suppression = "trailing"
    assert fs.zero_suppression == "trailing"
    assert fs.zeros == "leading"

    fs["zeros"] = "trailing"
    assert fs.zeros == "trailing"
    assert fs.zero_suppression == "leading"

    fs.zeros = "leading"
    assert fs.zeros == "leading"
    assert fs.zero_suppression == "trailing"

    fs = FileSettings(zeros="leading")
    assert fs.zeros == "leading"
    assert fs.zero_suppression == "trailing"

    fs = FileSettings(zero_suppression="leading")
    assert fs.zeros == "trailing"
    assert fs.zero_suppression == "leading"

    fs = FileSettings(zeros="leading", zero_suppression="trailing")
    assert fs.zeros == "leading"
    assert fs.zero_suppression == "trailing"

    fs = FileSettings(zeros="trailing", zero_suppression="leading")
    assert fs.zeros == "trailing"
    assert fs.zero_suppression == "leading"


def test_filesettings_validation():
    """ Test FileSettings constructor argument validation
    """
    # absolute-ish is not a valid notation
    pytest.raises(ValueError, FileSettings, "absolute-ish", "inch", None, (2, 5), None)

    # degrees kelvin isn't a valid unit for a CAM file
    pytest.raises(
        ValueError, FileSettings, "absolute", "degrees kelvin", None, (2, 5), None
    )

    pytest.raises(
        ValueError, FileSettings, "absolute", "inch", "leading", (2, 5), "leading"
    )

    # Technnically this should be an error, but Eangle files often do this incorrectly so we
    # allow it
    # pytest.raises(ValueError, FileSettings, 'absolute',
    #              'inch', 'following', (2, 5), None)

    pytest.raises(
        ValueError, FileSettings, "absolute", "inch", None, (2, 5), "following"
    )
    pytest.raises(ValueError, FileSettings, "absolute", "inch", None, (2, 5, 6), None)


def test_key_validation():
    fs = FileSettings()
    pytest.raises(KeyError, fs.__getitem__, "octopus")
    pytest.raises(KeyError, fs.__setitem__, "octopus", "do not care")
    pytest.raises(ValueError, fs.__setitem__, "notation", "absolute-ish")
    pytest.raises(ValueError, fs.__setitem__, "units", "degrees kelvin")
    pytest.raises(ValueError, fs.__setitem__, "zero_suppression", "following")
    pytest.raises(ValueError, fs.__setitem__, "zeros", "following")
    pytest.raises(ValueError, fs.__setitem__, "format", (2, 5, 6))