weston/tests/event-test.c
Pekka Paalanen f2aa64f18a tests: check wl_display_roundtrip() for errors
Add a macro that wraps wl_display_roundtrip() and check for errors. It
is a macro, so that the assert would show the relevant file and line
number.

This will also catch protocol errors, that would go unnoticed otherwise.

All roundtrips in tests are replaced with the check.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2012-12-12 10:39:01 -05:00

350 lines
8.9 KiB
C

/*
* Copyright © 2012 Intel Corporation
*
* Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of the copyright holders not be used in
* advertising or publicity pertaining to distribution of the software
* without specific, written prior permission. The copyright holders make
* no representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
* CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "weston-test-client-helper.h"
static void
check_pointer(struct client *client, int x, int y)
{
int sx, sy;
/* check that the client got the global pointer update */
assert(client->test->pointer_x == x);
assert(client->test->pointer_y == y);
/* Does global pointer map onto the surface? */
if (surface_contains(client->surface, x, y)) {
/* check that the surface has the pointer focus */
assert(client->input->pointer->focus == client->surface);
/*
* check that the local surface pointer maps
* to the global pointer.
*/
sx = client->input->pointer->x + client->surface->x;
sy = client->input->pointer->y + client->surface->y;
assert(sx == x);
assert(sy == y);
} else {
/*
* The global pointer does not map onto surface. So
* check that it doesn't have the pointer focus.
*/
assert(client->input->pointer->focus == NULL);
}
}
static void
check_pointer_move(struct client *client, int x, int y)
{
wl_test_move_pointer(client->test->wl_test, x, y);
client_roundtrip(client);
check_pointer(client, x, y);
}
TEST(test_pointer_top_left)
{
struct client *client;
int x, y;
client = client_create(46, 76, 111, 134);
assert(client);
/* move pointer outside top left */
x = client->surface->x - 1;
y = client->surface->y - 1;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer on top left */
x += 1; y += 1;
assert(surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer outside top left */
x -= 1; y -= 1;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
}
TEST(test_pointer_bottom_left)
{
struct client *client;
int x, y;
client = client_create(99, 100, 100, 98);
assert(client);
/* move pointer outside bottom left */
x = client->surface->x - 1;
y = client->surface->y + client->surface->height;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer on bottom left */
x += 1; y -= 1;
assert(surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer outside bottom left */
x -= 1; y += 1;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
}
TEST(test_pointer_top_right)
{
struct client *client;
int x, y;
client = client_create(48, 100, 67, 100);
assert(client);
/* move pointer outside top right */
x = client->surface->x + client->surface->width;
y = client->surface->y - 1;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer on top right */
x -= 1; y += 1;
assert(surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer outside top right */
x += 1; y -= 1;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
}
TEST(test_pointer_bottom_right)
{
struct client *client;
int x, y;
client = client_create(100, 123, 100, 69);
assert(client);
/* move pointer outside bottom right */
x = client->surface->x + client->surface->width;
y = client->surface->y + client->surface->height;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer on bottom right */
x -= 1; y -= 1;
assert(surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer outside bottom right */
x += 1; y += 1;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
}
TEST(test_pointer_top_center)
{
struct client *client;
int x, y;
client = client_create(100, 201, 100, 50);
assert(client);
/* move pointer outside top center */
x = client->surface->x + client->surface->width/2;
y = client->surface->y - 1;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer on top center */
y += 1;
assert(surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer outside top center */
y -= 1;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
}
TEST(test_pointer_bottom_center)
{
struct client *client;
int x, y;
client = client_create(100, 45, 67, 100);
assert(client);
/* move pointer outside bottom center */
x = client->surface->x + client->surface->width/2;
y = client->surface->y + client->surface->height;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer on bottom center */
y -= 1;
assert(surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer outside bottom center */
y += 1;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
}
TEST(test_pointer_left_center)
{
struct client *client;
int x, y;
client = client_create(167, 45, 78, 100);
assert(client);
/* move pointer outside left center */
x = client->surface->x - 1;
y = client->surface->y + client->surface->height/2;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer on left center */
x += 1;
assert(surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer outside left center */
x -= 1;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
}
TEST(test_pointer_right_center)
{
struct client *client;
int x, y;
client = client_create(110, 37, 100, 46);
assert(client);
/* move pointer outside right center */
x = client->surface->x + client->surface->width;
y = client->surface->y + client->surface->height/2;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer on right center */
x -= 1;
assert(surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
/* move pointer outside right center */
x += 1;
assert(!surface_contains(client->surface, x, y));
check_pointer_move(client, x, y);
}
TEST(test_pointer_surface_move)
{
struct client *client;
client = client_create(100, 100, 100, 100);
assert(client);
/* move pointer outside of client */
assert(!surface_contains(client->surface, 50, 50));
check_pointer_move(client, 50, 50);
/* move client center to pointer */
move_client(client, 0, 0);
assert(surface_contains(client->surface, 50, 50));
check_pointer(client, 50, 50);
}
static int
output_contains_client(struct client *client)
{
struct output *output = client->output;
struct surface *surface = client->surface;
return !(output->x >= surface->x + surface->width
|| output->x + output->width <= surface->x
|| output->y >= surface->y + surface->height
|| output->y + output->height <= surface->y);
}
static void
check_client_move(struct client *client, int x, int y)
{
move_client(client, x, y);
if (output_contains_client(client)) {
assert(client->surface->output == client->output);
} else {
assert(client->surface->output == NULL);
}
}
TEST(test_surface_output)
{
struct client *client;
int x, y;
client = client_create(100, 100, 100, 100);
assert(client);
assert(output_contains_client(client));
/* not visible */
x = 0;
y = -client->surface->height;
check_client_move(client, x, y);
/* visible */
check_client_move(client, x, ++y);
/* not visible */
x = -client->surface->width;
y = 0;
check_client_move(client, x, y);
/* visible */
check_client_move(client, ++x, y);
/* not visible */
x = client->output->width;
y = 0;
check_client_move(client, x, y);
/* visible */
check_client_move(client, --x, y);
assert(output_contains_client(client));
/* not visible */
x = 0;
y = client->output->height;
check_client_move(client, x, y);
assert(!output_contains_client(client));
/* visible */
check_client_move(client, x, --y);
assert(output_contains_client(client));
}