/*
 * Copyright (c) 2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <gtest/gtest.h>
#include "display_manager_lite.h"
#include "mock_display_manager_adapter_lite.h"
#include "singleton_mocker.h"
#include "display_manager_lite.cpp"

using namespace testing;
using namespace testing::ext;

namespace OHOS {
namespace Rosen {
std::string g_errLog;
void MyLogCallback(const LogType type, const LogLevel level, const unsigned int domain, const char* tag,
    const char* msg)
{
    g_errLog = msg;
}

using Mocker = SingletonMocker<DisplayManagerAdapterLite, MockDisplayManagerAdapterLite>;
class DmMockDisplayListener : public DisplayManagerLite::IDisplayListener {
public:
    void OnCreate(DisplayId) override {}
    void OnDestroy(DisplayId) override {}
    void OnChange(DisplayId) override {}
};
class DmMockFoldStatusListener : public DisplayManagerLite::IFoldStatusListener {
public:
    virtual void OnFoldStatusChanged([[maybe_unused]]FoldStatus foldStatus) {}
};

class DmMockDisplayAttributeListener : public DisplayManagerLite::IDisplayAttributeListener {
    void OnAttributeChange(DisplayId displayId, const std::vector<std::string>& attributes) override {}
};
class DisplayManagerTest : public testing::Test {
public:
    static void SetUpTestCase();
    static void TearDownTestCase();
    void SetUp() override;
    void TearDown() override;
};

void DisplayManagerTest::SetUpTestCase()
{
}

void DisplayManagerTest::TearDownTestCase()
{
}

void DisplayManagerTest::SetUp()
{
}

void DisplayManagerTest::TearDown()
{
}

namespace {
/**
 * @tc.name: OnDisplayCreate01
 * @tc.desc: OnDisplayCreate
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, OnDisplayCreate01, TestSize.Level1)
{
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(DMError::DM_OK));
    sptr<DisplayManagerLite::IDisplayListener> listener = new DmMockDisplayListener();
    DisplayManagerLite::GetInstance().RegisterDisplayListener(listener);
    auto displayManagerListener = DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_;
    ASSERT_NE(displayManagerListener, nullptr);
    displayManagerListener->OnDisplayCreate(nullptr);
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(DISPLAY_ID_INVALID);
    displayManagerListener->OnDisplayCreate(displayInfo);
    displayInfo->SetDisplayId(0);
    displayManagerListener->OnDisplayCreate(displayInfo);
    ASSERT_NE(displayManagerListener->pImpl_, nullptr);
    displayManagerListener->pImpl_ = nullptr;
    displayManagerListener->OnDisplayCreate(displayInfo);
    DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_ = nullptr;
}

/**
 * @tc.name: OnDisplayDestroy
 * @tc.desc: OnDisplayDestroy
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, OnDisplayDestroy, TestSize.Level1)
{
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(DMError::DM_OK));
    sptr<DisplayManagerLite::IDisplayListener> listener = new DmMockDisplayListener();
    DisplayManagerLite::GetInstance().RegisterDisplayListener(listener);
    auto displayManagerListener = DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_;
    ASSERT_NE(displayManagerListener, nullptr);
    displayManagerListener->OnDisplayDestroy(DISPLAY_ID_INVALID);
    displayManagerListener->OnDisplayDestroy(0);
    displayManagerListener->pImpl_ = nullptr;
    displayManagerListener->OnDisplayDestroy(1);
    DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_ = nullptr;
}

/**
 * @tc.name: OnDisplayChange
 * @tc.desc: OnDisplayChange
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, OnDisplayChange, TestSize.Level1)
{
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(DMError::DM_OK));
    sptr<DisplayManagerLite::IDisplayListener> listener = new DmMockDisplayListener();
    DisplayManagerLite::GetInstance().RegisterDisplayListener(listener);
    auto displayManagerListener = DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_;
    ASSERT_NE(displayManagerListener, nullptr);
    DisplayChangeEvent event = DisplayChangeEvent::DISPLAY_SIZE_CHANGED;
    displayManagerListener->OnDisplayChange(nullptr, event);
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(DISPLAY_ID_INVALID);
    displayManagerListener->OnDisplayChange(displayInfo, event);
    displayInfo->SetDisplayId(0);
    displayManagerListener->OnDisplayChange(displayInfo, event);
    ASSERT_NE(displayManagerListener->pImpl_, nullptr);
    displayManagerListener->pImpl_ = nullptr;
    displayManagerListener->OnDisplayChange(displayInfo, event);
    DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_ = nullptr;
}

/**
 * @tc.name: ImplUpdateDisplayInfoLocked
 * @tc.desc: ImplUpdateDisplayInfoLocked fun
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, ImplUpdateDisplayInfoLocked, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(DISPLAY_ID_INVALID);
    auto ret = DisplayManagerLite::GetInstance().pImpl_->UpdateDisplayInfoLocked(displayInfo);
    ASSERT_EQ(ret, false);
    displayInfo.clear();
}

/**
 * @tc.name: ImplUpdateDisplayInfoLocked
 * @tc.desc: ImplUpdateDisplayInfoLocked fun
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, ImplUpdateDisplayInfoLocked01, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = nullptr;
    auto ret = DisplayManagerLite::GetInstance().pImpl_->UpdateDisplayInfoLocked(displayInfo);
    ASSERT_EQ(ret, false);
    displayInfo.clear();
}

/**
 * @tc.name: RegisterDisplayListener
 * @tc.desc: displayManagerListener_ == nullptr, ret == DMError::DM_OK
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, RegisterDisplayListener01, TestSize.Level1)
{
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(DMError::DM_OK));
    sptr<DisplayManagerLite::IDisplayListener> listener = new DmMockDisplayListener();
    DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_ = nullptr;
    DisplayManagerLite::GetInstance().RegisterDisplayListener(listener);
    auto displayManagerListener = DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_;
    ASSERT_NE(displayManagerListener, nullptr);
}

/**
 * @tc.name: RegisterDisplayListener
 * @tc.desc: ret ! = DMError::DM_OK
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, RegisterDisplayListener02, TestSize.Level1)
{
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(DMError::DM_ERROR_IPC_FAILED));
    sptr<DisplayManagerLite::IDisplayListener> listener = new DmMockDisplayListener();
    DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_ = nullptr;
    DisplayManagerLite::GetInstance().RegisterDisplayListener(listener);
    auto displayManagerListener = DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_;
    ASSERT_EQ(displayManagerListener, nullptr);
}

/**
 * @tc.name: RegisterDisplayListener
 * @tc.desc: listener == nullptr
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, RegisterDisplayListener03, TestSize.Level1)
{
    sptr<DisplayManagerLite::IDisplayListener> listener = nullptr;
    auto ret = DisplayManagerLite::GetInstance().RegisterDisplayListener(listener);
    ASSERT_EQ(ret, DMError::DM_ERROR_NULLPTR);
}

/**
 * @tc.name: RegisterDisplayListener
 * @tc.desc: displayManagerListener_ != nullptr
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, RegisterDisplayListener04, TestSize.Level1)
{
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(DMError::DM_OK));
    sptr<DisplayManagerLite::IDisplayListener> listener = new DmMockDisplayListener();
    sptr<DisplayManagerLite::IDisplayListener> listener1 = new DmMockDisplayListener();
    DisplayManagerLite::GetInstance().RegisterDisplayListener(listener);
    auto ret = DisplayManagerLite::GetInstance().RegisterDisplayListener(listener1);
    ASSERT_EQ(ret, DMError::DM_OK);
}

/**
 * @tc.name: UnregisterDisplayListener
 * @tc.desc: listener == nullptr
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, UnregisterDisplayListener01, TestSize.Level1)
{
    sptr<DisplayManagerLite::IDisplayListener> listener = nullptr;
    auto ret = DisplayManagerLite::GetInstance().UnregisterDisplayListener(listener);
    ASSERT_EQ(ret, DMError::DM_ERROR_NULLPTR);
}

/**
 * @tc.name: UnregisterDisplayListener
 * @tc.desc: iter == displayListeners_.end()
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, UnregisterDisplayListener02, TestSize.Level1)
{
    sptr<DisplayManagerLite::IDisplayListener> listener = new DmMockDisplayListener();
    auto ret = DisplayManagerLite::GetInstance().UnregisterDisplayListener(listener);
    ASSERT_EQ(ret, DMError::DM_ERROR_NULLPTR);
}

/**
 * @tc.name: UnregisterDisplayListener
 * @tc.desc: iter == displayListeners_.end()
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, UnregisterDisplayListener03, TestSize.Level1)
{
    sptr<DisplayManagerLite::IDisplayListener> listener = new DmMockDisplayListener();
    DisplayManagerLite::GetInstance().pImpl_->displayListeners_.insert(listener);
    auto ret = DisplayManagerLite::GetInstance().UnregisterDisplayListener(listener);
    ASSERT_EQ(ret, DMError::DM_OK);
}

/**
 * @tc.name: RegisterFoldStatusListener
 * @tc.desc: listener == nullptr
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, RegisterFoldStatusListener01, TestSize.Level1)
{
    sptr<DisplayManagerLite::IFoldStatusListener> listener = nullptr;
    auto ret = DisplayManagerLite::GetInstance().RegisterFoldStatusListener(listener);
    ASSERT_EQ(ret, DMError::DM_ERROR_NULLPTR);
}

/**
 * @tc.name: RegisterFoldStatusListener
 * @tc.desc: listener == nullptr
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, RegisterFoldStatusListener02, TestSize.Level1)
{
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(DMError::DM_OK));
    sptr<DisplayManagerLite::IFoldStatusListener> listener = new DmMockFoldStatusListener();
    auto ret = DisplayManagerLite::GetInstance().RegisterFoldStatusListener(listener);
    ASSERT_EQ(ret, DMError::DM_OK);
    DisplayManagerLite::GetInstance().pImpl_->foldStatusListenerAgent_ = nullptr;
}

/**
 * @tc.name: RegisterFoldStatusListener
 * @tc.desc: foldStatusListenerAgent_ == nullptr, ret != DMError::DM_OK
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, RegisterFoldStatusListener03, TestSize.Level1)
{
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(DMError::DM_ERROR_IPC_FAILED));
    sptr<DisplayManagerLite::IFoldStatusListener> listener = new DmMockFoldStatusListener();
    DisplayManagerLite::GetInstance().RegisterFoldStatusListener(listener);
    ASSERT_EQ(DisplayManagerLite::GetInstance().pImpl_->foldStatusListenerAgent_, nullptr);
}

/**
 * @tc.name: RegisterFoldStatusListener
 * @tc.desc: foldStatusListenerAgent_ != nullptr, ret == DMError::DM_OK
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, RegisterFoldStatusListener04, TestSize.Level1)
{
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(DMError::DM_OK));
    sptr<DisplayManagerLite::IFoldStatusListener> listener = new DmMockFoldStatusListener();
    sptr<DisplayManagerLite::IFoldStatusListener> listener1 = new DmMockFoldStatusListener();
    DisplayManagerLite::GetInstance().RegisterFoldStatusListener(listener);
    auto ret = DisplayManagerLite::GetInstance().RegisterFoldStatusListener(listener1);
    ASSERT_EQ(ret, DMError::DM_OK);
}

/**
 * @tc.name: UnregisterFoldStatusListener
 * @tc.desc: foldStatusListenerAgent_ != nullptr, ret == DMError::DM_OK
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, UnregisterFoldStatusListener01, TestSize.Level1)
{
    sptr<DisplayManagerLite::IFoldStatusListener> listener = nullptr;
    auto ret = DisplayManagerLite::GetInstance().UnregisterFoldStatusListener(listener);
    ASSERT_EQ(ret, DMError::DM_ERROR_NULLPTR);
}

/**
 * @tc.name: UnregisterFoldStatusListener
 * @tc.desc: iter == foldStatusListeners_.end()
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, UnregisterFoldStatusListener02, TestSize.Level1)
{
    sptr<DisplayManagerLite::IFoldStatusListener> listener = new DmMockFoldStatusListener();
    auto ret = DisplayManagerLite::GetInstance().UnregisterFoldStatusListener(listener);
    ASSERT_EQ(ret, DMError::DM_ERROR_NULLPTR);
}

/**
 * @tc.name: UnregisterFoldStatusListener
 * @tc.desc: iter != foldStatusListeners_.end()
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, UnregisterFoldStatusListener03, TestSize.Level1)
{
    sptr<DisplayManagerLite::IFoldStatusListener> listener = new DmMockFoldStatusListener();
    DisplayManagerLite::GetInstance().pImpl_->foldStatusListeners_.insert(listener);
    auto ret = DisplayManagerLite::GetInstance().UnregisterFoldStatusListener(listener);
    ASSERT_EQ(ret, DMError::DM_OK);
}

/**
 * @tc.name: GetDefaultDisplay
 * @tc.desc: GetDefaultDisplay
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetDefaultDisplay, TestSize.Level1)
{
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    int32_t defaultUserId = CONCURRENT_USER_ID_DEFAULT;
    EXPECT_CALL(m->Mock(), GetDefaultDisplayInfo(defaultUserId)).Times(1).WillOnce(Return(nullptr));
    auto ret = DisplayManagerLite::GetInstance().GetDefaultDisplay();
    ASSERT_EQ(ret, nullptr);
}

/**
 * @tc.name: GetDisplayById
 * @tc.desc: destroyed_ == false
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetDisplayById01, TestSize.Level1)
{
    DisplayId displayId = 1000;
    auto ret = DisplayManagerLite::GetInstance().GetDisplayById(displayId);
    ASSERT_EQ(ret, nullptr);
}

/**
 * @tc.name: GetDisplayById
 * @tc.desc: UpdateDisplayInfoLocked
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetDisplayById02, TestSize.Level1)
{
    DisplayManagerLite::GetInstance().destroyed_ = false;
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    EXPECT_CALL(m->Mock(), GetDisplayInfo(_)).Times(1).WillOnce(Return(nullptr));
    DisplayId displayId = 1000;
    auto ret = DisplayManagerLite::GetInstance().GetDisplayById(displayId);
    ASSERT_EQ(ret, nullptr);
}

/**
 * @tc.name: OnDisplayCreate02
 * @tc.desc: OnDisplayCreate
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, OnDisplayCreate02, TestSize.Level1)
{
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(DMError::DM_OK));
    sptr<DisplayManagerLite::IDisplayListener> listener = new DmMockDisplayListener();
    DisplayManagerLite::GetInstance().RegisterDisplayListener(listener);
    auto displayManagerListener = DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_;
    ASSERT_NE(displayManagerListener, nullptr);
    displayManagerListener->OnDisplayCreate(nullptr);
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(DISPLAY_ID_INVALID);
    displayManagerListener->OnDisplayCreate(displayInfo);
    displayInfo->SetDisplayId(1000);
    displayManagerListener->OnDisplayCreate(displayInfo);
    ASSERT_NE(displayManagerListener->pImpl_, nullptr);
    displayManagerListener->pImpl_ = nullptr;
    displayManagerListener->OnDisplayCreate(displayInfo);
    DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_ = nullptr;
}

/**
 * @tc.name: OnDisplayDestroy02
 * @tc.desc: OnDisplayDestroy02
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, OnDisplayDestroy02, TestSize.Level1)
{
    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(DMError::DM_OK));
    sptr<DisplayManagerLite::IDisplayListener> listener = new DmMockDisplayListener();
    DisplayManagerLite::GetInstance().RegisterDisplayListener(listener);
    auto displayManagerListener = DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_;
    ASSERT_NE(displayManagerListener, nullptr);
    displayManagerListener->OnDisplayDestroy(DISPLAY_ID_INVALID);
    displayManagerListener->OnDisplayDestroy(10);
    displayManagerListener->pImpl_ = nullptr;
    displayManagerListener->OnDisplayDestroy(1000);
    DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_ = nullptr;
}

/**
 * @tc.name: ImplUpdateDisplayInfoLocked
 * @tc.desc: ImplUpdateDisplayInfoLocked fun
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, ImplUpdateDisplayInfoLocked03, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(10);
    auto ret = DisplayManagerLite::GetInstance().pImpl_->UpdateDisplayInfoLocked(displayInfo);
    ASSERT_EQ(ret, false);
    displayInfo.clear();
}

/**
 * @tc.name: ImplUpdateDisplayInfoLocked
 * @tc.desc: ImplUpdateDisplayInfoLocked fun
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, ImplUpdateDisplayInfoLocked04, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(1000);
    auto ret = DisplayManagerLite::GetInstance().pImpl_->UpdateDisplayInfoLocked(displayInfo);
    ASSERT_EQ(ret, false);
    displayInfo.clear();
}

/**
 * @tc.name: GetDisplayById
 * @tc.desc: destroyed_ == false
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetDisplayById03, TestSize.Level1)
{
    DisplayId displayId = DISPLAY_ID_INVALID;
    auto ret = DisplayManagerLite::GetInstance().GetDisplayById(displayId);
    ASSERT_EQ(ret, nullptr);
}

/**
 * @tc.name: GetDisplayById
 * @tc.desc: destroyed_ == false
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetDisplayById04, TestSize.Level1)
{
    DisplayId displayId = 10;
    auto ret = DisplayManagerLite::GetInstance().GetDisplayById(displayId);
    ASSERT_EQ(ret, nullptr);
}

/**
 * @tc.name: IsFoldable
 * @tc.desc: IsFoldable
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, IsFoldable, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = nullptr;
    auto ret = DisplayManagerLite::GetInstance().pImpl_->IsFoldable();
    ASSERT_EQ(ret, false);
    displayInfo.clear();
}

/**
 * @tc.name: IsFoldable01
 * @tc.desc: IsFoldable01
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, IsFoldable01, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(DISPLAY_ID_INVALID);
    auto ret = DisplayManagerLite::GetInstance().pImpl_->IsFoldable();
    ASSERT_EQ(ret, false);
    displayInfo.clear();
}

/**
 * @tc.name: IsFoldable02
 * @tc.desc: IsFoldable02
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, IsFoldable02, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(10);
    auto ret = DisplayManagerLite::GetInstance().pImpl_->IsFoldable();
    ASSERT_EQ(ret, false);
    displayInfo.clear();
}

/**
 * @tc.name: GetFoldStatus
 * @tc.desc: GetFoldStatus
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetFoldStatus, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = nullptr;
    auto ret = DisplayManagerLite::GetInstance().pImpl_->GetFoldStatus();
    ASSERT_EQ(ret, FoldStatus::UNKNOWN);
    displayInfo.clear();
}

/**
 * @tc.name: GetFoldStatus01
 * @tc.desc: GetFoldStatus01
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetFoldStatus01, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(DISPLAY_ID_INVALID);
    auto ret = DisplayManagerLite::GetInstance().pImpl_->GetFoldStatus();
    ASSERT_EQ(ret, FoldStatus::UNKNOWN);
    displayInfo.clear();
}

/**
 * @tc.name: GetFoldStatus02
 * @tc.desc: GetFoldStatus02
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetFoldStatus02, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(10);
    auto ret = DisplayManagerLite::GetInstance().pImpl_->GetFoldStatus();
    ASSERT_EQ(ret, FoldStatus::UNKNOWN);
    displayInfo.clear();
}

/**
 * @tc.name: GetFoldStatus03
 * @tc.desc: GetFoldStatus03
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetFoldStatus03, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(1000);
    auto ret = DisplayManagerLite::GetInstance().pImpl_->GetFoldStatus();
    ASSERT_EQ(ret, FoldStatus::UNKNOWN);
    displayInfo.clear();
}

/**
 * @tc.name: GetFoldDisplayMode
 * @tc.desc: GetFoldDisplayMode
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetFoldDisplayMode, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = nullptr;
    auto ret = DisplayManagerLite::GetInstance().pImpl_->GetFoldDisplayMode();
    ASSERT_EQ(ret, FoldDisplayMode::UNKNOWN);
    displayInfo.clear();
}

/**
 * @tc.name: GetFoldDisplayMode01
 * @tc.desc: GetFoldDisplayMode01
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetFoldDisplayMode01, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(DISPLAY_ID_INVALID);
    auto ret = DisplayManagerLite::GetInstance().pImpl_->GetFoldDisplayMode();
    ASSERT_EQ(ret, FoldDisplayMode::UNKNOWN);
    displayInfo.clear();
}

/**
 * @tc.name: GetFoldDisplayMode02
 * @tc.desc: GetFoldDisplayMode02
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetFoldDisplayMode02, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(10);
    auto ret = DisplayManagerLite::GetInstance().pImpl_->GetFoldDisplayMode();
    ASSERT_EQ(ret, FoldDisplayMode::UNKNOWN);
    displayInfo.clear();
}

/**
 * @tc.name: GetFoldDisplayMode03
 * @tc.desc: GetFoldDisplayMode03
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetFoldDisplayMode03, TestSize.Level1)
{
    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(1000);
    auto ret = DisplayManagerLite::GetInstance().pImpl_->GetFoldDisplayMode();
    ASSERT_EQ(ret, FoldDisplayMode::UNKNOWN);
    displayInfo.clear();
}

/**
 * @tc.name: GetScreenBrightness
 * @tc.desc: GetScreenBrightness
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetScreenBrightness, TestSize.Level1)
{
    uint64_t screenId = 2;
    auto ret = DisplayManagerLite::GetInstance().GetScreenBrightness(screenId);
    ASSERT_FALSE(ret == 1);
}

/**
 * @tc.name: RegisterScreenMagneticStateListener
 * @tc.desc: RegisterScreenMagneticStateListener fun
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, RegisterScreenMagneticStateListener, TestSize.Level1)
{
    sptr<DisplayManagerLite::IScreenMagneticStateListener> listener;
    auto ret = DisplayManagerLite::GetInstance().RegisterScreenMagneticStateListener(listener);
    ASSERT_EQ(ret, DMError::DM_ERROR_NULLPTR);
    listener = new DisplayManagerLite::IScreenMagneticStateListener();
    ret = DisplayManagerLite::GetInstance().RegisterScreenMagneticStateListener(listener);
    ASSERT_EQ(ret, DisplayManagerLite::GetInstance().pImpl_->RegisterScreenMagneticStateListener(listener));
    listener.clear();
}

/**
 * @tc.name: ImplRegisterScreenMagneticStateListener
 * @tc.desc: ImplRegisterScreenMagneticStateListener fun
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, ImplRegisterScreenMagneticStateListener, TestSize.Level1)
{
    sptr<DisplayManagerLite::IScreenMagneticStateListener> listener;
    DisplayManagerLite::GetInstance().pImpl_->screenMagneticStateListenerAgent_ = nullptr;
    sptr<DisplayManagerLite::Impl> impl_;
    sptr<DisplayManagerLite::Impl::DisplayManagerScreenMagneticStateAgent> screenMagneticStateListenerAgent =
        new DisplayManagerLite::Impl::DisplayManagerScreenMagneticStateAgent(impl_);
    auto ret = DisplayManagerLite::GetInstance().pImpl_->RegisterScreenMagneticStateListener(listener);
    ASSERT_EQ(ret, SingletonContainer::Get<DisplayManagerAdapterLite>().RegisterDisplayManagerAgent(
            screenMagneticStateListenerAgent,
            DisplayManagerAgentType::SCREEN_MAGNETIC_STATE_CHANGED_LISTENER));
    listener.clear();
    screenMagneticStateListenerAgent.clear();
}

/**
 * @tc.name: UnregisterScreenMagneticStateListener
 * @tc.desc: UnregisterScreenMagneticStateListener fun
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, UnregisterScreenMagneticStateListener, TestSize.Level1)
{
    sptr<DisplayManagerLite::IScreenMagneticStateListener> listener;
    auto ret = DisplayManagerLite::GetInstance().UnregisterScreenMagneticStateListener(listener);
    ASSERT_EQ(ret, DMError::DM_ERROR_NULLPTR);
    listener = new DisplayManagerLite::IScreenMagneticStateListener();
    ret = DisplayManagerLite::GetInstance().UnregisterScreenMagneticStateListener(listener);
    ASSERT_EQ(ret, DisplayManagerLite::GetInstance().pImpl_->UnregisterScreenMagneticStateListener(listener));
    listener.clear();
}

/**
 * @tc.name: ImplUnregisterScreenMagneticStateListener
 * @tc.desc: ImplUnregisterScreenMagneticStateListener fun
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, ImplUnregisterScreenMagneticStateListener, TestSize.Level1)
{
    sptr<DisplayManagerLite::IScreenMagneticStateListener> listener;
    auto ret = DisplayManagerLite::GetInstance().pImpl_->UnregisterScreenMagneticStateListener(listener);
    EXPECT_EQ(ret, DMError::DM_ERROR_NULLPTR);
    listener.clear();
}

/**
 * @tc.name: SetSystemKeyboardStatus
 * @tc.desc: SetSystemKeyboardStatus with true as parameter
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, SetSystemKeyboardStatus01, TestSize.Level1)
{
    auto ret = DisplayManagerLite::GetInstance().SetSystemKeyboardStatus(true);
    ASSERT_NE(ret, DMError::DM_OK);
}
 
/**
 * @tc.name: SetSystemKeyboardStatus
 * @tc.desc: SetSystemKeyboardStatus with false as parameter
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, SetSystemKeyboardStatus02, TestSize.Level1)
{
    auto ret = DisplayManagerLite::GetInstance().SetSystemKeyboardStatus(false);
    ASSERT_NE(ret, DMError::DM_OK);
}

/**
 * @tc.name: ClearDisplayStateCallbackLite01
 * @tc.desc: ClearDisplayStateCallbackLite01 test
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, ClearDisplayStateCallbackLite01, TestSize.Level1)
{
    DisplayManagerLite::GetInstance().pImpl_->ClearDisplayStateCallback();
    EXPECT_TRUE(DisplayManagerLite::GetInstance().pImpl_->displayStateAgent_ == nullptr);
}

/**
 * @tc.name: ClearFoldStatusCallbackLite01
 * @tc.desc: ClearFoldStatusCallbackLite01 test
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, ClearFoldStatusCallbackLite01, TestSize.Level1)
{
    DisplayManagerLite::GetInstance().pImpl_->ClearFoldStatusCallback();
    EXPECT_TRUE(DisplayManagerLite::GetInstance().pImpl_->foldStatusListenerAgent_ == nullptr);
}

/**
 * @tc.name: ClearDisplayModeCallbackLite01
 * @tc.desc: ClearDisplayModeCallbackLite01 test
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, ClearDisplayModeCallbackLite01, TestSize.Level1)
{
    DisplayManagerLite::GetInstance().pImpl_->ClearDisplayModeCallback();
    EXPECT_TRUE(DisplayManagerLite::GetInstance().pImpl_->displayModeListenerAgent_ == nullptr);
}

/**
 * @tc.name: IsOnboardDisplay
 * @tc.desc: IsOnboardDisplay fail and succeed
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, IsOnboardDisplay, TestSize.Level1)
{
    g_errLog.clear();
    LOG_SetCallback(MyLogCallback);

    DisplayId displayId = DISPLAY_ID_INVALID;
    bool isOnboardDisplay = false;
    DisplayManagerLite::GetInstance().IsOnboardDisplay(displayId, isOnboardDisplay);
    EXPECT_TRUE(g_errLog.find("id invalid") != std::string::npos);

    g_errLog.clear();
    displayId = 10;
    DisplayManagerLite::GetInstance().IsOnboardDisplay(displayId, isOnboardDisplay);
    EXPECT_TRUE(g_errLog.find("id invalid") == std::string::npos);
    LOG_SetCallback(nullptr);
}

/**
 * @tc.name: SetScreenSwitchState01
 * @tc.desc: SetScreenSwitchState with CLOSE state and screen off
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, SetScreenSwitchState01, TestSize.Level1)
{
    g_errLog.clear();
    LOG_SetCallback(MyLogCallback);

    std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
    ScreenClosedState screenClosedState = ScreenClosedState::CLOSE;
    bool isScreenOn = false;

    EXPECT_CALL(m->Mock(), SetScreenSwitchState(screenClosedState, isScreenOn))
        .Times(1)
        .WillOnce(Return(DMError::DM_OK));

    DMError ret = DisplayManagerLite::GetInstance().SetScreenSwitchState(screenClosedState, isScreenOn);
    EXPECT_EQ(ret, DMError::DM_OK);
    EXPECT_TRUE(g_errLog.find("[UL_POWER] start") != std::string::npos);
    
    LOG_SetCallback(nullptr);
}

/**
 * @tc.name: OnDisplayAttributeChange
 * @tc.desc: OnDisplayAttributeChange test
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, OnDisplayAttributeChange, Function | SmallTest | Level1)
{
    sptr<DisplayManagerLite::IDisplayAttributeListener> listener = new DmMockDisplayAttributeListener();
    std::vector<std::string> attributes = { "rotation" };
    auto ret = DisplayManagerLite::GetInstance().RegisterDisplayAttributeListener(attributes, listener);
    ASSERT_EQ(ret, DMError::DM_OK);
    auto displayAttributeAgent = DisplayManagerLite::GetInstance().pImpl_->displayManagerAttributeAgent_;
    ASSERT_NE(displayAttributeAgent, nullptr);
    displayAttributeAgent->OnDisplayAttributeChange(nullptr, attributes);

    sptr<DisplayInfo> displayInfo = new DisplayInfo();
    displayInfo->SetDisplayId(DISPLAY_ID_INVALID);
    displayAttributeAgent->OnDisplayAttributeChange(displayInfo, attributes);

    attributes = {};
    displayAttributeAgent->OnDisplayAttributeChange(displayInfo, attributes);

    displayInfo->SetDisplayId(0);
    attributes = { "rotation" };
    displayAttributeAgent->OnDisplayAttributeChange(displayInfo, attributes);

    ASSERT_NE(displayAttributeAgent->pImpl_, nullptr);
    displayAttributeAgent->pImpl_ = nullptr;
    displayAttributeAgent->OnDisplayAttributeChange(displayInfo, attributes);
    DisplayManagerLite::GetInstance().pImpl_->displayManagerListener_ = nullptr;
}

/**
 * @tc.name: RegisterDisplayAttributeListener
 * @tc.desc: RegisterDisplayAttributeListener test
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, RegisterDisplayAttributeListener, TestSize.Level1)
{
    sptr<DisplayManagerLite::IDisplayAttributeListener> listener;
    std::vector<std::string> attributes = { "rotation" };
    auto ret = DisplayManagerLite::GetInstance().RegisterDisplayAttributeListener(attributes, listener);
    ASSERT_EQ(ret, DMError::DM_ERROR_NULLPTR);
    listener = new DmMockDisplayAttributeListener();
    ret = DisplayManagerLite::GetInstance().RegisterDisplayAttributeListener(attributes, listener);
    ASSERT_EQ(ret, DisplayManagerLite::GetInstance().pImpl_->RegisterDisplayAttributeListener(attributes, listener));
    listener.clear();
}

/**
 * @tc.name: ImplRegisterDisplayAttributeListener
 * @tc.desc: ImplRegisterDisplayAttributeListener test
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, ImplRegisterDisplayAttributeListener, TestSize.Level1)
{
    std::recursive_mutex mutex;
    sptr<DisplayManagerLite::Impl> impl_;
    sptr<DisplayManagerLite::IDisplayAttributeListener> listener;
    DisplayManagerLite::GetInstance().pImpl_->displayManagerAttributeAgent_ = nullptr;
    sptr<DisplayManagerLite::Impl::DisplayManagerAttributeAgent> displayManagerAttributeAgent =
        new DisplayManagerLite::Impl::DisplayManagerAttributeAgent(impl_);
    std::vector<std::string> attributes{};
    auto ret = DisplayManagerLite::GetInstance().pImpl_->RegisterDisplayAttributeListener(attributes, listener);
    attributes = { "rotation" };
    ret = DisplayManagerLite::GetInstance().pImpl_->RegisterDisplayAttributeListener(attributes, listener);
    ASSERT_EQ(ret, SingletonContainer::Get<DisplayManagerAdapterLite>().RegisterDisplayAttributeAgent(
        attributes, displayManagerAttributeAgent));
    listener.clear();
    displayManagerAttributeAgent.clear();
}

/**
 * @tc.name: UnregisterDisplayAttributeListener
 * @tc.desc: UnregisterDisplayAttributeListener test
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, UnregisterDisplayAttributeListener, TestSize.Level1)
{
    sptr<DisplayManagerLite::IDisplayAttributeListener> listener;
    auto ret = DisplayManagerLite::GetInstance().UnregisterDisplayAttributeListener(listener);
    ASSERT_EQ(ret, DMError::DM_ERROR_NULLPTR);
    listener = new DmMockDisplayAttributeListener();
    ret = DisplayManagerLite::GetInstance().UnregisterDisplayAttributeListener(listener);
    ASSERT_EQ(ret, DisplayManagerLite::GetInstance().pImpl_->UnregisterDisplayAttributeListener(listener));
    listener.clear();
}

/**
 * @tc.name: UnregisterDisplayAttribute
 * @tc.desc: UnregisterDisplayAttribute test
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, UnregisterDisplayAttribute, TestSize.Level1)
{
    std::vector<std::string> attributes = { "rotation" };
    auto displayManagerAttributeAgent = DisplayManagerLite::GetInstance().pImpl_->displayManagerAttributeAgent_;
    DisplayManagerLite::GetInstance().pImpl_->displayManagerAttributeAgent_ = nullptr;
    auto ret = DisplayManagerLite::GetInstance().pImpl_->UnregisterDisplayAttribute(attributes);
    ASSERT_EQ(ret, DMError::DM_OK);

    DisplayManagerLite::GetInstance().pImpl_->displayManagerAttributeAgent_ = displayManagerAttributeAgent;
    ret = DisplayManagerLite::GetInstance().pImpl_->UnregisterDisplayAttribute(attributes);
    ASSERT_EQ(ret, DMError::DM_OK);

    attributes = {};
    ret = DisplayManagerLite::GetInstance().pImpl_->UnregisterDisplayAttribute(attributes);
    ASSERT_EQ(ret, DMError::DM_ERROR_INVALID_PARAM);
}

/**
 * @tc.name: GetCurrentFoldCreaseRegion01
 * @tc.desc: GetCurrentFoldCreaseRegion test
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetCurrentFoldCreaseRegion01, TestSize.Level1)
{
    auto ret = DisplayManagerLite::GetInstance().GetCurrentFoldCreaseRegion();
    if (ret != nullptr) {
        ASSERT_NE(ret->GetDisplayId(), DISPLAY_ID_INVALID);
    }
}

/**
 * @tc.name: GetCurrentFoldCreaseRegion02
 * @tc.desc: GetCurrentFoldCreaseRegion test with impl
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetCurrentFoldCreaseRegion02, TestSize.Level1)
{
    auto ret = DisplayManagerLite::GetInstance().pImpl_->GetCurrentFoldCreaseRegion();
    if (ret != nullptr) {
        ASSERT_NE(ret->GetDisplayId(), DISPLAY_ID_INVALID);
    }
}

/**
 * @tc.name: GetCurrentFoldCreaseRegion03
 * @tc.desc: GetCurrentFoldCreaseRegion test check creaseRects
 * @tc.type: FUNC
 */
HWTEST_F(DisplayManagerTest, GetCurrentFoldCreaseRegion03, TestSize.Level1)
{
    auto ret = DisplayManagerLite::GetInstance().GetCurrentFoldCreaseRegion();
    if (ret != nullptr) {
        auto creaseRects = ret->GetCreaseRects();
        ASSERT_TRUE(creaseRects.size() <= 20);
    }
}
}
} // namespace Rosen
} // namespace OHOS