//===- MCRegionFragmentTest.cpp - MCRegionFragment implementation ---------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "MCRegionFragmentTest.h"

#include "mcld/MC/MCRegionFragment.h"
#include "mcld/Support/MemoryAreaFactory.h"
#include "mcld/Support/Path.h"

using namespace mcld;
using namespace mcldtest;
using namespace mcld::sys::fs;


// Constructor can do set-up work for all test here.
MCRegionFragmentTest::MCRegionFragmentTest()
{
}

// Destructor can do clean-up work that doesn't throw exceptions here.
MCRegionFragmentTest::~MCRegionFragmentTest()
{
}

// SetUp() will be called immediately before each test.
void MCRegionFragmentTest::SetUp()
{
}

// TearDown() will be called immediately after each test.
void MCRegionFragmentTest::TearDown()
{
}

//==========================================================================//
// Testcases
//

TEST_F( MCRegionFragmentTest, classof_explicit ) {
  Path path(TOPDIR);
  path.append("unittests/test3.txt");
  MemoryAreaFactory* areaFactory = new MemoryAreaFactory(1);
  MemoryArea* area = areaFactory->produce(path, MemoryArea::ReadWrite);

  MemoryRegion* region = area->request(0, 4096);
  MCRegionFragment *frag = new MCRegionFragment(*region);

  ASSERT_FALSE(llvm::MCDataFragment::classof(frag));
  ASSERT_TRUE(MCRegionFragment::classof(frag));
  delete frag;
  delete areaFactory;
}

TEST_F( MCRegionFragmentTest, classof_implicit ) {
  Path path(TOPDIR);
  path.append("unittests/test3.txt");
  MemoryAreaFactory* areaFactory = new MemoryAreaFactory(1);
  MemoryArea* area = areaFactory->produce(path, MemoryArea::ReadWrite);

  MemoryRegion* region = area->request(0, 4096);
  llvm::MCFragment *frag = new MCRegionFragment(*region);

  ASSERT_FALSE(llvm::MCDataFragment::classof(frag));
  ASSERT_TRUE(MCRegionFragment::classof(frag));
  delete frag;
  delete areaFactory;
}

