diff --git a/tests/scale_test.c b/tests/scale_test.c index d8e177d..11ebece 100644 --- a/tests/scale_test.c +++ b/tests/scale_test.c @@ -28,6 +28,7 @@ enum test_kind BUFFER_SCALE_2_KIND, BUFFER_SCALE_1_2_KIND, BUFFER_SCALE_2_2_KIND, + BUFFER_SCALE_2_5_KIND, }; static const char *test_names[] = @@ -37,9 +38,10 @@ static const char *test_names[] = "buffer_scale_2", "buffer_scale_1_2", "buffer_scale_2_2", + "buffer_scale_2_5", }; -#define LAST_TEST BUFFER_SCALE_2_2_KIND +#define LAST_TEST BUFFER_SCALE_2_5_KIND /* The display. */ static struct test_display *display; @@ -64,6 +66,30 @@ static void wait_frame_callback (struct wl_surface *); +static void +do_verify_window_size (int scale, int output_scale) +{ + int scale_factor; + double buffer_factor; + + /* Verify the window size. The window size is determined by first + calculating a scale factor, which is the output scale minus the + scale. The scale factor describes how many times to scale down + the buffer contents. */ + scale_factor = scale - output_scale; + + /* Next, compute how much the buffer should actually be scaled + by. */ + buffer_factor = (scale_factor > 0 + ? 1.0 / (scale_factor + 1) + : -scale_factor + 1); + + /* And verify the window size. */ + verify_window_size (display, test_surface_window, + ceil (500 * buffer_factor), + ceil (500 * buffer_factor)); +} + static void do_scale_damage_test (int scale, const char *dump_1_name, const char *dump_2_name) @@ -140,12 +166,14 @@ test_single_step (enum test_kind kind) case BUFFER_SCALE_1_KIND: do_scale_damage_test (1, "buffer_scale_1_1.dump", "buffer_scale_1_2.dump"); + do_verify_window_size (1, 1); test_single_step (BUFFER_SCALE_2_KIND); break; case BUFFER_SCALE_2_KIND: do_scale_damage_test (2, "buffer_scale_2_1.dump", "buffer_scale_2_2.dump"); + do_verify_window_size (2, 1); test_single_step (BUFFER_SCALE_1_2_KIND); break; @@ -154,6 +182,7 @@ test_single_step (enum test_kind kind) test_set_scale (display, 2); do_scale_damage_test (1, "buffer_scale_1_2_1.dump", "buffer_scale_1_2_2.dump"); + do_verify_window_size (1, 2); test_single_step (BUFFER_SCALE_2_2_KIND); break; @@ -162,6 +191,16 @@ test_single_step (enum test_kind kind) test_set_scale (display, 2); do_scale_damage_test (2, "buffer_scale_2_2_1.dump", "buffer_scale_2_2_2.dump"); + do_verify_window_size (2, 2); + test_single_step (BUFFER_SCALE_2_5_KIND); + break; + + case BUFFER_SCALE_2_5_KIND: + /* The buffer should be made three times larger. */ + test_set_scale (display, 5); + do_scale_damage_test (2, "buffer_scale_2_5_1.dump", + "buffer_scale_2_5_2.dump"); + do_verify_window_size (2, 5); break; } diff --git a/tests/test_harness.c b/tests/test_harness.c index 2c5e630..3dcf35e 100644 --- a/tests/test_harness.c +++ b/tests/test_harness.c @@ -930,3 +930,17 @@ test_get_serial (struct test_display *display) return display->serial; } + +void +verify_window_size (struct test_display *display, + Window window, int width, int height) +{ + XWindowAttributes attrs; + + XGetWindowAttributes (display->x_display, window, &attrs); + + if (width != attrs.width || height != attrs.height) + report_test_failure ("window is incorrect size. expected: %d %d" + ", actual: %d %d", width, height, + attrs.width, attrs.height); +} diff --git a/tests/test_harness.h b/tests/test_harness.h index 2bab262..a5a0ebe 100644 --- a/tests/test_harness.h +++ b/tests/test_harness.h @@ -159,6 +159,7 @@ extern void test_complete (void) __attribute__ ((noreturn)); extern void test_set_scale (struct test_display *, int); extern void test_init_seat (struct test_display *); extern uint32_t test_get_serial (struct test_display *); +extern void verify_window_size (struct test_display *, Window, int, int); #define ARRAYELTS(arr) (sizeof (arr) / sizeof (arr)[0])