"""Unittests for crop_actions.py"""
import unittest
from telemetry.util import image_util
from gpu_tests import crop_actions as ca
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
class FixedRectCropActionUnittest(unittest.TestCase):
def testInit(self):
"""Tests constructor checks."""
with self.assertRaises(AssertionError):
ca.FixedRectCropAction(-1, 0, 1, 1)
with self.assertRaises(AssertionError):
ca.FixedRectCropAction(0, -1, 1, 1)
with self.assertRaises(AssertionError):
ca.FixedRectCropAction(0, 0, 0, 1)
with self.assertRaises(AssertionError):
ca.FixedRectCropAction(0, 0, 1, 0)
def testCropTopLeft(self):
"""Tests that cropping works properly when done at the top left bounds."""
image_width = 20
pixels = [*RED, *(GREEN * (image_width - 1)),
*(GREEN * image_width)]
image = image_util.FromRGBPixels(20, 2, pixels, bpp=3)
action = ca.FixedRectCropAction(0, 0, 1, 1)
cropped_image = action.CropScreenshot(image, 1, '', '')
expected_image = image_util.FromRGBPixels(1, 1, [*RED], bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
def testCropCenter(self):
"""Tests that cropping works properly when not along any bounds."""
image_width = 20
pixels = [*(GREEN * image_width),
*GREEN, *RED, *(GREEN * (image_width - 2)),
*(GREEN * image_width)]
image = image_util.FromRGBPixels(20, 3, pixels, bpp=3)
action = ca.FixedRectCropAction(1, 1, 2, 2)
cropped_image = action.CropScreenshot(image, 1, '', '')
expected_image = image_util.FromRGBPixels(1, 1, [*RED], bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
def testCropScrollbarRemoved(self):
"""Tests that right columns are auto-removed to avoid scrollbars."""
image_width = 20
pixels = [*(GREEN * image_width)]
image = image_util.FromRGBPixels(20, 1, pixels, bpp=3)
action = ca.FixedRectCropAction(0, 0, 20, 1)
cropped_image = action.CropScreenshot(image, 1, '', '')
expected_width = image_width - ca.FixedRectCropAction.SCROLLBAR_WIDTH
expected_pixels = [*(GREEN * expected_width)]
expected_image = image_util.FromRGBPixels(expected_width,
1,
expected_pixels,
bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
def testBoundsClamping(self):
"""Tests that the bottom right coordinates are automatically clamped."""
image_width = 20
pixels = [*(GREEN * image_width)]
image = image_util.FromRGBPixels(20, 1, pixels, bpp=3)
action = ca.FixedRectCropAction(0, 0, 999999, 999999)
cropped_image = action.CropScreenshot(image, 1, '', '')
expected_width = image_width - ca.FixedRectCropAction.SCROLLBAR_WIDTH
expected_pixels = [*(GREEN * expected_width)]
expected_image = image_util.FromRGBPixels(expected_width,
1,
expected_pixels,
bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
def testNoneBounds(self):
"""Tests that None can be used to specify the bottom right coordinates."""
image_width = 20
pixels = [*(GREEN * image_width)]
image = image_util.FromRGBPixels(20, 1, pixels, bpp=3)
action = ca.FixedRectCropAction(0, 0, None, None)
cropped_image = action.CropScreenshot(image, 1, '', '')
expected_width = image_width - ca.FixedRectCropAction.SCROLLBAR_WIDTH
expected_pixels = [*(GREEN * expected_width)]
expected_image = image_util.FromRGBPixels(expected_width,
1,
expected_pixels,
bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
def testDprScaling(self):
"""Tests that crop bounds are scaled by DPR."""
image_width = 20
pixels = [
*(GREEN * image_width),
*(GREEN * image_width),
*GREEN, *GREEN, *RED, *RED, *(GREEN * (image_width - 4)),
*GREEN, *GREEN, *RED, *RED, *(GREEN * (image_width - 4)),
*(GREEN * image_width),
]
image = image_util.FromRGBPixels(20, 5, pixels, bpp=3)
action = ca.FixedRectCropAction(1, 1, 2, 2)
cropped_image = action.CropScreenshot(image, 2.4, '', '')
expected_pixels = [*(RED * 4)]
expected_image = image_util.FromRGBPixels(2, 2, expected_pixels, bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
def testNegativeBounds(self):
"""Tests that negative numbers can be used to specify offsets."""
image_width = 20
pixels = [
*(GREEN * image_width),
*(GREEN * image_width),
*GREEN, *GREEN, *RED, *RED, *(GREEN * (image_width - 4)),
*GREEN, *GREEN, *RED, *RED, *(GREEN * (image_width - 4)),
*(GREEN * image_width),
]
image = image_util.FromRGBPixels(20, 5, pixels, bpp=3)
action = ca.FixedRectCropAction(2, 2, -16, -1)
cropped_image = action.CropScreenshot(image, 1, '', '')
expected_pixels = [*(RED * 4)]
expected_image = image_util.FromRGBPixels(2, 2, expected_pixels, bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
class NonWhiteContentCropAction(unittest.TestCase):
def testNoWhiteContent(self):
"""Tests behavior when there is no white content to remove."""
pixels = [*(GREEN * 9)]
image = image_util.FromRGBPixels(3, 3, pixels, bpp=3)
action = ca.NonWhiteContentCropAction()
cropped_image = action.CropScreenshot(image, 1, '', '')
expected_image = image_util.FromRGBPixels(3, 3, pixels, bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
def testSomeWhiteContent(self):
"""Tests behavior when there is some white content to remove."""
pixels = [*WHITE, *WHITE, *WHITE, *WHITE,
*WHITE, *RED, *RED, *WHITE,
*WHITE, *RED, *RED, *WHITE,
*WHITE, *WHITE, *WHITE, *WHITE]
image = image_util.FromRGBPixels(4, 4, pixels, bpp=3)
action = ca.NonWhiteContentCropAction()
cropped_image = action.CropScreenshot(image, 1, '', '')
expected_image = image_util.FromRGBPixels(2, 2, [*(RED * 4)], bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
def testSomeWhiteContentSinglePixel(self):
"""Checks for off-by-one errors when only a single pixel isn't white."""
pixels = [*WHITE, *WHITE, *WHITE,
*WHITE, *RED, *WHITE,
*WHITE, *WHITE, *WHITE]
image = image_util.FromRGBPixels(3, 3, pixels, bpp=3)
action = ca.NonWhiteContentCropAction()
cropped_image = action.CropScreenshot(image, 1, '', '')
expected_image = image_util.FromRGBPixels(1, 1, [*RED], bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
def testAllWhiteContent(self):
"""Tests that trying to crop all white content is an error."""
pixels = [*WHITE]
image = image_util.FromRGBPixels(1, 1, pixels, bpp=3)
action = ca.NonWhiteContentCropAction()
with self.assertRaisesRegex(
RuntimeError,
'Attempted to crop to non-white content in an all white image'):
action.CropScreenshot(image, 1, '', '')
def testInitialCrop(self):
"""Tests that a provided initial crop is used first."""
image_width = 20
pixels = [
*WHITE, *WHITE, *WHITE, *(WHITE * (image_width - 3)),
*WHITE, *RED, *WHITE, *(WHITE * (image_width - 3)),
*WHITE, *WHITE, *GREEN, *(WHITE * (image_width - 3)),
]
image = image_util.FromRGBPixels(20, 3, pixels, bpp=3)
initial_crop = ca.FixedRectCropAction(0, 0, 2, 2)
action = ca.NonWhiteContentCropAction(initial_crop=initial_crop)
cropped_image = action.CropScreenshot(image, 1, '', '')
expected_image = image_util.FromRGBPixels(1, 1, [*RED], bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
def testMacCrop(self):
"""Tests that some bottom rows are cropped on Mac due to rounded corners."""
image_height = 30
pixels = [*(RED * image_height)]
image = image_util.FromRGBPixels(1, image_height, pixels, bpp=3)
action = ca.NonWhiteContentCropAction()
cropped_image = action.CropScreenshot(image, 1, '', 'mac')
expected_image = image_util.FromRGBPixels(1,
10,
[*(RED * (image_height - 20))],
bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
def testOffWhiteCrop(self):
"""Tests cropping of the first row on devices that produce off-white."""
pixels = [*(RED * 9)]
image = image_util.FromRGBPixels(3, 3, pixels, bpp=3)
action = ca.NonWhiteContentCropAction()
cropped_image = action.CropScreenshot(image, 1, 'SM-A236B', '')
expected_image = image_util.FromRGBPixels(3, 2, [*(RED * 6)], bpp=3)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))
def testCropWithAlpha(self):
"""Tests that cropping works when an alpha channel is provided."""
white = (255, 255, 255, 255)
red = (255, 0, 0, 255)
pixels = [*white, *white, *white, *white,
*white, *red, *red, *white,
*white, *red, *red, *white,
*white, *white, *white, *white]
image = image_util.FromRGBPixels(4, 4, pixels, bpp=4)
action = ca.NonWhiteContentCropAction()
cropped_image = action.CropScreenshot(image, 1, '', '')
expected_image = image_util.FromRGBPixels(2, 2, [*(red * 4)], bpp=4)
self.assertTrue(
image_util.AreEqual(cropped_image,
expected_image,
tolerance=0,
likely_equal=True))