00001
00008
00009
00010
00011
00012 #define ECL_MEM_CHECK_ARRAYS // Make sure we use mem checking arrays, not regular
00013
00014
00015
00016
00017
00018 #include <iostream>
00019 #include <gtest/gtest.h>
00020 #include "../../include/ecl/containers/array.hpp"
00021
00022
00023
00024
00025
00026 using ecl::Array;
00027 using ecl::blueprints::ArrayFactory;
00028 using ecl::blueprints::ConstantArray;
00029 using ecl::StandardException;
00030
00031
00032
00033
00034
00035 TEST(ArrayMemCheckTests,constructors) {
00036 Array<int,4> array1 = Array<int,4>::Constant(3);
00037 EXPECT_EQ(3,array1[0]);
00038 EXPECT_EQ(3,array1[1]);
00039 EXPECT_EQ(3,array1[2]);
00040 EXPECT_EQ(3,array1[3]);
00041 Array<int,4> array2 = ArrayFactory<int,4>::Constant(4);
00042 EXPECT_EQ(4,array2[0]);
00043 EXPECT_EQ(4,array2[1]);
00044 EXPECT_EQ(4,array2[2]);
00045 EXPECT_EQ(4,array2[3]);
00046 Array<int,4> array3 = ConstantArray<int,4>(3);
00047 EXPECT_EQ(3,array3[0]);
00048 EXPECT_EQ(3,array3[1]);
00049 EXPECT_EQ(3,array3[2]);
00050 EXPECT_EQ(3,array3[3]);
00051
00052 Array<int> darray1 = Array<int>::Constant(4,3);
00053 EXPECT_EQ(3,darray1[0]);
00054 EXPECT_EQ(3,darray1[1]);
00055 EXPECT_EQ(3,darray1[2]);
00056 EXPECT_EQ(3,darray1[3]);
00057
00058 }
00059
00060 TEST(ArrayMemCheckTests,copyConstructors) {
00061
00062 Array<int,4> array1 = Array<int,4>::Constant(3);
00063 Array<int> darray1 = Array<int>::Constant(4,3);
00064
00065 Array<int,4> array2(array1);
00066 Array<int> darray2(darray1);
00067
00068 EXPECT_EQ(3,array2[0]);
00069 EXPECT_EQ(3,array2[1]);
00070 EXPECT_EQ(3,array2[2]);
00071 EXPECT_EQ(3,array2[3]);
00072
00073 EXPECT_EQ(3,darray2[0]);
00074 EXPECT_EQ(3,darray2[1]);
00075 EXPECT_EQ(3,darray2[2]);
00076 EXPECT_EQ(3,darray2[3]);
00077 }
00078
00079 TEST(ArrayMemCheckTests,blueprintAssignment) {
00080
00081 Array<int,4> array;
00082 array = Array<int,4>::Constant(3);
00083
00084 EXPECT_EQ(3,array[0]);
00085 EXPECT_EQ(3,array[1]);
00086 EXPECT_EQ(3,array[2]);
00087 EXPECT_EQ(3,array[3]);
00088 }
00089 TEST(ArrayMemCheckTests,commaInitialisation) {
00090
00091 Array<int,4> array;
00092 Array<int> darray(4);
00093 array << 1,2,3,4;
00094 darray << 1,2,3,4;
00095
00096 EXPECT_EQ(1,array[0]);
00097 EXPECT_EQ(2,array[1]);
00098 EXPECT_EQ(3,array[2]);
00099 EXPECT_EQ(4,array[3]);
00100
00101 EXPECT_EQ(1,darray[0]);
00102 EXPECT_EQ(2,darray[1]);
00103 EXPECT_EQ(3,darray[2]);
00104 EXPECT_EQ(4,darray[3]);
00105 }
00106 TEST(ArrayMemCheckTests,Accessors) {
00107
00108 int j;
00109 Array<int,4> array;
00110 Array<int> darray(4);
00111 array << 1,2,3,4;
00112 darray << 1,2,3,4;
00113
00114 j = array[2];
00115 EXPECT_EQ(3,j);
00116 j = array.at(1);
00117 EXPECT_EQ(2,j);
00118 j = darray[2];
00119 EXPECT_EQ(3,j);
00120 j = darray.at(1);
00121 EXPECT_EQ(2,j);
00122 }
00123
00124 TEST(ArrayMemCheckTests,rangeChecking) {
00125
00126 Array<int,4> array = Array<int,4>::Constant(3);
00127 Array<int> darray = Array<int>::Constant(4,3);
00128 bool result = false;
00129 try {
00130 array.at(10);
00131 } catch ( StandardException &e ) {
00132 result = true;
00133
00134 }
00135 EXPECT_TRUE(result);
00136 result = false;
00137 try {
00138 darray.at(10);
00139 } catch ( StandardException &e ) {
00140 result = true;
00141
00142 }
00143 EXPECT_TRUE(result);
00144 }
00145
00146 TEST(ArrayMemCheckTests,iterators) {
00147
00148 Array<int,4> array = Array<int,4>::Constant(3);
00149 Array<int,4>::iterator iterator;
00150 for ( iterator = array.begin(); iterator != array.end(); ++iterator ) {
00151 EXPECT_EQ(3,*iterator);
00152 }
00153 }
00154
00155 TEST(ArrayMemCheckTests,resize) {
00156 Array<int> darray = Array<int>::Constant(4,3);
00157 darray.resize(10);
00158 darray << 0,1,2,3,4,5,6,7,8,9;
00159 int i = 0;
00160 Array<int>::iterator iterator;
00161 for ( iterator = darray.begin(); iterator != darray.end(); ++iterator ) {
00162 EXPECT_EQ(i,*iterator);
00163 ++i;
00164 }
00165 darray.clear();
00166 }
00167
00168 TEST(ArrayMemCheckTests,bufferRuns) {
00169 int *istart = NULL;
00170 Array<int,4> array_ok; array_ok << 1, 2, 3, 4;
00171 Array<int,4> array_under; array_under << 1, 2, 3, 4;
00172 Array<int,4> array_over; array_over << 1, 2, 3, 4;
00173
00174
00175
00176
00177
00178
00179 istart = &array_under[0];
00180 for ( unsigned int i = 0; i < 3; ++i ) {
00181 *(istart-i) = i;
00182 }
00183
00184
00185 istart = &array_over[0];
00186 for ( unsigned int i = 0; i < array_over.size() + 1; ++i ) {
00187 *(istart+i) = i;
00188 }
00189
00190
00191 EXPECT_TRUE(array_under.bufferUnderRun());
00192 EXPECT_FALSE(array_under.bufferOverRun());
00193
00194 EXPECT_TRUE(array_over.bufferOverRun());
00195 EXPECT_FALSE(array_over.bufferUnderRun());
00196
00197 EXPECT_FALSE(array_ok.bufferOverRun());
00198 EXPECT_FALSE(array_ok.bufferUnderRun());
00199
00200
00201
00202
00203 Array<int> darray_ok(4); darray_ok << 1, 2, 3, 4;
00204 Array<int> darray_under(4); darray_under << 1, 2, 3, 4;
00205 Array<int> darray_over(4); darray_over << 1, 2, 3, 4;
00206
00207
00208
00209
00210 istart = &darray_under[0];
00211 for ( unsigned int i = 0; i < darray_under.size()+1; ++i ) {
00212 *(istart+i-1) = i;
00213 }
00214
00215
00216 istart = &darray_over[0];
00217 for ( unsigned int i = 0; i < darray_over.size()+1; ++i ) {
00218 *(istart+i) = i;
00219 }
00220
00221 EXPECT_TRUE(darray_under.bufferUnderRun());
00222 EXPECT_FALSE(darray_under.bufferOverRun());
00223
00224 EXPECT_TRUE(darray_over.bufferOverRun());
00225 EXPECT_FALSE(darray_over.bufferUnderRun());
00226
00227 EXPECT_FALSE(darray_ok.bufferOverRun());
00228 EXPECT_FALSE(darray_ok.bufferUnderRun());
00229 }
00230
00231
00232
00233
00234
00235 int main(int argc, char **argv) {
00236
00237 testing::InitGoogleTest(&argc,argv);
00238 return RUN_ALL_TESTS();
00239 }
00240