FBVectorTests.cpp.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /*
  2. * Copyright 2011-present Facebook, Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /**
  17. * This file is supposed to be included from within
  18. * FBVectorTest. Do not use otherwise.
  19. */
  20. TESTFUN(clause_23_3_6_1_1) {
  21. VECTOR v;
  22. EXPECT_TRUE(v.empty());
  23. VECTOR::allocator_type a;
  24. VECTOR v1(a);
  25. EXPECT_TRUE(v1.empty());
  26. }
  27. TESTFUN(clause_23_3_6_1_3) {
  28. auto const n = random(0U, 10000U);
  29. VECTOR v(n);
  30. EXPECT_EQ(v.size(), n);
  31. FOR_EACH (i, v) { EXPECT_EQ(*i, VECTOR::value_type()); }
  32. }
  33. TESTFUN(clause_23_3_6_1_9) {
  34. // Insert with iterators
  35. list<VECTOR::value_type> lst;
  36. auto const n = random(0U, 10000U);
  37. FOR_EACH_RANGE (i, 0, n) {
  38. lst.push_back(randomObject<VECTOR::value_type>());
  39. }
  40. VECTOR v(lst.begin(), lst.end());
  41. EXPECT_EQ(v.size(), lst.size());
  42. size_t j = 0;
  43. FOR_EACH (i, lst) {
  44. EXPECT_EQ(v[j], *i);
  45. j++;
  46. }
  47. }
  48. TESTFUN(clause_23_3_6_1_11) {
  49. // assign with iterators
  50. list<VECTOR::value_type> lst;
  51. auto const n = random(0U, 10000U);
  52. FOR_EACH_RANGE (i, 0, n) {
  53. lst.push_back(randomObject<VECTOR::value_type>());
  54. }
  55. VECTOR v;
  56. v.assign(lst.begin(), lst.end());
  57. EXPECT_EQ(v.size(), lst.size());
  58. size_t j = 0;
  59. FOR_EACH (i, lst) {
  60. EXPECT_EQ(v[j], *i);
  61. j++;
  62. }
  63. // aliased assign
  64. v.assign(v.begin(), v.begin() + v.size() / 2);
  65. EXPECT_EQ(v.size(), lst.size() / 2);
  66. j = 0;
  67. FOR_EACH (i, lst) {
  68. if (j == v.size()) {
  69. break;
  70. }
  71. EXPECT_EQ(v[j], *i);
  72. j++;
  73. }
  74. }
  75. TESTFUN(clause_23_3_6_1_12) {
  76. VECTOR v;
  77. auto const n = random(0U, 10000U);
  78. auto const obj = randomObject<VECTOR::value_type>();
  79. v.assign(n, obj);
  80. EXPECT_EQ(v.size(), n);
  81. FOR_EACH (i, v) { EXPECT_EQ(*i, obj); }
  82. }
  83. TESTFUN(clause_23_3_6_2_1) {
  84. VECTOR v;
  85. auto const n = random(0U, 10000U);
  86. v.reserve(n);
  87. EXPECT_GE(v.capacity(), n);
  88. }
  89. TESTFUN(clause_23_3_6_2_7) {
  90. auto const n1 = random(0U, 10000U);
  91. auto const n2 = random(0U, 10000U);
  92. auto const obj1 = randomObject<VECTOR::value_type>();
  93. auto const obj2 = randomObject<VECTOR::value_type>();
  94. VECTOR v1(n1, obj1), v2(n2, obj2);
  95. v1.swap(v2);
  96. EXPECT_EQ(v1.size(), n2);
  97. EXPECT_EQ(v2.size(), n1);
  98. FOR_EACH (i, v1) { EXPECT_EQ(*i, obj2); }
  99. FOR_EACH (i, v2) { EXPECT_EQ(*i, obj1); }
  100. }
  101. TESTFUN(clause_23_3_6_2_9) {
  102. VECTOR v;
  103. auto const n1 = random(0U, 10000U);
  104. v.resize(n1);
  105. FOR_EACH (i, v) { EXPECT_EQ(*i, VECTOR::value_type()); }
  106. FOR_EACH (i, v) { EXPECT_EQ(*i, VECTOR::value_type()); }
  107. }
  108. TESTFUN(clause_23_3_6_2_11) {
  109. VECTOR v;
  110. auto const n1 = random(0U, 10000U);
  111. auto const obj1 = randomObject<VECTOR::value_type>();
  112. v.resize(n1, obj1);
  113. FOR_EACH (i, v) { EXPECT_EQ(*i, obj1); }
  114. auto const n2 = random(0U, 10000U);
  115. auto const obj2 = randomObject<VECTOR::value_type>();
  116. v.resize(n2, obj2);
  117. if (n1 < n2) {
  118. FOR_EACH_RANGE (i, n1, n2) { EXPECT_EQ(v[i], obj2); }
  119. }
  120. }
  121. TESTFUN(clause_absent_element_access) {
  122. VECTOR v;
  123. auto const n1 = random(1U, 10000U);
  124. auto const obj1 = randomObject<VECTOR::value_type>();
  125. v.resize(n1, obj1);
  126. auto const n = random(0U, v.size() - 1);
  127. EXPECT_EQ(v[n], v.at(n));
  128. auto const obj2 = randomObject<VECTOR::value_type>();
  129. v[n] = obj2;
  130. EXPECT_EQ(v[n], v.at(n));
  131. EXPECT_EQ(v[n], obj2);
  132. auto const obj3 = randomObject<VECTOR::value_type>();
  133. v.at(n) = obj3;
  134. EXPECT_EQ(v[n], v.at(n));
  135. EXPECT_EQ(v[n], obj3);
  136. }
  137. TESTFUN(clause_23_3_6_3_1) {
  138. VECTOR v;
  139. auto const n1 = random(1U, 10000U);
  140. auto const obj1 = randomObject<VECTOR::value_type>();
  141. v.resize(n1, obj1);
  142. EXPECT_EQ(v.data(), &v.front());
  143. }
  144. TESTFUN(clause_23_3_6_4_1_a) {
  145. VECTOR v, w;
  146. auto const n1 = random(1U, 10000U);
  147. FOR_EACH_RANGE (i, 0, n1) {
  148. auto const obj1 = randomObject<VECTOR::value_type>();
  149. v.push_back(obj1);
  150. w.push_back(obj1);
  151. }
  152. auto const n2 = random(0U, n1 - 1);
  153. auto pos = v.begin() + n2;
  154. auto const obj2 = randomObject<VECTOR::value_type>();
  155. auto r = v.insert(pos, obj2);
  156. EXPECT_EQ(v.size(), w.size() + 1);
  157. EXPECT_EQ(r - v.begin(), n2);
  158. EXPECT_EQ(*r, obj2);
  159. FOR_EACH_RANGE (i, 0, r - v.begin()) { EXPECT_EQ(v[i], w[i]); }
  160. FOR_EACH_RANGE (i, r - v.begin() + 1, v.size()) { EXPECT_EQ(v[i], w[i - 1]); }
  161. }
  162. TESTFUN(clause_23_3_6_4_1_c) {
  163. // This test only works for fbvector
  164. fbvector<VECTOR::value_type> v, w;
  165. auto const n1 = random(1U, 10000U);
  166. FOR_EACH_RANGE (i, 0, n1) {
  167. auto const obj1 = randomObject<VECTOR::value_type>();
  168. v.push_back(obj1);
  169. w.push_back(obj1);
  170. }
  171. auto const n2 = random(0U, n1 - 1);
  172. auto pos = v.begin() + n2;
  173. auto const obj2 = randomObject<VECTOR::value_type>();
  174. auto const n3 = random(0U, 10000U);
  175. auto r = v.insert(pos, n3, obj2);
  176. EXPECT_EQ(v.size(), w.size() + n3);
  177. EXPECT_EQ(r - v.begin(), n2);
  178. FOR_EACH_RANGE (i, 0, r - v.begin()) { EXPECT_EQ(v[i], w[i]); }
  179. FOR_EACH_RANGE (i, r - v.begin(), r - v.begin() + n3) {
  180. EXPECT_EQ(v[i], obj2);
  181. }
  182. FOR_EACH_RANGE (i, r - v.begin() + n3, v.size()) {
  183. EXPECT_EQ(v[i], w[i - n3]);
  184. }
  185. }
  186. TESTFUN(clause_23_3_6_4_1_d) {
  187. VECTOR v, w;
  188. auto const n1 = random(0U, 10000U);
  189. FOR_EACH_RANGE (i, 0, n1) {
  190. auto const obj1 = randomObject<VECTOR::value_type>();
  191. v.push_back(obj1);
  192. w.push_back(obj1);
  193. }
  194. EXPECT_EQ(v.size(), n1);
  195. auto const obj2 = randomObject<VECTOR::value_type>();
  196. v.push_back(obj2);
  197. EXPECT_EQ(v.back(), obj2);
  198. EXPECT_EQ(v.size(), w.size() + 1);
  199. FOR_EACH_RANGE (i, 0, w.size()) { EXPECT_EQ(v[i], w[i]); }
  200. }
  201. TESTFUN(clause_23_3_6_4_3) {
  202. VECTOR v, w;
  203. auto const n1 = random(1U, 10000U);
  204. FOR_EACH_RANGE (i, 0, n1) {
  205. auto const obj1 = randomObject<VECTOR::value_type>();
  206. v.push_back(obj1);
  207. w.push_back(obj1);
  208. }
  209. EXPECT_EQ(v.size(), n1);
  210. auto const n2 = random(0U, n1 - 1);
  211. auto it = v.erase(v.begin() + n2);
  212. EXPECT_EQ(v.size() + 1, w.size());
  213. FOR_EACH_RANGE (i, 0, it - v.begin()) { EXPECT_EQ(v[i], w[i]); }
  214. FOR_EACH_RANGE (i, it - v.begin(), v.size()) { EXPECT_EQ(v[i], w[i + 1]); }
  215. }
  216. TESTFUN(clause_23_3_6_4_4) {
  217. VECTOR v, w;
  218. auto const n1 = random(1U, 10000U);
  219. FOR_EACH_RANGE (i, 0, n1) {
  220. auto const obj1 = randomObject<VECTOR::value_type>();
  221. v.push_back(obj1);
  222. w.push_back(obj1);
  223. }
  224. EXPECT_EQ(v.size(), n1);
  225. auto const n2 = random(0U, n1 - 1);
  226. auto const n3 = random(n2, n1 - 1);
  227. auto it = v.erase(v.begin() + n2, v.begin() + n3);
  228. EXPECT_EQ(v.size() + (n3 - n2), w.size());
  229. FOR_EACH_RANGE (i, 0, it - v.begin()) { EXPECT_EQ(v[i], w[i]); }
  230. FOR_EACH_RANGE (i, it - v.begin(), v.size()) {
  231. EXPECT_EQ(v[i], w[i + (n3 - n2)]);
  232. }
  233. }
  234. TESTFUN(clause_23_3_6_4_clear) {
  235. VECTOR v;
  236. v.clear();
  237. EXPECT_TRUE(v.empty());
  238. v.resize(random(0U, 10000U));
  239. auto c = v.capacity();
  240. v.clear();
  241. EXPECT_TRUE(v.empty());
  242. EXPECT_EQ(v.capacity(), c);
  243. }