//
// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//

#include <cl/ClBackend.hpp>
#include <cl/ClTensorHandleFactory.hpp>
#include <cl/ClImportTensorHandleFactory.hpp>
#include <cl/test/ClContextControlFixture.hpp>

#include <doctest/doctest.h>

using namespace armnn;

TEST_SUITE("ClBackendTests")
{
TEST_CASE("ClRegisterTensorHandleFactoriesMatchingImportFactoryId")
{
    auto clBackend = std::make_unique<ClBackend>();
    TensorHandleFactoryRegistry registry;
    clBackend->RegisterTensorHandleFactories(registry);

    // When calling RegisterTensorHandleFactories, CopyAndImportFactoryPair is registered
    // Get ClImportTensorHandleFactory id as the matching import factory id
    CHECK((registry.GetMatchingImportFactoryId(ClTensorHandleFactory::GetIdStatic()) ==
           ClImportTensorHandleFactory::GetIdStatic()));
}

TEST_CASE("ClRegisterTensorHandleFactoriesWithMemorySourceFlagsMatchingImportFactoryId")
{
    auto clBackend = std::make_unique<ClBackend>();
    TensorHandleFactoryRegistry registry;
    clBackend->RegisterTensorHandleFactories(registry,
                                             static_cast<MemorySourceFlags>(MemorySource::Malloc),
                                             static_cast<MemorySourceFlags>(MemorySource::Malloc));

    // When calling RegisterTensorHandleFactories with MemorySourceFlags, CopyAndImportFactoryPair is registered
    // Get ClImportTensorHandleFactory id as the matching import factory id
    CHECK((registry.GetMatchingImportFactoryId(ClTensorHandleFactory::GetIdStatic()) ==
           ClImportTensorHandleFactory::GetIdStatic()));
}

TEST_CASE_FIXTURE(ClContextControlFixture, "ClCreateWorkloadFactoryMatchingImportFactoryId")
{
    auto clBackend = std::make_unique<ClBackend>();
    TensorHandleFactoryRegistry registry;
    clBackend->CreateWorkloadFactory(registry);

    // When calling CreateWorkloadFactory, CopyAndImportFactoryPair is registered
    // Get ClImportTensorHandleFactory id as the matching import factory id
    CHECK((registry.GetMatchingImportFactoryId(ClTensorHandleFactory::GetIdStatic()) ==
           ClImportTensorHandleFactory::GetIdStatic()));
}

TEST_CASE_FIXTURE(ClContextControlFixture, "ClCreateWorkloadFactoryWithOptionsMatchingImportFactoryId")
{
    auto clBackend = std::make_unique<ClBackend>();
    TensorHandleFactoryRegistry registry;
    ModelOptions modelOptions;
    clBackend->CreateWorkloadFactory(registry, modelOptions);

    // When calling CreateWorkloadFactory with ModelOptions, CopyAndImportFactoryPair is registered
    // Get ClImportTensorHandleFactory id as the matching import factory id
    CHECK((registry.GetMatchingImportFactoryId(ClTensorHandleFactory::GetIdStatic()) ==
           ClImportTensorHandleFactory::GetIdStatic()));
}

TEST_CASE_FIXTURE(ClContextControlFixture, "ClCreateWorkloadFactoryWitMemoryFlagsMatchingImportFactoryId")
{
    auto clBackend = std::make_unique<ClBackend>();
    TensorHandleFactoryRegistry registry;
    ModelOptions modelOptions;
    clBackend->CreateWorkloadFactory(registry, modelOptions,
                                     static_cast<MemorySourceFlags>(MemorySource::Malloc),
                                     static_cast<MemorySourceFlags>(MemorySource::Malloc));

    // When calling CreateWorkloadFactory with ModelOptions and MemorySourceFlags,
    // CopyAndImportFactoryPair is registered
    // Get ClImportTensorHandleFactory id as the matching import factory id
    CHECK((registry.GetMatchingImportFactoryId(ClTensorHandleFactory::GetIdStatic()) ==
           ClImportTensorHandleFactory::GetIdStatic()));
}
}
