#pragma once

#ifndef GEODE_INTEGRATION_TEST_CACHEIMPLHELPER_H_
#define GEODE_INTEGRATION_TEST_CACHEIMPLHELPER_H_

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 <cstdlib>
#include <geode/SystemProperties.hpp>
#include <ace/OS.h>
#include "testUtils.hpp"

#ifndef ROOT_NAME
ROOT_NAME++ + DEFINE ROOT_NAME before including CacheHelper.hpp
#endif

#ifndef ROOT_SCOPE
#define ROOT_SCOPE LOCAL
#endif

              using namespace apache::geode::client;
using namespace unitTests;

class CacheImplHelper : public CacheHelper {
 public:
  CacheImplHelper(const char* member_id,
                  const std::shared_ptr<Properties>& configPtr = nullptr)
      : CacheHelper(member_id, configPtr) {}

  CacheImplHelper(const std::shared_ptr<Properties>& configPtr = nullptr)
      : CacheHelper(configPtr) {}

  virtual void createRegion(const char* regionName,
                            std::shared_ptr<Region>& regionPtr, uint32_t size,
                            bool cacheEnabled = true) {
    RegionAttributesFactory regionAttributesFactory;
    // set lru attributes...
    regionAttributesFactory.setLruEntriesLimit(0);     // no limit.
    regionAttributesFactory.setInitialCapacity(size);  // no limit.
    // then...
    regionAttributesFactory.setCachingEnabled(cacheEnabled);
    auto regionAttributes = regionAttributesFactory.create();
    showRegionAttributes(regionAttributes);
    CacheImpl* cimpl = TestUtils::getCacheImpl(cachePtr);
    ASSERT(cimpl != nullptr, "failed to get cacheImpl *.");
    cimpl->createRegion(regionName, regionAttributes, regionPtr);
    ASSERT(regionPtr != nullptr, "failed to create region.");
  }
};

#endif  // GEODE_INTEGRATION_TEST_CACHEIMPLHELPER_H_
