/*
 * 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_scroll_view.h"
#include <climits>
#include <gtest/gtest.h>

using namespace testing::ext;
namespace OHOS {
namespace {
    const uint16_t size = 0;
    const EasingFunc func(EasingEquation::CubicEaseOut);
    const uint8_t value = 0;
    const uint8_t threshold = 2;
    const uint8_t side = 0;
    const Point center = {0, 0};
}

class ScrollViewTest : public testing::Test {
public:
    static void SetUpTestCase();
    static void TearDownTestCase();
    static UIScrollView* scrollView_;
};

UIScrollView* ScrollViewTest::scrollView_ = nullptr;

void ScrollViewTest::SetUpTestCase()
{
    if (scrollView_ == nullptr) {
        scrollView_ = new UIScrollView();
    }
}

void ScrollViewTest::TearDownTestCase()
{
    if (scrollView_ != nullptr) {
        delete scrollView_;
        scrollView_ = nullptr;
    }
}

/**
 * @tc.name: UIScrollViewSetScrollState_001
 * @tc.desc: Verify SetScrollState function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000DSMQE
 */
HWTEST_F(ScrollViewTest, UIScrollViewSetScrollState_001, TestSize.Level0)
{
    UIScrollView::OnScrollListener* scrollListener = new UIScrollView::OnScrollListener();
    if (scrollListener == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    uint8_t state = UIScrollView::OnScrollListener::SCROLL_STATE_MOVE;
    scrollListener->SetScrollState(state);
    EXPECT_EQ(scrollListener->GetScrollState(), state);

    state = UIScrollView::OnScrollListener::SCROLL_STATE_STOP;
    scrollListener->SetScrollState(state);
    EXPECT_EQ(scrollListener->GetScrollState(), state);
    delete scrollListener;
}

/**
 * @tc.name: UIScrollViewGetViewType_001
 * @tc.desc: Verify GetViewType function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000DSMQE
 */
HWTEST_F(ScrollViewTest, UIScrollViewGetViewType_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    EXPECT_EQ(scrollView_->GetViewType(), UI_SCROLL_VIEW);
}

/**
 * @tc.name: UIScrollViewSetHorizontalScrollState_001
 * @tc.desc: Verify SetHorizontalScrollState function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000DSMQE
 */
HWTEST_F(ScrollViewTest, UIScrollViewSetHorizontalScrollState_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    scrollView_->SetHorizontalScrollState(false);
    EXPECT_EQ(scrollView_->GetHorizontalScrollState(), false);

    scrollView_->SetHorizontalScrollState(true);
    EXPECT_EQ(scrollView_->GetHorizontalScrollState(), true);
}

/**
 * @tc.name: UIScrollViewSetVerticalScrollState_001
 * @tc.desc: Verify SetVerticalScrollState function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000DSMQE
 */
HWTEST_F(ScrollViewTest, UIScrollViewSetVerticalScrollState_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    scrollView_->SetVerticalScrollState(false);
    EXPECT_EQ(scrollView_->GetVerticalScrollState(), false);

    scrollView_->SetVerticalScrollState(true);
    EXPECT_EQ(scrollView_->GetVerticalScrollState(), true);
}

/**
 * @tc.name: UIScrollViewSetMaxScrollDistance_001
 * @tc.desc: Verify SetMaxScrollDistance function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000E2RJK
 */
HWTEST_F(ScrollViewTest, UIScrollViewSetMaxScrollDistance_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    const uint16_t distance = 10;
    scrollView_->SetMaxScrollDistance(distance);
    EXPECT_EQ(scrollView_->GetMaxScrollDistance(), distance);
}

/**
 * @tc.name: UIScrollViewSetDragACCLevel_001
 * @tc.desc: Verify SetDragACCLevel function, equal.
 * @tc.type: FUNC
 * @tc.require: SR000E2RJJ
 */
HWTEST_F(ScrollViewTest, UIScrollViewSetDragACCLevel_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    const uint16_t value = 10;
    scrollView_->SetDragACCLevel(value);
    EXPECT_EQ(scrollView_->GetDragACCLevel(), value);
}

/**
 * @tc.name: UIScrollViewSetSwipeACCLevel_001
 * @tc.desc: Verify SetSwipeACCLevel function, equal.
 * @tc.type: FUNC
 * @tc.require: AR000F4E5P
 */
HWTEST_F(ScrollViewTest, UIScrollViewSetSwipeACCLevel_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    const uint16_t value = 10;
    scrollView_->SetSwipeACCLevel(value);
    EXPECT_EQ(scrollView_->GetSwipeACCLevel(), value);
}

/**
 * @tc.name: UIScrollViewMoveChildByOffset_001
 * @tc.desc: Verify MoveChildByOffset function, equal.
 * @tc.type: FUNC
 * @tc.require: SR000F3PEM
 */
HWTEST_F(ScrollViewTest, UIScrollViewMoveChildByOffset_001, TestSize.Level0)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    UIView* view = new UIView();
    EXPECT_EQ(view->GetX(), 0);
    EXPECT_EQ(view->GetY(), 0);

    scrollView_->Add(view);

    const int16_t offsetX = 10;
    const int16_t offsetY = 20;
    scrollView_->SetThrowDrag(true);
    scrollView_->MoveChildByOffset(offsetX, offsetY);
    EXPECT_EQ(view->GetX(), offsetX);
    EXPECT_EQ(view->GetY(), offsetY);

    scrollView_->Remove(view);
    delete view;
}

/**
 * @tc.name: UIAbstractClockSetScrollBlankSize_001
 * @tc.desc: Verify SetScrollBlankSize function.
 */
HWTEST_F(ScrollViewTest, UIAbstractScrollSetScrollBlankSize_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    scrollView_->SetScrollBlankSize(size);
    EXPECT_EQ(scrollView_->GetScrollBlankSize(), size);
}

/**
 * @tc.name: UIAbstractClockSetReboundSize_001
 * @tc.desc: Verify SetReboundSize function.
 */
HWTEST_F(ScrollViewTest, UIAbstractScrollSetReboundSize_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    scrollView_->SetReboundSize(size);
    EXPECT_EQ(scrollView_->GetReboundSize(), size);
}

/**
 * @tc.name: UIAbstractClockSetDragFunc_001
 * @tc.desc: Verify SetDragFunc function.
 */
HWTEST_F(ScrollViewTest, UIAbstractScrollSetDragFunc_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    scrollView_->SetDragFunc(func);
    EXPECT_EQ(scrollView_->GetDragFunc(), func);
}

#if defined(ENABLE_ROTATE_INPUT) && ENABLE_ROTATE_INPUT
/**
 * @tc.name: UIAbstractClockSetRotateACCLevel_001
 * @tc.desc: Verify SetRotateACCLevel function.
 */
HWTEST_F(ScrollViewTest, UIAbstractScrollSetRotateACCLevel_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    scrollView_->SetRotateACCLevel(value);
    EXPECT_EQ(scrollView_->GetRotateACCLevel(), value);
}

/**
 * @tc.name: UIAbstractClockSetRotateThrowThreshold_001
 * @tc.desc: Verify SetRotateThrowThreshold function.
 */
HWTEST_F(ScrollViewTest, UIAbstractScrollSetRotateThrowThreshold_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    scrollView_->SetRotateThrowThreshold(threshold);
    EXPECT_EQ(scrollView_->GetRotateThrowThreshold(), threshold);
}

/**
 * @tc.name: UIAbstractClockRotateEvent_001
 * @tc.desc: Verify OnRotateStartEvent OnRotateEvent OnRotateEndEvent function.
 */
HWTEST_F(ScrollViewTest, UIAbstractScrollRotateEvent_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    RotateEvent* event = new RotateEvent(1);
    EXPECT_EQ(scrollView_->OnRotateStartEvent(*event), false);
    EXPECT_EQ(scrollView_->OnRotateEvent(*event), false);
    EXPECT_EQ(scrollView_->OnRotateEndEvent(*event), false);
    delete event;
    event = nullptr;
}
#endif

/**
 * @tc.name: UIAbstractClockSetScrollBarSide_001
 * @tc.desc: Verify SetScrollBarSide function.
 */
HWTEST_F(ScrollViewTest, UIAbstractScrollSetScrollBarSide_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    scrollView_->SetScrollBarSide(side);
    EXPECT_EQ(scrollView_->GetScrollBarSide(), side);
}

/**
 * @tc.name: UIAbstractClockSetScrollBarCenter_001
 * @tc.desc: Verify SetScrollBarCenter function.
 */
HWTEST_F(ScrollViewTest, UIAbstractScrollSetScrollBarCenter_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    scrollView_->SetScrollBarCenter(center);
    EXPECT_EQ(scrollView_->GetScrollBarCenter().x, center.x);
    EXPECT_EQ(scrollView_->GetScrollBarCenter().y, center.y);
}

/**
 * @tc.name: UIAbstractClockSetDirection_001
 * @tc.desc: Verify SetDirection function.
 */
HWTEST_F(ScrollViewTest, UIAbstractScrollSetDirection_001, TestSize.Level1)
{
    if (scrollView_ == nullptr) {
        EXPECT_NE(0, 0);
        return;
    }
    scrollView_->SetDirection(2);
    EXPECT_EQ(scrollView_->GetDirection(), 2);
}
} // namespace OHOS