You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Framework/AzFramework/Tests/NativeWindow.cpp

211 lines
7.9 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <AzCore/UnitTest/TestTypes.h>
#include <AzFramework/Windowing/NativeWindow.h>
using namespace AZ;
using namespace AzFramework;
namespace UnitTest
{
using NativeWindowTest = AllocatorsFixture;
class NativeWindowListener
: public WindowNotificationBus::Handler
{
public:
NativeWindowListener(NativeWindowHandle windowHandle)
: m_windowHandle(windowHandle)
{
AzFramework::WindowNotificationBus::Handler::BusConnect(m_windowHandle);
}
~NativeWindowListener() override
{
AzFramework::WindowNotificationBus::Handler::BusDisconnect(m_windowHandle);
}
// WindowNotificationBus::Handler overrides...
void OnWindowResized(uint32_t width, uint32_t height) override
{
AZ_UNUSED(width);
AZ_UNUSED(height);
m_wasOnWindowResizedReceived = true;
}
void OnWindowClosed() override
{
m_wasOnWindowClosedReceived = true;
}
NativeWindowHandle m_windowHandle = nullptr;
bool m_wasOnWindowResizedReceived = false;
bool m_wasOnWindowClosedReceived = false;
};
// Test that a window can be created and will start in the non-active state
#if AZ_TRAIT_DISABLE_FAILED_NATIVE_WINDOWS_TESTS
TEST_F(NativeWindowTest, DISABLED_CreateWindow)
#else
TEST_F(NativeWindowTest, CreateWindow)
#endif // AZ_TRAIT_DISABLE_FAILED_NATIVE_WINDOWS_TESTS
{
const uint32_t PosX = 0;
const uint32_t PosY = 0;
const uint32_t Width = 1280;
const uint32_t Height = 720;
WindowGeometry geometry(PosX, PosY, Width, Height);
AZStd::unique_ptr<NativeWindow> nativeWindow = AZStd::make_unique<AzFramework::NativeWindow>(
"Test Window", geometry);
EXPECT_FALSE(nativeWindow == nullptr) << "NativeWindow was not allocated correctly.";
EXPECT_FALSE(nativeWindow->IsActive()) << "NativeWindow was in active state after construction.";
}
// Test that a window can be created and activated
#if AZ_TRAIT_DISABLE_FAILED_NATIVE_WINDOWS_TESTS
TEST_F(NativeWindowTest, DISABLED_ActivateWindow)
#else
TEST_F(NativeWindowTest, ActivateWindow)
#endif // AZ_TRAIT_DISABLE_FAILED_NATIVE_WINDOWS_TESTS
{
const uint32_t PosX = 0;
const uint32_t PosY = 0;
const uint32_t Width = 1280;
const uint32_t Height = 720;
WindowGeometry geometry(PosX, PosY, Width, Height);
AZStd::unique_ptr<NativeWindow> nativeWindow = AZStd::make_unique<AzFramework::NativeWindow>(
"Test Window", geometry);
EXPECT_FALSE(nativeWindow == nullptr) << "NativeWindow was not allocated correctly.";
nativeWindow->Activate();
EXPECT_TRUE(nativeWindow->IsActive()) << "NativeWindow was in inactive state after Activate called.";
// The window will get deactivated automatically when the NativeWindow is destructed
}
// Test that a window can be created, activated and deactivated
#if AZ_TRAIT_DISABLE_FAILED_NATIVE_WINDOWS_TESTS
TEST_F(NativeWindowTest, DISABLED_DectivateWindow)
#else
TEST_F(NativeWindowTest, DectivateWindow)
#endif // AZ_TRAIT_DISABLE_FAILED_NATIVE_WINDOWS_TESTS
{
const uint32_t PosX = 0;
const uint32_t PosY = 0;
const uint32_t Width = 1280;
const uint32_t Height = 720;
WindowGeometry geometry(PosX, PosY, Width, Height);
AZStd::unique_ptr<NativeWindow> nativeWindow = AZStd::make_unique<AzFramework::NativeWindow>(
"Test Window", geometry);
EXPECT_FALSE(nativeWindow == nullptr) << "NativeWindow was not allocated correctly.";
nativeWindow->Activate();
EXPECT_TRUE(nativeWindow->IsActive()) << "NativeWindow was in inactive state after Activate called.";
nativeWindow->Deactivate();
EXPECT_FALSE(nativeWindow->IsActive()) << "NativeWindow was in active state after Deactivate called.";
}
// Test that a window responds to the GetClientAreaSize bus request
#if AZ_TRAIT_DISABLE_FAILED_NATIVE_WINDOWS_TESTS
TEST_F(NativeWindowTest, DISABLED_GetClientAreaSize)
#else
TEST_F(NativeWindowTest, GetClientAreaSize)
#endif // AZ_TRAIT_DISABLE_FAILED_NATIVE_WINDOWS_TESTS
{
const uint32_t PosX = 0;
const uint32_t PosY = 0;
const uint32_t Width = 1280;
const uint32_t Height = 720;
WindowGeometry geometry(PosX, PosY, Width, Height);
AZStd::unique_ptr<NativeWindow> nativeWindow = AZStd::make_unique<AzFramework::NativeWindow>(
"Test Window", geometry);
EXPECT_FALSE(nativeWindow == nullptr) << "NativeWindow was not allocated correctly.";
nativeWindow->Activate();
EXPECT_TRUE(nativeWindow->IsActive()) << "NativeWindow was in inactive state after activation.";
NativeWindowHandle windowHandle = nativeWindow->GetWindowHandle();
WindowSize windowSize;
WindowRequestBus::EventResult(windowSize, windowHandle, &WindowRequestBus::Events::GetClientAreaSize);
EXPECT_TRUE(windowSize.m_width > 0) << "NativeWindow was created with wrong geometry.";
EXPECT_TRUE(windowSize.m_height > 0) << "NativeWindow was created with wrong geometry.";
EXPECT_TRUE(windowSize.m_width <= geometry.m_width) << "NativeWindow was created with wrong geometry.";
EXPECT_TRUE(windowSize.m_height <= geometry.m_height) << "NativeWindow was created with wrong geometry.";
}
// Test that a window sends the correct notifications
#if AZ_TRAIT_DISABLE_FAILED_NATIVE_WINDOWS_TESTS
TEST_F(NativeWindowTest, DISABLED_Notifications)
#else
TEST_F(NativeWindowTest, Notifications)
#endif // AZ_TRAIT_DISABLE_FAILED_NATIVE_WINDOWS_TESTS
{
const uint32_t PosX = 0;
const uint32_t PosY = 0;
const uint32_t Width = 1280;
const uint32_t Height = 720;
WindowGeometry geometry(PosX, PosY, Width, Height);
AZStd::unique_ptr<NativeWindow> nativeWindow = AZStd::make_unique<AzFramework::NativeWindow>(
"Test Window", geometry);
EXPECT_FALSE(nativeWindow == nullptr) << "NativeWindow was not allocated correctly.";
NativeWindowHandle windowHandle = nativeWindow->GetWindowHandle();
EXPECT_FALSE(windowHandle == nullptr) << "NativeWindow has invalid handle.";
NativeWindowListener listener(windowHandle);
EXPECT_FALSE(listener.m_wasOnWindowResizedReceived) << "No notifications should be received yet.";
EXPECT_FALSE(listener.m_wasOnWindowClosedReceived) << "No notifications should be received yet.";
nativeWindow->Activate();
WindowSize windowSize;
WindowRequestBus::EventResult(windowSize, windowHandle, &WindowRequestBus::Events::GetClientAreaSize);
bool windowSizeChanged = windowSize.m_width != geometry.m_width || windowSize.m_height != geometry.m_height;
EXPECT_TRUE(nativeWindow->IsActive()) << "NativeWindow was in inactive state after activation.";
EXPECT_TRUE(listener.m_wasOnWindowResizedReceived || !windowSizeChanged) << "Expected the OnWindowResized notification to have occurred.";
EXPECT_FALSE(listener.m_wasOnWindowClosedReceived) << "Did not expect the OnWindowClosed notification to have occurred.";
listener.m_wasOnWindowResizedReceived = false;
nativeWindow->Deactivate();
EXPECT_FALSE(nativeWindow->IsActive()) << "NativeWindow was in active state after deactivation.";
EXPECT_FALSE(listener.m_wasOnWindowResizedReceived) << "Did not expect the OnWindowResized notification to have occurred.";
EXPECT_TRUE(listener.m_wasOnWindowClosedReceived) << "Expected the OnWindowClosed notification to have occurred.";
}
} // namespace UnitTest