14d949f91Sopenharmony_ci/*
24d949f91Sopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd.
34d949f91Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44d949f91Sopenharmony_ci * you may not use this file except in compliance with the License.
54d949f91Sopenharmony_ci * You may obtain a copy of the License at
64d949f91Sopenharmony_ci *
74d949f91Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84d949f91Sopenharmony_ci *
94d949f91Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104d949f91Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114d949f91Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124d949f91Sopenharmony_ci * See the License for the specific language governing permissions and
134d949f91Sopenharmony_ci * limitations under the License.
144d949f91Sopenharmony_ci */
154d949f91Sopenharmony_ci
164d949f91Sopenharmony_ci#include "image_effect_inner_unittest.h"
174d949f91Sopenharmony_ci
184d949f91Sopenharmony_ci#include "efilter_factory.h"
194d949f91Sopenharmony_ci#include "brightness_efilter.h"
204d949f91Sopenharmony_ci#include "contrast_efilter.h"
214d949f91Sopenharmony_ci#include "test_common.h"
224d949f91Sopenharmony_ci#include "external_loader.h"
234d949f91Sopenharmony_ci#include "crop_efilter.h"
244d949f91Sopenharmony_ci
254d949f91Sopenharmony_ciusing namespace testing::ext;
264d949f91Sopenharmony_ciusing ::testing::_;
274d949f91Sopenharmony_ciusing ::testing::A;
284d949f91Sopenharmony_ciusing ::testing::InSequence;
294d949f91Sopenharmony_ciusing ::testing::Mock;
304d949f91Sopenharmony_ciusing ::testing::Return;
314d949f91Sopenharmony_ciusing namespace OHOS::Media::Effect::Test;
324d949f91Sopenharmony_ci
334d949f91Sopenharmony_cinamespace {
344d949f91Sopenharmony_ci    constexpr uint32_t CROP_FACTOR = 2;
354d949f91Sopenharmony_ci}
364d949f91Sopenharmony_ci
374d949f91Sopenharmony_cinamespace OHOS {
384d949f91Sopenharmony_cinamespace Media {
394d949f91Sopenharmony_cinamespace Effect {
404d949f91Sopenharmony_ciclass FakeEFilter : public EFilter {
414d949f91Sopenharmony_cipublic:
424d949f91Sopenharmony_ci    explicit FakeEFilter(const std::string &name) : EFilter(name) {}
434d949f91Sopenharmony_ci    ~FakeEFilter() {}
444d949f91Sopenharmony_ci
454d949f91Sopenharmony_ci    ErrorCode Render(EffectBuffer *buffer, std::shared_ptr<EffectContext> &context) override
464d949f91Sopenharmony_ci    {
474d949f91Sopenharmony_ci        return PushData(buffer, context);
484d949f91Sopenharmony_ci    }
494d949f91Sopenharmony_ci
504d949f91Sopenharmony_ci    ErrorCode Render(EffectBuffer *src, EffectBuffer *dst, std::shared_ptr<EffectContext> &context) override
514d949f91Sopenharmony_ci    {
524d949f91Sopenharmony_ci        return ErrorCode::SUCCESS;
534d949f91Sopenharmony_ci    }
544d949f91Sopenharmony_ci
554d949f91Sopenharmony_ci    ErrorCode Restore(const EffectJsonPtr &values) override
564d949f91Sopenharmony_ci    {
574d949f91Sopenharmony_ci        return ErrorCode::SUCCESS;
584d949f91Sopenharmony_ci    }
594d949f91Sopenharmony_ci};
604d949f91Sopenharmony_ci
614d949f91Sopenharmony_ciclass FakeImageEffect : public ImageEffect {
624d949f91Sopenharmony_cipublic:
634d949f91Sopenharmony_ci    explicit FakeImageEffect() : ImageEffect("ImageEffect") {}
644d949f91Sopenharmony_ci    ~FakeImageEffect() {}
654d949f91Sopenharmony_ci};
664d949f91Sopenharmony_ci
674d949f91Sopenharmony_civoid ImageEffectInnerUnittest::SetUpTestCase() {}
684d949f91Sopenharmony_ci
694d949f91Sopenharmony_civoid ImageEffectInnerUnittest::TearDownTestCase() {}
704d949f91Sopenharmony_ci
714d949f91Sopenharmony_civoid ImageEffectInnerUnittest::SetUp()
724d949f91Sopenharmony_ci{
734d949f91Sopenharmony_ci    ExternLoader::Instance()->InitExt();
744d949f91Sopenharmony_ci    EFilterFactory::Instance()->functions_.clear();
754d949f91Sopenharmony_ci    EFilterFactory::Instance()->RegisterEFilter<BrightnessEFilter>(BRIGHTNESS_EFILTER);
764d949f91Sopenharmony_ci    EFilterFactory::Instance()->RegisterEFilter<ContrastEFilter>(CONTRAST_EFILTER);
774d949f91Sopenharmony_ci    EFilterFactory::Instance()->RegisterEFilter<CropEFilter>(CROP_EFILTER);
784d949f91Sopenharmony_ci    EFilterFactory::Instance()->delegates_.clear();
794d949f91Sopenharmony_ci    mockPixelMap_ = new MockPixelMap();
804d949f91Sopenharmony_ci    imageEffect_ = new FakeImageEffect();
814d949f91Sopenharmony_ci    efilter_ = new FakeEFilter(BRIGHTNESS_EFILTER);
824d949f91Sopenharmony_ci
834d949f91Sopenharmony_ci    std::shared_ptr<BufferInfo> info = std::make_unique<BufferInfo>();
844d949f91Sopenharmony_ci    info->width_ = mockPixelMap_->GetWidth();
854d949f91Sopenharmony_ci    info->height_ = mockPixelMap_->GetHeight();
864d949f91Sopenharmony_ci    info->rowStride_ = mockPixelMap_->GetRowStride();
874d949f91Sopenharmony_ci    info->len_ = mockPixelMap_->GetHeight() * mockPixelMap_->GetRowStride();
884d949f91Sopenharmony_ci    info->formatType_ = IEffectFormat::RGBA8888;
894d949f91Sopenharmony_ci    std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
904d949f91Sopenharmony_ci    extraInfo->dataType = DataType::PIXEL_MAP;
914d949f91Sopenharmony_ci    extraInfo->bufferType = BufferType::HEAP_MEMORY;
924d949f91Sopenharmony_ci    extraInfo->pixelMap = mockPixelMap_;
934d949f91Sopenharmony_ci    extraInfo->surfaceBuffer = nullptr;
944d949f91Sopenharmony_ci    effectBuffer_ = new EffectBuffer(info, (void *)mockPixelMap_->GetPixels(), extraInfo);
954d949f91Sopenharmony_ci}
964d949f91Sopenharmony_ci
974d949f91Sopenharmony_civoid ImageEffectInnerUnittest::TearDown()
984d949f91Sopenharmony_ci{
994d949f91Sopenharmony_ci    delete(mockPixelMap_);
1004d949f91Sopenharmony_ci    Mock::AllowLeak(imageEffect_);
1014d949f91Sopenharmony_ci    Mock::AllowLeak(efilter_);
1024d949f91Sopenharmony_ci    delete(effectBuffer_);
1034d949f91Sopenharmony_ci}
1044d949f91Sopenharmony_ci
1054d949f91Sopenharmony_ciHWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_001, TestSize.Level1)
1064d949f91Sopenharmony_ci{
1074d949f91Sopenharmony_ci    InSequence s;
1084d949f91Sopenharmony_ci    std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
1094d949f91Sopenharmony_ci    imageEffect_->AddEFilter(efilter);
1104d949f91Sopenharmony_ci    Plugin::Any value = 200.f;
1114d949f91Sopenharmony_ci    efilter->SetValue(KEY_FILTER_INTENSITY, value);
1124d949f91Sopenharmony_ci    ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
1134d949f91Sopenharmony_ci    ASSERT_EQ(result, ErrorCode::SUCCESS);
1144d949f91Sopenharmony_ci    result = imageEffect_->Start();
1154d949f91Sopenharmony_ci    ASSERT_EQ(result, ErrorCode::SUCCESS);
1164d949f91Sopenharmony_ci}
1174d949f91Sopenharmony_ci
1184d949f91Sopenharmony_ciHWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_002, TestSize.Level1)
1194d949f91Sopenharmony_ci{
1204d949f91Sopenharmony_ci    InSequence s;
1214d949f91Sopenharmony_ci    std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
1224d949f91Sopenharmony_ci    Plugin::Any value = 200.f;
1234d949f91Sopenharmony_ci    efilter->SetValue(KEY_FILTER_INTENSITY, value);
1244d949f91Sopenharmony_ci    std::shared_ptr<EffectBuffer> src = std::make_shared<EffectBuffer>(
1254d949f91Sopenharmony_ci        effectBuffer_->bufferInfo_, effectBuffer_->buffer_, effectBuffer_->extraInfo_);
1264d949f91Sopenharmony_ci
1274d949f91Sopenharmony_ci    ErrorCode result = efilter->Render(src, src);
1284d949f91Sopenharmony_ci    ASSERT_EQ(result, ErrorCode::SUCCESS);
1294d949f91Sopenharmony_ci}
1304d949f91Sopenharmony_ci
1314d949f91Sopenharmony_ciHWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_003, TestSize.Level1)
1324d949f91Sopenharmony_ci{
1334d949f91Sopenharmony_ci    std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
1344d949f91Sopenharmony_ci    imageEffect_->AddEFilter(efilter);
1354d949f91Sopenharmony_ci    Plugin::Any value = 100.f;
1364d949f91Sopenharmony_ci    efilter->SetValue(KEY_FILTER_INTENSITY, value);
1374d949f91Sopenharmony_ci    ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
1384d949f91Sopenharmony_ci    ASSERT_EQ(result, ErrorCode::SUCCESS);
1394d949f91Sopenharmony_ci    result = imageEffect_->SetOutputPixelMap(mockPixelMap_);
1404d949f91Sopenharmony_ci    ASSERT_EQ(result, ErrorCode::SUCCESS);
1414d949f91Sopenharmony_ci    result = imageEffect_->Start();
1424d949f91Sopenharmony_ci    ASSERT_EQ(result, ErrorCode::SUCCESS);
1434d949f91Sopenharmony_ci}
1444d949f91Sopenharmony_ci
1454d949f91Sopenharmony_ciHWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_004, TestSize.Level1)
1464d949f91Sopenharmony_ci{
1474d949f91Sopenharmony_ci    std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(CROP_EFILTER);
1484d949f91Sopenharmony_ci    imageEffect_->AddEFilter(efilter);
1494d949f91Sopenharmony_ci    uint32_t x1 = static_cast<uint32_t>(mockPixelMap_->GetWidth() / CROP_FACTOR);
1504d949f91Sopenharmony_ci    uint32_t y1 = static_cast<uint32_t>(mockPixelMap_->GetHeight() / CROP_FACTOR);
1514d949f91Sopenharmony_ci    uint32_t areaInfo[] = { 0, 0, x1, y1};
1524d949f91Sopenharmony_ci    Plugin::Any value = static_cast<void *>(areaInfo);
1534d949f91Sopenharmony_ci    efilter->SetValue(KEY_FILTER_REGION, value);
1544d949f91Sopenharmony_ci    ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
1554d949f91Sopenharmony_ci    ASSERT_EQ(result, ErrorCode::SUCCESS);
1564d949f91Sopenharmony_ci    result = imageEffect_->SetOutputPixelMap(mockPixelMap_);
1574d949f91Sopenharmony_ci    ASSERT_EQ(result, ErrorCode::SUCCESS);
1584d949f91Sopenharmony_ci    result = imageEffect_->Start();
1594d949f91Sopenharmony_ci    ASSERT_EQ(result, ErrorCode::SUCCESS);
1604d949f91Sopenharmony_ci}
1614d949f91Sopenharmony_ci
1624d949f91Sopenharmony_ciHWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_005, TestSize.Level1)
1634d949f91Sopenharmony_ci{
1644d949f91Sopenharmony_ci    std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(CROP_EFILTER);
1654d949f91Sopenharmony_ci    imageEffect_->AddEFilter(efilter);
1664d949f91Sopenharmony_ci    uint32_t x1 = static_cast<uint32_t>(mockPixelMap_->GetWidth() / CROP_FACTOR);
1674d949f91Sopenharmony_ci    uint32_t y1 = static_cast<uint32_t>(mockPixelMap_->GetHeight() / CROP_FACTOR);
1684d949f91Sopenharmony_ci    uint32_t areaInfo[] = { 0, 0, x1, y1};
1694d949f91Sopenharmony_ci    Plugin::Any value = static_cast<void *>(areaInfo);
1704d949f91Sopenharmony_ci    efilter->SetValue(KEY_FILTER_REGION, value);
1714d949f91Sopenharmony_ci    ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
1724d949f91Sopenharmony_ci    ASSERT_EQ(result, ErrorCode::SUCCESS);
1734d949f91Sopenharmony_ci    result = imageEffect_->Start();
1744d949f91Sopenharmony_ci    ASSERT_EQ(result, ErrorCode::SUCCESS);
1754d949f91Sopenharmony_ci}
1764d949f91Sopenharmony_ci
1774d949f91Sopenharmony_ciHWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_006, TestSize.Level1)
1784d949f91Sopenharmony_ci{
1794d949f91Sopenharmony_ci    DataInfo dataInfo;
1804d949f91Sopenharmony_ci    std::shared_ptr<BufferInfo> bufferInfo = std::make_unique<BufferInfo>();
1814d949f91Sopenharmony_ci    std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
1824d949f91Sopenharmony_ci    std::shared_ptr<EffectBuffer> effectBuffer = std::make_unique<EffectBuffer>(bufferInfo, nullptr, extraInfo);
1834d949f91Sopenharmony_ci    std::shared_ptr<ImageEffect> imageEffect = std::make_unique<ImageEffect>();
1844d949f91Sopenharmony_ci
1854d949f91Sopenharmony_ci    dataInfo.dataType_ = DataType::PATH;
1864d949f91Sopenharmony_ci    dataInfo.path_ = "path";
1874d949f91Sopenharmony_ci    EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, true), ErrorCode::SUCCESS);
1884d949f91Sopenharmony_ci
1894d949f91Sopenharmony_ci    dataInfo.dataType_ = DataType::NATIVE_WINDOW;
1904d949f91Sopenharmony_ci    EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false), ErrorCode::SUCCESS);
1914d949f91Sopenharmony_ci
1924d949f91Sopenharmony_ci    dataInfo.dataType_ = DataType::UNKNOWN;
1934d949f91Sopenharmony_ci    EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false), ErrorCode::ERR_NO_DATA);
1944d949f91Sopenharmony_ci
1954d949f91Sopenharmony_ci    dataInfo.dataType_ = static_cast<DataType>(100);
1964d949f91Sopenharmony_ci    EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false), ErrorCode::ERR_UNSUPPORTED_DATA_TYPE);
1974d949f91Sopenharmony_ci}
1984d949f91Sopenharmony_ci} // namespace Effect
1994d949f91Sopenharmony_ci} // namespace Media
2004d949f91Sopenharmony_ci} // namespace OHOS