1import unittest, test.test_support
2import colorsys
3
4def frange(start, stop, step):
5    while start <= stop:
6        yield start
7        start += step
8
9class ColorsysTest(unittest.TestCase):
10
11    def assertTripleEqual(self, tr1, tr2):
12        self.assertEqual(len(tr1), 3)
13        self.assertEqual(len(tr2), 3)
14        self.assertAlmostEqual(tr1[0], tr2[0])
15        self.assertAlmostEqual(tr1[1], tr2[1])
16        self.assertAlmostEqual(tr1[2], tr2[2])
17
18    def test_hsv_roundtrip(self):
19        for r in frange(0.0, 1.0, 0.2):
20            for g in frange(0.0, 1.0, 0.2):
21                for b in frange(0.0, 1.0, 0.2):
22                    rgb = (r, g, b)
23                    self.assertTripleEqual(
24                        rgb,
25                        colorsys.hsv_to_rgb(*colorsys.rgb_to_hsv(*rgb))
26                    )
27
28    def test_hsv_values(self):
29        values = [
30            # rgb, hsv
31            ((0.0, 0.0, 0.0), (  0  , 0.0, 0.0)), # black
32            ((0.0, 0.0, 1.0), (4./6., 1.0, 1.0)), # blue
33            ((0.0, 1.0, 0.0), (2./6., 1.0, 1.0)), # green
34            ((0.0, 1.0, 1.0), (3./6., 1.0, 1.0)), # cyan
35            ((1.0, 0.0, 0.0), (  0  , 1.0, 1.0)), # red
36            ((1.0, 0.0, 1.0), (5./6., 1.0, 1.0)), # purple
37            ((1.0, 1.0, 0.0), (1./6., 1.0, 1.0)), # yellow
38            ((1.0, 1.0, 1.0), (  0  , 0.0, 1.0)), # white
39            ((0.5, 0.5, 0.5), (  0  , 0.0, 0.5)), # grey
40        ]
41        for (rgb, hsv) in values:
42            self.assertTripleEqual(hsv, colorsys.rgb_to_hsv(*rgb))
43            self.assertTripleEqual(rgb, colorsys.hsv_to_rgb(*hsv))
44
45    def test_hls_roundtrip(self):
46        for r in frange(0.0, 1.0, 0.2):
47            for g in frange(0.0, 1.0, 0.2):
48                for b in frange(0.0, 1.0, 0.2):
49                    rgb = (r, g, b)
50                    self.assertTripleEqual(
51                        rgb,
52                        colorsys.hls_to_rgb(*colorsys.rgb_to_hls(*rgb))
53                    )
54
55    def test_hls_values(self):
56        values = [
57            # rgb, hls
58            ((0.0, 0.0, 0.0), (  0  , 0.0, 0.0)), # black
59            ((0.0, 0.0, 1.0), (4./6., 0.5, 1.0)), # blue
60            ((0.0, 1.0, 0.0), (2./6., 0.5, 1.0)), # green
61            ((0.0, 1.0, 1.0), (3./6., 0.5, 1.0)), # cyan
62            ((1.0, 0.0, 0.0), (  0  , 0.5, 1.0)), # red
63            ((1.0, 0.0, 1.0), (5./6., 0.5, 1.0)), # purple
64            ((1.0, 1.0, 0.0), (1./6., 0.5, 1.0)), # yellow
65            ((1.0, 1.0, 1.0), (  0  , 1.0, 0.0)), # white
66            ((0.5, 0.5, 0.5), (  0  , 0.5, 0.0)), # grey
67        ]
68        for (rgb, hls) in values:
69            self.assertTripleEqual(hls, colorsys.rgb_to_hls(*rgb))
70            self.assertTripleEqual(rgb, colorsys.hls_to_rgb(*hls))
71
72def test_main():
73    test.test_support.run_unittest(ColorsysTest)
74
75if __name__ == "__main__":
76    test_main()
77