import unittest
from main import *
import numpy as np


class TestImageAreaApp(unittest.TestCase):

    def test_hex_to_hsv_success(self):
        """Проверка успешной конвертации hex кода цвета в hsv"""
        payload = 'ff0000'
        res = hex_to_hsv(payload)
        self.assertEqual(res, [0, 255, 255])

    def test_hex_to_hsv_error(self):
        """Проверка конвертации hex кода цвета hsv c ошибкой"""
        payload = 'invalid text'
        with self.assertRaises(ValueError):
            hex_to_hsv(payload)

    def test_get_main_color_success(self):
        """Проверка успешного получения цвета центрального пикселя на кртинке"""
        color = [0, 255, 0]
        payload = np.array([
            [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
            [[0, 0, 0], color, [0, 0, 0]],
            [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
        ])
        res = get_main_color(payload)
        for index, c in enumerate(res):
            # проверяем чтобы значения каждого канала соответствовало реальному цвету
            self.assertEqual(color[index], c)

    def test_get_main_color_error(self):
        """Проверка получения цвета центрального пикселя с ошибкой"""
        color = [0, 255, 0]
        payload = np.array(
            [[0, 0, 0], color, [0, 0, 0]],
        )
        with self.assertRaises(ValueError):
            get_main_color(payload)

    def test_get_min_max_color_success(self):
        """Проверка успешного получения диапазона цветов для опередения контура"""
        payload = np.array([2, 252, 100])
        min_c, max_c = get_min_max(payload)
        self.assertTrue(np.array_equal(min_c, np.array([0, 222, 70])))
        self.assertTrue(np.array_equal(max_c, np.array([32, 255, 130])))

    def test_get_min_max_color_error(self):
        """Проверка получени диарапазона цветов с ошибкой"""
        payload = 123
        with self.assertRaises(TypeError):
            get_min_max(payload)

    def get_result_string_with_no_area_mode(self):
        """Проверка формирования строки вывода без режима только прощадь"""
        payload = {
            'area': 186,
            'area_mode': None
        }
        res = get_result_string(**payload)
        self.assertEqual(res, 'Area of figure: 186')

    def get_result_string_with_area_mode(self):
        """Проверка формирования строки вывода с режимом только прощадь"""
        payload = {
            'area': 186,
            'area_mode': True
        }
        res = get_result_string(**payload)
        self.assertEqual(res, '186')


if __name__ == '__main__':
    unittest.main()
