blob: 34b970959c4f6d4d64be5f93260dd66c90e506d1 [file]
/*
* Copyright (C) 2025 Igalia, S.L.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "WPEDisplayMock.h"
#include "WPEMockPlatformTest.h"
#include "WPEScreenMock.h"
#include "WPEToplevelMock.h"
#include "WPEViewMock.h"
namespace TestWebKitAPI {
class WPEMockViewTest : public WPEMockPlatformTest {
public:
WPE_PLATFORM_TEST_FIXTURE(WPEMockViewTest);
WPEMockViewTest()
: m_view(adoptGRef(wpe_view_new(m_display.get())))
{
assertObjectIsDeletedWhenTestFinishes(m_view.get());
g_assert_true(wpe_view_get_display(m_view.get()) == display());
}
WPEView* view() const { return m_view.get(); }
private:
GRefPtr<WPEView> m_view;
};
static void testViewToplevel(WPEMockViewTest* test, gconstpointer)
{
auto* toplevel = wpe_view_get_toplevel(test->view());
g_assert_true(WPE_IS_TOPLEVEL_MOCK(toplevel));
test->assertObjectIsDeletedWhenTestFinishes(toplevel);
g_assert_true(wpe_toplevel_get_display(toplevel) == wpe_view_get_display(test->view()));
}
static void testViewSize(WPEMockViewTest* test, gconstpointer)
{
g_assert_cmpint(wpe_view_get_width(test->view()), ==, 1024);
g_assert_cmpint(wpe_view_get_height(test->view()), ==, 768);
auto* toplevel = wpe_view_get_toplevel(test->view());
g_assert_true(WPE_IS_TOPLEVEL_MOCK(toplevel));
test->assertObjectIsDeletedWhenTestFinishes(toplevel);
int width, height;
wpe_toplevel_get_size(toplevel, &width, &height);
g_assert_cmpint(wpe_view_get_width(test->view()), ==, width);
g_assert_cmpint(wpe_view_get_height(test->view()), ==, height);
gboolean viewResized = FALSE;
auto viewResizedID = g_signal_connect(test->view(), "resized", G_CALLBACK(+[](WPEView*, gboolean* viewResized) {
*viewResized = TRUE;
}), &viewResized);
g_assert_true(wpe_toplevel_resize(toplevel, 800, 600));
g_assert_true(viewResized);
g_assert_cmpint(wpe_view_get_width(test->view()), ==, 800);
g_assert_cmpint(wpe_view_get_height(test->view()), ==, 600);
wpe_toplevel_get_size(toplevel, &width, &height);
g_assert_cmpint(wpe_view_get_width(test->view()), ==, width);
g_assert_cmpint(wpe_view_get_height(test->view()), ==, height);
g_signal_handler_disconnect(test->view(), viewResizedID);
}
static void testViewScale(WPEMockViewTest* test, gconstpointer)
{
g_assert_cmpfloat(wpe_view_get_scale(test->view()), ==, 1.);
auto* toplevel = wpe_view_get_toplevel(test->view());
g_assert_true(WPE_IS_TOPLEVEL_MOCK(toplevel));
test->assertObjectIsDeletedWhenTestFinishes(toplevel);
g_assert_cmpfloat(wpe_view_get_scale(test->view()), ==, wpe_toplevel_get_scale(toplevel));
wpeDisplayMockAddSecondaryScreen(WPE_DISPLAY_MOCK(test->display()));
gboolean viewScaleChanged = FALSE;
auto viewScaleChangedID = g_signal_connect(test->view(), "notify::scale", G_CALLBACK(+[](WPEView*, GParamSpec*, gboolean* viewScaleChanged) {
*viewScaleChanged = TRUE;
}), &viewScaleChanged);
wpeToplevelMockSwitchToScreen(WPE_TOPLEVEL_MOCK(toplevel), 1);
g_assert_true(viewScaleChanged);
g_assert_cmpfloat(wpe_view_get_scale(test->view()), ==, 2.);
g_signal_handler_disconnect(test->view(), viewScaleChangedID);
}
static void testViewToplevelState(WPEMockViewTest* test, gconstpointer)
{
auto state = wpe_view_get_toplevel_state(test->view());
g_assert_cmpuint(state, ==, 0);
auto* toplevel = wpe_view_get_toplevel(test->view());
g_assert_true(WPE_IS_TOPLEVEL_MOCK(toplevel));
test->assertObjectIsDeletedWhenTestFinishes(toplevel);
g_assert_cmpuint(wpe_view_get_toplevel_state(test->view()), ==, wpe_toplevel_get_state(toplevel));
gboolean viewStateChanged = FALSE;
auto viewStateChangedID = g_signal_connect(test->view(), "notify::toplevel-state", G_CALLBACK(+[](WPEView*, GParamSpec*, gboolean* viewStateChanged) {
*viewStateChanged = TRUE;
}), &viewStateChanged);
wpeToplevelMockSetActive(WPE_TOPLEVEL_MOCK(toplevel), TRUE);
g_assert_true(viewStateChanged);
state = wpe_view_get_toplevel_state(test->view());
g_assert_true(state & WPE_TOPLEVEL_STATE_ACTIVE);
g_assert_false(state & WPE_TOPLEVEL_STATE_FULLSCREEN);
g_assert_false(state & WPE_TOPLEVEL_STATE_MAXIMIZED);
g_assert_cmpuint(state, ==, wpe_toplevel_get_state(toplevel));
gboolean viewResized = FALSE;
auto viewResizedID = g_signal_connect(test->view(), "resized", G_CALLBACK(+[](WPEView*, gboolean* viewResized) {
*viewResized = TRUE;
}), &viewResized);
viewStateChanged = FALSE;
g_assert_true(wpe_toplevel_fullscreen(toplevel));
g_assert_true(viewStateChanged);
state = wpe_view_get_toplevel_state(test->view());
g_assert_true(state & WPE_TOPLEVEL_STATE_ACTIVE);
g_assert_true(state & WPE_TOPLEVEL_STATE_FULLSCREEN);
g_assert_false(state & WPE_TOPLEVEL_STATE_MAXIMIZED);
g_assert_cmpuint(state, ==, wpe_toplevel_get_state(toplevel));
g_assert_true(viewResized);
g_assert_cmpint(wpe_view_get_width(test->view()), ==, 1920);
g_assert_cmpint(wpe_view_get_height(test->view()), ==, 1080);
viewStateChanged = FALSE;
viewResized = FALSE;
g_assert_true(wpe_toplevel_unfullscreen(toplevel));
g_assert_true(viewStateChanged);
state = wpe_view_get_toplevel_state(test->view());
g_assert_true(state & WPE_TOPLEVEL_STATE_ACTIVE);
g_assert_false(state & WPE_TOPLEVEL_STATE_FULLSCREEN);
g_assert_false(state & WPE_TOPLEVEL_STATE_MAXIMIZED);
g_assert_cmpuint(state, ==, wpe_toplevel_get_state(toplevel));
g_assert_true(viewResized);
g_assert_cmpint(wpe_view_get_width(test->view()), ==, 1024);
g_assert_cmpint(wpe_view_get_height(test->view()), ==, 768);
viewStateChanged = FALSE;
g_assert_true(wpe_toplevel_maximize(toplevel));
g_assert_true(viewStateChanged);
state = wpe_view_get_toplevel_state(test->view());
g_assert_true(state & WPE_TOPLEVEL_STATE_ACTIVE);
g_assert_false(state & WPE_TOPLEVEL_STATE_FULLSCREEN);
g_assert_true(state & WPE_TOPLEVEL_STATE_MAXIMIZED);
g_assert_cmpuint(state, ==, wpe_toplevel_get_state(toplevel));
g_assert_true(viewResized);
g_assert_cmpint(wpe_view_get_width(test->view()), ==, 1920);
g_assert_cmpint(wpe_view_get_height(test->view()), ==, 1040);
viewStateChanged = FALSE;
viewResized = FALSE;
g_assert_true(wpe_toplevel_unmaximize(toplevel));
g_assert_true(viewStateChanged);
state = wpe_view_get_toplevel_state(test->view());
g_assert_true(state & WPE_TOPLEVEL_STATE_ACTIVE);
g_assert_false(state & WPE_TOPLEVEL_STATE_FULLSCREEN);
g_assert_false(state & WPE_TOPLEVEL_STATE_MAXIMIZED);
g_assert_cmpuint(state, ==, wpe_toplevel_get_state(toplevel));
g_assert_true(viewResized);
g_assert_cmpint(wpe_view_get_width(test->view()), ==, 1024);
g_assert_cmpint(wpe_view_get_height(test->view()), ==, 768);
g_signal_handler_disconnect(test->view(), viewStateChangedID);
g_signal_handler_disconnect(test->view(), viewResizedID);
}
void beforeAll()
{
WPEMockViewTest::add("View", "toplevel", testViewToplevel);
WPEMockViewTest::add("View", "size", testViewSize);
WPEMockViewTest::add("View", "scale", testViewScale);
WPEMockViewTest::add("View", "toplevel-state", testViewToplevelState);
}
void afterAll()
{
}
} // namespace TestWebKitAPI