blob: 0babae5d46c5ed9da71020ad26bc221c703eb0e0 [file] [log] [blame]
# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""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
# 20 x 2 green image with a single red pixel in the top left.
# yapf: disable
pixels = [*RED, *(GREEN * (image_width - 1)),
*(GREEN * image_width)]
# yapf: enable
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
# 20 x 3 green image with a single red pixel one column/row away from the
# top left.
# yapf: disable
pixels = [*(GREEN * image_width),
*GREEN, *RED, *(GREEN * (image_width - 2)),
*(GREEN * image_width)]
# yapf: enable
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
# 20 x 1 green image.
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
# 20 x 1 green image.
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
# 20 x 1 green image.
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
# 20 x 5 green image with a group of 4 red pixels towards the top left.
# yapf: disable
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),
]
# yapf: enable
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
# 20 x 5 green image with a group of 4 red pixels towards the top left.
# yapf: disable
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),
]
# yapf: enable
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."""
# 3 x 3 green image.
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."""
# 4 x 4 white image with red pixels in the middle.
# yapf: disable
pixels = [*WHITE, *WHITE, *WHITE, *WHITE,
*WHITE, *RED, *RED, *WHITE,
*WHITE, *RED, *RED, *WHITE,
*WHITE, *WHITE, *WHITE, *WHITE]
# yapf: enable
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."""
# 3 x 3 white image with a red pixel in the middle.
# yapf: disable
pixels = [*WHITE, *WHITE, *WHITE,
*WHITE, *RED, *WHITE,
*WHITE, *WHITE, *WHITE]
# yapf: enable
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
# A 20 x 3 image with one red and one green pixel.
# yapf: disable
pixels = [
*WHITE, *WHITE, *WHITE, *(WHITE * (image_width - 3)),
*WHITE, *RED, *WHITE, *(WHITE * (image_width - 3)),
*WHITE, *WHITE, *GREEN, *(WHITE * (image_width - 3)),
]
# yapf: enable
image = image_util.FromRGBPixels(20, 3, pixels, bpp=3)
# This should crop out the green pixel.
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)
# The same pixel data as testSomeWhiteContent, but with an alpha channel.
# 4 x 4 white image with red pixels in the middle.
# yapf: disable
pixels = [*white, *white, *white, *white,
*white, *red, *red, *white,
*white, *red, *red, *white,
*white, *white, *white, *white]
# yapf: enable
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))