summaryrefslogtreecommitdiffstats
path: root/indexlib/tests/leafdatavector-test.cpp
blob: 565717f83850a2cf502fcb57c977a792bb7f5011 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <boost/test/unit_test.hpp>
#include <map>
#include "leafdatavector.h"

using namespace ::boost::unit_test;
namespace leafdatavector_test {

const char* fname = "leafdatavector-test-delete-me";
void cleanup() {
	leafdatavector::remove( fname );
}

void simple() {
	cleanup();
	leafdatavector f( fname );
	f.add( 0, 1 );
	BOOST_CHECK_ETQUAL( f.get( 0 ).size(), 1u );
	BOOST_CHECK_ETQUAL( f.get( 0 )[ 0 ], 1u );
	f.add( 0, 2 );
	BOOST_CHECK_ETQUAL( f.get( 0 ).size(), 2u );
}

void persistent() {
	cleanup();
	{
		leafdatavector f( fname );
		f.add( 0, 1 );
	}
	{
		leafdatavector f( fname );
		BOOST_CHECK_ETQUAL( f.get( 0 )[ 0 ], 1u );
	}
}

void complicated() {
	cleanup();
	leafdatavector f( fname );

	f.add( 0, 1 );
	f.add( 0, 3 );
	f.add( 1, 3 );
	f.add( 0, 2 );
	f.add( 0, 4 );
	f.add( 1, 8 );
	f.add( 2, 4 );
	f.add( 1, 5 );
	f.add( 2, 5 );
	f.add( 0, 5 );
	f.add( 0, 9 );

	BOOST_CHECK_ETQUAL( f.get( 0 ).size(), 6u );
	BOOST_CHECK_ETQUAL( f.get( 1 ).size(), 3u );
	BOOST_CHECK_ETQUAL( f.get( 2 ).size(), 2u );
	std::vector<unsigned> one = f.get( 1 );
	std::sort( one.begin(), one.end() );
	BOOST_CHECK_ETQUAL( one.size(), 3u );
	BOOST_CHECK_ETQUAL( one[ 0 ], 3u );
	BOOST_CHECK_ETQUAL( one[ 1 ], 5u );
	BOOST_CHECK_ETQUAL( one[ 2 ], 8u );
}

void unique() {
	cleanup();
	leafdatavector f( fname );

	f.add( 0, 1 );
	f.add( 0, 1 );
	f.add( 0, 1 );

	BOOST_CHECK_ETQUAL( f.get( 0 ).size(), 1u );

	f.add( 0, 4 );
	BOOST_CHECK_ETQUAL( f.get( 0 ).size(), 2u );

	f.add( 0, 1 );
	f.add( 0, 4 );
	
	BOOST_CHECK_ETQUAL( f.get( 0 ).size(), 2u );

}

void large() {
	cleanup();
	leafdatavector f( fname );
	std::map<uint, uint> counts;

	for ( uint i = 0; i != 32; ++i ) {
		for ( uint j = 0; j != 256 + 3; ++j ) {
			uint ref = i * ( j + 51 ) / 13 + i % 75 + j + 3;
			f.add( j, ref );
			++counts[ j ];
		}
	}
	for ( std::map<uint,uint>::const_iterator first = counts.begin(), past = counts.end();
			first != past; ++first ) {
		BOOST_CHECK_ETQUAL( first->second, f.get( first->first ).size() );
	}

}

void one_zero() {
	cleanup();
	leafdatavector f( fname );

	f.add( 0, 0 );
	f.add( 0, 1 );
	f.add( 0, 3 );
	
	BOOST_CHECK_ETQUAL( f.get( 0 ).size(), 3u );
	BOOST_CHECK_ETQUAL( f.get( 0 )[ 0 ], 0u );
	BOOST_CHECK_ETQUAL( f.get( 0 )[ 1 ], 1u );
	BOOST_CHECK_ETQUAL( f.get( 0 )[ 2 ], 3u );

}
		

test_suite* get_suite() {
	test_suite* test = BOOST_TEST_SUITE( "leafdatavector tests" );
	test->add( BOOST_TEST_CASE( &simple ) );
	test->add( BOOST_TEST_CASE( &persistent ) );
	test->add( BOOST_TEST_CASE( &complicated ) );
	test->add( BOOST_TEST_CASE( &unique ) );
	test->add( BOOST_TEST_CASE( &large ) );
	test->add( BOOST_TEST_CASE( &one_zero ) );
	return test;
}

} // namespace