/**
 * 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 "transaction/ResourceId.hpp"

#include "gtest/gtest.h"

namespace quickstep {
namespace transaction {

class ResourceIdTest : public ::testing::Test {
 protected:
  ResourceIdTest()
      : db1_(1),
        db2_(2),
        db2_rel2_(2, 2),
        db2_rel4_(2, 4),
        db2_rel2_block2_(2, 2, 2),
        db2_rel2_block3_(2, 2, 3),
        db2_rel4_block5_(2, 4, 5),
        db2_rel4_block7_(2, 4, 7),
        db2_rel2_block2_tpl4_(2, 2, 2, 4),
        db2_rel2_block2_tpl7_(2, 2, 2, 7),
        db2_rel4_block5_tpl3_(2, 4, 5, 7),
        db2_rel4_block5_tpl8_(2, 4, 5, 8) {
  }

  const ResourceId db1_;
  const ResourceId db2_;
  const ResourceId db2_rel2_;
  const ResourceId db2_rel4_;
  const ResourceId db2_rel2_block2_;
  const ResourceId db2_rel2_block3_;
  const ResourceId db2_rel4_block5_;
  const ResourceId db2_rel4_block7_;
  const ResourceId db2_rel2_block2_tpl4_;
  const ResourceId db2_rel2_block2_tpl7_;
  const ResourceId db2_rel4_block5_tpl3_;
  const ResourceId db2_rel4_block5_tpl8_;
};

TEST_F(ResourceIdTest, CheckAccessLevels) {
  EXPECT_TRUE(db2_.isDatabaseAccess());
  EXPECT_FALSE(db2_rel4_.isDatabaseAccess());
  EXPECT_FALSE(db2_rel4_block5_.isDatabaseAccess());
  EXPECT_FALSE(db2_rel4_block5_tpl8_.isDatabaseAccess());

  EXPECT_FALSE(db2_.isRelationAccess());
  EXPECT_TRUE(db2_rel4_.isRelationAccess());
  EXPECT_FALSE(db2_rel4_block5_.isRelationAccess());
  EXPECT_FALSE(db2_rel4_block5_tpl8_.isRelationAccess());

  EXPECT_FALSE(db2_.isBlockAccess());
  EXPECT_FALSE(db2_rel4_.isBlockAccess());
  EXPECT_TRUE(db2_rel4_block5_.isBlockAccess());
  EXPECT_FALSE(db2_rel4_block5_tpl8_.isBlockAccess());

  EXPECT_FALSE(db2_.isTupleAccess());
  EXPECT_FALSE(db2_rel4_.isTupleAccess());
  EXPECT_FALSE(db2_rel4_block5_.isTupleAccess());
  EXPECT_TRUE(db2_rel4_block5_tpl8_.isTupleAccess());
}

TEST_F(ResourceIdTest, Equality) {
  // Copy some resource ids.
  const ResourceId db1_copy(db1_);
  const ResourceId db2_rel2_copy(db2_rel2_);
  const ResourceId db2_rel4_block5_copy(db2_rel4_block5_);
  const ResourceId db2_rel4_block5_tpl8_copy(db2_rel4_block5_tpl8_);

  // Self comparison must be equal.
  EXPECT_EQ(db1_, db1_);
  EXPECT_EQ(db2_rel2_, db2_rel2_);
  EXPECT_EQ(db2_rel4_block5_, db2_rel4_block5_);
  EXPECT_EQ(db2_rel4_block5_tpl3_, db2_rel4_block5_tpl3_);

  // If resources are different, than it must have different ids.
  EXPECT_NE(db1_, db2_);
  EXPECT_NE(db2_rel2_, db2_rel4_);
  EXPECT_NE(db2_rel4_block5_, db2_rel4_block7_);
  EXPECT_NE(db2_rel4_block5_tpl3_, db2_rel4_block5_tpl8_);

  // Comparison with a copy must be equal.
  EXPECT_EQ(db1_copy, db1_);
  EXPECT_EQ(db2_rel2_copy, db2_rel2_);
  EXPECT_EQ(db2_rel4_block5_copy, db2_rel4_block5_);
  EXPECT_EQ(db2_rel4_block5_tpl8_copy, db2_rel4_block5_tpl8_);
}

TEST_F(ResourceIdTest, ParentResourceIds) {
  EXPECT_EQ(db2_, db2_rel2_.getParentResourceId());
  EXPECT_EQ(db2_rel2_, db2_rel2_block2_.getParentResourceId());
  EXPECT_EQ(db2_rel2_, db2_rel2_block3_.getParentResourceId());
  EXPECT_EQ(db2_rel2_block2_, db2_rel2_block2_tpl4_.getParentResourceId());
  EXPECT_EQ(db2_rel2_block2_, db2_rel2_block2_tpl7_.getParentResourceId());
}

}  // namespace transaction
}  // namespace quickstep
