#!/usr/bin/env python
'''
Unit test file for ../color_randomize.py
--
If you want to help, read the python unittest documentation:
http://docs.python.org/library/unittest.html
'''

import os
import sys
import unittest

sys.path.append('..') # this line allows to import the extension code
from color_randomize import *

def extract_hsl(e,rgb):
    r = int(rgb[:2], 16)
    g = int(rgb[2:4], 16)
    b = int(rgb[4:6], 16)
    return e.rgb_to_hsl(r/255.0, g/255.0, b/255.0)


class ColorRandomizeBasicTest(unittest.TestCase):
    def setUp(self):
        self.e=C()

    def test_default_values(self):
        """ The default ranges are set to 0, and thus the color and opacity should not change. """
        args = ['svg/empty-SVG.svg']
        self.e.affect(args, False)
        col = self.e.colmod(128, 128, 255)
        self.assertEqual("8080ff", col)
        opac = self.e.opacmod(5)
        self.assertEqual(5, opac)


class ColorRandomizeColorModificationTest(unittest.TestCase):
    def setUp(self):
        self.e=C()

    def test_no_change(self):
        """ The user selected 0% values, and thus the color should not change. """
        args = ['-y 0', '-t 0', '-m 0', 'svg/empty-SVG.svg']
        self.e.affect(args, False)
        col = self.e.colmod(128, 128, 255)
        self.assertEqual("8080ff", col)

    def test_random_hue(self):
        """ Random hue only. Saturation and lightness not changed. """
        args = ['-y 50','-t 0','-m 0','svg/empty-SVG.svg']
        self.e.affect(args, False)
        hsl = extract_hsl(self.e, self.e.colmod(150, 100, 200))
        self.assertEqual([0.47, 0.59], [round(hsl[1], 2), round(hsl[2], 2)])

    @unittest.skip("Inaccurate conversion")
    def test_random_lightness(self):
        """ Random lightness only. Hue and saturation not changed. """
        args = ['-y 0', '-t 0', '-m 50', 'svg/empty-SVG.svg']
        self.e.affect(args, False)
        hsl = extract_hsl(self.e, self.e.colmod(150, 100, 200))
        # Lightness change also affects hue and saturation...
        #self.assertEqual(0.75, round(hsl[0], 2))
        #self.assertEqual(0.48, round(hsl[1], 2))

    def test_random_saturation(self):
        """ Random saturation only. Hue and lightness not changed. """
        args = ['-y 0', '-t 50', '-m 0', 'svg/empty-SVG.svg']
        self.e.affect(args, False)
        hsl = extract_hsl(self.e, self.e.colmod(150, 100, 200))
        self.assertEqual([0.75, 0.59], [round(hsl[0], 2), round(hsl[2], 2)])

    def test_range_limits(self):
        """ The maximum hsl values should be between 0 and 100% of their maximum """
        args = ['-y 100', '-t 100', '-m 100', 'svg/empty-SVG.svg']
        self.e.affect(args, False)
        hsl = extract_hsl(self.e, self.e.colmod(156, 156, 156))
        self.assertLessEqual([hsl[0], hsl[1], hsl[2]], [1, 1, 1])
        self.assertGreaterEqual([hsl[0], hsl[1], hsl[2]], [0, 0, 0])


class ColorRandomizeOpacityModificationTest(unittest.TestCase):
    def setUp(self):
        self.e=C()

    def test_no_change(self):
        """ The user selected 0% opacity range, and thus the opacity should not change. """
        args = ['-o 0', 'svg/empty-SVG.svg']
        self.e.affect(args, False)
        opac = self.e.opacmod(0.15)
        self.assertEqual(0.15, opac)

    def test_range_min_limit(self):
        """ The opacity value should be greater than 0 """
        args = ['-o 100', 'svg/empty-SVG.svg']
        self.e.affect(args, False)
        opac = self.e.opacmod(0)
        self.assertGreaterEqual(opac, "0")

    def test_range_max_limit(self):
        """ The opacity value should be lesser than 1 """
        args = ['-o 100', 'svg/empty-SVG.svg']
        self.e.affect(args, False)
        opac = self.e.opacmod(1)
        self.assertLessEqual(opac, "1")

    def test_non_float_opacity(self):
        """ Non-float opacity value not changed """
        args = ['-o 100', 'svg/empty-SVG.svg']
        self.e.affect(args, False)
        opac = self.e.opacmod("toto")
        self.assertLessEqual(opac, "toto")

if __name__ == '__main__':
    #unittest.main()
    suite = unittest.TestLoader().loadTestsFromTestCase(ColorRandomizeBasicTest)
    unittest.TextTestRunner(verbosity=2).run(suite)
    suite = unittest.TestLoader().loadTestsFromTestCase(ColorRandomizeColorModificationTest)
    unittest.TextTestRunner(verbosity=2).run(suite)
    suite = unittest.TestLoader().loadTestsFromTestCase(ColorRandomizeOpacityModificationTest)
    unittest.TextTestRunner(verbosity=2).run(suite)


# vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99
