extensions.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830
  1. #include <catch2/catch.hpp>
  2. #include <tl/expected.hpp>
  3. #define TOKENPASTE(x, y) x##y
  4. #define TOKENPASTE2(x, y) TOKENPASTE(x, y)
  5. #undef STATIC_REQUIRE
  6. #define STATIC_REQUIRE(e) \
  7. constexpr bool TOKENPASTE2(rqure, __LINE__) = e; \
  8. (void)TOKENPASTE2(rqure, __LINE__); \
  9. REQUIRE(e);
  10. TEST_CASE("Map extensions", "[extensions.map]") {
  11. auto mul2 = [](int a) { return a * 2; };
  12. auto ret_void = [](int a) { (void)a; };
  13. {
  14. tl::expected<int, int> e = 21;
  15. auto ret = e.map(mul2);
  16. REQUIRE(ret);
  17. REQUIRE(*ret == 42);
  18. }
  19. {
  20. const tl::expected<int, int> e = 21;
  21. auto ret = e.map(mul2);
  22. REQUIRE(ret);
  23. REQUIRE(*ret == 42);
  24. }
  25. {
  26. tl::expected<int, int> e = 21;
  27. auto ret = std::move(e).map(mul2);
  28. REQUIRE(ret);
  29. REQUIRE(*ret == 42);
  30. }
  31. {
  32. const tl::expected<int, int> e = 21;
  33. auto ret = std::move(e).map(mul2);
  34. REQUIRE(ret);
  35. REQUIRE(*ret == 42);
  36. }
  37. {
  38. tl::expected<int, int> e(tl::unexpect, 21);
  39. auto ret = e.map(mul2);
  40. REQUIRE(!ret);
  41. REQUIRE(ret.error() == 21);
  42. }
  43. {
  44. const tl::expected<int, int> e(tl::unexpect, 21);
  45. auto ret = e.map(mul2);
  46. REQUIRE(!ret);
  47. REQUIRE(ret.error() == 21);
  48. }
  49. {
  50. tl::expected<int, int> e(tl::unexpect, 21);
  51. auto ret = std::move(e).map(mul2);
  52. REQUIRE(!ret);
  53. REQUIRE(ret.error() == 21);
  54. }
  55. {
  56. const tl::expected<int, int> e(tl::unexpect, 21);
  57. auto ret = std::move(e).map(mul2);
  58. REQUIRE(!ret);
  59. REQUIRE(ret.error() == 21);
  60. }
  61. {
  62. tl::expected<int, int> e = 21;
  63. auto ret = e.map(ret_void);
  64. REQUIRE(ret);
  65. STATIC_REQUIRE(
  66. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  67. }
  68. {
  69. const tl::expected<int, int> e = 21;
  70. auto ret = e.map(ret_void);
  71. REQUIRE(ret);
  72. STATIC_REQUIRE(
  73. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  74. }
  75. {
  76. tl::expected<int, int> e = 21;
  77. auto ret = std::move(e).map(ret_void);
  78. REQUIRE(ret);
  79. STATIC_REQUIRE(
  80. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  81. }
  82. {
  83. const tl::expected<int, int> e = 21;
  84. auto ret = std::move(e).map(ret_void);
  85. REQUIRE(ret);
  86. STATIC_REQUIRE(
  87. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  88. }
  89. {
  90. tl::expected<int, int> e(tl::unexpect, 21);
  91. auto ret = e.map(ret_void);
  92. REQUIRE(!ret);
  93. STATIC_REQUIRE(
  94. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  95. }
  96. {
  97. const tl::expected<int, int> e(tl::unexpect, 21);
  98. auto ret = e.map(ret_void);
  99. REQUIRE(!ret);
  100. STATIC_REQUIRE(
  101. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  102. }
  103. {
  104. tl::expected<int, int> e(tl::unexpect, 21);
  105. auto ret = std::move(e).map(ret_void);
  106. REQUIRE(!ret);
  107. STATIC_REQUIRE(
  108. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  109. }
  110. {
  111. const tl::expected<int, int> e(tl::unexpect, 21);
  112. auto ret = std::move(e).map(ret_void);
  113. REQUIRE(!ret);
  114. STATIC_REQUIRE(
  115. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  116. }
  117. // mapping functions which return references
  118. {
  119. tl::expected<int, int> e(42);
  120. auto ret = e.map([](int& i) -> int& { return i; });
  121. REQUIRE(ret);
  122. REQUIRE(ret == 42);
  123. }
  124. }
  125. TEST_CASE("Map error extensions", "[extensions.map_error]") {
  126. auto mul2 = [](int a) { return a * 2; };
  127. auto ret_void = [](int a) { (void)a; };
  128. {
  129. tl::expected<int, int> e = 21;
  130. auto ret = e.map_error(mul2);
  131. REQUIRE(ret);
  132. REQUIRE(*ret == 21);
  133. }
  134. {
  135. const tl::expected<int, int> e = 21;
  136. auto ret = e.map_error(mul2);
  137. REQUIRE(ret);
  138. REQUIRE(*ret == 21);
  139. }
  140. {
  141. tl::expected<int, int> e = 21;
  142. auto ret = std::move(e).map_error(mul2);
  143. REQUIRE(ret);
  144. REQUIRE(*ret == 21);
  145. }
  146. {
  147. const tl::expected<int, int> e = 21;
  148. auto ret = std::move(e).map_error(mul2);
  149. REQUIRE(ret);
  150. REQUIRE(*ret == 21);
  151. }
  152. {
  153. tl::expected<int, int> e(tl::unexpect, 21);
  154. auto ret = e.map_error(mul2);
  155. REQUIRE(!ret);
  156. REQUIRE(ret.error() == 42);
  157. }
  158. {
  159. const tl::expected<int, int> e(tl::unexpect, 21);
  160. auto ret = e.map_error(mul2);
  161. REQUIRE(!ret);
  162. REQUIRE(ret.error() == 42);
  163. }
  164. {
  165. tl::expected<int, int> e(tl::unexpect, 21);
  166. auto ret = std::move(e).map_error(mul2);
  167. REQUIRE(!ret);
  168. REQUIRE(ret.error() == 42);
  169. }
  170. {
  171. const tl::expected<int, int> e(tl::unexpect, 21);
  172. auto ret = std::move(e).map_error(mul2);
  173. REQUIRE(!ret);
  174. REQUIRE(ret.error() == 42);
  175. }
  176. {
  177. tl::expected<int, int> e = 21;
  178. auto ret = e.map_error(ret_void);
  179. REQUIRE(ret);
  180. }
  181. {
  182. const tl::expected<int, int> e = 21;
  183. auto ret = e.map_error(ret_void);
  184. REQUIRE(ret);
  185. }
  186. {
  187. tl::expected<int, int> e = 21;
  188. auto ret = std::move(e).map_error(ret_void);
  189. REQUIRE(ret);
  190. }
  191. {
  192. const tl::expected<int, int> e = 21;
  193. auto ret = std::move(e).map_error(ret_void);
  194. REQUIRE(ret);
  195. }
  196. {
  197. tl::expected<int, int> e(tl::unexpect, 21);
  198. auto ret = e.map_error(ret_void);
  199. REQUIRE(!ret);
  200. }
  201. {
  202. const tl::expected<int, int> e(tl::unexpect, 21);
  203. auto ret = e.map_error(ret_void);
  204. REQUIRE(!ret);
  205. }
  206. {
  207. tl::expected<int, int> e(tl::unexpect, 21);
  208. auto ret = std::move(e).map_error(ret_void);
  209. REQUIRE(!ret);
  210. }
  211. {
  212. const tl::expected<int, int> e(tl::unexpect, 21);
  213. auto ret = std::move(e).map_error(ret_void);
  214. REQUIRE(!ret);
  215. }
  216. }
  217. TEST_CASE("And then extensions", "[extensions.and_then]") {
  218. auto succeed = [](int a) { (void)a; return tl::expected<int, int>(21 * 2); };
  219. auto fail = [](int a) { (void)a; return tl::expected<int, int>(tl::unexpect, 17); };
  220. {
  221. tl::expected<int, int> e = 21;
  222. auto ret = e.and_then(succeed);
  223. REQUIRE(ret);
  224. REQUIRE(*ret == 42);
  225. }
  226. {
  227. const tl::expected<int, int> e = 21;
  228. auto ret = e.and_then(succeed);
  229. REQUIRE(ret);
  230. REQUIRE(*ret == 42);
  231. }
  232. {
  233. tl::expected<int, int> e = 21;
  234. auto ret = std::move(e).and_then(succeed);
  235. REQUIRE(ret);
  236. REQUIRE(*ret == 42);
  237. }
  238. {
  239. const tl::expected<int, int> e = 21;
  240. auto ret = std::move(e).and_then(succeed);
  241. REQUIRE(ret);
  242. REQUIRE(*ret == 42);
  243. }
  244. {
  245. tl::expected<int, int> e = 21;
  246. auto ret = e.and_then(fail);
  247. REQUIRE(!ret);
  248. REQUIRE(ret.error() == 17);
  249. }
  250. {
  251. const tl::expected<int, int> e = 21;
  252. auto ret = e.and_then(fail);
  253. REQUIRE(!ret);
  254. REQUIRE(ret.error() == 17);
  255. }
  256. {
  257. tl::expected<int, int> e = 21;
  258. auto ret = std::move(e).and_then(fail);
  259. REQUIRE(!ret);
  260. REQUIRE(ret.error() == 17);
  261. }
  262. {
  263. const tl::expected<int, int> e = 21;
  264. auto ret = std::move(e).and_then(fail);
  265. REQUIRE(!ret);
  266. REQUIRE(ret.error() == 17);
  267. }
  268. {
  269. tl::expected<int, int> e(tl::unexpect, 21);
  270. auto ret = e.and_then(succeed);
  271. REQUIRE(!ret);
  272. REQUIRE(ret.error() == 21);
  273. }
  274. {
  275. const tl::expected<int, int> e(tl::unexpect, 21);
  276. auto ret = e.and_then(succeed);
  277. REQUIRE(!ret);
  278. REQUIRE(ret.error() == 21);
  279. }
  280. {
  281. tl::expected<int, int> e(tl::unexpect, 21);
  282. auto ret = std::move(e).and_then(succeed);
  283. REQUIRE(!ret);
  284. REQUIRE(ret.error() == 21);
  285. }
  286. {
  287. const tl::expected<int, int> e(tl::unexpect, 21);
  288. auto ret = std::move(e).and_then(succeed);
  289. REQUIRE(!ret);
  290. REQUIRE(ret.error() == 21);
  291. }
  292. {
  293. tl::expected<int, int> e(tl::unexpect, 21);
  294. auto ret = e.and_then(fail);
  295. REQUIRE(!ret);
  296. REQUIRE(ret.error() == 21);
  297. }
  298. {
  299. const tl::expected<int, int> e(tl::unexpect, 21);
  300. auto ret = e.and_then(fail);
  301. REQUIRE(!ret);
  302. REQUIRE(ret.error() == 21);
  303. }
  304. {
  305. tl::expected<int, int> e(tl::unexpect, 21);
  306. auto ret = std::move(e).and_then(fail);
  307. REQUIRE(!ret);
  308. REQUIRE(ret.error() == 21);
  309. }
  310. {
  311. const tl::expected<int, int> e(tl::unexpect, 21);
  312. auto ret = std::move(e).and_then(fail);
  313. REQUIRE(!ret);
  314. REQUIRE(ret.error() == 21);
  315. }
  316. }
  317. TEST_CASE("or_else", "[extensions.or_else]") {
  318. using eptr = std::unique_ptr<int>;
  319. auto succeed = [](int a) { (void)a; return tl::expected<int, int>(21 * 2); };
  320. auto succeedptr = [](eptr e) { (void)e; return tl::expected<int,eptr>(21*2);};
  321. auto fail = [](int a) { (void)a; return tl::expected<int,int>(tl::unexpect, 17);};
  322. auto failptr = [](eptr e) { *e = 17;return tl::expected<int,eptr>(tl::unexpect, std::move(e));};
  323. auto failvoid = [](int) {};
  324. auto failvoidptr = [](const eptr&) { /* don't consume */};
  325. auto consumeptr = [](eptr) {};
  326. auto make_u_int = [](int n) { return std::unique_ptr<int>(new int(n));};
  327. {
  328. tl::expected<int, int> e = 21;
  329. auto ret = e.or_else(succeed);
  330. REQUIRE(ret);
  331. REQUIRE(*ret == 21);
  332. }
  333. {
  334. const tl::expected<int, int> e = 21;
  335. auto ret = e.or_else(succeed);
  336. REQUIRE(ret);
  337. REQUIRE(*ret == 21);
  338. }
  339. {
  340. tl::expected<int, int> e = 21;
  341. auto ret = std::move(e).or_else(succeed);
  342. REQUIRE(ret);
  343. REQUIRE(*ret == 21);
  344. }
  345. {
  346. tl::expected<int, eptr> e = 21;
  347. auto ret = std::move(e).or_else(succeedptr);
  348. REQUIRE(ret);
  349. REQUIRE(*ret == 21);
  350. }
  351. {
  352. const tl::expected<int, int> e = 21;
  353. auto ret = std::move(e).or_else(succeed);
  354. REQUIRE(ret);
  355. REQUIRE(*ret == 21);
  356. }
  357. {
  358. tl::expected<int, int> e = 21;
  359. auto ret = e.or_else(fail);
  360. REQUIRE(ret);
  361. REQUIRE(*ret == 21);
  362. }
  363. {
  364. const tl::expected<int, int> e = 21;
  365. auto ret = e.or_else(fail);
  366. REQUIRE(ret);
  367. REQUIRE(*ret == 21);
  368. }
  369. {
  370. tl::expected<int, int> e = 21;
  371. auto ret = std::move(e).or_else(fail);
  372. REQUIRE(ret);
  373. REQUIRE(ret == 21);
  374. }
  375. {
  376. tl::expected<int, eptr> e = 21;
  377. auto ret = std::move(e).or_else(failptr);
  378. REQUIRE(ret);
  379. REQUIRE(ret == 21);
  380. }
  381. {
  382. const tl::expected<int, int> e = 21;
  383. auto ret = std::move(e).or_else(fail);
  384. REQUIRE(ret);
  385. REQUIRE(*ret == 21);
  386. }
  387. {
  388. tl::expected<int, int> e(tl::unexpect, 21);
  389. auto ret = e.or_else(succeed);
  390. REQUIRE(ret);
  391. REQUIRE(*ret == 42);
  392. }
  393. {
  394. const tl::expected<int, int> e(tl::unexpect, 21);
  395. auto ret = e.or_else(succeed);
  396. REQUIRE(ret);
  397. REQUIRE(*ret == 42);
  398. }
  399. {
  400. tl::expected<int, int> e(tl::unexpect, 21);
  401. auto ret = std::move(e).or_else(succeed);
  402. REQUIRE(ret);
  403. REQUIRE(*ret == 42);
  404. }
  405. {
  406. tl::expected<int, eptr> e(tl::unexpect, make_u_int(21));
  407. auto ret = std::move(e).or_else(succeedptr);
  408. REQUIRE(ret);
  409. REQUIRE(*ret == 42);
  410. }
  411. {
  412. const tl::expected<int, int> e(tl::unexpect, 21);
  413. auto ret = std::move(e).or_else(succeed);
  414. REQUIRE(ret);
  415. REQUIRE(*ret == 42);
  416. }
  417. {
  418. tl::expected<int, int> e(tl::unexpect, 21);
  419. auto ret = e.or_else(fail);
  420. REQUIRE(!ret);
  421. REQUIRE(ret.error() == 17);
  422. }
  423. {
  424. tl::expected<int, int> e(tl::unexpect, 21);
  425. auto ret = e.or_else(failvoid);
  426. REQUIRE(!ret);
  427. REQUIRE(ret.error() == 21);
  428. }
  429. {
  430. const tl::expected<int, int> e(tl::unexpect, 21);
  431. auto ret = e.or_else(fail);
  432. REQUIRE(!ret);
  433. REQUIRE(ret.error() == 17);
  434. }
  435. {
  436. const tl::expected<int, int> e(tl::unexpect, 21);
  437. auto ret = e.or_else(failvoid);
  438. REQUIRE(!ret);
  439. REQUIRE(ret.error() == 21);
  440. }
  441. {
  442. tl::expected<int, int> e(tl::unexpect, 21);
  443. auto ret = std::move(e).or_else(fail);
  444. REQUIRE(!ret);
  445. REQUIRE(ret.error() == 17);
  446. }
  447. {
  448. tl::expected<int, int> e(tl::unexpect, 21);
  449. auto ret = std::move(e).or_else(failvoid);
  450. REQUIRE(!ret);
  451. REQUIRE(ret.error() == 21);
  452. }
  453. {
  454. tl::expected<int, eptr> e(tl::unexpect, make_u_int(21));
  455. auto ret = std::move(e).or_else(failvoidptr);
  456. REQUIRE(!ret);
  457. REQUIRE(*ret.error() == 21);
  458. }
  459. {
  460. tl::expected<int, eptr> e(tl::unexpect, make_u_int(21));
  461. auto ret = std::move(e).or_else(consumeptr);
  462. REQUIRE(!ret);
  463. REQUIRE(ret.error() == nullptr);
  464. }
  465. {
  466. const tl::expected<int, int> e(tl::unexpect, 21);
  467. auto ret = std::move(e).or_else(fail);
  468. REQUIRE(!ret);
  469. REQUIRE(ret.error() == 17);
  470. }
  471. {
  472. const tl::expected<int, int> e(tl::unexpect, 21);
  473. auto ret = std::move(e).or_else(failvoid);
  474. REQUIRE(!ret);
  475. REQUIRE(ret.error() == 21);
  476. }
  477. }
  478. TEST_CASE("Transform extensions", "[extensions.tronsfarm]") {
  479. auto mul2 = [](int a) { return a * 2; };
  480. auto ret_void = [](int a) { (void)a; };
  481. {
  482. tl::expected<int, int> e = 21;
  483. auto ret = e.transform(mul2);
  484. REQUIRE(ret);
  485. REQUIRE(*ret == 42);
  486. }
  487. {
  488. const tl::expected<int, int> e = 21;
  489. auto ret = e.transform(mul2);
  490. REQUIRE(ret);
  491. REQUIRE(*ret == 42);
  492. }
  493. {
  494. tl::expected<int, int> e = 21;
  495. auto ret = std::move(e).transform(mul2);
  496. REQUIRE(ret);
  497. REQUIRE(*ret == 42);
  498. }
  499. {
  500. const tl::expected<int, int> e = 21;
  501. auto ret = std::move(e).transform(mul2);
  502. REQUIRE(ret);
  503. REQUIRE(*ret == 42);
  504. }
  505. {
  506. tl::expected<int, int> e(tl::unexpect, 21);
  507. auto ret = e.transform(mul2);
  508. REQUIRE(!ret);
  509. REQUIRE(ret.error() == 21);
  510. }
  511. {
  512. const tl::expected<int, int> e(tl::unexpect, 21);
  513. auto ret = e.transform(mul2);
  514. REQUIRE(!ret);
  515. REQUIRE(ret.error() == 21);
  516. }
  517. {
  518. tl::expected<int, int> e(tl::unexpect, 21);
  519. auto ret = std::move(e).transform(mul2);
  520. REQUIRE(!ret);
  521. REQUIRE(ret.error() == 21);
  522. }
  523. {
  524. const tl::expected<int, int> e(tl::unexpect, 21);
  525. auto ret = std::move(e).transform(mul2);
  526. REQUIRE(!ret);
  527. REQUIRE(ret.error() == 21);
  528. }
  529. {
  530. tl::expected<int, int> e = 21;
  531. auto ret = e.transform(ret_void);
  532. REQUIRE(ret);
  533. STATIC_REQUIRE(
  534. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  535. }
  536. {
  537. const tl::expected<int, int> e = 21;
  538. auto ret = e.transform(ret_void);
  539. REQUIRE(ret);
  540. STATIC_REQUIRE(
  541. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  542. }
  543. {
  544. tl::expected<int, int> e = 21;
  545. auto ret = std::move(e).transform(ret_void);
  546. REQUIRE(ret);
  547. STATIC_REQUIRE(
  548. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  549. }
  550. {
  551. const tl::expected<int, int> e = 21;
  552. auto ret = std::move(e).transform(ret_void);
  553. REQUIRE(ret);
  554. STATIC_REQUIRE(
  555. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  556. }
  557. {
  558. tl::expected<int, int> e(tl::unexpect, 21);
  559. auto ret = e.transform(ret_void);
  560. REQUIRE(!ret);
  561. STATIC_REQUIRE(
  562. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  563. }
  564. {
  565. const tl::expected<int, int> e(tl::unexpect, 21);
  566. auto ret = e.transform(ret_void);
  567. REQUIRE(!ret);
  568. STATIC_REQUIRE(
  569. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  570. }
  571. {
  572. tl::expected<int, int> e(tl::unexpect, 21);
  573. auto ret = std::move(e).transform(ret_void);
  574. REQUIRE(!ret);
  575. STATIC_REQUIRE(
  576. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  577. }
  578. {
  579. const tl::expected<int, int> e(tl::unexpect, 21);
  580. auto ret = std::move(e).transform(ret_void);
  581. REQUIRE(!ret);
  582. STATIC_REQUIRE(
  583. (std::is_same<decltype(ret), tl::expected<void, int>>::value));
  584. }
  585. // mapping functions which return references
  586. {
  587. tl::expected<int, int> e(42);
  588. auto ret = e.transform([](int& i) -> int& { return i; });
  589. REQUIRE(ret);
  590. REQUIRE(ret == 42);
  591. }
  592. }
  593. TEST_CASE("Transform error extensions", "[extensions.transform_error]") {
  594. auto mul2 = [](int a) { return a * 2; };
  595. auto ret_void = [](int a) { (void)a; };
  596. {
  597. tl::expected<int, int> e = 21;
  598. auto ret = e.transform_error(mul2);
  599. REQUIRE(ret);
  600. REQUIRE(*ret == 21);
  601. }
  602. {
  603. const tl::expected<int, int> e = 21;
  604. auto ret = e.transform_error(mul2);
  605. REQUIRE(ret);
  606. REQUIRE(*ret == 21);
  607. }
  608. {
  609. tl::expected<int, int> e = 21;
  610. auto ret = std::move(e).transform_error(mul2);
  611. REQUIRE(ret);
  612. REQUIRE(*ret == 21);
  613. }
  614. {
  615. const tl::expected<int, int> e = 21;
  616. auto ret = std::move(e).transform_error(mul2);
  617. REQUIRE(ret);
  618. REQUIRE(*ret == 21);
  619. }
  620. {
  621. tl::expected<int, int> e(tl::unexpect, 21);
  622. auto ret = e.transform_error(mul2);
  623. REQUIRE(!ret);
  624. REQUIRE(ret.error() == 42);
  625. }
  626. {
  627. const tl::expected<int, int> e(tl::unexpect, 21);
  628. auto ret = e.transform_error(mul2);
  629. REQUIRE(!ret);
  630. REQUIRE(ret.error() == 42);
  631. }
  632. {
  633. tl::expected<int, int> e(tl::unexpect, 21);
  634. auto ret = std::move(e).transform_error(mul2);
  635. REQUIRE(!ret);
  636. REQUIRE(ret.error() == 42);
  637. }
  638. {
  639. const tl::expected<int, int> e(tl::unexpect, 21);
  640. auto ret = std::move(e).transform_error(mul2);
  641. REQUIRE(!ret);
  642. REQUIRE(ret.error() == 42);
  643. }
  644. {
  645. tl::expected<int, int> e = 21;
  646. auto ret = e.transform_error(ret_void);
  647. REQUIRE(ret);
  648. }
  649. {
  650. const tl::expected<int, int> e = 21;
  651. auto ret = e.transform_error(ret_void);
  652. REQUIRE(ret);
  653. }
  654. {
  655. tl::expected<int, int> e = 21;
  656. auto ret = std::move(e).transform_error(ret_void);
  657. REQUIRE(ret);
  658. }
  659. {
  660. const tl::expected<int, int> e = 21;
  661. auto ret = std::move(e).transform_error(ret_void);
  662. REQUIRE(ret);
  663. }
  664. {
  665. tl::expected<int, int> e(tl::unexpect, 21);
  666. auto ret = e.transform_error(ret_void);
  667. REQUIRE(!ret);
  668. }
  669. {
  670. const tl::expected<int, int> e(tl::unexpect, 21);
  671. auto ret = e.transform_error(ret_void);
  672. REQUIRE(!ret);
  673. }
  674. {
  675. tl::expected<int, int> e(tl::unexpect, 21);
  676. auto ret = std::move(e).transform_error(ret_void);
  677. REQUIRE(!ret);
  678. }
  679. {
  680. const tl::expected<int, int> e(tl::unexpect, 21);
  681. auto ret = std::move(e).transform_error(ret_void);
  682. REQUIRE(!ret);
  683. }
  684. }
  685. struct S {
  686. int x;
  687. };
  688. struct F {
  689. int x;
  690. };
  691. TEST_CASE("14", "[issue.14]") {
  692. auto res = tl::expected<S,F>{tl::unexpect, F{}};
  693. res.map_error([](F f) {
  694. (void)f;
  695. });
  696. }
  697. TEST_CASE("32", "[issue.32]") {
  698. int i = 0;
  699. tl::expected<void, int> a;
  700. a.map([&i]{i = 42;});
  701. REQUIRE(i == 42);
  702. auto x = a.map([]{return 42;});
  703. REQUIRE(*x == 42);
  704. }