/*
 * Copyright (c) 2020-2021 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 "components/ui_digital_clock.h"
#include <climits>
#include <gtest/gtest.h>

using namespace testing::ext;

namespace OHOS {
namespace {
    const uint8_t CURRENT_HOUR = 14;
    const uint8_t CURRENT_MINUTE = 40;
    const uint8_t CURRENT_SECOND = 30;
    const uint8_t HALF_DAY_IN_HOUR = 12;
}

class UIDigitalClockTest : public testing::Test {
public:
    static void SetUpTestCase(void);
    static void TearDownTestCase(void);
    static UIDigitalClock* digitalClock_;
};

UIDigitalClock* UIDigitalClockTest::digitalClock_ = nullptr;

void UIDigitalClockTest::SetUpTestCase(void)
{
    if (digitalClock_ == nullptr) {
        digitalClock_ = new UIDigitalClock();
    }
}

void UIDigitalClockTest::TearDownTestCase(void)
{
    if (digitalClock_ != nullptr) {
        delete digitalClock_;
        digitalClock_ = nullptr;
    }
}

/**
 * @tc.name: UIDigitalClockGetViewType_001
 * @tc.desc: Verify GetViewType function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000EEMQ4
 */
HWTEST_F(UIDigitalClockTest, UIDigitalClockGetViewType_001, TestSize.Level1)
{
    if (digitalClock_ == nullptr) {
        EXPECT_EQ(1, 0);
        return;
    }
    EXPECT_EQ(digitalClock_->GetViewType(), UI_DIGITAL_CLOCK);
}

/**
 * @tc.name: UIDigitalClockSetFontId_001
 * @tc.desc: Verify SetFontId function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000EEMQ4
 */
HWTEST_F(UIDigitalClockTest, UIDigitalClockSetFontId_001, TestSize.Level1)
{
    if (digitalClock_ == nullptr) {
        EXPECT_EQ(1, 0);
        return;
    }
    const uint16_t fontId = 10;
    digitalClock_->SetFontId(fontId);
    EXPECT_EQ(digitalClock_->GetStyle(STYLE_TEXT_FONT), fontId);
}

/**
 * @tc.name: UIDigitalClockSetDisplayMode_001
 * @tc.desc: Verify SetDisplayMode function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000EEMQ4
 */
HWTEST_F(UIDigitalClockTest, UIDigitalClockSetDisplayMode_001, TestSize.Level0)
{
    if (digitalClock_ == nullptr) {
        EXPECT_EQ(1, 0);
        return;
    }
    digitalClock_->SetDisplayMode(UIDigitalClock::DisplayMode::DISPLAY_12_HOUR_NO_SECONDS);
    EXPECT_EQ(digitalClock_->GetDisplayMode(), UIDigitalClock::DisplayMode::DISPLAY_12_HOUR_NO_SECONDS);
    digitalClock_->SetDisplayMode(UIDigitalClock::DisplayMode::DISPLAY_24_HOUR_NO_SECONDS);
    EXPECT_EQ(digitalClock_->GetDisplayMode(), UIDigitalClock::DisplayMode::DISPLAY_24_HOUR_NO_SECONDS);
    digitalClock_->SetDisplayMode(UIDigitalClock::DisplayMode::DISPLAY_12_HOUR);
    EXPECT_EQ(digitalClock_->GetDisplayMode(), UIDigitalClock::DisplayMode::DISPLAY_12_HOUR);
    digitalClock_->SetDisplayMode(UIDigitalClock::DisplayMode::DISPLAY_24_HOUR);
    EXPECT_EQ(digitalClock_->GetDisplayMode(), UIDigitalClock::DisplayMode::DISPLAY_24_HOUR);
}

/**
 * @tc.name: UIDigitalClockSetOpacity_001
 * @tc.desc: Verify SetOpacity function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000EEMQ4
 */
HWTEST_F(UIDigitalClockTest, UIDigitalClockSetOpacity_001, TestSize.Level1)
{
    if (digitalClock_ == nullptr) {
        EXPECT_EQ(1, 0);
        return;
    }
    digitalClock_->SetOpacity(OPA_OPAQUE);
    EXPECT_EQ(digitalClock_->GetOpacity(), OPA_OPAQUE);
}

/**
 * @tc.name: UIDigitalClockSetTime24Hour_001
 * @tc.desc: Verify SetTime24Hour function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000EEMQ4
 */
HWTEST_F(UIDigitalClockTest, UIDigitalClockSetTime24Hour_001, TestSize.Level1)
{
    if (digitalClock_ == nullptr) {
        EXPECT_EQ(1, 0);
        return;
    }
    digitalClock_->SetTime24Hour(CURRENT_HOUR, CURRENT_MINUTE, CURRENT_SECOND);
    EXPECT_EQ(digitalClock_->GetCurrentHour(), CURRENT_HOUR);
    EXPECT_EQ(digitalClock_->GetCurrentMinute(), CURRENT_MINUTE);
    EXPECT_EQ(digitalClock_->GetCurrentSecond(), CURRENT_SECOND);
}

/**
 * @tc.name: UIDigitalClockSetTime12Hour_001
 * @tc.desc: Verify SetTime12Hour function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000EEMQ4
 */
HWTEST_F(UIDigitalClockTest, UIDigitalClockSetTime12Hour_001, TestSize.Level1)
{
    if (digitalClock_ == nullptr) {
        EXPECT_EQ(1, 0);
        return;
    }
    digitalClock_->SetTime12Hour(CURRENT_HOUR, CURRENT_MINUTE, CURRENT_SECOND, true);
    EXPECT_EQ(digitalClock_->GetCurrentHour(), CURRENT_HOUR - HALF_DAY_IN_HOUR);
    EXPECT_EQ(digitalClock_->GetCurrentMinute(), CURRENT_MINUTE);
    EXPECT_EQ(digitalClock_->GetCurrentSecond(), CURRENT_SECOND);
}

/**
 * @tc.name: UIDigitalClockSetTime12Hour_002
 * @tc.desc: Verify SetTime12Hour function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000EEMQ4
 */
HWTEST_F(UIDigitalClockTest, UIDigitalClockSetTime12Hour_002, TestSize.Level1)
{
    if (digitalClock_ == nullptr) {
        EXPECT_EQ(1, 0);
        return;
    }
    digitalClock_->SetTime12Hour(CURRENT_HOUR, CURRENT_MINUTE, CURRENT_SECOND, false);
    EXPECT_EQ(digitalClock_->GetCurrentHour(), CURRENT_HOUR);
    EXPECT_EQ(digitalClock_->GetCurrentMinute(), CURRENT_MINUTE);
    EXPECT_EQ(digitalClock_->GetCurrentSecond(), CURRENT_SECOND);
}

/**
 * @tc.name: UIDigitalClockSetFont_001
 * @tc.desc: Verify SetFont function, equal.
 */
HWTEST_F(UIDigitalClockTest, UIDigitalClockSetFont_001, TestSize.Level1)
{
    if (digitalClock_ == nullptr) {
        EXPECT_EQ(1, 0);
        return;
    }
    uint8_t size = 10;
    const char* name = "xxx";
    digitalClock_->SetFont(name, size);
    digitalClock_->UpdateClock(false);
    Text* text = new Text();
    EXPECT_EQ(text->GetFontId(), 0);
    delete text;
    text = nullptr;
}

/**
 * @tc.name: UIDigitalClockSetColor_001
 * @tc.desc: Verify SetColor function, equal.
 */
HWTEST_F(UIDigitalClockTest, UIDigitalClockSetColor_001, TestSize.Level1)
{
    if (digitalClock_ == nullptr) {
        EXPECT_EQ(1, 0);
        return;
    }
    ColorType color = Color::Red();
    digitalClock_->SetColor(color);
    EXPECT_EQ(digitalClock_->GetColor().full, color.full);
}

/**
 * @tc.name: UIDigitalClockDisplayLeadingZero_001
 * @tc.desc: Verify DisplayLeadingZero function, equal.
 */
HWTEST_F(UIDigitalClockTest, UIDigitalClockDisplayLeadingZero_001, TestSize.Level1)
{
    if (digitalClock_ == nullptr) {
        EXPECT_EQ(1, 0);
        return;
    }
    bool flag = false;
    digitalClock_->DisplayLeadingZero(flag);
    EXPECT_EQ(digitalClock_->GetLeadingZero(), flag);
}
}