RangesTests.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/UnitTest/TestTypes.h>
  9. #include <AzCore/IO/Path/Path.h>
  10. #include <AzCore/std/ranges/ranges.h>
  11. namespace UnitTest
  12. {
  13. class RangesTestFixture
  14. : public LeakDetectionFixture
  15. {};
  16. struct RangeLikeCustomizationPoint {};
  17. RangeLikeCustomizationPoint* begin(RangeLikeCustomizationPoint& rangeLike)
  18. {
  19. return &rangeLike;
  20. }
  21. RangeLikeCustomizationPoint* end(RangeLikeCustomizationPoint& rangeLike)
  22. {
  23. return &rangeLike;
  24. }
  25. const RangeLikeCustomizationPoint* begin(const RangeLikeCustomizationPoint& rangeLike)
  26. {
  27. return &rangeLike;
  28. }
  29. const RangeLikeCustomizationPoint* end(const RangeLikeCustomizationPoint& rangeLike)
  30. {
  31. return &rangeLike;
  32. }
  33. RangeLikeCustomizationPoint* rbegin(RangeLikeCustomizationPoint& rangeLike)
  34. {
  35. return &rangeLike;
  36. }
  37. RangeLikeCustomizationPoint* rend(RangeLikeCustomizationPoint& rangeLike)
  38. {
  39. return &rangeLike;
  40. }
  41. const RangeLikeCustomizationPoint* rbegin(const RangeLikeCustomizationPoint& rangeLike)
  42. {
  43. return &rangeLike;
  44. }
  45. const RangeLikeCustomizationPoint* rend(const RangeLikeCustomizationPoint& rangeLike)
  46. {
  47. return &rangeLike;
  48. }
  49. constexpr size_t size(const RangeLikeCustomizationPoint&)
  50. {
  51. return 0;
  52. }
  53. constexpr size_t size(RangeLikeCustomizationPoint&)
  54. {
  55. return 0;
  56. }
  57. // range access
  58. TEST_F(RangesTestFixture, RangesBegin_Compiles_WithExtentArray)
  59. {
  60. using ArrayExtentType = int[5];
  61. ArrayExtentType extentArray{};
  62. EXPECT_EQ(extentArray + 0, AZStd::ranges::begin(extentArray));
  63. }
  64. TEST_F(RangesTestFixture, RangesBegin_DoesNotCompile_WithNoExtentArray)
  65. {
  66. using ArrayNoExtentType = int[];
  67. static_assert(!AZStd::invocable<decltype(AZStd::ranges::begin), ArrayNoExtentType>);
  68. }
  69. TEST_F(RangesTestFixture, RangesBegin_Compiles_WithMemberOverload)
  70. {
  71. AZStd::string_view strView;
  72. EXPECT_EQ(strView.begin(), AZStd::ranges::begin(strView));
  73. }
  74. TEST_F(RangesTestFixture, RangesBegin_Compiles_WithADL)
  75. {
  76. RangeLikeCustomizationPoint rangeLike;
  77. EXPECT_EQ(&rangeLike, AZStd::ranges::begin(rangeLike));
  78. }
  79. TEST_F(RangesTestFixture, RangesEnd_Compiles_WithExtentArray)
  80. {
  81. using ArrayExtentType = int[5];
  82. ArrayExtentType extentArray{};
  83. EXPECT_EQ(extentArray + 5, AZStd::ranges::end(extentArray));
  84. }
  85. TEST_F(RangesTestFixture, RangesEnd_DoesNotCompile_WithNoExtentArray)
  86. {
  87. using ArrayNoExtentType = int[];
  88. static_assert(!AZStd::invocable<decltype(AZStd::ranges::end), ArrayNoExtentType>);
  89. }
  90. TEST_F(RangesTestFixture, RangesEnd_Compiles_WithMemberOverload)
  91. {
  92. AZStd::string_view strView;
  93. EXPECT_EQ(strView.end(), AZStd::ranges::end(strView));
  94. }
  95. TEST_F(RangesTestFixture, RangesEnd_Compiles_WithADL)
  96. {
  97. RangeLikeCustomizationPoint rangeLike;
  98. EXPECT_EQ(&rangeLike, AZStd::ranges::end(rangeLike));
  99. }
  100. TEST_F(RangesTestFixture, RangesCBegin_Compiles_WithExtentArray)
  101. {
  102. using ArrayExtentType = int[5];
  103. ArrayExtentType extentArray{};
  104. EXPECT_EQ(extentArray + 0, AZStd::ranges::cbegin(extentArray));
  105. }
  106. TEST_F(RangesTestFixture, RangesCBegin_Compiles_WithMemberOverload)
  107. {
  108. AZStd::string_view strView;
  109. EXPECT_EQ(strView.cbegin(), AZStd::ranges::cbegin(strView));
  110. }
  111. TEST_F(RangesTestFixture, RangesCBegin_Compiles_WithADL)
  112. {
  113. RangeLikeCustomizationPoint rangeLike;
  114. EXPECT_EQ(&rangeLike, AZStd::ranges::cbegin(rangeLike));
  115. }
  116. TEST_F(RangesTestFixture, RangesCEnd_Compiles_WithExtentArray)
  117. {
  118. using ArrayExtentType = int[5];
  119. ArrayExtentType extentArray{};
  120. EXPECT_EQ(extentArray + 5, AZStd::ranges::cend(extentArray));
  121. }
  122. TEST_F(RangesTestFixture, RangesCEnd_Compiles_WithMemberOverload)
  123. {
  124. AZStd::string_view strView;
  125. EXPECT_EQ(strView.cend(), AZStd::ranges::cend(strView));
  126. }
  127. TEST_F(RangesTestFixture, RangesCEnd_Compiles_WithADL)
  128. {
  129. RangeLikeCustomizationPoint rangeLike;
  130. EXPECT_EQ(&rangeLike, AZStd::ranges::cend(rangeLike));
  131. }
  132. TEST_F(RangesTestFixture, RangesRBegin_Compiles_WithExtentArray)
  133. {
  134. using ArrayExtentType = int[5];
  135. ArrayExtentType extentArray{};
  136. EXPECT_EQ(extentArray + 5, AZStd::ranges::rbegin(extentArray).base());
  137. }
  138. TEST_F(RangesTestFixture, RangesRBegin_Compiles_WithMemberOverload)
  139. {
  140. AZStd::string_view strView;
  141. EXPECT_EQ(strView.rbegin(), AZStd::ranges::rbegin(strView));
  142. }
  143. TEST_F(RangesTestFixture, RangesRBegin_Compiles_WithADL)
  144. {
  145. RangeLikeCustomizationPoint rangeLike;
  146. EXPECT_EQ(&rangeLike, AZStd::ranges::rbegin(rangeLike));
  147. }
  148. TEST_F(RangesTestFixture, RangesREnd_Compiles_WithExtentArray)
  149. {
  150. using ArrayExtentType = int[5];
  151. ArrayExtentType extentArray{};
  152. EXPECT_EQ(extentArray, AZStd::ranges::rend(extentArray).base());
  153. }
  154. TEST_F(RangesTestFixture, RangesREnd_Compiles_WithMemberOverload)
  155. {
  156. AZStd::string_view strView;
  157. EXPECT_EQ(strView.rend(), AZStd::ranges::rend(strView));
  158. }
  159. TEST_F(RangesTestFixture, RangesREnd_Compiles_WithADL)
  160. {
  161. RangeLikeCustomizationPoint rangeLike;
  162. EXPECT_EQ(&rangeLike, AZStd::ranges::rend(rangeLike));
  163. }
  164. TEST_F(RangesTestFixture, RangesCRBegin_Compiles_WithExtentArray)
  165. {
  166. using ArrayExtentType = int[5];
  167. ArrayExtentType extentArray{};
  168. EXPECT_EQ(extentArray + 5, AZStd::ranges::crbegin(extentArray).base());
  169. }
  170. TEST_F(RangesTestFixture, RangesCRBegin_Compiles_WithMemberOverload)
  171. {
  172. AZStd::string_view strView;
  173. EXPECT_EQ(strView.crbegin(), AZStd::ranges::crbegin(strView));
  174. }
  175. TEST_F(RangesTestFixture, RangesCRBegin_Compiles_WithADL)
  176. {
  177. RangeLikeCustomizationPoint rangeLike;
  178. EXPECT_EQ(&rangeLike, AZStd::ranges::crbegin(rangeLike));
  179. }
  180. TEST_F(RangesTestFixture, RangesCREnd_Compiles_WithExtentArray)
  181. {
  182. using ArrayExtentType = int[5];
  183. ArrayExtentType extentArray{};
  184. EXPECT_EQ(extentArray + 0, AZStd::ranges::crend(extentArray).base());
  185. }
  186. TEST_F(RangesTestFixture, RangesCREnd_Compiles_WithMemberOverload)
  187. {
  188. AZStd::string_view strView;
  189. EXPECT_EQ(strView.crend(), AZStd::ranges::crend(strView));
  190. }
  191. TEST_F(RangesTestFixture, RangesCREnd_Compiles_WithADL)
  192. {
  193. RangeLikeCustomizationPoint rangeLike;
  194. EXPECT_EQ(&rangeLike, AZStd::ranges::crend(rangeLike));
  195. }
  196. // range access - size
  197. TEST_F(RangesTestFixture, RangesSize_Compiles_WithExtentArray)
  198. {
  199. using ArrayExtentType = int[5];
  200. constexpr ArrayExtentType extentArray{};
  201. static_assert(5 == AZStd::ranges::size(extentArray));
  202. }
  203. TEST_F(RangesTestFixture, RangesSize_DoesNotCompile_WithNoExtentArray)
  204. {
  205. using ArrayNoExtentType = int[];
  206. static_assert(!AZStd::invocable<decltype(AZStd::ranges::size), ArrayNoExtentType>);
  207. }
  208. TEST_F(RangesTestFixture, RangesSize_Compiles_WithMemberOverload)
  209. {
  210. AZStd::string_view strView;
  211. EXPECT_EQ(strView.size(), AZStd::ranges::size(strView));
  212. }
  213. TEST_F(RangesTestFixture, RangesSize_Compiles_WithADL)
  214. {
  215. RangeLikeCustomizationPoint rangeLike;
  216. EXPECT_EQ(0, AZStd::ranges::size(rangeLike));
  217. }
  218. TEST_F(RangesTestFixture, RangesSSize_Compiles_WithExtentArray)
  219. {
  220. using ArrayExtentType = int[5];
  221. constexpr ArrayExtentType extentArray{};
  222. static_assert(AZStd::signed_integral<decltype(AZStd::ranges::ssize(extentArray))>);
  223. static_assert(5 == AZStd::ranges::ssize(extentArray));
  224. }
  225. TEST_F(RangesTestFixture, RangesSSize_DoesNotCompile_WithNoExtentArray)
  226. {
  227. using ArrayNoExtentType = int[];
  228. static_assert(!AZStd::invocable<decltype(AZStd::ranges::ssize), ArrayNoExtentType>);
  229. }
  230. TEST_F(RangesTestFixture, RangesSSize_Compiles_WithMemberOverload)
  231. {
  232. AZStd::string_view strView;
  233. static_assert(AZStd::signed_integral<decltype(AZStd::ranges::ssize(strView))>);
  234. EXPECT_EQ(strView.size(), AZStd::ranges::ssize(strView));
  235. }
  236. TEST_F(RangesTestFixture, RangesSSize_Compiles_WithADL)
  237. {
  238. RangeLikeCustomizationPoint rangeLike;
  239. static_assert(AZStd::signed_integral<decltype(AZStd::ranges::ssize(rangeLike))>);
  240. EXPECT_EQ(0, AZStd::ranges::ssize(rangeLike));
  241. }
  242. // range access - empty
  243. TEST_F(RangesTestFixture, RangesEmpty_Compiles_WithExtentArray)
  244. {
  245. using ArrayExtentType = int[5];
  246. constexpr ArrayExtentType extentArray{};
  247. static_assert(!AZStd::ranges::empty(extentArray));
  248. }
  249. TEST_F(RangesTestFixture, RangesEmpty_DoesNotCompile_WithNoExtentArray)
  250. {
  251. using ArrayNoExtentType = int[];
  252. static_assert(!AZStd::invocable<decltype(AZStd::ranges::empty), ArrayNoExtentType>);
  253. }
  254. TEST_F(RangesTestFixture, RangesEmpty_Compiles_WithMemberOverload)
  255. {
  256. constexpr AZStd::string_view strView;
  257. static_assert(AZStd::ranges::empty(strView));
  258. }
  259. TEST_F(RangesTestFixture, RangesEmpty_Compiles_WithADL)
  260. {
  261. constexpr RangeLikeCustomizationPoint rangeLike;
  262. static_assert(AZStd::ranges::empty(rangeLike));
  263. }
  264. // range access - data
  265. TEST_F(RangesTestFixture, RangesData_Compiles_WithExtentArray)
  266. {
  267. using ArrayExtentType = int[5];
  268. constexpr ArrayExtentType extentArray{};
  269. EXPECT_EQ(extentArray, AZStd::ranges::data(extentArray));
  270. }
  271. TEST_F(RangesTestFixture, RangesData_DoesNotCompile_WithNoExtentArray)
  272. {
  273. using ArrayNoExtentType = int[];
  274. static_assert(!AZStd::invocable<decltype(AZStd::ranges::data), ArrayNoExtentType>);
  275. }
  276. TEST_F(RangesTestFixture, RangesData_Compiles_WithMemberOverload)
  277. {
  278. constexpr AZStd::string_view strView;
  279. EXPECT_EQ(strView.data(), AZStd::ranges::data(strView));
  280. }
  281. TEST_F(RangesTestFixture, RangesData_Compiles_WithADL)
  282. {
  283. RangeLikeCustomizationPoint rangeLike;
  284. EXPECT_EQ(&rangeLike, AZStd::ranges::data(rangeLike));
  285. }
  286. // range access - cdata
  287. TEST_F(RangesTestFixture, RangesCData_Compiles_WithExtentArray)
  288. {
  289. using ArrayExtentType = int[5];
  290. constexpr ArrayExtentType extentArray{};
  291. EXPECT_EQ(extentArray, AZStd::ranges::cdata(extentArray));
  292. }
  293. TEST_F(RangesTestFixture, RangesCData_DoesNotCompile_WithNoExtentArray)
  294. {
  295. using ArrayNoExtentType = int[];
  296. static_assert(!AZStd::invocable<decltype(AZStd::ranges::cdata), ArrayNoExtentType>);
  297. }
  298. TEST_F(RangesTestFixture, RangesCData_Compiles_WithMemberOverload)
  299. {
  300. constexpr AZStd::string_view strView;
  301. EXPECT_EQ(strView.data(), AZStd::ranges::cdata(strView));
  302. }
  303. TEST_F(RangesTestFixture, RangesCData_Compiles_WithADL)
  304. {
  305. RangeLikeCustomizationPoint rangeLike;
  306. EXPECT_EQ(&rangeLike, AZStd::ranges::cdata(rangeLike));
  307. }
  308. // Ranges TypeTraits Test
  309. TEST_F(RangesTestFixture, RangesTypeTraits_Compiles)
  310. {
  311. // string_view
  312. static_assert(AZStd::same_as<AZStd::ranges::iterator_t<AZStd::string_view>, const char*>);
  313. static_assert(AZStd::same_as<AZStd::ranges::sentinel_t<AZStd::string_view>, const char*>);
  314. static_assert(AZStd::same_as<AZStd::ranges::range_difference_t<AZStd::string_view>, ptrdiff_t>);
  315. static_assert(AZStd::same_as<AZStd::ranges::range_size_t<AZStd::string_view>, size_t>);
  316. static_assert(AZStd::same_as<AZStd::ranges::range_value_t<AZStd::string_view>, char>);
  317. static_assert(AZStd::same_as<AZStd::ranges::range_reference_t<AZStd::string_view>, const char&>);
  318. static_assert(AZStd::same_as<AZStd::ranges::range_rvalue_reference_t<AZStd::string_view>, const char&&>);
  319. // string
  320. static_assert(AZStd::same_as<AZStd::ranges::iterator_t<AZStd::string>, char*>);
  321. static_assert(AZStd::same_as<AZStd::ranges::sentinel_t<AZStd::string>, char*>);
  322. static_assert(AZStd::same_as<AZStd::ranges::range_difference_t<AZStd::string>, ptrdiff_t>);
  323. static_assert(AZStd::same_as<AZStd::ranges::range_size_t<AZStd::string>, size_t>);
  324. static_assert(AZStd::same_as<AZStd::ranges::range_value_t<AZStd::string>, char>);
  325. static_assert(AZStd::same_as<AZStd::ranges::range_reference_t<AZStd::string>, char&>);
  326. static_assert(AZStd::same_as<AZStd::ranges::range_rvalue_reference_t<AZStd::string>, char&&>);
  327. // int array type
  328. using ArrayExtentType = int[5];
  329. static_assert(AZStd::same_as<AZStd::ranges::iterator_t<ArrayExtentType>, int*>);
  330. static_assert(AZStd::same_as<AZStd::ranges::sentinel_t<ArrayExtentType>, int*>);
  331. static_assert(AZStd::same_as<AZStd::ranges::range_difference_t<ArrayExtentType>, ptrdiff_t>);
  332. static_assert(AZStd::same_as<AZStd::ranges::range_size_t<ArrayExtentType>, size_t>);
  333. static_assert(AZStd::same_as<AZStd::ranges::range_value_t<ArrayExtentType>, int>);
  334. static_assert(AZStd::same_as<AZStd::ranges::range_reference_t<ArrayExtentType>, int&>);
  335. static_assert(AZStd::same_as<AZStd::ranges::range_rvalue_reference_t<ArrayExtentType>, int&&>);
  336. // RangeLikeCustomizationPoint type which specializes several range functions
  337. static_assert(AZStd::same_as<AZStd::ranges::iterator_t<RangeLikeCustomizationPoint>, RangeLikeCustomizationPoint*>);
  338. static_assert(AZStd::same_as<AZStd::ranges::sentinel_t<RangeLikeCustomizationPoint>, RangeLikeCustomizationPoint*>);
  339. static_assert(AZStd::same_as<AZStd::ranges::range_difference_t<RangeLikeCustomizationPoint>, ptrdiff_t>);
  340. static_assert(AZStd::same_as<AZStd::ranges::range_size_t<RangeLikeCustomizationPoint>, size_t>);
  341. static_assert(AZStd::same_as<AZStd::ranges::range_value_t<RangeLikeCustomizationPoint>, RangeLikeCustomizationPoint>);
  342. static_assert(AZStd::same_as<AZStd::ranges::range_reference_t<RangeLikeCustomizationPoint>, RangeLikeCustomizationPoint&>);
  343. static_assert(AZStd::same_as<AZStd::ranges::range_rvalue_reference_t<RangeLikeCustomizationPoint>, RangeLikeCustomizationPoint&&>);
  344. }
  345. // Ranges Concepts Test
  346. TEST_F(RangesTestFixture, RangesConcepts_Compiles)
  347. {
  348. using ArrayExtentType = int[5];
  349. // concept - range
  350. static_assert(AZStd::ranges::range<AZStd::string_view>);
  351. static_assert(AZStd::ranges::range<ArrayExtentType>);
  352. static_assert(AZStd::ranges::range<AZ::IO::PathView>);
  353. static_assert(!AZStd::ranges::range<int>);
  354. // concept - sized_range
  355. static_assert(AZStd::ranges::sized_range<AZStd::string_view>);
  356. static_assert(AZStd::ranges::sized_range<ArrayExtentType>);
  357. // Path classes do not have a size() function so they are not a sized_range
  358. static_assert(!AZStd::ranges::sized_range<AZ::IO::PathView>);
  359. // concept - borrowed_range
  360. static_assert(AZStd::ranges::borrowed_range<AZStd::string_view>);
  361. static_assert(AZStd::ranges::borrowed_range<ArrayExtentType&>);
  362. static_assert(!AZStd::ranges::borrowed_range<ArrayExtentType>);
  363. // concept - output_range
  364. static_assert(AZStd::ranges::output_range<AZStd::string, char>);
  365. static_assert(!AZStd::ranges::output_range<AZStd::string_view, char>);
  366. // concept - input_range
  367. static_assert(AZStd::ranges::input_range<AZStd::list<int>>);
  368. static_assert(AZStd::ranges::input_range<AZStd::string>);
  369. static_assert(AZStd::ranges::input_range<AZStd::string_view>);
  370. // concept - forward_range
  371. static_assert(AZStd::ranges::forward_range<AZStd::list<int>>);
  372. static_assert(AZStd::ranges::forward_range<AZStd::string>);
  373. static_assert(AZStd::ranges::forward_range<AZStd::string_view>);
  374. // concept - bidirectional_range
  375. static_assert(AZStd::ranges::bidirectional_range<AZStd::list<int>>);
  376. static_assert(AZStd::ranges::bidirectional_range<AZStd::string>);
  377. static_assert(AZStd::ranges::bidirectional_range<AZStd::string_view>);
  378. // concept - random_access_range
  379. static_assert(!AZStd::ranges::random_access_range<AZStd::list<int>>);
  380. static_assert(AZStd::ranges::random_access_range<AZStd::deque<int>>);
  381. static_assert(AZStd::ranges::random_access_range<AZStd::string>);
  382. static_assert(AZStd::ranges::random_access_range<AZStd::string_view>);
  383. // concept - contiguous_range
  384. static_assert(!AZStd::ranges::contiguous_range<AZStd::deque<int>>);
  385. static_assert(AZStd::ranges::contiguous_range<AZStd::string>);
  386. static_assert(AZStd::ranges::contiguous_range<AZStd::string_view>);
  387. // concept - common_range
  388. static_assert(AZStd::ranges::common_range<ArrayExtentType>);
  389. static_assert(AZStd::ranges::common_range<AZStd::list<int>>);
  390. static_assert(AZStd::ranges::common_range<AZStd::deque<int>>);
  391. static_assert(AZStd::ranges::common_range<AZStd::string>);
  392. static_assert(AZStd::ranges::common_range<AZStd::string_view>);
  393. // concept - view
  394. static_assert(AZStd::ranges::view<AZStd::string_view>);
  395. static_assert(!AZStd::ranges::view<ArrayExtentType>);
  396. // concept - viewable_range
  397. static_assert(AZStd::ranges::viewable_range<AZStd::string>);
  398. static_assert(AZStd::ranges::viewable_range<AZStd::string_view>);
  399. static_assert(!AZStd::ranges::viewable_range<ArrayExtentType>);
  400. }
  401. // Ranges iterator operations
  402. TEST_F(RangesTestFixture, RangesAdvance_PositiveDifference_Succeeds)
  403. {
  404. AZStd::string_view testString{ "Hello World" };
  405. auto strIter = testString.begin();
  406. // difference overload
  407. AZStd::ranges::advance(strIter, 5);
  408. ASSERT_NE(testString.end(), strIter);
  409. EXPECT_EQ(' ', *strIter);
  410. // bound overload
  411. AZStd::ranges::advance(strIter, testString.end());
  412. EXPECT_EQ(testString.end(), strIter);
  413. // difference + bound overload
  414. strIter = testString.begin();
  415. ptrdiff_t charactersToTraverse = 20;
  416. EXPECT_EQ(charactersToTraverse - testString.size(), AZStd::ranges::advance(strIter, charactersToTraverse, testString.end()));
  417. EXPECT_EQ(testString.end(), strIter);
  418. strIter = testString.begin();
  419. charactersToTraverse = 5;
  420. EXPECT_EQ(0, AZStd::ranges::advance(strIter, charactersToTraverse, testString.end()));
  421. ASSERT_NE(testString.end(), strIter);
  422. EXPECT_EQ(' ', *strIter);
  423. }
  424. TEST_F(RangesTestFixture, RangesAdvance_NegativeDifference_Succeeds)
  425. {
  426. AZStd::string_view testString{ "Hello World" };
  427. auto strIter = testString.end();
  428. // difference overload
  429. AZStd::ranges::advance(strIter, -5);
  430. ASSERT_NE(testString.end(), strIter);
  431. EXPECT_EQ('W', *strIter);
  432. // difference + bound overload
  433. strIter = testString.end();
  434. ptrdiff_t charactersToTraverse = -20;
  435. EXPECT_EQ(charactersToTraverse + testString.size(), AZStd::ranges::advance(strIter, charactersToTraverse, testString.begin()));
  436. EXPECT_EQ(testString.begin(), strIter);
  437. strIter = testString.end();
  438. charactersToTraverse = -5;
  439. EXPECT_EQ(0, AZStd::ranges::advance(strIter, charactersToTraverse, testString.begin()));
  440. ASSERT_NE(testString.end(), strIter);
  441. ASSERT_NE(testString.begin(), strIter);
  442. EXPECT_EQ('W', *strIter);
  443. }
  444. TEST_F(RangesTestFixture, RangesDistance_Succeeds)
  445. {
  446. AZStd::string_view testString{ "Hello World" };
  447. EXPECT_EQ(testString.size(), AZStd::ranges::distance(testString));
  448. EXPECT_EQ(testString.size(), AZStd::ranges::distance(testString.begin(), testString.end()));
  449. AZStd::list<char> testList{ 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' };
  450. EXPECT_EQ(testList.size(), AZStd::ranges::distance(testList));
  451. EXPECT_EQ(testList.size(), AZStd::ranges::distance(testList.begin(), testList.end()));
  452. }
  453. TEST_F(RangesTestFixture, RangesNext_Succeeds)
  454. {
  455. AZStd::string_view testString{ "Hello World" };
  456. auto strIter = testString.begin();
  457. auto boundIter = testString.begin() + 5;
  458. // single increment
  459. EXPECT_EQ(testString.begin() + 1, AZStd::ranges::next(strIter));
  460. // increment by value
  461. strIter = testString.begin();
  462. EXPECT_EQ(testString.begin() + 5, AZStd::ranges::next(strIter, 5));
  463. // increment until bound
  464. strIter = testString.begin();
  465. EXPECT_EQ(testString.begin() + 5, AZStd::ranges::next(strIter, boundIter));
  466. // increment by value up until bound
  467. strIter = testString.begin();
  468. EXPECT_EQ(testString.begin() + 5, AZStd::ranges::next(strIter, 10, boundIter));
  469. strIter = testString.begin();
  470. EXPECT_EQ(testString.begin() + 4, AZStd::ranges::next(strIter, 4, boundIter));
  471. }
  472. TEST_F(RangesTestFixture, RangesPrev_Succeeds)
  473. {
  474. AZStd::string_view testString{ "Hello World" };
  475. auto strIter = testString.end();
  476. auto boundIter = testString.end() - 5;
  477. // single decrement
  478. EXPECT_EQ(testString.end() - 1, AZStd::ranges::prev(strIter));
  479. // decrement by value
  480. strIter = testString.end();
  481. EXPECT_EQ(testString.end() - 5, AZStd::ranges::prev(strIter, 5));
  482. // decrement by value up until bound
  483. strIter = testString.end();
  484. EXPECT_EQ(testString.end() - 5, AZStd::ranges::prev(strIter, 10, boundIter));
  485. strIter = testString.end();
  486. EXPECT_EQ(testString.end() - 4, AZStd::ranges::prev(strIter, 4, boundIter));
  487. }
  488. }