1
0
Fork 0
ProjektAI/kelner/venv/Lib/site-packages/pygame/tests/color_test.py

1028 lines
36 KiB
Python

import unittest
import math
import operator
import platform
import pygame
from pygame.compat import long_
IS_PYPY = 'PyPy' == platform.python_implementation()
################################### CONSTANTS ##################################
rgba_vals = [0, 1, 62, 63, 126, 127, 255]
rgba_combinations = [
(r,g,b,a) for r in rgba_vals
for g in rgba_vals
for b in rgba_vals
for a in rgba_vals
]
################################################################################
def rgba_combos_Color_generator():
for rgba in rgba_combinations:
yield pygame.Color(*rgba)
# Python gamma correct
def gamma_correct(rgba_0_255, gamma):
corrected = round(255.0 * math.pow(rgba_0_255 / 255.0, gamma))
return max(min(int(corrected), 255), 0)
################################################################################
# TODO: add tests for
# correct_gamma() -- test against statically defined verified correct values
# coerce () -- ??
def _assignr(x, y):
x.r = y
def _assigng(x, y):
x.g = y
def _assignb(x, y):
x.b = y
def _assigna(x, y):
x.a = y
def _assign_item(x, p, y):
x[p] = y
class ColorTypeTest (unittest.TestCase):
def test_new(self):
c = pygame.Color.__new__(pygame.Color)
self.assertEqual(c, pygame.Color(0, 0, 0, 255))
self.assertEqual(len(c), 4)
def test_init(self):
c = pygame.Color(10, 20, 30, 200)
self.assertEqual(c, (10, 20, 30, 200))
c.set_length(3)
self.assertEqual(len(c), 3)
c.__init__(100, 110, 120, 128)
self.assertEqual(len(c), 4)
self.assertEqual(c, (100, 110, 120, 128))
def test_invalid_html_hex_codes(self):
# This was a problem with the way 2 digit hex numbers were
# calculated. The test_hex_digits test is related to the fix.
Color = pygame.color.Color
self.assertRaises(ValueError, lambda: Color('# f000000'))
self.assertRaises(ValueError, lambda: Color('#f 000000'))
self.assertRaises(ValueError, lambda: Color('#-f000000'))
def test_hex_digits(self):
# This is an implementation specific test.
# Two digit hex numbers are calculated using table lookups
# for the upper and lower digits.
Color = pygame.color.Color
self.assertEqual(Color('#00000000').r, 0x00)
self.assertEqual(Color('#10000000').r, 0x10)
self.assertEqual(Color('#20000000').r, 0x20)
self.assertEqual(Color('#30000000').r, 0x30)
self.assertEqual(Color('#40000000').r, 0x40)
self.assertEqual(Color('#50000000').r, 0x50)
self.assertEqual(Color('#60000000').r, 0x60)
self.assertEqual(Color('#70000000').r, 0x70)
self.assertEqual(Color('#80000000').r, 0x80)
self.assertEqual(Color('#90000000').r, 0x90)
self.assertEqual(Color('#A0000000').r, 0xA0)
self.assertEqual(Color('#B0000000').r, 0xB0)
self.assertEqual(Color('#C0000000').r, 0xC0)
self.assertEqual(Color('#D0000000').r, 0xD0)
self.assertEqual(Color('#E0000000').r, 0xE0)
self.assertEqual(Color('#F0000000').r, 0xF0)
self.assertEqual(Color('#01000000').r, 0x01)
self.assertEqual(Color('#02000000').r, 0x02)
self.assertEqual(Color('#03000000').r, 0x03)
self.assertEqual(Color('#04000000').r, 0x04)
self.assertEqual(Color('#05000000').r, 0x05)
self.assertEqual(Color('#06000000').r, 0x06)
self.assertEqual(Color('#07000000').r, 0x07)
self.assertEqual(Color('#08000000').r, 0x08)
self.assertEqual(Color('#09000000').r, 0x09)
self.assertEqual(Color('#0A000000').r, 0x0A)
self.assertEqual(Color('#0B000000').r, 0x0B)
self.assertEqual(Color('#0C000000').r, 0x0C)
self.assertEqual(Color('#0D000000').r, 0x0D)
self.assertEqual(Color('#0E000000').r, 0x0E)
self.assertEqual(Color('#0F000000').r, 0x0F)
def test_comparison(self):
Color = pygame.color.Color
# Check valid comparisons
self.assertTrue(Color(255, 0, 0, 0) == Color(255, 0, 0, 0))
self.assertTrue(Color(0, 255, 0, 0) == Color(0, 255, 0, 0))
self.assertTrue(Color(0, 0, 255, 0) == Color(0, 0, 255, 0))
self.assertTrue(Color(0, 0, 0, 255) == Color(0, 0, 0, 255))
self.assertFalse(Color(0, 0, 0, 0) == Color(255, 0, 0, 0))
self.assertFalse(Color(0, 0, 0, 0) == Color(0, 255, 0, 0))
self.assertFalse(Color(0, 0, 0, 0) == Color(0, 0, 255, 0))
self.assertFalse(Color(0, 0, 0, 0) == Color(0, 0, 0, 255))
self.assertTrue(Color(0, 0, 0, 0) != Color(255, 0, 0, 0))
self.assertTrue(Color(0, 0, 0, 0) != Color(0, 255, 0, 0))
self.assertTrue(Color(0, 0, 0, 0) != Color(0, 0, 255, 0))
self.assertTrue(Color(0, 0, 0, 0) != Color(0, 0, 0, 255))
self.assertFalse(Color(255, 0, 0, 0) != Color(255, 0, 0, 0))
self.assertFalse(Color(0, 255, 0, 0) != Color(0, 255, 0, 0))
self.assertFalse(Color(0, 0, 255, 0) != Color(0, 0, 255, 0))
self.assertFalse(Color(0, 0, 0, 255) != Color(0, 0, 0, 255))
self.assertTrue(Color(255, 0, 0, 0) == (255, 0, 0, 0))
self.assertTrue(Color(0, 255, 0, 0) == (0, 255, 0, 0))
self.assertTrue(Color(0, 0, 255, 0) == (0, 0, 255, 0))
self.assertTrue(Color(0, 0, 0, 255) == (0, 0, 0, 255))
self.assertFalse(Color(0, 0, 0, 0) == (255, 0, 0, 0))
self.assertFalse(Color(0, 0, 0, 0) == (0, 255, 0, 0))
self.assertFalse(Color(0, 0, 0, 0) == (0, 0, 255, 0))
self.assertFalse(Color(0, 0, 0, 0) == (0, 0, 0, 255))
self.assertTrue(Color(0, 0, 0, 0) != (255, 0, 0, 0))
self.assertTrue(Color(0, 0, 0, 0) != (0, 255, 0, 0))
self.assertTrue(Color(0, 0, 0, 0) != (0, 0, 255, 0))
self.assertTrue(Color(0, 0, 0, 0) != (0, 0, 0, 255))
self.assertFalse(Color(255, 0, 0, 0) != (255, 0, 0, 0))
self.assertFalse(Color(0, 255, 0, 0) != (0, 255, 0, 0))
self.assertFalse(Color(0, 0, 255, 0) != (0, 0, 255, 0))
self.assertFalse(Color(0, 0, 0, 255) != (0, 0, 0, 255))
self.assertTrue((255, 0, 0, 0) == Color(255, 0, 0, 0))
self.assertTrue((0, 255, 0, 0) == Color(0, 255, 0, 0))
self.assertTrue((0, 0, 255, 0) == Color(0, 0, 255, 0))
self.assertTrue((0, 0, 0, 255) == Color(0, 0, 0, 255))
self.assertFalse((0, 0, 0, 0) == Color(255, 0, 0, 0))
self.assertFalse((0, 0, 0, 0) == Color(0, 255, 0, 0))
self.assertFalse((0, 0, 0, 0) == Color(0, 0, 255, 0))
self.assertFalse((0, 0, 0, 0) == Color(0, 0, 0, 255))
self.assertTrue((0, 0, 0, 0) != Color(255, 0, 0, 0))
self.assertTrue((0, 0, 0, 0) != Color(0, 255, 0, 0))
self.assertTrue((0, 0, 0, 0) != Color(0, 0, 255, 0))
self.assertTrue((0, 0, 0, 0) != Color(0, 0, 0, 255))
self.assertFalse((255, 0, 0, 0) != Color(255, 0, 0, 0))
self.assertFalse((0, 255, 0, 0) != Color(0, 255, 0, 0))
self.assertFalse((0, 0, 255, 0) != Color(0, 0, 255, 0))
self.assertFalse((0, 0, 0, 255) != Color(0, 0, 0, 255))
class TupleSubclass(tuple):
pass
self.assertTrue(Color(255, 0, 0, 0) == TupleSubclass((255, 0, 0, 0)))
self.assertTrue(TupleSubclass((255, 0, 0, 0)) == Color(255, 0, 0, 0))
self.assertFalse(Color(255, 0, 0, 0) != TupleSubclass((255, 0, 0, 0)))
self.assertFalse(TupleSubclass((255, 0, 0, 0)) != Color(255, 0, 0, 0))
# These are not supported so will be unequal.
self.assertFalse(Color(255, 0, 0, 0) == "#ff000000")
self.assertTrue(Color(255, 0, 0, 0) != "#ff000000")
self.assertFalse("#ff000000" == Color(255, 0, 0, 0))
self.assertTrue("#ff000000" != Color(255, 0, 0, 0))
self.assertFalse(Color(255, 0, 0, 0) == 0xff000000)
self.assertTrue(Color(255, 0, 0, 0) != 0xff000000)
self.assertFalse(0xff000000 == Color(255, 0, 0, 0))
self.assertTrue(0xff000000 != Color(255, 0, 0, 0))
self.assertFalse(Color(255, 0, 0, 0) == [255, 0, 0, 0])
self.assertTrue(Color(255, 0, 0, 0) != [255, 0, 0, 0])
self.assertFalse([255, 0, 0, 0] == Color(255, 0, 0 ,0))
self.assertTrue([255, 0, 0, 0] != Color(255, 0, 0, 0))
# Comparison is not implemented for invalid color values.
class Test(object):
def __eq__(self, other):
return -1
def __ne__(self, other):
return -2
class TestTuple(tuple):
def __eq__(self, other):
return -1
def __ne__(self, other):
return -2
t = Test()
t_tuple = TestTuple(('a', 0, 0, 0))
black = Color('black')
self.assertEqual(black == t, -1)
self.assertEqual(t == black, -1)
self.assertEqual(black != t, -2)
self.assertEqual(t != black, -2)
self.assertEqual(black == t_tuple, -1)
self.assertEqual(black != t_tuple, -2)
self.assertEqual(t_tuple == black, -1)
self.assertEqual(t_tuple != black, -2)
def test_ignore_whitespace(self):
self.assertEqual(pygame.color.Color('red'), pygame.color.Color(' r e d '))
def test_slice(self):
#"""|tags: python3_ignore|"""
# slicing a color gives you back a tuple.
# do all sorts of slice combinations.
c = pygame.Color(1,2,3,4)
self.assertEqual((1,2,3,4), c[:])
self.assertEqual((1,2,3), c[:-1])
self.assertEqual((), c[:-5])
self.assertEqual((1,2,3,4), c[:4])
self.assertEqual((1,2,3,4), c[:5])
self.assertEqual((1,2), c[:2])
self.assertEqual((1,), c[:1])
self.assertEqual((), c[:0])
self.assertEqual((2,), c[1:-2])
self.assertEqual((3, 4), c[-2:])
self.assertEqual((4,), c[-1:])
# NOTE: assigning to a slice is currently unsupported.
def test_unpack(self):
# should be able to unpack to r,g,b,a and r,g,b
c = pygame.Color(1,2,3,4)
r,g,b,a = c
self.assertEqual((1,2,3,4), (r,g,b,a))
self.assertEqual(c, (r,g,b,a))
c.set_length(3)
r,g,b = c
self.assertEqual((1,2,3), (r,g,b))
def test_length(self):
# should be able to unpack to r,g,b,a and r,g,b
c = pygame.Color(1,2,3,4)
self.assertEqual(len(c), 4)
c.set_length(3)
self.assertEqual(len(c), 3)
# it keeps the old alpha anyway...
self.assertEqual(c.a, 4)
# however you can't get the alpha in this way:
self.assertRaises(IndexError, lambda x:c[x], 4)
c.set_length(4)
self.assertEqual(len(c), 4)
self.assertEqual(len(c), 4)
self.assertRaises(ValueError, c.set_length, 5)
self.assertRaises(ValueError, c.set_length, -1)
self.assertRaises(ValueError, c.set_length, 0)
self.assertRaises(ValueError, c.set_length, pow(2, long_(33)))
def test_case_insensitivity_of_string_args(self):
self.assertEqual(pygame.color.Color('red'), pygame.color.Color('Red'))
def test_color(self):
c = pygame.Color(10, 20, 30, 40)
self.assertEqual(c.r, 10)
self.assertEqual(c.g, 20)
self.assertEqual(c.b, 30)
self.assertEqual(c.a, 40)
c = pygame.Color("indianred3")
self.assertEqual(c.r, 205)
self.assertEqual(c.g, 85)
self.assertEqual(c.b, 85)
self.assertEqual(c.a, 255)
c = pygame.Color(0xAABBCCDD)
self.assertEqual(c.r, 0xAA)
self.assertEqual(c.g, 0xBB)
self.assertEqual(c.b, 0xCC)
self.assertEqual(c.a, 0xDD)
self.assertRaises(ValueError, pygame.Color, 257, 10, 105, 44)
self.assertRaises(ValueError, pygame.Color, 10, 257, 105, 44)
self.assertRaises(ValueError, pygame.Color, 10, 105, 257, 44)
self.assertRaises(ValueError, pygame.Color, 10, 105, 44, 257)
def test_rgba(self):
c = pygame.Color(0)
self.assertEqual(c.r, 0)
self.assertEqual(c.g, 0)
self.assertEqual(c.b, 0)
self.assertEqual(c.a, 0)
# Test simple assignments
c.r = 123
self.assertEqual(c.r, 123)
self.assertRaises(ValueError, _assignr, c, 537)
self.assertEqual(c.r, 123)
self.assertRaises(ValueError, _assignr, c, -3)
self.assertEqual(c.r, 123)
c.g = 55
self.assertEqual(c.g, 55)
self.assertRaises(ValueError, _assigng, c, 348)
self.assertEqual(c.g, 55)
self.assertRaises(ValueError, _assigng, c, -44)
self.assertEqual(c.g, 55)
c.b = 77
self.assertEqual(c.b, 77)
self.assertRaises(ValueError, _assignb, c, 256)
self.assertEqual(c.b, 77)
self.assertRaises(ValueError, _assignb, c, -12)
self.assertEqual(c.b, 77)
c.a = 255
self.assertEqual(c.a, 255)
self.assertRaises(ValueError, _assigna, c, 312)
self.assertEqual(c.a, 255)
self.assertRaises(ValueError, _assigna, c, -10)
self.assertEqual(c.a, 255)
def test_repr(self):
c = pygame.Color(68, 38, 26, 69)
t = "(68, 38, 26, 69)"
self.assertEqual(repr(c), t)
def test_add(self):
c1 = pygame.Color(0)
self.assertEqual(c1.r, 0)
self.assertEqual(c1.g, 0)
self.assertEqual(c1.b, 0)
self.assertEqual(c1.a, 0)
c2 = pygame.Color(20, 33, 82, 193)
self.assertEqual(c2.r, 20)
self.assertEqual(c2.g, 33)
self.assertEqual(c2.b, 82)
self.assertEqual(c2.a, 193)
c3 = c1 + c2
self.assertEqual(c3.r, 20)
self.assertEqual(c3.g, 33)
self.assertEqual(c3.b, 82)
self.assertEqual(c3.a, 193)
c3 = c3 + c2
self.assertEqual(c3.r, 40)
self.assertEqual(c3.g, 66)
self.assertEqual(c3.b, 164)
self.assertEqual(c3.a, 255)
# Issue #286: Is type checking done for Python 3.x?
self.assertRaises(TypeError, operator.add, c1, None)
self.assertRaises(TypeError, operator.add, None, c1)
def test_sub(self):
c1 = pygame.Color(0xFFFFFFFF)
self.assertEqual(c1.r, 255)
self.assertEqual(c1.g, 255)
self.assertEqual(c1.b, 255)
self.assertEqual(c1.a, 255)
c2 = pygame.Color(20, 33, 82, 193)
self.assertEqual(c2.r, 20)
self.assertEqual(c2.g, 33)
self.assertEqual(c2.b, 82)
self.assertEqual(c2.a, 193)
c3 = c1 - c2
self.assertEqual(c3.r, 235)
self.assertEqual(c3.g, 222)
self.assertEqual(c3.b, 173)
self.assertEqual(c3.a, 62)
c3 = c3 - c2
self.assertEqual(c3.r, 215)
self.assertEqual(c3.g, 189)
self.assertEqual(c3.b, 91)
self.assertEqual(c3.a, 0)
# Issue #286: Is type checking done for Python 3.x?
self.assertRaises(TypeError, operator.sub, c1, None)
self.assertRaises(TypeError, operator.sub, None, c1)
def test_mul(self):
c1 = pygame.Color(0x01010101)
self.assertEqual(c1.r, 1)
self.assertEqual(c1.g, 1)
self.assertEqual(c1.b, 1)
self.assertEqual(c1.a, 1)
c2 = pygame.Color(2, 5, 3, 22)
self.assertEqual(c2.r, 2)
self.assertEqual(c2.g, 5)
self.assertEqual(c2.b, 3)
self.assertEqual(c2.a, 22)
c3 = c1 * c2
self.assertEqual(c3.r, 2)
self.assertEqual(c3.g, 5)
self.assertEqual(c3.b, 3)
self.assertEqual(c3.a, 22)
c3 = c3 * c2
self.assertEqual(c3.r, 4)
self.assertEqual(c3.g, 25)
self.assertEqual(c3.b, 9)
self.assertEqual(c3.a, 255)
# Issue #286: Is type checking done for Python 3.x?
self.assertRaises(TypeError, operator.mul, c1, None)
self.assertRaises(TypeError, operator.mul, None, c1)
def test_div(self):
c1 = pygame.Color(0x80808080)
self.assertEqual(c1.r, 128)
self.assertEqual(c1.g, 128)
self.assertEqual(c1.b, 128)
self.assertEqual(c1.a, 128)
c2 = pygame.Color(2, 4, 8, 16)
self.assertEqual(c2.r, 2)
self.assertEqual(c2.g, 4)
self.assertEqual(c2.b, 8)
self.assertEqual(c2.a, 16)
c3 = c1 // c2
self.assertEqual(c3.r, 64)
self.assertEqual(c3.g, 32)
self.assertEqual(c3.b, 16)
self.assertEqual(c3.a, 8)
c3 = c3 // c2
self.assertEqual(c3.r, 32)
self.assertEqual(c3.g, 8)
self.assertEqual(c3.b, 2)
self.assertEqual(c3.a, 0)
# Issue #286: Is type checking done for Python 3.x?
self.assertRaises(TypeError, operator.floordiv, c1, None)
self.assertRaises(TypeError, operator.floordiv, None, c1)
# Division by zero check
dividend = pygame.Color(255, 255, 255, 255)
for i in range(4):
divisor = pygame.Color(64, 64, 64, 64)
divisor[i] = 0
quotient = pygame.Color(3, 3, 3, 3)
quotient[i] = 0
self.assertEqual(dividend // divisor, quotient)
def test_mod(self):
c1 = pygame.Color(0xFFFFFFFF)
self.assertEqual(c1.r, 255)
self.assertEqual(c1.g, 255)
self.assertEqual(c1.b, 255)
self.assertEqual(c1.a, 255)
c2 = pygame.Color(2, 4, 8, 16)
self.assertEqual(c2.r, 2)
self.assertEqual(c2.g, 4)
self.assertEqual(c2.b, 8)
self.assertEqual(c2.a, 16)
c3 = c1 % c2
self.assertEqual(c3.r, 1)
self.assertEqual(c3.g, 3)
self.assertEqual(c3.b, 7)
self.assertEqual(c3.a, 15)
# Issue #286: Is type checking done for Python 3.x?
self.assertRaises(TypeError, operator.mod, c1, None)
self.assertRaises(TypeError, operator.mod, None, c1)
# Division by zero check
dividend = pygame.Color(255, 255, 255, 255)
for i in range(4):
divisor = pygame.Color(64, 64, 64, 64)
divisor[i] = 0
quotient = pygame.Color(63, 63, 63, 63)
quotient[i] = 0
self.assertEqual(dividend % divisor, quotient)
def test_float(self):
c = pygame.Color(0xCC00CC00)
self.assertEqual(c.r, 204)
self.assertEqual(c.g, 0)
self.assertEqual(c.b, 204)
self.assertEqual(c.a, 0)
self.assertEqual(float(c), float(0xCC00CC00))
c = pygame.Color(0x33727592)
self.assertEqual(c.r, 51)
self.assertEqual(c.g, 114)
self.assertEqual(c.b, 117)
self.assertEqual(c.a, 146)
self.assertEqual(float(c), float(0x33727592))
def test_oct(self):
c = pygame.Color(0xCC00CC00)
self.assertEqual(c.r, 204)
self.assertEqual(c.g, 0)
self.assertEqual(c.b, 204)
self.assertEqual(c.a, 0)
self.assertEqual(oct(c), oct(0xCC00CC00))
c = pygame.Color(0x33727592)
self.assertEqual(c.r, 51)
self.assertEqual(c.g, 114)
self.assertEqual(c.b, 117)
self.assertEqual(c.a, 146)
self.assertEqual(oct(c), oct(0x33727592))
def test_hex(self):
c = pygame.Color(0xCC00CC00)
self.assertEqual(c.r, 204)
self.assertEqual(c.g, 0)
self.assertEqual(c.b, 204)
self.assertEqual(c.a, 0)
self.assertEqual(hex(c), hex(0xCC00CC00))
c = pygame.Color(0x33727592)
self.assertEqual(c.r, 51)
self.assertEqual(c.g, 114)
self.assertEqual(c.b, 117)
self.assertEqual(c.a, 146)
self.assertEqual(hex(c), hex(0x33727592))
def test_webstyle(self):
c = pygame.Color("#CC00CC11")
self.assertEqual(c.r, 204)
self.assertEqual(c.g, 0)
self.assertEqual(c.b, 204)
self.assertEqual(c.a, 17)
self.assertEqual(hex(c), hex(0xCC00CC11))
c = pygame.Color("#CC00CC")
self.assertEqual(c.r, 204)
self.assertEqual(c.g, 0)
self.assertEqual(c.b, 204)
self.assertEqual(c.a, 255)
self.assertEqual(hex(c), hex(0xCC00CCFF))
c = pygame.Color("0xCC00CC11")
self.assertEqual(c.r, 204)
self.assertEqual(c.g, 0)
self.assertEqual(c.b, 204)
self.assertEqual(c.a, 17)
self.assertEqual(hex(c), hex(0xCC00CC11))
c = pygame.Color("0xCC00CC")
self.assertEqual(c.r, 204)
self.assertEqual(c.g, 0)
self.assertEqual(c.b, 204)
self.assertEqual(c.a, 255)
self.assertEqual(hex(c), hex(0xCC00CCFF))
self.assertRaises(ValueError, pygame.Color, "#cc00qq")
self.assertRaises(ValueError, pygame.Color, "0xcc00qq")
self.assertRaises(ValueError, pygame.Color, "09abcdef")
self.assertRaises(ValueError, pygame.Color, "09abcde")
self.assertRaises(ValueError, pygame.Color, "quarky")
def test_int(self):
# This will be a long
c = pygame.Color(0xCC00CC00)
self.assertEqual(c.r, 204)
self.assertEqual(c.g, 0)
self.assertEqual(c.b, 204)
self.assertEqual(c.a, 0)
self.assertEqual(int(c), int(0xCC00CC00))
# This will be an int
c = pygame.Color(0x33727592)
self.assertEqual(c.r, 51)
self.assertEqual(c.g, 114)
self.assertEqual(c.b, 117)
self.assertEqual(c.a, 146)
self.assertEqual(int(c), int(0x33727592))
def test_long(self):
# This will be a long
c = pygame.Color(0xCC00CC00)
self.assertEqual(c.r, 204)
self.assertEqual(c.g, 0)
self.assertEqual(c.b, 204)
self.assertEqual(c.a, 0)
self.assertEqual(long_ (c), long_ (0xCC00CC00))
# This will be an int
c = pygame.Color(0x33727592)
self.assertEqual(c.r, 51)
self.assertEqual(c.g, 114)
self.assertEqual(c.b, 117)
self.assertEqual(c.a, 146)
self.assertEqual(long_ (c), long_ (0x33727592))
def test_normalize(self):
c = pygame.Color(204, 38, 194, 55)
self.assertEqual(c.r, 204)
self.assertEqual(c.g, 38)
self.assertEqual(c.b, 194)
self.assertEqual(c.a, 55)
t = c.normalize()
self.assertAlmostEqual(t[0], 0.800000, 5)
self.assertAlmostEqual(t[1], 0.149016, 5)
self.assertAlmostEqual(t[2], 0.760784, 5)
self.assertAlmostEqual(t[3], 0.215686, 5)
def test_len(self):
c = pygame.Color(204, 38, 194, 55)
self.assertEqual(len(c), 4)
def test_get_item(self):
c = pygame.Color(204, 38, 194, 55)
self.assertEqual(c[0], 204)
self.assertEqual(c[1], 38)
self.assertEqual(c[2], 194)
self.assertEqual(c[3], 55)
def test_set_item(self):
c = pygame.Color(204, 38, 194, 55)
self.assertEqual(c[0], 204)
self.assertEqual(c[1], 38)
self.assertEqual(c[2], 194)
self.assertEqual(c[3], 55)
c[0] = 33
self.assertEqual(c[0], 33)
c[1] = 48
self.assertEqual(c[1], 48)
c[2] = 173
self.assertEqual(c[2], 173)
c[3] = 213
self.assertEqual(c[3], 213)
# Now try some 'invalid' ones
self.assertRaises(ValueError, _assign_item, c, 0, 95.485)
self.assertEqual(c[0], 33)
self.assertRaises(ValueError, _assign_item, c, 1, -83)
self.assertEqual(c[1], 48)
self.assertRaises(ValueError, _assign_item, c, 2, "Hello")
self.assertEqual(c[2], 173)
def test_Color_type_works_for_Surface_get_and_set_colorkey(self):
s = pygame.Surface((32, 32))
c = pygame.Color(33, 22, 11, 255)
s.set_colorkey(c)
get_r, get_g, get_b, get_a = s.get_colorkey()
self.assertTrue(get_r == c.r)
self.assertTrue(get_g == c.g)
self.assertTrue(get_b == c.b)
self.assertTrue(get_a == c.a)
########## HSLA, HSVA, CMY, I1I2I3 ALL ELEMENTS WITHIN SPECIFIED RANGE #########
def test_hsla__all_elements_within_limits(self):
for c in rgba_combos_Color_generator():
h, s, l, a = c.hsla
self.assertTrue(0 <= h <= 360)
self.assertTrue(0 <= s <= 100)
self.assertTrue(0 <= l <= 100)
self.assertTrue(0 <= a <= 100)
def test_hsva__all_elements_within_limits(self):
for c in rgba_combos_Color_generator():
h, s, v, a = c.hsva
self.assertTrue(0 <= h <= 360)
self.assertTrue(0 <= s <= 100)
self.assertTrue(0 <= v <= 100)
self.assertTrue(0 <= a <= 100)
def test_cmy__all_elements_within_limits(self):
for c in rgba_combos_Color_generator():
c, m, y = c.cmy
self.assertTrue(0 <= c <= 1)
self.assertTrue(0 <= m <= 1)
self.assertTrue(0 <= y <= 1)
def test_i1i2i3__all_elements_within_limits(self):
for c in rgba_combos_Color_generator():
i1, i2, i3 = c.i1i2i3
self.assertTrue( 0 <= i1 <= 1)
self.assertTrue(-0.5 <= i2 <= 0.5)
self.assertTrue(-0.5 <= i3 <= 0.5)
def test_issue_269(self):
"""PyColor OverflowError on HSVA with hue value of 360
>>> c = pygame.Color(0)
>>> c.hsva = (360,0,0,0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: this is not allowed to happen ever
>>> pygame.ver
'1.9.1release'
>>>
"""
c = pygame.Color(0)
c.hsva = 360, 0, 0, 0
self.assertEqual(c.hsva, (0, 0, 0, 0))
c.hsva = 360, 100, 100, 100
self.assertEqual(c.hsva, (0, 100, 100, 100))
self.assertEqual(c, (255, 0, 0, 255))
####################### COLORSPACE PROPERTY SANITY TESTS #######################
def colorspaces_converted_should_not_raise(self, prop):
fails = 0
x = 0
for c in rgba_combos_Color_generator():
x += 1
other = pygame.Color(0)
try:
setattr(other, prop, getattr(c, prop))
#eg other.hsla = c.hsla
except ValueError:
fails += 1
self.assertTrue(x > 0, "x is combination counter, 0 means no tests!")
self.assertTrue((fails, x) == (0, x))
def test_hsla__sanity_testing_converted_should_not_raise(self):
self.colorspaces_converted_should_not_raise('hsla')
def test_hsva__sanity_testing_converted_should_not_raise(self):
self.colorspaces_converted_should_not_raise('hsva')
def test_cmy__sanity_testing_converted_should_not_raise(self):
self.colorspaces_converted_should_not_raise('cmy')
def test_i1i2i3__sanity_testing_converted_should_not_raise(self):
self.colorspaces_converted_should_not_raise('i1i2i3')
################################################################################
def colorspaces_converted_should_equate_bar_rounding(self, prop):
for c in rgba_combos_Color_generator():
other = pygame.Color(0)
try:
setattr(other, prop, getattr(c, prop))
#eg other.hsla = c.hsla
self.assertTrue(abs(other.r - c.r) <= 1)
self.assertTrue(abs(other.b - c.b) <= 1)
self.assertTrue(abs(other.g - c.g) <= 1)
# CMY and I1I2I3 do not care about the alpha
if not prop in ("cmy", "i1i2i3"):
self.assertTrue(abs(other.a - c.a) <= 1)
except ValueError:
pass # other tests will notify, this tests equation
def test_hsla__sanity_testing_converted_should_equate_bar_rounding(self):
self.colorspaces_converted_should_equate_bar_rounding('hsla')
def test_hsva__sanity_testing_converted_should_equate_bar_rounding(self):
self.colorspaces_converted_should_equate_bar_rounding('hsva')
def test_cmy__sanity_testing_converted_should_equate_bar_rounding(self):
self.colorspaces_converted_should_equate_bar_rounding('cmy')
def test_i1i2i3__sanity_testing_converted_should_equate_bar_rounding(self):
self.colorspaces_converted_should_equate_bar_rounding('i1i2i3')
################################################################################
def test_correct_gamma__verified_against_python_implementation(self):
"|tags:slow|"
# gamma_correct defined at top of page
gammas = [i / 10.0 for i in range(1, 31)] # [0.1 ... 3.0]
gammas_len = len(gammas)
for i, c in enumerate(rgba_combos_Color_generator()):
gamma = gammas[i % gammas_len]
corrected = pygame.Color(*[gamma_correct(x, gamma)
for x in tuple(c)])
lib_corrected = c.correct_gamma(gamma)
self.assertTrue(corrected.r == lib_corrected.r)
self.assertTrue(corrected.g == lib_corrected.g)
self.assertTrue(corrected.b == lib_corrected.b)
self.assertTrue(corrected.a == lib_corrected.a)
# TODO: test against statically defined verified _correct_ values
# assert corrected.r == 125 etc.
def test_pickle(self):
import pickle
c1 = pygame.Color(1,2,3,4)
#c2 = pygame.Color(255,254,253,252)
pickle_string = pickle.dumps(c1)
c1_frompickle = pickle.loads(pickle_string)
self.assertEqual(c1,c1_frompickle)
################################################################################
# only available if ctypes module is also available
@unittest.skipIf(IS_PYPY, 'PyPy has no ctypes')
def test_arraystruct(self):
import pygame.tests.test_utils.arrinter as ai
import ctypes as ct
c_byte_p = ct.POINTER(ct.c_byte)
c = pygame.Color(5, 7, 13, 23)
flags = (ai.PAI_CONTIGUOUS | ai.PAI_FORTRAN |
ai.PAI_ALIGNED | ai.PAI_NOTSWAPPED)
for i in range(1, 5):
c.set_length(i)
inter = ai.ArrayInterface(c)
self.assertEqual(inter.two, 2)
self.assertEqual(inter.nd, 1)
self.assertEqual(inter.typekind, 'u')
self.assertEqual(inter.itemsize, 1)
self.assertEqual(inter.flags, flags)
self.assertEqual(inter.shape[0], i)
self.assertEqual(inter.strides[0], 1)
data = ct.cast(inter.data, c_byte_p)
for j in range(i):
self.assertEqual(data[j], c[j])
@unittest.skipIf(not pygame.HAVE_NEWBUF, 'newbuf not implemented')
def test_newbuf(self):
from pygame.tests.test_utils import buftools
from ctypes import cast, POINTER, c_uint8
class ColorImporter(buftools.Importer):
def __init__(self, color, flags):
super(ColorImporter, self).__init__(color, flags)
self.items = cast(self.buf, POINTER(c_uint8))
def __getitem__(self, index):
if 0 <= index < 4:
return self.items[index]
raise IndexError("valid index values are between 0 and 3: "
"got {}".format(index))
def __setitem__(self, index, value):
if 0 <= index < 4:
self.items[index] = value
else:
raise IndexError("valid index values are between 0 and 3: "
"got {}".format(index))
c = pygame.Color(50, 100, 150, 200)
imp = ColorImporter(c, buftools.PyBUF_SIMPLE)
self.assertTrue(imp.obj is c)
self.assertEqual(imp.ndim, 0)
self.assertEqual(imp.itemsize, 1)
self.assertEqual(imp.len, 4)
self.assertTrue(imp.readonly)
self.assertTrue(imp.format is None)
self.assertTrue(imp.shape is None)
self.assertTrue(imp.strides is None)
self.assertTrue(imp.suboffsets is None)
for i in range(4):
self.assertEqual(c[i], imp[i])
imp[0] = 60
self.assertEqual(c.r, 60)
imp[1] = 110
self.assertEqual(c.g, 110)
imp[2] = 160
self.assertEqual(c.b, 160)
imp[3] = 210
self.assertEqual(c.a, 210)
imp = ColorImporter(c, buftools.PyBUF_FORMAT)
self.assertEqual(imp.ndim, 0)
self.assertEqual(imp.itemsize, 1)
self.assertEqual(imp.len, 4)
self.assertEqual(imp.format, 'B')
self.assertEqual(imp.ndim, 0)
self.assertEqual(imp.itemsize, 1)
self.assertEqual(imp.len, 4)
imp = ColorImporter(c, buftools.PyBUF_ND)
self.assertEqual(imp.ndim, 1)
self.assertEqual(imp.itemsize, 1)
self.assertEqual(imp.len, 4)
self.assertTrue(imp.format is None)
self.assertEqual(imp.shape, (4,))
self.assertEqual(imp.strides, None)
imp = ColorImporter(c, buftools.PyBUF_STRIDES)
self.assertEqual(imp.ndim, 1)
self.assertTrue(imp.format is None)
self.assertEqual(imp.shape, (4,))
self.assertEqual(imp.strides, (1,))
imp = ColorImporter(c, buftools.PyBUF_C_CONTIGUOUS)
self.assertEqual(imp.ndim, 1)
imp = ColorImporter(c, buftools.PyBUF_F_CONTIGUOUS)
self.assertEqual(imp.ndim, 1)
imp = ColorImporter(c, buftools.PyBUF_ANY_CONTIGUOUS)
self.assertEqual(imp.ndim, 1)
for i in range(1, 5):
c.set_length(i)
imp = ColorImporter(c, buftools.PyBUF_ND)
self.assertEqual(imp.ndim, 1)
self.assertEqual(imp.len, i)
self.assertEqual(imp.shape, (i,))
self.assertRaises(BufferError, ColorImporter,
c, buftools.PyBUF_WRITABLE)
class SubclassTest(unittest.TestCase):
class MyColor(pygame.Color):
def __init__ (self, *args, **kwds):
super(SubclassTest.MyColor, self).__init__ (*args, **kwds)
self.an_attribute = True
def test_add(self):
mc1 = self.MyColor(128, 128, 128, 255)
self.assertTrue(mc1.an_attribute)
c2 = pygame.Color(64, 64, 64, 255)
mc2 = mc1 + c2
self.assertTrue(isinstance(mc2, self.MyColor))
self.assertRaises(AttributeError, getattr, mc2, 'an_attribute')
c3 = c2 + mc1
self.assertTrue(type(c3) is pygame.Color)
def test_sub(self):
mc1 = self.MyColor(128, 128, 128, 255)
self.assertTrue(mc1.an_attribute)
c2 = pygame.Color(64, 64, 64, 255)
mc2 = mc1 - c2
self.assertTrue(isinstance(mc2, self.MyColor))
self.assertRaises(AttributeError, getattr, mc2, 'an_attribute')
c3 = c2 - mc1
self.assertTrue(type(c3) is pygame.Color)
def test_mul(self):
mc1 = self.MyColor(128, 128, 128, 255)
self.assertTrue(mc1.an_attribute)
c2 = pygame.Color(64, 64, 64, 255)
mc2 = mc1 * c2
self.assertTrue(isinstance(mc2, self.MyColor))
self.assertRaises(AttributeError, getattr, mc2, 'an_attribute')
c3 = c2 * mc1
self.assertTrue(type(c3) is pygame.Color)
def test_div(self):
mc1 = self.MyColor(128, 128, 128, 255)
self.assertTrue(mc1.an_attribute)
c2 = pygame.Color(64, 64, 64, 255)
mc2 = mc1 // c2
self.assertTrue(isinstance(mc2, self.MyColor))
self.assertRaises(AttributeError, getattr, mc2, 'an_attribute')
c3 = c2 // mc1
self.assertTrue(type(c3) is pygame.Color)
def test_mod(self):
mc1 = self.MyColor(128, 128, 128, 255)
self.assertTrue(mc1.an_attribute)
c2 = pygame.Color(64, 64, 64, 255)
mc2 = mc1 % c2
self.assertTrue(isinstance(mc2, self.MyColor))
self.assertRaises(AttributeError, getattr, mc2, 'an_attribute')
c3 = c2 % mc1
self.assertTrue(type(c3) is pygame.Color)
def test_inv(self):
mc1 = self.MyColor(64, 64, 64, 64)
self.assertTrue(mc1.an_attribute)
mc2 = ~mc1
self.assertTrue(isinstance(mc2, self.MyColor))
self.assertRaises(AttributeError, getattr, mc2, 'an_attribute')
def test_correct_gamma(self):
mc1 = self.MyColor(64, 70, 75, 255)
self.assertTrue(mc1.an_attribute)
mc2 = mc1.correct_gamma(.03)
self.assertTrue(isinstance(mc2, self.MyColor))
self.assertRaises(AttributeError, getattr, mc2, 'an_attribute')
################################################################################
if __name__ == '__main__':
unittest.main()