# Copyright (c) OpenMMLab. All rights reserved.
"""Test text label visualize."""
import os.path as osp
import random
import tempfile
from unittest import mock

import numpy as np
import pytest

import mmocr.core.visualize as visualize_utils


def test_tile_image():
    dummp_imgs, heights, widths = [], [], []
    for _ in range(3):
        h = random.randint(100, 300)
        w = random.randint(100, 300)
        heights.append(h)
        widths.append(w)
        # dummy_img = Image.new('RGB', (w, h), Image.ANTIALIAS)
        dummy_img = np.ones((h, w, 3), dtype=np.uint8)
        dummp_imgs.append(dummy_img)
    joint_img = visualize_utils.tile_image(dummp_imgs)
    assert joint_img.shape[0] == sum(heights)
    assert joint_img.shape[1] == max(widths)

    # test invalid arguments
    with pytest.raises(AssertionError):
        visualize_utils.tile_image(dummp_imgs[0])
    with pytest.raises(AssertionError):
        visualize_utils.tile_image([])


@mock.patch('%s.visualize_utils.mmcv.imread' % __name__)
@mock.patch('%s.visualize_utils.mmcv.imshow' % __name__)
@mock.patch('%s.visualize_utils.mmcv.imwrite' % __name__)
def test_show_text_label(mock_imwrite, mock_imshow, mock_imread):
    img = np.ones((32, 160), dtype=np.uint8)
    pred_label = 'hello'
    gt_label = 'world'

    tmp_dir = tempfile.TemporaryDirectory()
    out_file = osp.join(tmp_dir.name, 'tmp.jpg')

    # test invalid arguments
    with pytest.raises(AssertionError):
        visualize_utils.imshow_text_label(5, pred_label, gt_label)
    with pytest.raises(AssertionError):
        visualize_utils.imshow_text_label(img, pred_label, 4)
    with pytest.raises(AssertionError):
        visualize_utils.imshow_text_label(img, 3, gt_label)
    with pytest.raises(AssertionError):
        visualize_utils.imshow_text_label(
            img, pred_label, gt_label, show=True, wait_time=0.1)

    mock_imread.side_effect = [img, img]
    visualize_utils.imshow_text_label(
        img, pred_label, gt_label, out_file=out_file)
    visualize_utils.imshow_text_label(
        img, '中文', '中文', out_file=None, show=True)

    # test showing img
    mock_imshow.assert_called_once()
    mock_imwrite.assert_called_once()

    tmp_dir.cleanup()
