* [PATCH v2 0/5] Create tests for the drm_rect functions
@ 2023-03-27 13:38 Arthur Grillo
2023-03-27 13:38 ` [PATCH v2 1/5] drm/tests: Test drm_rect_intersect() Arthur Grillo
` (4 more replies)
0 siblings, 5 replies; 10+ messages in thread
From: Arthur Grillo @ 2023-03-27 13:38 UTC (permalink / raw)
To: dri-devel
Cc: carlos.craveiro, tales.aparecida, dlatypov, javierm, mairacanal,
maxime, andrealmeid, Arthur Grillo, matheus.vieira.g
This patchset seeks to add unit tests for the rest of the functions on
the drm_rect.c.
The test coverage report generated by the gcov[1] tool states that this
set reaches 100% of coverage on the drm_rect.c file. This would be
very good for future development on the file.
Thanks for reviewing!
Best regards,
~Arthur Grillo
---
v1->v2: https://lore.kernel.org/all/20230322140701.69852-1-arthurgrillo@riseup.net/
- Create parameterized tests for drm_rect_intersect().
- Use .16 binary fixed point values on the drm_rect_calc_hscale() and
drm_rect_calc_vscale() tests.
- Replace INT_MIN for 0 on the on the drm_rect_calc_hscale() and
drm_rect_calc_vscale() tests.
- Assign nonzero values to the width and height parameters of the
drm_rect_rotate() and drm_rect_rotate_inv() tests.
- Switch memcpy to a simple variable assignment on the drm_rect_rotate()
and drm_rect_rotate_inv() tests.
---
[1]: https://gcc.gnu.org/onlinedocs/gcc/Gcov.html#Gcov
---
Arthur Grillo (5):
drm/tests: Test drm_rect_intersect()
drm/tests: Test drm_rect_calc_hscale()
drm/tests: Test drm_rect_calc_vscale()
drm/tests: Test drm_rect_rotate()
drm/test: Test drm_rect_rotate_inv()
drivers/gpu/drm/tests/drm_rect_test.c | 335 ++++++++++++++++++++++++++
1 file changed, 335 insertions(+)
--
2.39.2
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 1/5] drm/tests: Test drm_rect_intersect()
2023-03-27 13:38 [PATCH v2 0/5] Create tests for the drm_rect functions Arthur Grillo
@ 2023-03-27 13:38 ` Arthur Grillo
2023-04-03 15:33 ` Maíra Canal
2023-03-27 13:38 ` [PATCH v2 2/5] drm/tests: Test drm_rect_calc_hscale() Arthur Grillo
` (3 subsequent siblings)
4 siblings, 1 reply; 10+ messages in thread
From: Arthur Grillo @ 2023-03-27 13:38 UTC (permalink / raw)
To: dri-devel
Cc: carlos.craveiro, tales.aparecida, dlatypov, javierm, mairacanal,
maxime, andrealmeid, Arthur Grillo, matheus.vieira.g
Insert test for the drm_rect_intersect() function, it also create a
helper for comparing drm_rects more easily.
Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
---
drivers/gpu/drm/tests/drm_rect_test.c | 139 ++++++++++++++++++++++++++
1 file changed, 139 insertions(+)
diff --git a/drivers/gpu/drm/tests/drm_rect_test.c b/drivers/gpu/drm/tests/drm_rect_test.c
index e9809ea32696..3654c0be3d6b 100644
--- a/drivers/gpu/drm/tests/drm_rect_test.c
+++ b/drivers/gpu/drm/tests/drm_rect_test.c
@@ -9,6 +9,17 @@
#include <drm/drm_rect.h>
+#include <linux/string_helpers.h>
+
+static void drm_rect_compare(struct kunit *test, const struct drm_rect *r,
+ const struct drm_rect *expected)
+{
+ KUNIT_EXPECT_EQ(test, r->x1, expected->x1);
+ KUNIT_EXPECT_EQ(test, r->y1, expected->y1);
+ KUNIT_EXPECT_EQ(test, drm_rect_width(r), drm_rect_width(expected));
+ KUNIT_EXPECT_EQ(test, drm_rect_height(r), drm_rect_height(expected));
+}
+
static void drm_test_rect_clip_scaled_div_by_zero(struct kunit *test)
{
struct drm_rect src, dst, clip;
@@ -196,11 +207,139 @@ static void drm_test_rect_clip_scaled_signed_vs_unsigned(struct kunit *test)
KUNIT_EXPECT_FALSE_MSG(test, drm_rect_visible(&src), "Source should not be visible\n");
}
+struct drm_rect_intersect_case {
+ const char *description;
+ struct drm_rect r1, r2;
+ bool should_be_visible;
+ struct drm_rect expected_intersection;
+};
+
+static const struct drm_rect_intersect_case drm_rect_intersect_cases[] = {
+ {
+ .description = "top-left X bottom-right",
+ .r1 = DRM_RECT_INIT(1, 1, 2, 2),
+ .r2 = DRM_RECT_INIT(0, 0, 2, 2),
+ .should_be_visible = true,
+ .expected_intersection = DRM_RECT_INIT(1, 1, 1, 1),
+ },
+ {
+ .description = "top-right X bottom-left",
+ .r1 = DRM_RECT_INIT(0, 0, 2, 2),
+ .r2 = DRM_RECT_INIT(1, -1, 2, 2),
+ .should_be_visible = true,
+ .expected_intersection = DRM_RECT_INIT(1, 0, 1, 1),
+ },
+ {
+ .description = "bottom-left X top-right",
+ .r1 = DRM_RECT_INIT(1, -1, 2, 2),
+ .r2 = DRM_RECT_INIT(0, 0, 2, 2),
+ .should_be_visible = true,
+ .expected_intersection = DRM_RECT_INIT(1, 0, 1, 1),
+ },
+ {
+ .description = "bottom-right X top-left",
+ .r1 = DRM_RECT_INIT(0, 0, 2, 2),
+ .r2 = DRM_RECT_INIT(1, 1, 2, 2),
+ .should_be_visible = true,
+ .expected_intersection = DRM_RECT_INIT(1, 1, 1, 1),
+ },
+ {
+ .description = "right X left",
+ .r1 = DRM_RECT_INIT(0, 0, 2, 1),
+ .r2 = DRM_RECT_INIT(1, 0, 3, 1),
+ .should_be_visible = true,
+ .expected_intersection = DRM_RECT_INIT(1, 0, 1, 1),
+ },
+ {
+ .description = "left X right",
+ .r1 = DRM_RECT_INIT(1, 0, 3, 1),
+ .r2 = DRM_RECT_INIT(0, 0, 2, 1),
+ .should_be_visible = true,
+ .expected_intersection = DRM_RECT_INIT(1, 0, 1, 1),
+ },
+ {
+ .description = "up X bottom",
+ .r1 = DRM_RECT_INIT(0, 0, 1, 2),
+ .r2 = DRM_RECT_INIT(0, -1, 1, 3),
+ .should_be_visible = true,
+ .expected_intersection = DRM_RECT_INIT(0, 0, 1, 2),
+ },
+ {
+ .description = "bottom X up",
+ .r1 = DRM_RECT_INIT(0, -1, 1, 3),
+ .r2 = DRM_RECT_INIT(0, 0, 1, 2),
+ .should_be_visible = true,
+ .expected_intersection = DRM_RECT_INIT(0, 0, 1, 2),
+ },
+ {
+ .description = "touching corner",
+ .r1 = DRM_RECT_INIT(0, 0, 1, 1),
+ .r2 = DRM_RECT_INIT(1, 1, 2, 2),
+ .should_be_visible = false,
+ .expected_intersection = DRM_RECT_INIT(1, 1, 0, 0),
+ },
+ {
+ .description = "touching side",
+ .r1 = DRM_RECT_INIT(0, 0, 1, 1),
+ .r2 = DRM_RECT_INIT(1, 0, 1, 1),
+ .should_be_visible = false,
+ .expected_intersection = DRM_RECT_INIT(1, 0, 0, 1),
+ },
+ {
+ .description = "equal rects",
+ .r1 = DRM_RECT_INIT(0, 0, 2, 2),
+ .r2 = DRM_RECT_INIT(0, 0, 2, 2),
+ .should_be_visible = true,
+ .expected_intersection = DRM_RECT_INIT(0, 0, 2, 2),
+ },
+ {
+ .description = "inside another",
+ .r1 = DRM_RECT_INIT(0, 0, 2, 2),
+ .r2 = DRM_RECT_INIT(1, 1, 1, 1),
+ .should_be_visible = true,
+ .expected_intersection = DRM_RECT_INIT(1, 1, 1, 1),
+ },
+ {
+ .description = "far away",
+ .r1 = DRM_RECT_INIT(0, 0, 1, 1),
+ .r2 = DRM_RECT_INIT(3, 6, 1, 1),
+ .should_be_visible = false,
+ .expected_intersection = DRM_RECT_INIT(3, 6, -2, -5),
+ },
+};
+
+static void drm_rect_intersect_case_desc(const struct drm_rect_intersect_case *t, char *desc)
+{
+ if (!t->description)
+ snprintf(desc, KUNIT_PARAM_DESC_SIZE,
+ DRM_RECT_FMT " X " DRM_RECT_FMT,
+ DRM_RECT_ARG(&t->r1), DRM_RECT_ARG(&t->r2));
+ else
+ snprintf(desc, KUNIT_PARAM_DESC_SIZE,
+ "%s: " DRM_RECT_FMT " X " DRM_RECT_FMT,
+ t->description, DRM_RECT_ARG(&t->r1), DRM_RECT_ARG(&t->r2));
+}
+
+KUNIT_ARRAY_PARAM(drm_rect_intersect, drm_rect_intersect_cases, drm_rect_intersect_case_desc);
+
+static void drm_test_rect_intersect(struct kunit *test)
+{
+ const struct drm_rect_intersect_case *params = test->param_value;
+ struct drm_rect r1_aux = params->r1;
+ bool visible;
+
+ visible = drm_rect_intersect(&r1_aux, ¶ms->r2);
+
+ KUNIT_EXPECT_EQ(test, visible, params->should_be_visible);
+ drm_rect_compare(test, &r1_aux, ¶ms->expected_intersection);
+}
+
static struct kunit_case drm_rect_tests[] = {
KUNIT_CASE(drm_test_rect_clip_scaled_div_by_zero),
KUNIT_CASE(drm_test_rect_clip_scaled_not_clipped),
KUNIT_CASE(drm_test_rect_clip_scaled_clipped),
KUNIT_CASE(drm_test_rect_clip_scaled_signed_vs_unsigned),
+ KUNIT_CASE_PARAM(drm_test_rect_intersect, drm_rect_intersect_gen_params),
{ }
};
--
2.39.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 2/5] drm/tests: Test drm_rect_calc_hscale()
2023-03-27 13:38 [PATCH v2 0/5] Create tests for the drm_rect functions Arthur Grillo
2023-03-27 13:38 ` [PATCH v2 1/5] drm/tests: Test drm_rect_intersect() Arthur Grillo
@ 2023-03-27 13:38 ` Arthur Grillo
2023-04-03 15:42 ` Maíra Canal
2023-03-27 13:38 ` [PATCH v2 3/5] drm/tests: Test drm_rect_calc_vscale() Arthur Grillo
` (2 subsequent siblings)
4 siblings, 1 reply; 10+ messages in thread
From: Arthur Grillo @ 2023-03-27 13:38 UTC (permalink / raw)
To: dri-devel
Cc: carlos.craveiro, tales.aparecida, dlatypov, javierm, mairacanal,
maxime, andrealmeid, Arthur Grillo, matheus.vieira.g
Insert test for the drm_rect_hscale() function, besides the test
for the usual case it also test for the exceptions.
Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
---
drivers/gpu/drm/tests/drm_rect_test.c | 57 +++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/drivers/gpu/drm/tests/drm_rect_test.c b/drivers/gpu/drm/tests/drm_rect_test.c
index 3654c0be3d6b..c282e1cf9c30 100644
--- a/drivers/gpu/drm/tests/drm_rect_test.c
+++ b/drivers/gpu/drm/tests/drm_rect_test.c
@@ -10,6 +10,7 @@
#include <drm/drm_rect.h>
#include <linux/string_helpers.h>
+#include <linux/errno.h>
static void drm_rect_compare(struct kunit *test, const struct drm_rect *r,
const struct drm_rect *expected)
@@ -334,12 +335,68 @@ static void drm_test_rect_intersect(struct kunit *test)
drm_rect_compare(test, &r1_aux, ¶ms->expected_intersection);
}
+static void drm_test_rect_calc_hscale(struct kunit *test)
+{
+ struct drm_rect src, dst;
+ int scaling_factor;
+
+ drm_rect_init(&src, 0, 0, 2 << 16, 0);
+ drm_rect_init(&dst, 0, 0, 1 << 16, 0);
+
+ scaling_factor = drm_rect_calc_hscale(&src, &dst, 0, INT_MAX);
+
+ KUNIT_EXPECT_EQ(test, scaling_factor, 2);
+}
+
+static void drm_test_rect_calc_hscale_out_of_range(struct kunit *test)
+{
+ struct drm_rect src, dst;
+ int scaling_factor;
+
+ drm_rect_init(&src, 0, 0, 10 << 16, 0);
+ drm_rect_init(&dst, 0, 0, 1 << 16, 0);
+
+ scaling_factor = drm_rect_calc_hscale(&src, &dst, 3, 5);
+
+ KUNIT_EXPECT_EQ(test, scaling_factor, -ERANGE);
+
+ drm_rect_init(&src, 0, 0, 2 << 16, 0);
+ drm_rect_init(&dst, 0, 0, 1 << 16, 0);
+
+ scaling_factor = drm_rect_calc_hscale(&src, &dst, 3, 5);
+
+ KUNIT_EXPECT_EQ(test, scaling_factor, -ERANGE);
+}
+
+static void drm_test_rect_calc_hscale_negative_args(struct kunit *test)
+{
+ struct drm_rect src, dst;
+ int scaling_factor;
+
+ drm_rect_init(&src, 0, 0, -1 << 16, 0);
+ drm_rect_init(&dst, 0, 0, 1 << 16, 0);
+
+ scaling_factor = drm_rect_calc_hscale(&src, &dst, 0, INT_MAX);
+
+ KUNIT_EXPECT_EQ(test, scaling_factor, -EINVAL);
+
+ drm_rect_init(&src, 0, 0, 1 << 16, 0);
+ drm_rect_init(&dst, 0, 0, -1 << 16, 0);
+
+ scaling_factor = drm_rect_calc_hscale(&src, &dst, 0, INT_MAX);
+
+ KUNIT_EXPECT_EQ(test, scaling_factor, -EINVAL);
+}
+
static struct kunit_case drm_rect_tests[] = {
KUNIT_CASE(drm_test_rect_clip_scaled_div_by_zero),
KUNIT_CASE(drm_test_rect_clip_scaled_not_clipped),
KUNIT_CASE(drm_test_rect_clip_scaled_clipped),
KUNIT_CASE(drm_test_rect_clip_scaled_signed_vs_unsigned),
KUNIT_CASE_PARAM(drm_test_rect_intersect, drm_rect_intersect_gen_params),
+ KUNIT_CASE(drm_test_rect_calc_hscale),
+ KUNIT_CASE(drm_test_rect_calc_hscale_out_of_range),
+ KUNIT_CASE(drm_test_rect_calc_hscale_negative_args),
{ }
};
--
2.39.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 3/5] drm/tests: Test drm_rect_calc_vscale()
2023-03-27 13:38 [PATCH v2 0/5] Create tests for the drm_rect functions Arthur Grillo
2023-03-27 13:38 ` [PATCH v2 1/5] drm/tests: Test drm_rect_intersect() Arthur Grillo
2023-03-27 13:38 ` [PATCH v2 2/5] drm/tests: Test drm_rect_calc_hscale() Arthur Grillo
@ 2023-03-27 13:38 ` Arthur Grillo
2023-04-03 15:47 ` Maíra Canal
2023-03-27 13:38 ` [PATCH v2 4/5] drm/tests: Test drm_rect_rotate() Arthur Grillo
2023-03-27 13:38 ` [PATCH v2 5/5] drm/test: Test drm_rect_rotate_inv() Arthur Grillo
4 siblings, 1 reply; 10+ messages in thread
From: Arthur Grillo @ 2023-03-27 13:38 UTC (permalink / raw)
To: dri-devel
Cc: carlos.craveiro, tales.aparecida, dlatypov, javierm, mairacanal,
maxime, andrealmeid, Arthur Grillo, matheus.vieira.g
Insert test for the drm_rect_vscale() function, besides the test
for the usual case it also test for the exceptions.
Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
---
drivers/gpu/drm/tests/drm_rect_test.c | 56 +++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/drivers/gpu/drm/tests/drm_rect_test.c b/drivers/gpu/drm/tests/drm_rect_test.c
index c282e1cf9c30..a14da86ef435 100644
--- a/drivers/gpu/drm/tests/drm_rect_test.c
+++ b/drivers/gpu/drm/tests/drm_rect_test.c
@@ -388,6 +388,59 @@ static void drm_test_rect_calc_hscale_negative_args(struct kunit *test)
KUNIT_EXPECT_EQ(test, scaling_factor, -EINVAL);
}
+static void drm_test_rect_calc_vscale(struct kunit *test)
+{
+ struct drm_rect src, dst;
+ int scaling_factor;
+
+ drm_rect_init(&src, 0, 0, 0, 2 << 16);
+ drm_rect_init(&dst, 0, 0, 0, 1 << 16);
+
+ scaling_factor = drm_rect_calc_vscale(&src, &dst, 0, INT_MAX);
+
+ KUNIT_EXPECT_EQ(test, scaling_factor, 2);
+}
+
+static void drm_test_rect_calc_vscale_out_of_range(struct kunit *test)
+{
+ struct drm_rect src, dst;
+ int scaling_factor;
+
+ drm_rect_init(&src, 0, 0, 0, 10 << 16);
+ drm_rect_init(&dst, 0, 0, 0, 1 << 16);
+
+ scaling_factor = drm_rect_calc_vscale(&src, &dst, 3, 5);
+
+ KUNIT_EXPECT_EQ(test, scaling_factor, -ERANGE);
+
+ drm_rect_init(&src, 0, 0, 0, 2 << 16);
+ drm_rect_init(&dst, 0, 0, 0, 1 << 16);
+
+ scaling_factor = drm_rect_calc_vscale(&src, &dst, 3, 5);
+
+ KUNIT_EXPECT_EQ(test, scaling_factor, -ERANGE);
+}
+
+static void drm_test_rect_calc_vscale_negative_args(struct kunit *test)
+{
+ struct drm_rect src, dst;
+ int scaling_factor;
+
+ drm_rect_init(&src, 0, 0, 0, -1 << 16);
+ drm_rect_init(&dst, 0, 0, 0, 1 << 16);
+
+ scaling_factor = drm_rect_calc_vscale(&src, &dst, 0, INT_MAX);
+
+ KUNIT_EXPECT_EQ(test, scaling_factor, -EINVAL);
+
+ drm_rect_init(&src, 0, 0, 0, 1 << 16);
+ drm_rect_init(&dst, 0, 0, 0, -1 << 16);
+
+ scaling_factor = drm_rect_calc_vscale(&src, &dst, 0, INT_MAX);
+
+ KUNIT_EXPECT_EQ(test, scaling_factor, -EINVAL);
+}
+
static struct kunit_case drm_rect_tests[] = {
KUNIT_CASE(drm_test_rect_clip_scaled_div_by_zero),
KUNIT_CASE(drm_test_rect_clip_scaled_not_clipped),
@@ -397,6 +450,9 @@ static struct kunit_case drm_rect_tests[] = {
KUNIT_CASE(drm_test_rect_calc_hscale),
KUNIT_CASE(drm_test_rect_calc_hscale_out_of_range),
KUNIT_CASE(drm_test_rect_calc_hscale_negative_args),
+ KUNIT_CASE(drm_test_rect_calc_vscale),
+ KUNIT_CASE(drm_test_rect_calc_vscale_out_of_range),
+ KUNIT_CASE(drm_test_rect_calc_vscale_negative_args),
{ }
};
--
2.39.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 4/5] drm/tests: Test drm_rect_rotate()
2023-03-27 13:38 [PATCH v2 0/5] Create tests for the drm_rect functions Arthur Grillo
` (2 preceding siblings ...)
2023-03-27 13:38 ` [PATCH v2 3/5] drm/tests: Test drm_rect_calc_vscale() Arthur Grillo
@ 2023-03-27 13:38 ` Arthur Grillo
2023-03-27 13:38 ` [PATCH v2 5/5] drm/test: Test drm_rect_rotate_inv() Arthur Grillo
4 siblings, 0 replies; 10+ messages in thread
From: Arthur Grillo @ 2023-03-27 13:38 UTC (permalink / raw)
To: dri-devel
Cc: carlos.craveiro, tales.aparecida, dlatypov, javierm, mairacanal,
maxime, andrealmeid, Arthur Grillo, matheus.vieira.g
Insert test for the drm_rect_rotate() function, create test cases
for all the rotation modes.
Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
---
drivers/gpu/drm/tests/drm_rect_test.c | 72 +++++++++++++++++++++++++++
1 file changed, 72 insertions(+)
diff --git a/drivers/gpu/drm/tests/drm_rect_test.c b/drivers/gpu/drm/tests/drm_rect_test.c
index a14da86ef435..bb3fff09cb7b 100644
--- a/drivers/gpu/drm/tests/drm_rect_test.c
+++ b/drivers/gpu/drm/tests/drm_rect_test.c
@@ -8,6 +8,7 @@
#include <kunit/test.h>
#include <drm/drm_rect.h>
+#include <drm/drm_mode.h>
#include <linux/string_helpers.h>
#include <linux/errno.h>
@@ -441,6 +442,76 @@ static void drm_test_rect_calc_vscale_negative_args(struct kunit *test)
KUNIT_EXPECT_EQ(test, scaling_factor, -EINVAL);
}
+struct drm_rect_rotate_case {
+ const char *name;
+ unsigned int rotation;
+ struct drm_rect rect;
+ int width, height;
+ struct drm_rect expected;
+};
+
+static const struct drm_rect_rotate_case drm_rect_rotate_cases[] = {
+ {
+ .name = "reflect x",
+ .rotation = DRM_MODE_REFLECT_X,
+ .rect = DRM_RECT_INIT(0, 0, 5, 5),
+ .width = 5, .height = 10,
+ .expected = DRM_RECT_INIT(0, 0, 5, 5),
+ },
+ {
+ .name = "reflect y",
+ .rotation = DRM_MODE_REFLECT_Y,
+ .rect = DRM_RECT_INIT(0, 0, 5, 5),
+ .width = 5, .height = 10,
+ .expected = DRM_RECT_INIT(0, 5, 5, 5),
+ },
+ {
+ .name = "rotate 0",
+ .rotation = DRM_MODE_ROTATE_0,
+ .rect = DRM_RECT_INIT(0, 0, 5, 5),
+ .width = 5, .height = 10,
+ .expected = DRM_RECT_INIT(0, 0, 5, 5),
+ },
+ {
+ .name = "rotate 90",
+ .rotation = DRM_MODE_ROTATE_90,
+ .rect = DRM_RECT_INIT(0, 0, 5, 10),
+ .width = 5, .height = 10,
+ .expected = DRM_RECT_INIT(0, 0, 10, 5),
+ },
+ {
+ .name = "rotate 180",
+ .rotation = DRM_MODE_ROTATE_180,
+ .rect = DRM_RECT_INIT(0, 0, 5, 10),
+ .width = 5, .height = 10,
+ .expected = DRM_RECT_INIT(0, 0, 5, 10),
+ },
+ {
+ .name = "rotate 270",
+ .rotation = DRM_MODE_ROTATE_270,
+ .rect = DRM_RECT_INIT(0, 0, 5, 10),
+ .width = 5, .height = 10,
+ .expected = DRM_RECT_INIT(0, 0, 10, 5),
+ },
+};
+
+static void drm_rect_case_desc(const struct drm_rect_rotate_case *t, char *desc)
+{
+ strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
+}
+
+KUNIT_ARRAY_PARAM(drm_rect_rotate, drm_rect_rotate_cases, drm_rect_case_desc);
+
+static void drm_test_rect_rotate(struct kunit *test)
+{
+ const struct drm_rect_rotate_case *params = test->param_value;
+ struct drm_rect r = params->rect;
+
+ drm_rect_rotate(&r, params->width, params->height, params->rotation);
+
+ drm_rect_compare(test, &r, ¶ms->expected);
+}
+
static struct kunit_case drm_rect_tests[] = {
KUNIT_CASE(drm_test_rect_clip_scaled_div_by_zero),
KUNIT_CASE(drm_test_rect_clip_scaled_not_clipped),
@@ -453,6 +524,7 @@ static struct kunit_case drm_rect_tests[] = {
KUNIT_CASE(drm_test_rect_calc_vscale),
KUNIT_CASE(drm_test_rect_calc_vscale_out_of_range),
KUNIT_CASE(drm_test_rect_calc_vscale_negative_args),
+ KUNIT_CASE_PARAM(drm_test_rect_rotate, drm_rect_rotate_gen_params),
{ }
};
--
2.39.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 5/5] drm/test: Test drm_rect_rotate_inv()
2023-03-27 13:38 [PATCH v2 0/5] Create tests for the drm_rect functions Arthur Grillo
` (3 preceding siblings ...)
2023-03-27 13:38 ` [PATCH v2 4/5] drm/tests: Test drm_rect_rotate() Arthur Grillo
@ 2023-03-27 13:38 ` Arthur Grillo
4 siblings, 0 replies; 10+ messages in thread
From: Arthur Grillo @ 2023-03-27 13:38 UTC (permalink / raw)
To: dri-devel
Cc: carlos.craveiro, tales.aparecida, dlatypov, javierm, mairacanal,
maxime, andrealmeid, Arthur Grillo, matheus.vieira.g
Insert test for the drm_rect_rotate_inv() function, by expanding the
existing test framework for the drm_rect_rotate().
Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
---
drivers/gpu/drm/tests/drm_rect_test.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/gpu/drm/tests/drm_rect_test.c b/drivers/gpu/drm/tests/drm_rect_test.c
index bb3fff09cb7b..f3805a8512de 100644
--- a/drivers/gpu/drm/tests/drm_rect_test.c
+++ b/drivers/gpu/drm/tests/drm_rect_test.c
@@ -512,6 +512,16 @@ static void drm_test_rect_rotate(struct kunit *test)
drm_rect_compare(test, &r, ¶ms->expected);
}
+static void drm_test_rect_rotate_inv(struct kunit *test)
+{
+ const struct drm_rect_rotate_case *params = test->param_value;
+ struct drm_rect r = params->expected;
+
+ drm_rect_rotate_inv(&r, params->width, params->height, params->rotation);
+
+ drm_rect_compare(test, &r, ¶ms->rect);
+}
+
static struct kunit_case drm_rect_tests[] = {
KUNIT_CASE(drm_test_rect_clip_scaled_div_by_zero),
KUNIT_CASE(drm_test_rect_clip_scaled_not_clipped),
@@ -525,6 +535,7 @@ static struct kunit_case drm_rect_tests[] = {
KUNIT_CASE(drm_test_rect_calc_vscale_out_of_range),
KUNIT_CASE(drm_test_rect_calc_vscale_negative_args),
KUNIT_CASE_PARAM(drm_test_rect_rotate, drm_rect_rotate_gen_params),
+ KUNIT_CASE_PARAM(drm_test_rect_rotate_inv, drm_rect_rotate_gen_params),
{ }
};
--
2.39.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v2 1/5] drm/tests: Test drm_rect_intersect()
2023-03-27 13:38 ` [PATCH v2 1/5] drm/tests: Test drm_rect_intersect() Arthur Grillo
@ 2023-04-03 15:33 ` Maíra Canal
2023-04-03 18:06 ` Arthur Grillo Queiroz Cabral
0 siblings, 1 reply; 10+ messages in thread
From: Maíra Canal @ 2023-04-03 15:33 UTC (permalink / raw)
To: Arthur Grillo, dri-devel
Cc: carlos.craveiro, tales.aparecida, dlatypov, javierm, maxime,
andrealmeid, matheus.vieira.g
Hi Arthur,
On 3/27/23 10:38, Arthur Grillo wrote:
> Insert test for the drm_rect_intersect() function, it also create a
> helper for comparing drm_rects more easily.
>
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---
> drivers/gpu/drm/tests/drm_rect_test.c | 139 ++++++++++++++++++++++++++
> 1 file changed, 139 insertions(+)
>
> diff --git a/drivers/gpu/drm/tests/drm_rect_test.c b/drivers/gpu/drm/tests/drm_rect_test.c
> index e9809ea32696..3654c0be3d6b 100644
> --- a/drivers/gpu/drm/tests/drm_rect_test.c
> +++ b/drivers/gpu/drm/tests/drm_rect_test.c
> @@ -9,6 +9,17 @@
>
> #include <drm/drm_rect.h>
>
> +#include <linux/string_helpers.h>
Is this include really needed? I was able to compile without it.
> +
> +static void drm_rect_compare(struct kunit *test, const struct drm_rect *r,
> + const struct drm_rect *expected)
> +{
> + KUNIT_EXPECT_EQ(test, r->x1, expected->x1);
Maybe it would be nice to have a message here that shows the current x1
and the expected x1. Same for the other dimensions.
> + KUNIT_EXPECT_EQ(test, r->y1, expected->y1);
> + KUNIT_EXPECT_EQ(test, drm_rect_width(r), drm_rect_width(expected));
> + KUNIT_EXPECT_EQ(test, drm_rect_height(r), drm_rect_height(expected));
> +}
> +
> static void drm_test_rect_clip_scaled_div_by_zero(struct kunit *test)
> {
> struct drm_rect src, dst, clip;
> @@ -196,11 +207,139 @@ static void drm_test_rect_clip_scaled_signed_vs_unsigned(struct kunit *test)
> KUNIT_EXPECT_FALSE_MSG(test, drm_rect_visible(&src), "Source should not be visible\n");
> }
>
> +struct drm_rect_intersect_case {
> + const char *description;
> + struct drm_rect r1, r2;
> + bool should_be_visible;
> + struct drm_rect expected_intersection;
> +};
> +
> +static const struct drm_rect_intersect_case drm_rect_intersect_cases[] = {
> + {
> + .description = "top-left X bottom-right",
> + .r1 = DRM_RECT_INIT(1, 1, 2, 2),
> + .r2 = DRM_RECT_INIT(0, 0, 2, 2),
> + .should_be_visible = true,
> + .expected_intersection = DRM_RECT_INIT(1, 1, 1, 1),
> + },
> + {
> + .description = "top-right X bottom-left",
> + .r1 = DRM_RECT_INIT(0, 0, 2, 2),
> + .r2 = DRM_RECT_INIT(1, -1, 2, 2),
> + .should_be_visible = true,
> + .expected_intersection = DRM_RECT_INIT(1, 0, 1, 1),
> + },
> + {
> + .description = "bottom-left X top-right",
> + .r1 = DRM_RECT_INIT(1, -1, 2, 2),
> + .r2 = DRM_RECT_INIT(0, 0, 2, 2),
> + .should_be_visible = true,
> + .expected_intersection = DRM_RECT_INIT(1, 0, 1, 1),
> + },
> + {
> + .description = "bottom-right X top-left",
> + .r1 = DRM_RECT_INIT(0, 0, 2, 2),
> + .r2 = DRM_RECT_INIT(1, 1, 2, 2),
> + .should_be_visible = true,
> + .expected_intersection = DRM_RECT_INIT(1, 1, 1, 1),
> + },
> + {
> + .description = "right X left",
> + .r1 = DRM_RECT_INIT(0, 0, 2, 1),
> + .r2 = DRM_RECT_INIT(1, 0, 3, 1),
> + .should_be_visible = true,
> + .expected_intersection = DRM_RECT_INIT(1, 0, 1, 1),
> + },
> + {
> + .description = "left X right",
> + .r1 = DRM_RECT_INIT(1, 0, 3, 1),
> + .r2 = DRM_RECT_INIT(0, 0, 2, 1),
> + .should_be_visible = true,
> + .expected_intersection = DRM_RECT_INIT(1, 0, 1, 1),
> + },
> + {
> + .description = "up X bottom",
> + .r1 = DRM_RECT_INIT(0, 0, 1, 2),
> + .r2 = DRM_RECT_INIT(0, -1, 1, 3),
> + .should_be_visible = true,
> + .expected_intersection = DRM_RECT_INIT(0, 0, 1, 2),
> + },
> + {
> + .description = "bottom X up",
> + .r1 = DRM_RECT_INIT(0, -1, 1, 3),
> + .r2 = DRM_RECT_INIT(0, 0, 1, 2),
> + .should_be_visible = true,
> + .expected_intersection = DRM_RECT_INIT(0, 0, 1, 2),
> + },
> + {
> + .description = "touching corner",
> + .r1 = DRM_RECT_INIT(0, 0, 1, 1),
> + .r2 = DRM_RECT_INIT(1, 1, 2, 2),
> + .should_be_visible = false,
> + .expected_intersection = DRM_RECT_INIT(1, 1, 0, 0),
> + },
> + {
> + .description = "touching side",
> + .r1 = DRM_RECT_INIT(0, 0, 1, 1),
> + .r2 = DRM_RECT_INIT(1, 0, 1, 1),
> + .should_be_visible = false,
> + .expected_intersection = DRM_RECT_INIT(1, 0, 0, 1),
> + },
> + {
> + .description = "equal rects",
> + .r1 = DRM_RECT_INIT(0, 0, 2, 2),
> + .r2 = DRM_RECT_INIT(0, 0, 2, 2),
> + .should_be_visible = true,
> + .expected_intersection = DRM_RECT_INIT(0, 0, 2, 2),
> + },
> + {
> + .description = "inside another",
> + .r1 = DRM_RECT_INIT(0, 0, 2, 2),
> + .r2 = DRM_RECT_INIT(1, 1, 1, 1),
> + .should_be_visible = true,
> + .expected_intersection = DRM_RECT_INIT(1, 1, 1, 1),
> + },
> + {
> + .description = "far away",
> + .r1 = DRM_RECT_INIT(0, 0, 1, 1),
> + .r2 = DRM_RECT_INIT(3, 6, 1, 1),
> + .should_be_visible = false,
> + .expected_intersection = DRM_RECT_INIT(3, 6, -2, -5),
> + },
> +};
What happens if width = height = 0? It would be nice to have a test
case for this scenario.
> +
> +static void drm_rect_intersect_case_desc(const struct drm_rect_intersect_case *t, char *desc)
> +{
> + if (!t->description)
> + snprintf(desc, KUNIT_PARAM_DESC_SIZE,
> + DRM_RECT_FMT " X " DRM_RECT_FMT,
> + DRM_RECT_ARG(&t->r1), DRM_RECT_ARG(&t->r2));
Is this conditional clause really needed? All parameters have
description.
> + else
> + snprintf(desc, KUNIT_PARAM_DESC_SIZE,
> + "%s: " DRM_RECT_FMT " X " DRM_RECT_FMT,
> + t->description, DRM_RECT_ARG(&t->r1), DRM_RECT_ARG(&t->r2));
> +}
> +
> +KUNIT_ARRAY_PARAM(drm_rect_intersect, drm_rect_intersect_cases, drm_rect_intersect_case_desc);
> +
> +static void drm_test_rect_intersect(struct kunit *test)
> +{
> + const struct drm_rect_intersect_case *params = test->param_value;
> + struct drm_rect r1_aux = params->r1;
Does this variable needs to exist? I guess you could just use params->r1.
Best Regards,
- Maíra Canal
> + bool visible;
> +
> + visible = drm_rect_intersect(&r1_aux, ¶ms->r2);
> +
> + KUNIT_EXPECT_EQ(test, visible, params->should_be_visible);
> + drm_rect_compare(test, &r1_aux, ¶ms->expected_intersection);
> +}
> +
> static struct kunit_case drm_rect_tests[] = {
> KUNIT_CASE(drm_test_rect_clip_scaled_div_by_zero),
> KUNIT_CASE(drm_test_rect_clip_scaled_not_clipped),
> KUNIT_CASE(drm_test_rect_clip_scaled_clipped),
> KUNIT_CASE(drm_test_rect_clip_scaled_signed_vs_unsigned),
> + KUNIT_CASE_PARAM(drm_test_rect_intersect, drm_rect_intersect_gen_params),
> { }
> };
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/5] drm/tests: Test drm_rect_calc_hscale()
2023-03-27 13:38 ` [PATCH v2 2/5] drm/tests: Test drm_rect_calc_hscale() Arthur Grillo
@ 2023-04-03 15:42 ` Maíra Canal
0 siblings, 0 replies; 10+ messages in thread
From: Maíra Canal @ 2023-04-03 15:42 UTC (permalink / raw)
To: Arthur Grillo, dri-devel
Cc: carlos.craveiro, tales.aparecida, dlatypov, javierm, maxime,
andrealmeid, matheus.vieira.g
Hi Arthur,
On 3/27/23 10:38, Arthur Grillo wrote:
> Insert test for the drm_rect_hscale() function, besides the test
> for the usual case it also test for the exceptions.
>
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---
> drivers/gpu/drm/tests/drm_rect_test.c | 57 +++++++++++++++++++++++++++
> 1 file changed, 57 insertions(+)
>
> diff --git a/drivers/gpu/drm/tests/drm_rect_test.c b/drivers/gpu/drm/tests/drm_rect_test.c
> index 3654c0be3d6b..c282e1cf9c30 100644
> --- a/drivers/gpu/drm/tests/drm_rect_test.c
> +++ b/drivers/gpu/drm/tests/drm_rect_test.c
> @@ -10,6 +10,7 @@
> #include <drm/drm_rect.h>
>
> #include <linux/string_helpers.h>
> +#include <linux/errno.h>
>
> static void drm_rect_compare(struct kunit *test, const struct drm_rect *r,
> const struct drm_rect *expected)
> @@ -334,12 +335,68 @@ static void drm_test_rect_intersect(struct kunit *test)
> drm_rect_compare(test, &r1_aux, ¶ms->expected_intersection);
> }
>
> +static void drm_test_rect_calc_hscale(struct kunit *test)
> +{
> + struct drm_rect src, dst;
> + int scaling_factor;
> +
> + drm_rect_init(&src, 0, 0, 2 << 16, 0);
> + drm_rect_init(&dst, 0, 0, 1 << 16, 0);
What about the case that dst_w == 0?
Best Regards,
- Maíra Canal
> +
> + scaling_factor = drm_rect_calc_hscale(&src, &dst, 0, INT_MAX);
> +
> + KUNIT_EXPECT_EQ(test, scaling_factor, 2);
> +}
> +
> +static void drm_test_rect_calc_hscale_out_of_range(struct kunit *test)
> +{
> + struct drm_rect src, dst;
> + int scaling_factor;
> +
> + drm_rect_init(&src, 0, 0, 10 << 16, 0);
> + drm_rect_init(&dst, 0, 0, 1 << 16, 0);
> +
> + scaling_factor = drm_rect_calc_hscale(&src, &dst, 3, 5);
> +
> + KUNIT_EXPECT_EQ(test, scaling_factor, -ERANGE);
> +
> + drm_rect_init(&src, 0, 0, 2 << 16, 0);
> + drm_rect_init(&dst, 0, 0, 1 << 16, 0);
> +
> + scaling_factor = drm_rect_calc_hscale(&src, &dst, 3, 5);
> +
> + KUNIT_EXPECT_EQ(test, scaling_factor, -ERANGE);
> +}
> +
> +static void drm_test_rect_calc_hscale_negative_args(struct kunit *test)
> +{
> + struct drm_rect src, dst;
> + int scaling_factor;
> +
> + drm_rect_init(&src, 0, 0, -1 << 16, 0);
> + drm_rect_init(&dst, 0, 0, 1 << 16, 0);
> +
> + scaling_factor = drm_rect_calc_hscale(&src, &dst, 0, INT_MAX);
> +
> + KUNIT_EXPECT_EQ(test, scaling_factor, -EINVAL);
> +
> + drm_rect_init(&src, 0, 0, 1 << 16, 0);
> + drm_rect_init(&dst, 0, 0, -1 << 16, 0);
> +
> + scaling_factor = drm_rect_calc_hscale(&src, &dst, 0, INT_MAX);
> +
> + KUNIT_EXPECT_EQ(test, scaling_factor, -EINVAL);
> +}
> +
> static struct kunit_case drm_rect_tests[] = {
> KUNIT_CASE(drm_test_rect_clip_scaled_div_by_zero),
> KUNIT_CASE(drm_test_rect_clip_scaled_not_clipped),
> KUNIT_CASE(drm_test_rect_clip_scaled_clipped),
> KUNIT_CASE(drm_test_rect_clip_scaled_signed_vs_unsigned),
> KUNIT_CASE_PARAM(drm_test_rect_intersect, drm_rect_intersect_gen_params),
> + KUNIT_CASE(drm_test_rect_calc_hscale),
> + KUNIT_CASE(drm_test_rect_calc_hscale_out_of_range),
> + KUNIT_CASE(drm_test_rect_calc_hscale_negative_args),
> { }
> };
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 3/5] drm/tests: Test drm_rect_calc_vscale()
2023-03-27 13:38 ` [PATCH v2 3/5] drm/tests: Test drm_rect_calc_vscale() Arthur Grillo
@ 2023-04-03 15:47 ` Maíra Canal
0 siblings, 0 replies; 10+ messages in thread
From: Maíra Canal @ 2023-04-03 15:47 UTC (permalink / raw)
To: Arthur Grillo, dri-devel
Cc: carlos.craveiro, tales.aparecida, dlatypov, javierm, maxime,
andrealmeid, matheus.vieira.g
Hi Arthur,
On 3/27/23 10:38, Arthur Grillo wrote:
> Insert test for the drm_rect_vscale() function, besides the test
> for the usual case it also test for the exceptions.
>
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---
> drivers/gpu/drm/tests/drm_rect_test.c | 56 +++++++++++++++++++++++++++
> 1 file changed, 56 insertions(+)
>
> diff --git a/drivers/gpu/drm/tests/drm_rect_test.c b/drivers/gpu/drm/tests/drm_rect_test.c
> index c282e1cf9c30..a14da86ef435 100644
> --- a/drivers/gpu/drm/tests/drm_rect_test.c
> +++ b/drivers/gpu/drm/tests/drm_rect_test.c
> @@ -388,6 +388,59 @@ static void drm_test_rect_calc_hscale_negative_args(struct kunit *test)
> KUNIT_EXPECT_EQ(test, scaling_factor, -EINVAL);
> }
>
> +static void drm_test_rect_calc_vscale(struct kunit *test)
> +{
> + struct drm_rect src, dst;
> + int scaling_factor;
> +
> + drm_rect_init(&src, 0, 0, 0, 2 << 16);
> + drm_rect_init(&dst, 0, 0, 0, 1 << 16);
> +
What about the case that dst_h == 0?
Best Regards,
- Maíra Canal
> + scaling_factor = drm_rect_calc_vscale(&src, &dst, 0, INT_MAX);
> +
> + KUNIT_EXPECT_EQ(test, scaling_factor, 2);
> +}
> +
> +static void drm_test_rect_calc_vscale_out_of_range(struct kunit *test)
> +{
> + struct drm_rect src, dst;
> + int scaling_factor;
> +
> + drm_rect_init(&src, 0, 0, 0, 10 << 16);
> + drm_rect_init(&dst, 0, 0, 0, 1 << 16);
> +
> + scaling_factor = drm_rect_calc_vscale(&src, &dst, 3, 5);
> +
> + KUNIT_EXPECT_EQ(test, scaling_factor, -ERANGE);
> +
> + drm_rect_init(&src, 0, 0, 0, 2 << 16);
> + drm_rect_init(&dst, 0, 0, 0, 1 << 16);
> +
> + scaling_factor = drm_rect_calc_vscale(&src, &dst, 3, 5);
> +
> + KUNIT_EXPECT_EQ(test, scaling_factor, -ERANGE);
> +}
> +
> +static void drm_test_rect_calc_vscale_negative_args(struct kunit *test)
> +{
> + struct drm_rect src, dst;
> + int scaling_factor;
> +
> + drm_rect_init(&src, 0, 0, 0, -1 << 16);
> + drm_rect_init(&dst, 0, 0, 0, 1 << 16);
> +
> + scaling_factor = drm_rect_calc_vscale(&src, &dst, 0, INT_MAX);
> +
> + KUNIT_EXPECT_EQ(test, scaling_factor, -EINVAL);
> +
> + drm_rect_init(&src, 0, 0, 0, 1 << 16);
> + drm_rect_init(&dst, 0, 0, 0, -1 << 16);
> +
> + scaling_factor = drm_rect_calc_vscale(&src, &dst, 0, INT_MAX);
> +
> + KUNIT_EXPECT_EQ(test, scaling_factor, -EINVAL);
> +}
> +
> static struct kunit_case drm_rect_tests[] = {
> KUNIT_CASE(drm_test_rect_clip_scaled_div_by_zero),
> KUNIT_CASE(drm_test_rect_clip_scaled_not_clipped),
> @@ -397,6 +450,9 @@ static struct kunit_case drm_rect_tests[] = {
> KUNIT_CASE(drm_test_rect_calc_hscale),
> KUNIT_CASE(drm_test_rect_calc_hscale_out_of_range),
> KUNIT_CASE(drm_test_rect_calc_hscale_negative_args),
> + KUNIT_CASE(drm_test_rect_calc_vscale),
> + KUNIT_CASE(drm_test_rect_calc_vscale_out_of_range),
> + KUNIT_CASE(drm_test_rect_calc_vscale_negative_args),
> { }
> };
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 1/5] drm/tests: Test drm_rect_intersect()
2023-04-03 15:33 ` Maíra Canal
@ 2023-04-03 18:06 ` Arthur Grillo Queiroz Cabral
0 siblings, 0 replies; 10+ messages in thread
From: Arthur Grillo Queiroz Cabral @ 2023-04-03 18:06 UTC (permalink / raw)
To: Maíra Canal, dri-devel
Cc: carlos.craveiro, tales.aparecida, dlatypov, javierm, maxime,
andrealmeid, matheus.vieira.g
On 03/04/23 12:33, Maíra Canal wrote:
> Hi Arthur,
>
> On 3/27/23 10:38, Arthur Grillo wrote:
>> Insert test for the drm_rect_intersect() function, it also create a
>> helper for comparing drm_rects more easily.
>>
>> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
>> ---
>> drivers/gpu/drm/tests/drm_rect_test.c | 139 ++++++++++++++++++++++++++
>> 1 file changed, 139 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/tests/drm_rect_test.c b/drivers/gpu/drm/tests/drm_rect_test.c
>> index e9809ea32696..3654c0be3d6b 100644
>> --- a/drivers/gpu/drm/tests/drm_rect_test.c
>> +++ b/drivers/gpu/drm/tests/drm_rect_test.c
>> @@ -9,6 +9,17 @@
>> #include <drm/drm_rect.h>
>> +#include <linux/string_helpers.h>
>
> Is this include really needed? I was able to compile without it.
>
>> +
>> +static void drm_rect_compare(struct kunit *test, const struct drm_rect *r,
>> + const struct drm_rect *expected)
>> +{
>> + KUNIT_EXPECT_EQ(test, r->x1, expected->x1);
>
> Maybe it would be nice to have a message here that shows the current x1
> and the expected x1. Same for the other dimensions.
>
Doesn't KUnit already output this information when the values don't
match?
>> + KUNIT_EXPECT_EQ(test, r->y1, expected->y1);
>> + KUNIT_EXPECT_EQ(test, drm_rect_width(r), drm_rect_width(expected));
>> + KUNIT_EXPECT_EQ(test, drm_rect_height(r), drm_rect_height(expected));
>> +}
>> +
>> static void drm_test_rect_clip_scaled_div_by_zero(struct kunit *test)
>> {
>> struct drm_rect src, dst, clip;
>> @@ -196,11 +207,139 @@ static void drm_test_rect_clip_scaled_signed_vs_unsigned(struct kunit *test)
>> KUNIT_EXPECT_FALSE_MSG(test, drm_rect_visible(&src), "Source should not be visible\n");
>> }
>> +struct drm_rect_intersect_case {
>> + const char *description;
>> + struct drm_rect r1, r2;
>> + bool should_be_visible;
>> + struct drm_rect expected_intersection;
>> +};
>> +
>> +static const struct drm_rect_intersect_case drm_rect_intersect_cases[] = {
>> + {
>> + .description = "top-left X bottom-right",
>> + .r1 = DRM_RECT_INIT(1, 1, 2, 2),
>> + .r2 = DRM_RECT_INIT(0, 0, 2, 2),
>> + .should_be_visible = true,
>> + .expected_intersection = DRM_RECT_INIT(1, 1, 1, 1),
>> + },
>> + {
>> + .description = "top-right X bottom-left",
>> + .r1 = DRM_RECT_INIT(0, 0, 2, 2),
>> + .r2 = DRM_RECT_INIT(1, -1, 2, 2),
>> + .should_be_visible = true,
>> + .expected_intersection = DRM_RECT_INIT(1, 0, 1, 1),
>> + },
>> + {
>> + .description = "bottom-left X top-right",
>> + .r1 = DRM_RECT_INIT(1, -1, 2, 2),
>> + .r2 = DRM_RECT_INIT(0, 0, 2, 2),
>> + .should_be_visible = true,
>> + .expected_intersection = DRM_RECT_INIT(1, 0, 1, 1),
>> + },
>> + {
>> + .description = "bottom-right X top-left",
>> + .r1 = DRM_RECT_INIT(0, 0, 2, 2),
>> + .r2 = DRM_RECT_INIT(1, 1, 2, 2),
>> + .should_be_visible = true,
>> + .expected_intersection = DRM_RECT_INIT(1, 1, 1, 1),
>> + },
>> + {
>> + .description = "right X left",
>> + .r1 = DRM_RECT_INIT(0, 0, 2, 1),
>> + .r2 = DRM_RECT_INIT(1, 0, 3, 1),
>> + .should_be_visible = true,
>> + .expected_intersection = DRM_RECT_INIT(1, 0, 1, 1),
>> + },
>> + {
>> + .description = "left X right",
>> + .r1 = DRM_RECT_INIT(1, 0, 3, 1),
>> + .r2 = DRM_RECT_INIT(0, 0, 2, 1),
>> + .should_be_visible = true,
>> + .expected_intersection = DRM_RECT_INIT(1, 0, 1, 1),
>> + },
>> + {
>> + .description = "up X bottom",
>> + .r1 = DRM_RECT_INIT(0, 0, 1, 2),
>> + .r2 = DRM_RECT_INIT(0, -1, 1, 3),
>> + .should_be_visible = true,
>> + .expected_intersection = DRM_RECT_INIT(0, 0, 1, 2),
>> + },
>> + {
>> + .description = "bottom X up",
>> + .r1 = DRM_RECT_INIT(0, -1, 1, 3),
>> + .r2 = DRM_RECT_INIT(0, 0, 1, 2),
>> + .should_be_visible = true,
>> + .expected_intersection = DRM_RECT_INIT(0, 0, 1, 2),
>> + },
>> + {
>> + .description = "touching corner",
>> + .r1 = DRM_RECT_INIT(0, 0, 1, 1),
>> + .r2 = DRM_RECT_INIT(1, 1, 2, 2),
>> + .should_be_visible = false,
>> + .expected_intersection = DRM_RECT_INIT(1, 1, 0, 0),
>> + },
>> + {
>> + .description = "touching side",
>> + .r1 = DRM_RECT_INIT(0, 0, 1, 1),
>> + .r2 = DRM_RECT_INIT(1, 0, 1, 1),
>> + .should_be_visible = false,
>> + .expected_intersection = DRM_RECT_INIT(1, 0, 0, 1),
>> + },
>> + {
>> + .description = "equal rects",
>> + .r1 = DRM_RECT_INIT(0, 0, 2, 2),
>> + .r2 = DRM_RECT_INIT(0, 0, 2, 2),
>> + .should_be_visible = true,
>> + .expected_intersection = DRM_RECT_INIT(0, 0, 2, 2),
>> + },
>> + {
>> + .description = "inside another",
>> + .r1 = DRM_RECT_INIT(0, 0, 2, 2),
>> + .r2 = DRM_RECT_INIT(1, 1, 1, 1),
>> + .should_be_visible = true,
>> + .expected_intersection = DRM_RECT_INIT(1, 1, 1, 1),
>> + },
>> + {
>> + .description = "far away",
>> + .r1 = DRM_RECT_INIT(0, 0, 1, 1),
>> + .r2 = DRM_RECT_INIT(3, 6, 1, 1),
>> + .should_be_visible = false,
>> + .expected_intersection = DRM_RECT_INIT(3, 6, -2, -5),
>> + },
>> +};
>
> What happens if width = height = 0? It would be nice to have a test
> case for this scenario.
>
>> +
>> +static void drm_rect_intersect_case_desc(const struct drm_rect_intersect_case *t, char *desc)
>> +{
>> + if (!t->description)
>> + snprintf(desc, KUNIT_PARAM_DESC_SIZE,
>> + DRM_RECT_FMT " X " DRM_RECT_FMT,
>> + DRM_RECT_ARG(&t->r1), DRM_RECT_ARG(&t->r2));
>
> Is this conditional clause really needed? All parameters have
> description.
>
>> + else
>> + snprintf(desc, KUNIT_PARAM_DESC_SIZE,
>> + "%s: " DRM_RECT_FMT " X " DRM_RECT_FMT,
>> + t->description, DRM_RECT_ARG(&t->r1), DRM_RECT_ARG(&t->r2));
>> +}
>> +
>> +KUNIT_ARRAY_PARAM(drm_rect_intersect, drm_rect_intersect_cases, drm_rect_intersect_case_desc);
>> +
>> +static void drm_test_rect_intersect(struct kunit *test)
>> +{
>> + const struct drm_rect_intersect_case *params = test->param_value;
>> + struct drm_rect r1_aux = params->r1;
>
> Does this variable needs to exist? I guess you could just use params->r1.
>
I think it does because the params variable is const.
Best Regards,
~Arthur Grillo
> Best Regards,
> - Maíra Canal
>
>> + bool visible;
>> +
>> + visible = drm_rect_intersect(&r1_aux, ¶ms->r2);
>> +
>> + KUNIT_EXPECT_EQ(test, visible, params->should_be_visible);
>> + drm_rect_compare(test, &r1_aux, ¶ms->expected_intersection);
>> +}
>> +
>> static struct kunit_case drm_rect_tests[] = {
>> KUNIT_CASE(drm_test_rect_clip_scaled_div_by_zero),
>> KUNIT_CASE(drm_test_rect_clip_scaled_not_clipped),
>> KUNIT_CASE(drm_test_rect_clip_scaled_clipped),
>> KUNIT_CASE(drm_test_rect_clip_scaled_signed_vs_unsigned),
>> + KUNIT_CASE_PARAM(drm_test_rect_intersect, drm_rect_intersect_gen_params),
>> { }
>> };
>>
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-04-03 18:06 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-27 13:38 [PATCH v2 0/5] Create tests for the drm_rect functions Arthur Grillo
2023-03-27 13:38 ` [PATCH v2 1/5] drm/tests: Test drm_rect_intersect() Arthur Grillo
2023-04-03 15:33 ` Maíra Canal
2023-04-03 18:06 ` Arthur Grillo Queiroz Cabral
2023-03-27 13:38 ` [PATCH v2 2/5] drm/tests: Test drm_rect_calc_hscale() Arthur Grillo
2023-04-03 15:42 ` Maíra Canal
2023-03-27 13:38 ` [PATCH v2 3/5] drm/tests: Test drm_rect_calc_vscale() Arthur Grillo
2023-04-03 15:47 ` Maíra Canal
2023-03-27 13:38 ` [PATCH v2 4/5] drm/tests: Test drm_rect_rotate() Arthur Grillo
2023-03-27 13:38 ` [PATCH v2 5/5] drm/test: Test drm_rect_rotate_inv() Arthur Grillo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).