From 2e4e315a1b66091b382474cc733363441552d8f3 Mon Sep 17 00:00:00 2001 From: Arsh Date: Sat, 11 Sep 2021 03:31:56 +0530 Subject: [PATCH] added new converters and conversion tests --- acrylic/Converters.py | 142 +++++++++ acrylic/Defaults.py | 10 +- acrylic/{Validator.py => Validators.py} | 16 +- acrylic/color_names.py | 296 +++++++++--------- changelog | 10 + tests/test_converters.py | 58 ++++ ...{test_validation.py => test_validators.py} | 2 +- 7 files changed, 379 insertions(+), 155 deletions(-) create mode 100644 acrylic/Converters.py rename acrylic/{Validator.py => Validators.py} (88%) create mode 100644 changelog create mode 100644 tests/test_converters.py rename tests/{test_validation.py => test_validators.py} (99%) diff --git a/acrylic/Converters.py b/acrylic/Converters.py new file mode 100644 index 0000000..d82914d --- /dev/null +++ b/acrylic/Converters.py @@ -0,0 +1,142 @@ +import colorsys + +from acrylic.Defaults import SCHEMAS, PRECISION +from acrylic.color_names import color_names, color_names_reverse + + +def rgb_to_hsl(rgb): + rgb_format, hsl_format = SCHEMAS['rgb'].format, SCHEMAS['hsl'].format + + norm = [x / m[1] for x, m in zip(rgb, rgb_format)] + h, l, s = colorsys.rgb_to_hls(*norm) + + hsl = [round(x * m[1], PRECISION) for x, m in zip([h, s, l], hsl_format)] + return SCHEMAS['hsl'].output_type(*hsl) + + +def rgb_to_hsv(rgb): + rgb_format, hsv_format = SCHEMAS['rgb'].format, SCHEMAS['hsv'].format + + norm = [x / m[1] for x, m in zip(rgb, rgb_format)] + h, s, v = colorsys.rgb_to_hsv(*norm) + + hsl = [round(x * m[1], PRECISION) for x, m in zip([h, s, v], hsv_format)] + return SCHEMAS['hsl'].output_type(*hsl) + + +def rgb_to_hex(rgb): + return f'#{"".join(f"{x:02X}" for x in rgb)}'.upper() + + +def rgb_to_name(rgb): + return color_names_reverse[rgb] if rgb in color_names_reverse else '-' + + +def rgb_to_ryb(rgb): + # Source: + # https://www.jstage.jst.go.jp/article/tievciieej/5/2/5_110/_pdf/-char/en + + rgb_format, ryb_format = SCHEMAS['rgb'].format, SCHEMAS['ryb'].format + rgb_r, rgb_g, rgb_b = [x / m[1] for x, m in zip(rgb, rgb_format)] + + white = min(rgb_r, rgb_g, rgb_b) + black = min(1 - rgb_r, 1 - rgb_g, 1 - rgb_b) + rgb_r, rgb_g, rgb_b = [x - white for x in (rgb_r, rgb_g, rgb_b)] + + yellow = min(rgb_r, rgb_g) + print(yellow, rgb_r, rgb_g) + ryb_r = rgb_r - yellow + ryb_y = (yellow + rgb_g) / 2 + ryb_b = (rgb_b + rgb_g - yellow) / 2 + + norm = 0 + if max(rgb_r, rgb_g, rgb_b) != 0: + norm = max(ryb_r, ryb_y, ryb_b) / max(rgb_r, rgb_g, rgb_b) + + ryb = [x / norm if norm > 0 else x for x in (ryb_r, ryb_y, ryb_b)] + ryb = [x + black for x in ryb] + + result = [round(x * m[1]) for x, m in zip(ryb, ryb_format)] + return SCHEMAS['ryb'].output_type(*result) + + +# - - - - - - - - - - - - - - + + +def hsl_to_rgb(hsl): + rgb_format, hsl_format = SCHEMAS['rgb'].format, SCHEMAS['hsl'].format + + (h, s, l) = [x / m[1] for x, m in zip(hsl, hsl_format)] + rgb = colorsys.hls_to_rgb(h, l, s) + + rgb = [round(x * m[1]) for x, m in zip(rgb, rgb_format)] + return SCHEMAS['rgb'].output_type(*rgb) + + +def hsv_to_rgb(hsv): + rgb_format, hsv_format = SCHEMAS['rgb'].format, SCHEMAS['hsv'].format + + (h, s, v) = [x / m[1] for x, m in zip(hsv, hsv_format)] + rgb = colorsys.hsv_to_rgb(h, s, v) + + rgb = [round(x * m[1]) for x, m in zip(rgb, rgb_format)] + return SCHEMAS['rgb'].output_type(*rgb) + + +def hex_to_rgb(hex_str): + rgb = [int(hex_str[x:x + 2], 16) for x in range(1, 7, 2)] + return SCHEMAS['rgb'].output_type(*rgb) + + +def name_to_rgb(name): + if name == '-': + return SCHEMAS['rgb'].output_type(0, 0, 0) + return SCHEMAS['rgb'].output_type(*color_names[name]) + + +def ryb_to_rgb(ryb): + # Source: + # https://www.jstage.jst.go.jp/article/tievciieej/5/2/5_110/_pdf/-char/en + + rgb_format, ryb_format = SCHEMAS['rgb'].format, SCHEMAS['ryb'].format + ryb_r, ryb_y, ryb_b = [x / m[1] for x, m in zip(ryb, ryb_format)] + + black = min(ryb_r, ryb_y, ryb_b) + white = min(1 - ryb_r, 1 - ryb_y, 1 - ryb_b) + (ryb_r, ryb_y, ryb_b) = (x - black for x in (ryb_r, ryb_y, ryb_b)) + + green = min(ryb_y, ryb_b) + rgb_r = ryb_r + ryb_y - green + rgb_g = ryb_y + green + rgb_b = 2 * (ryb_b - green) + + norm = 0 + if max(ryb_r, ryb_y, ryb_b) != 0: + norm = max(rgb_r, rgb_g, rgb_b) / max(ryb_r, ryb_y, ryb_b) + + rgb = [x / norm if norm > 0 else x for x in (rgb_r, rgb_g, rgb_b)] + rgb = [x + white for x in rgb] + + result = [round(x * m[1]) for x, m in zip(rgb, rgb_format)] + return SCHEMAS['rgb'].output_type(*result) + + +# - - - - - - - - - - - - - - + + +rgb_to = { + 'hsl': rgb_to_hsl, + 'hsv': rgb_to_hsv, + 'hex': rgb_to_hex, + 'name': rgb_to_name, + 'ryb': rgb_to_ryb, +} + + +rgb_from = { + 'hsl': hsl_to_rgb, + 'hsv': hsv_to_rgb, + 'hex': hex_to_rgb, + 'name': name_to_rgb, + 'ryb': ryb_to_rgb, +} diff --git a/acrylic/Defaults.py b/acrylic/Defaults.py index 896c09d..13a97f2 100644 --- a/acrylic/Defaults.py +++ b/acrylic/Defaults.py @@ -11,11 +11,11 @@ Ryb = namedtuple('Ryb', 'r y b') Schema = namedtuple( - 'Schema', 'format names length rng input_type output_type' + 'Schema', 'format names length rng input_type output_type validation_type' ) RANDOM = -1 -PRECISION = 3 +PRECISION = 2 SCHEMAS = { @@ -26,6 +26,7 @@ rng=lambda a, b: randint(a, b), input_type=int, output_type=Rgb, + validation_type='values', ), 'hsl': Schema( format=Hsl((0, 360.0), (0, 100.0), (0, 100.0)), @@ -34,6 +35,7 @@ rng=lambda a, b: round(uniform(a, b), PRECISION), input_type=float, output_type=Hsl, + validation_type='values', ), 'hsv': Schema( format=Hsv((0, 360.0), (0, 100.0), (0, 100.0)), @@ -42,6 +44,7 @@ rng=lambda a, b: round(uniform(a, b), PRECISION), input_type=float, output_type=Hsv, + validation_type='values', ), 'ryb': Schema( format=Ryb((0, 255), (0, 255), (0, 255)), @@ -50,6 +53,7 @@ rng=lambda a, b: randint(a, b), input_type=int, output_type=Ryb, + validation_type='values', ), 'hex': Schema( format=re.compile(r''.join([ @@ -64,6 +68,7 @@ rng='#' + ''.join(choice('0123456789ABCDEF') for _ in range(6)), input_type=str, output_type=lambda x: f'#{x.upper()}', + validation_type='string', ), 'name': Schema( format=color_names, @@ -72,5 +77,6 @@ rng=choice(list(color_names.keys())), input_type=str, output_type=str, + validation_type='string', ), } diff --git a/acrylic/Validator.py b/acrylic/Validators.py similarity index 88% rename from acrylic/Validator.py rename to acrylic/Validators.py index 5703d6c..2b802a7 100644 --- a/acrylic/Validator.py +++ b/acrylic/Validators.py @@ -3,6 +3,13 @@ from acrylic.Defaults import RANDOM, PRECISION, SCHEMAS +def validate(value, colorspace): + if SCHEMAS[colorspace].validation_type == 'values': + return validate_values(value, colorspace) + if SCHEMAS[colorspace].validation_type == 'string': + return validate_string(value, colorspace) + + def in_range(x, a, b, p): if x < a or x > b: raise ValueError(f'{p!r} should be in range {a} - {b}') @@ -106,18 +113,17 @@ def validate_string(value, colorspace): value = check_datatype(schema.input_type, value, colorspace) if colorspace == 'hex': - match = schema.format.match(value) - if match and match.group('hex'): + match = schema.format.match(value, 0, 10) + if match and match.lastgroup == 'hex': return schema.output_type(match.group('hex')) - elif match and match.group('hex_alpha'): + elif match and match.lastgroup == 'hex_alpha': return schema.output_type(match.group('hex_alpha')) - elif match and match.group('hex_short'): + elif match and match.lastgroup == 'hex_short': extended = ''.join(f'{x}{x}' for x in match.group('hex_short')) return schema.output_type(extended) if colorspace == 'name': value = ''.join(value.strip().lower().split()) - print(value) if value in schema.format: return schema.output_type(value) diff --git a/acrylic/color_names.py b/acrylic/color_names.py index 9bad5ea..e9c6571 100644 --- a/acrylic/color_names.py +++ b/acrylic/color_names.py @@ -1,149 +1,151 @@ color_names = { - 'aliceblue': [240, 248, 255], - 'antiquewhite': [250, 235, 215], - 'aqua': [0, 255, 255], - 'aquamarine': [127, 255, 212], - 'azure': [240, 255, 255], - 'beige': [245, 245, 220], - 'bisque': [255, 228, 196], - 'black': [0, 0, 0], - 'blanchedalmond': [255, 235, 205], - 'blue': [0, 0, 255], - 'blueviolet': [138, 43, 226], - 'brown': [165, 42, 42], - 'burlywood': [222, 184, 135], - 'cadetblue': [95, 158, 160], - 'chartreuse': [127, 255, 0], - 'chocolate': [210, 105, 30], - 'coral': [255, 127, 80], - 'cornflowerblue': [100, 149, 237], - 'cornsilk': [255, 248, 220], - 'crimson': [220, 20, 60], - 'cyan': [0, 255, 255], - 'darkblue': [0, 0, 139], - 'darkcyan': [0, 139, 139], - 'darkgoldenrod': [184, 134, 11], - 'darkgray': [169, 169, 169], - 'darkgreen': [0, 100, 0], - 'darkgrey': [169, 169, 169], - 'darkkhaki': [189, 183, 107], - 'darkmagenta': [139, 0, 139], - 'darkolivegreen': [85, 107, 47], - 'darkorange': [255, 140, 0], - 'darkorchid': [153, 50, 204], - 'darkred': [139, 0, 0], - 'darksalmon': [233, 150, 122], - 'darkseagreen': [143, 188, 143], - 'darkslateblue': [72, 61, 139], - 'darkslategray': [47, 79, 79], - 'darkslategrey': [47, 79, 79], - 'darkturquoise': [0, 206, 209], - 'darkviolet': [148, 0, 211], - 'deeppink': [255, 20, 147], - 'deepskyblue': [0, 191, 255], - 'dimgray': [105, 105, 105], - 'dimgrey': [105, 105, 105], - 'dodgerblue': [30, 144, 255], - 'firebrick': [178, 34, 34], - 'floralwhite': [255, 250, 240], - 'forestgreen': [34, 139, 34], - 'fuchsia': [255, 0, 255], - 'gainsboro': [220, 220, 220], - 'ghostwhite': [248, 248, 255], - 'gold': [255, 215, 0], - 'goldenrod': [218, 165, 32], - 'gray': [128, 128, 128], - 'green': [0, 128, 0], - 'greenyellow': [173, 255, 47], - 'grey': [128, 128, 128], - 'honeydew': [240, 255, 240], - 'hotpink': [255, 105, 180], - 'indianred': [205, 92, 92], - 'indigo': [75, 0, 130], - 'ivory': [255, 255, 240], - 'khaki': [240, 230, 140], - 'lavender': [230, 230, 250], - 'lavenderblush': [255, 240, 245], - 'lawngreen': [124, 252, 0], - 'lemonchiffon': [255, 250, 205], - 'lightblue': [173, 216, 230], - 'lightcoral': [240, 128, 128], - 'lightcyan': [224, 255, 255], - 'lightgoldenrodyellow': [250, 250, 210], - 'lightgray': [211, 211, 211], - 'lightgreen': [144, 238, 144], - 'lightgrey': [211, 211, 211], - 'lightpink': [255, 182, 193], - 'lightsalmon': [255, 160, 122], - 'lightseagreen': [32, 178, 170], - 'lightskyblue': [135, 206, 250], - 'lightslategray': [119, 136, 153], - 'lightslategrey': [119, 136, 153], - 'lightsteelblue': [176, 196, 222], - 'lightyellow': [255, 255, 224], - 'lime': [0, 255, 0], - 'limegreen': [50, 205, 50], - 'linen': [250, 240, 230], - 'magenta': [255, 0, 255], - 'maroon': [128, 0, 0], - 'mediumaquamarine': [102, 205, 170], - 'mediumblue': [0, 0, 205], - 'mediumorchid': [186, 85, 211], - 'mediumpurple': [147, 112, 219], - 'mediumseagreen': [60, 179, 113], - 'mediumslateblue': [123, 104, 238], - 'mediumspringgreen': [0, 250, 154], - 'mediumturquoise': [72, 209, 204], - 'mediumvioletred': [199, 21, 133], - 'midnightblue': [25, 25, 112], - 'mintcream': [245, 255, 250], - 'mistyrose': [255, 228, 225], - 'moccasin': [255, 228, 181], - 'navajowhite': [255, 222, 173], - 'navy': [0, 0, 128], - 'oldlace': [253, 245, 230], - 'olive': [128, 128, 0], - 'olivedrab': [107, 142, 35], - 'orange': [255, 165, 0], - 'orangered': [255, 69, 0], - 'orchid': [218, 112, 214], - 'palegoldenrod': [238, 232, 170], - 'palegreen': [152, 251, 152], - 'paleturquoise': [175, 238, 238], - 'palevioletred': [219, 112, 147], - 'papayawhip': [255, 239, 213], - 'peachpuff': [255, 218, 185], - 'peru': [205, 133, 63], - 'pink': [255, 192, 203], - 'plum': [221, 160, 221], - 'powderblue': [176, 224, 230], - 'purple': [128, 0, 128], - 'red': [255, 0, 0], - 'rosybrown': [188, 143, 143], - 'royalblue': [65, 105, 225], - 'saddlebrown': [139, 69, 19], - 'salmon': [250, 128, 114], - 'sandybrown': [244, 164, 96], - 'seagreen': [46, 139, 87], - 'seashell': [255, 245, 238], - 'sienna': [160, 82, 45], - 'silver': [192, 192, 192], - 'skyblue': [135, 206, 235], - 'slateblue': [106, 90, 205], - 'slategray': [112, 128, 144], - 'slategrey': [112, 128, 144], - 'snow': [255, 250, 250], - 'springgreen': [0, 255, 127], - 'steelblue': [70, 130, 180], - 'tan': [210, 180, 140], - 'teal': [0, 128, 128], - 'thistle': [216, 191, 216], - 'tomato': [255, 99, 71], - 'turquoise': [64, 224, 208], - 'violet': [238, 130, 238], - 'wheat': [245, 222, 179], - 'white': [255, 255, 255], - 'whitesmoke': [245, 245, 245], - 'yellow': [255, 255, 0], - 'yellowgreen': [154, 205, 50 ], + 'aliceblue': (240, 248, 255), + 'antiquewhite': (250, 235, 215), + 'aqua': (0, 255, 255), + 'aquamarine': (127, 255, 212), + 'azure': (240, 255, 255), + 'beige': (245, 245, 220), + 'bisque': (255, 228, 196), + 'black': (0, 0, 0), + 'blanchedalmond': (255, 235, 205), + 'blue': (0, 0, 255), + 'blueviolet': (138, 43, 226), + 'brown': (165, 42, 42), + 'burlywood': (222, 184, 135), + 'cadetblue': (95, 158, 160), + 'chartreuse': (127, 255, 0), + 'chocolate': (210, 105, 30), + 'coral': (255, 127, 80), + 'cornflowerblue': (100, 149, 237), + 'cornsilk': (255, 248, 220), + 'crimson': (220, 20, 60), + 'cyan': (0, 255, 255), + 'darkblue': (0, 0, 139), + 'darkcyan': (0, 139, 139), + 'darkgoldenrod': (184, 134, 11), + 'darkgray': (169, 169, 169), + 'darkgreen': (0, 100, 0), + 'darkgrey': (169, 169, 169), + 'darkkhaki': (189, 183, 107), + 'darkmagenta': (139, 0, 139), + 'darkolivegreen': (85, 107, 47), + 'darkorange': (255, 140, 0), + 'darkorchid': (153, 50, 204), + 'darkred': (139, 0, 0), + 'darksalmon': (233, 150, 122), + 'darkseagreen': (143, 188, 143), + 'darkslateblue': (72, 61, 139), + 'darkslategray': (47, 79, 79), + 'darkslategrey': (47, 79, 79), + 'darkturquoise': (0, 206, 209), + 'darkviolet': (148, 0, 211), + 'deeppink': (255, 20, 147), + 'deepskyblue': (0, 191, 255), + 'dimgray': (105, 105, 105), + 'dimgrey': (105, 105, 105), + 'dodgerblue': (30, 144, 255), + 'firebrick': (178, 34, 34), + 'floralwhite': (255, 250, 240), + 'forestgreen': (34, 139, 34), + 'fuchsia': (255, 0, 255), + 'gainsboro': (220, 220, 220), + 'ghostwhite': (248, 248, 255), + 'gold': (255, 215, 0), + 'goldenrod': (218, 165, 32), + 'gray': (128, 128, 128), + 'green': (0, 128, 0), + 'greenyellow': (173, 255, 47), + 'grey': (128, 128, 128), + 'honeydew': (240, 255, 240), + 'hotpink': (255, 105, 180), + 'indianred': (205, 92, 92), + 'indigo': (75, 0, 130), + 'ivory': (255, 255, 240), + 'khaki': (240, 230, 140), + 'lavender': (230, 230, 250), + 'lavenderblush': (255, 240, 245), + 'lawngreen': (124, 252, 0), + 'lemonchiffon': (255, 250, 205), + 'lightblue': (173, 216, 230), + 'lightcoral': (240, 128, 128), + 'lightcyan': (224, 255, 255), + 'lightgoldenrodyellow': (250, 250, 210), + 'lightgray': (211, 211, 211), + 'lightgreen': (144, 238, 144), + 'lightgrey': (211, 211, 211), + 'lightpink': (255, 182, 193), + 'lightsalmon': (255, 160, 122), + 'lightseagreen': (32, 178, 170), + 'lightskyblue': (135, 206, 250), + 'lightslategray': (119, 136, 153), + 'lightslategrey': (119, 136, 153), + 'lightsteelblue': (176, 196, 222), + 'lightyellow': (255, 255, 224), + 'lime': (0, 255, 0), + 'limegreen': (50, 205, 50), + 'linen': (250, 240, 230), + 'magenta': (255, 0, 255), + 'maroon': (128, 0, 0), + 'mediumaquamarine': (102, 205, 170), + 'mediumblue': (0, 0, 205), + 'mediumorchid': (186, 85, 211), + 'mediumpurple': (147, 112, 219), + 'mediumseagreen': (60, 179, 113), + 'mediumslateblue': (123, 104, 238), + 'mediumspringgreen': (0, 250, 154), + 'mediumturquoise': (72, 209, 204), + 'mediumvioletred': (199, 21, 133), + 'midnightblue': (25, 25, 112), + 'mintcream': (245, 255, 250), + 'mistyrose': (255, 228, 225), + 'moccasin': (255, 228, 181), + 'navajowhite': (255, 222, 173), + 'navy': (0, 0, 128), + 'oldlace': (253, 245, 230), + 'olive': (128, 128, 0), + 'olivedrab': (107, 142, 35), + 'orange': (255, 165, 0), + 'orangered': (255, 69, 0), + 'orchid': (218, 112, 214), + 'palegoldenrod': (238, 232, 170), + 'palegreen': (152, 251, 152), + 'paleturquoise': (175, 238, 238), + 'palevioletred': (219, 112, 147), + 'papayawhip': (255, 239, 213), + 'peachpuff': (255, 218, 185), + 'peru': (205, 133, 63), + 'pink': (255, 192, 203), + 'plum': (221, 160, 221), + 'powderblue': (176, 224, 230), + 'purple': (128, 0, 128), + 'red': (255, 0, 0), + 'rosybrown': (188, 143, 143), + 'royalblue': (65, 105, 225), + 'saddlebrown': (139, 69, 19), + 'salmon': (250, 128, 114), + 'sandybrown': (244, 164, 96), + 'seagreen': (46, 139, 87), + 'seashell': (255, 245, 238), + 'sienna': (160, 82, 45), + 'silver': (192, 192, 192), + 'skyblue': (135, 206, 235), + 'slateblue': (106, 90, 205), + 'slategray': (112, 128, 144), + 'slategrey': (112, 128, 144), + 'snow': (255, 250, 250), + 'springgreen': (0, 255, 127), + 'steelblue': (70, 130, 180), + 'tan': (210, 180, 140), + 'teal': (0, 128, 128), + 'thistle': (216, 191, 216), + 'tomato': (255, 99, 71), + 'turquoise': (64, 224, 208), + 'violet': (238, 130, 238), + 'wheat': (245, 222, 179), + 'white': (255, 255, 255), + 'whitesmoke': (245, 245, 245), + 'yellow': (255, 255, 0), + 'yellowgreen': (154, 205, 50), } + +color_names_reverse = {v: k for k, v in color_names.items()} diff --git a/changelog b/changelog new file mode 100644 index 0000000..7f2d1c4 --- /dev/null +++ b/changelog @@ -0,0 +1,10 @@ + +v0.3.0 +- rewrote the validation system to follow duck typing conventions +- optimized the validation code to remove inefficient parts +- added option to select colors by name, using any valid CSS3 color name +- added more detailed tests for validation and conversion + + +v0.2.4 & older +- changelog not maintained here diff --git a/tests/test_converters.py b/tests/test_converters.py new file mode 100644 index 0000000..c38c7c8 --- /dev/null +++ b/tests/test_converters.py @@ -0,0 +1,58 @@ +from acrylic.Converters import rgb_to, rgb_from + + +class Test_converters(): + + rgbs = [(62, 244, 255), (255, 0, 0), (25, 24, 25)] + hsls = [(183.42, 100.0, 62.16), (0, 100, 50), (300.0, 2.04, 9.61)] + hsvs = [(183.42, 75.69, 100.0), (0, 100, 100), (300.0, 4.0, 9.8)] + hexes = ['#3EF4FF', '#FF0000', '#191819'] + names = ['-', 'red', '-'] + rybs = [(0, 94, 193), (255, 0, 0), (231, 230, 230)] + + def test_rgb_to_hsl(self): + for rgb, hsl in zip(self.rgbs, self.hsls): + for x, y in zip(rgb_to['hsl'](rgb), hsl): + assert round(x) == round(y) + + def test_rgb_to_hsv(self): + for rgb, hsv in zip(self.rgbs, self.hsvs): + for x, y in zip(rgb_to['hsv'](rgb), hsv): + assert round(x) == round(y) + + def test_rgb_to_hex(self): + for rgb, hex_code in zip(self.rgbs, self.hexes): + assert rgb_to['hex'](rgb) == hex_code + + def test_rgb_to_name(self): + for rgb, name in zip(self.rgbs, self.names): + assert rgb_to['name'](rgb) == name + + def test_rgb_to_ryb(self): + for rgb, ryb in zip(self.rgbs, self.rybs): + for x, y in zip(rgb_to['ryb'](rgb), ryb): + assert x - y <= 1 + + # - - - - - - - - - - + + def test_hsl_to_rgb(self): + for rgb, hsl in zip(self.rgbs, self.hsls): + assert rgb_from['hsl'](hsl) == rgb + + def test_hsv_to_rgb(self): + for rgb, hsv in zip(self.rgbs, self.hsvs): + assert rgb_from['hsv'](hsv) == rgb + + def test_hex_to_rgb(self): + for rgb, hex_code in zip(self.rgbs, self.hexes): + assert rgb_from['hex'](hex_code) == rgb + + def test_name_to_rgb(self): + for rgb, name in zip(self.rgbs, self.names): + if name != '-': + assert rgb_from['name'](name) == rgb + + def test_ryb_to_rgb(self): + for rgb, ryb in zip(self.rgbs, self.rybs): + for x, y in zip(rgb_from['ryb'](ryb), rgb): + assert x - y <= 1 diff --git a/tests/test_validation.py b/tests/test_validators.py similarity index 99% rename from tests/test_validation.py rename to tests/test_validators.py index 5bb6ff3..c323d77 100644 --- a/tests/test_validation.py +++ b/tests/test_validators.py @@ -2,7 +2,7 @@ from decimal import Decimal from collections.abc import Iterable -from acrylic.Validator import ( +from acrylic.Validators import ( in_range, check_datatype, check_iter, validate_values, validate_string ) from acrylic.Defaults import SCHEMAS, Rgb