#ifndef MANTID_API_FREEBLOCKTEST_H_ #define MANTID_API_FREEBLOCKTEST_H_ #include "MantidKernel/FreeBlock.h" #include "MantidKernel/System.h" #include "MantidKernel/Timer.h" #include <cxxtest/TestSuite.h> #include <iomanip> #include <iostream> using namespace Mantid; using namespace Mantid::Kernel; class FreeBlockTest : public CxxTest::TestSuite { public: void test_constructor() { FreeBlock b; TS_ASSERT_EQUALS( b.getFilePosition(), 0 ); TS_ASSERT_EQUALS( b.getSize(), 0 ); FreeBlock b2(123,456); TS_ASSERT_EQUALS( b2.getFilePosition(), 123 ); TS_ASSERT_EQUALS( b2.getSize(), 456 ); FreeBlock b3(b2); TS_ASSERT_EQUALS( b3.getFilePosition(), 123 ); TS_ASSERT_EQUALS( b3.getSize(), 456 ); } void test_assignment() { FreeBlock b2(123,456); FreeBlock b3; b3 = b2; TS_ASSERT_EQUALS( b3.getFilePosition(), 123 ); TS_ASSERT_EQUALS( b3.getSize(), 456 ); } void test_merge() { FreeBlock b1(100, 100); FreeBlock b2(200, 500); // Merge that succeeds TS_ASSERT( FreeBlock::merge(b1, b2) ); TS_ASSERT_EQUALS( b1.getFilePosition(), 100 ); TS_ASSERT_EQUALS( b1.getSize(), 600 ); // Merge that fails FreeBlock b3(100, 100); FreeBlock b4(201, 100); TS_ASSERT( !FreeBlock::merge(b3, b4) ); TS_ASSERT_EQUALS( b3.getFilePosition(), 100 ); TS_ASSERT_EQUALS( b3.getSize(), 100 ); } }; class FreeBlockTestPerformance : public CxxTest::TestSuite { public: std::vector<FreeBlock> blocks; size_t num; void setUp() { num = 1000000; // Make a list where 1/3 of the blocks are adjacent for (size_t i=0; i<num; i++) blocks.push_back( FreeBlock(i*10, (i%3==0) ? 10 : 7) ); } void test_merge() { // Merge by going backwards through the list. for (size_t i=num-1; i>0; i--) FreeBlock::merge(blocks[i-1], blocks[i]); // The first block is merged into size 17 TS_ASSERT_EQUALS( blocks[0].getSize(), 17); } }; #endif /* MANTID_API_FREEBLOCKTEST_H_ */