--- /dev/null
+#include "tc_main.h"
+#include "mockclient.h"
+#include "mockcompositor.h"
+
+#include <cstring>
+#include <libds/log.h>
+#include <libds-tizen/scaler.h>
+#include <scaler-client-protocol.h>
+
+TEST(ScalerSimpleTest, CreateScaler)
+{
+ struct wl_display *display = wl_display_create();
+
+ struct ds_tizen_scaler *scaler = ds_tizen_scaler_create(display);
+ ASSERT_NE(scaler, nullptr);
+
+ wl_display_destroy(display);
+}
+
+class ScalerCompositor : public MockCompositor, public ::testing::Test
+{
+public:
+ ScalerCompositor() :
+ MockCompositor(&ScalerCompositor::SetUpComp, this)
+ {
+ /* We are only interested in test results. Let's silence libds log. */
+ ds_log_init(DS_SILENT, nullptr);
+ }
+
+ static void SetUpComp(void *data)
+ {
+ ScalerCompositor *comp = static_cast<ScalerCompositor*>(data);
+
+ struct ds_tizen_scaler *scaler =
+ ds_tizen_scaler_create(comp->GetWlDisplay());
+ ASSERT_NE(scaler, nullptr);
+ }
+};
+
+static void handle_global(void *data, struct wl_registry *registry,
+ uint32_t name, const char *interface, uint32_t version);
+static void handle_global_remove(void *data, struct wl_registry *registry,
+ uint32_t name);
+
+static const struct wl_registry_listener registry_listener = {
+ .global = handle_global,
+ .global_remove = handle_global_remove,
+};
+
+class MockScalerClient : public MockClient
+{
+public:
+ MockScalerClient() : MockClient(®istry_listener, this)
+ {
+ EXPECT_NE(this->compositor, nullptr);
+ EXPECT_NE(this->scaler, nullptr);
+
+ surface = wl_compositor_create_surface(this->compositor);
+ EXPECT_NE(this->surface, nullptr);
+ }
+
+ ~MockScalerClient()
+ {
+ wl_surface_destroy(this->surface);
+ wl_scaler_destroy(this->scaler);
+ wl_compositor_destroy(this->compositor);
+ }
+
+ struct wl_compositor *compositor;
+ struct wl_scaler *scaler;
+ struct wl_surface *surface;
+};
+
+static void
+handle_global(void *data, struct wl_registry *registry,
+ uint32_t name, const char *interface, uint32_t version)
+{
+ MockScalerClient *client = static_cast<MockScalerClient*>(data);
+
+ if (strcmp(interface, "wl_compositor") == 0) {
+ client->compositor = static_cast<struct wl_compositor*>(
+ wl_registry_bind(registry, name, &wl_compositor_interface, 4));
+ } else if (strcmp(interface, "wl_scaler") == 0) {
+ client->scaler = static_cast<struct wl_scaler*>(
+ wl_registry_bind(registry, name, &wl_scaler_interface, 2));
+ }
+}
+
+static void
+handle_global_remove(void *data, struct wl_registry *registry, uint32_t name)
+{
+}
+
+TEST_F(ScalerCompositor, CreateViewport)
+{
+ MockScalerClient *client = new MockScalerClient();
+
+ struct wl_viewport *vp = wl_scaler_get_viewport(client->scaler,
+ client->surface);
+
+ client->ExpectNoError();
+
+ wl_viewport_destroy(vp);
+ delete client;
+}
+
+TEST_F(ScalerCompositor, CreateViewportTwice)
+{
+ MockScalerClient *client = new MockScalerClient();
+
+ struct wl_viewport *vp[2];
+ vp[0] = wl_scaler_get_viewport(client->scaler, client->surface);
+ vp[1] = wl_scaler_get_viewport(client->scaler, client->surface);
+
+ client->ExpectProtocolError(&wl_scaler_interface,
+ WL_SCALER_ERROR_VIEWPORT_EXISTS);
+
+ wl_viewport_destroy(vp[0]);
+ wl_viewport_destroy(vp[1]);
+ delete client;
+}
+
+TEST_F(ScalerCompositor, SetSource)
+{
+ MockScalerClient *client = new MockScalerClient();
+
+ struct wl_viewport *vp = wl_scaler_get_viewport(client->scaler,
+ client->surface);
+
+ wl_viewport_set_source(vp,
+ wl_fixed_from_int(100), wl_fixed_from_int(100),
+ wl_fixed_from_int(100), wl_fixed_from_int(100));
+ wl_surface_commit(client->surface);
+
+ client->ExpectNoError();
+
+ wl_viewport_destroy(vp);
+ delete client;
+}
+
+TEST_F(ScalerCompositor, UnsetSource)
+{
+ MockScalerClient *client = new MockScalerClient();
+
+ struct wl_viewport *vp = wl_scaler_get_viewport(client->scaler,
+ client->surface);
+
+ wl_viewport_set_source(vp,
+ wl_fixed_from_int(-1.0), wl_fixed_from_int(-1.0),
+ wl_fixed_from_int(-1.0), wl_fixed_from_int(-1.0));
+ wl_surface_commit(client->surface);
+
+ client->ExpectNoError();
+
+ wl_viewport_destroy(vp);
+ delete client;
+}
+
+TEST_F(ScalerCompositor, SetDestination)
+{
+ MockScalerClient *client = new MockScalerClient();
+
+ struct wl_viewport *vp = wl_scaler_get_viewport(client->scaler,
+ client->surface);
+
+ wl_viewport_set_destination(vp, 100, 100);
+ wl_surface_commit(client->surface);
+
+ client->ExpectNoError();
+
+ wl_viewport_destroy(vp);
+ delete client;
+}
+
+TEST_F(ScalerCompositor, UnsetDestination)
+{
+ MockScalerClient *client = new MockScalerClient();
+
+ struct wl_viewport *vp = wl_scaler_get_viewport(client->scaler,
+ client->surface);
+
+ wl_viewport_set_destination(vp, -1, -1);
+ wl_surface_commit(client->surface);
+
+ client->ExpectNoError();
+
+ wl_viewport_destroy(vp);
+ delete client;
+}
+
+struct Box {
+ int x, y, width, height;
+};
+
+class ScalerCompositorBadSourceTest :
+ public ScalerCompositor,
+ public testing::WithParamInterface<Box>
+{
+};
+
+INSTANTIATE_TEST_SUITE_P(ScalerBadSourceParamTest,
+ ScalerCompositorBadSourceTest,
+ testing::Values(
+ Box{0, 0, 0, 0},
+ Box{0, 0, 0, 10},
+ Box{0, 0, 20, 0},
+ Box{0, 0, -20, 10},
+ Box{0, 0, 20, -10},
+ Box{0, 0, -20, -10}));
+
+TEST_P(ScalerCompositorBadSourceTest, SetBadSource)
+{
+ MockScalerClient *client = new MockScalerClient();
+
+ struct wl_viewport *vp = wl_scaler_get_viewport(client->scaler,
+ client->surface);
+
+ Box src = GetParam();
+ wl_viewport_set_source(vp,
+ wl_fixed_from_int(src.x), wl_fixed_from_int(src.y),
+ wl_fixed_from_int(src.width), wl_fixed_from_int(src.height));
+ wl_surface_commit(client->surface);
+
+ client->ExpectProtocolError(&wl_viewport_interface,
+ WL_VIEWPORT_ERROR_BAD_VALUE);
+
+ wl_viewport_destroy(vp);
+ delete client;
+}
+
+struct Size {
+ int width, height;
+};
+
+class ScalerCompositorBadDestinationTest :
+ public ScalerCompositor,
+ public testing::WithParamInterface<Size>
+{
+};
+
+INSTANTIATE_TEST_SUITE_P(ScalerBadDestinationParamTest,
+ ScalerCompositorBadDestinationTest,
+ testing::Values(
+ Size{0, 0},
+ Size{0, 10},
+ Size{20, 0},
+ Size{-20, 10},
+ Size{20, -10},
+ Size{-20, -10}));
+
+TEST_P(ScalerCompositorBadDestinationTest, SetBadDestination)
+{
+ MockScalerClient *client = new MockScalerClient();
+
+ struct wl_viewport *vp = wl_scaler_get_viewport(client->scaler,
+ client->surface);
+
+ Size dst = GetParam();
+ wl_viewport_set_destination(vp, dst.width, dst.height);
+ wl_surface_commit(client->surface);
+
+ client->ExpectProtocolError(&wl_viewport_interface,
+ WL_VIEWPORT_ERROR_BAD_VALUE);
+
+ wl_viewport_destroy(vp);
+ delete client;
+}