You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

582 lines
16KB

  1. import json
  2. from pathlib import Path
  3. from typing import NamedTuple, Sequence, List
  4. import pytest
  5. from tests import DDS, fileutil
  6. class DepsCase(NamedTuple):
  7. dep: str
  8. usage: str
  9. source: str
  10. def setup_root(self, dds: DDS):
  11. dds.scope.enter_context(
  12. fileutil.set_contents(
  13. dds.source_root / 'package.json',
  14. json.dumps({
  15. 'name': 'test-project',
  16. 'namespace': 'test',
  17. 'version': '0.0.0',
  18. 'depends': [self.dep],
  19. }).encode()))
  20. dds.scope.enter_context(
  21. fileutil.set_contents(dds.source_root / 'library.json',
  22. json.dumps({
  23. 'name': 'test',
  24. 'uses': [self.usage],
  25. }).encode()))
  26. dds.scope.enter_context(fileutil.set_contents(dds.source_root / 'src/test.test.cpp', self.source.encode()))
  27. CASES: List[DepsCase] = []
  28. def get_default_pkg_versions(pkg: str) -> Sequence[str]:
  29. catalog_json = Path(__file__).resolve().parent.parent.parent / 'old-catalog.json'
  30. catalog_dict = json.loads(catalog_json.read_text())
  31. return list(catalog_dict['packages'][pkg].keys())
  32. def add_cases(pkg: str, uses: str, versions: Sequence[str], source: str):
  33. if versions == ['auto']:
  34. versions = get_default_pkg_versions(pkg)
  35. for ver in versions:
  36. CASES.append(DepsCase(f'{pkg}@{ver}', uses, source))
  37. # magic_enum tests
  38. """
  39. ## ## ### ###### #### ###### ######## ## ## ## ## ## ##
  40. ### ### ## ## ## ## ## ## ## ## ### ## ## ## ### ###
  41. #### #### ## ## ## ## ## ## #### ## ## ## #### ####
  42. ## ### ## ## ## ## #### ## ## ###### ## ## ## ## ## ## ### ##
  43. ## ## ######### ## ## ## ## ## ## #### ## ## ## ##
  44. ## ## ## ## ## ## ## ## ## ## ## ### ## ## ## ##
  45. ## ## ## ## ###### #### ###### ####### ######## ## ## ####### ## ##
  46. """
  47. add_cases(
  48. 'magic_enum', 'neargye/magic_enum', ['auto'], r'''
  49. #include <magic_enum.hpp>
  50. #include <string_view>
  51. enum my_enum {
  52. foo,
  53. bar,
  54. };
  55. int main() {
  56. if (magic_enum::enum_name(my_enum::foo) != "foo") {
  57. return 1;
  58. }
  59. }
  60. ''')
  61. # Range-v3 tests
  62. """
  63. ######## ### ## ## ###### ######## ## ## #######
  64. ## ## ## ## ### ## ## ## ## ## ## ## ##
  65. ## ## ## ## #### ## ## ## ## ## ##
  66. ######## ## ## ## ## ## ## #### ###### ####### ## ## #######
  67. ## ## ######### ## #### ## ## ## ## ## ##
  68. ## ## ## ## ## ### ## ## ## ## ## ## ##
  69. ## ## ## ## ## ## ###### ######## ### #######
  70. """
  71. add_cases(
  72. 'range-v3', 'range-v3/range-v3', ['auto'], r'''
  73. #include <range/v3/algorithm/remove_if.hpp>
  74. #include <vector>
  75. #include <algorithm>
  76. int main() {
  77. std::vector<int> nums = {1, 2, 3, 5, 1, 4, 2, 7, 8, 0, 9};
  78. auto end = ranges::remove_if(nums, [](auto i) { return i % 2; });
  79. return std::distance(nums.begin(), end) != 5;
  80. }
  81. ''')
  82. # nlohmann-json
  83. """
  84. ## ## ## ####### ## ## ## ## ### ## ## ## ## ## ###### ####### ## ##
  85. ### ## ## ## ## ## ## ### ### ## ## ### ## ### ## ## ## ## ## ## ### ##
  86. #### ## ## ## ## ## ## #### #### ## ## #### ## #### ## ## ## ## ## #### ##
  87. ## ## ## ## ## ## ######### ## ### ## ## ## ## ## ## ## ## ## ####### ## ###### ## ## ## ## ##
  88. ## #### ## ## ## ## ## ## ## ######### ## #### ## #### ## ## ## ## ## ## ####
  89. ## ### ## ## ## ## ## ## ## ## ## ## ### ## ### ## ## ## ## ## ## ## ###
  90. ## ## ######## ####### ## ## ## ## ## ## ## ## ## ## ###### ###### ####### ## ##
  91. """
  92. add_cases('nlohmann-json', 'nlohmann/json', ['auto'], r'''
  93. #include <nlohmann/json.hpp>
  94. int main() {}
  95. ''')
  96. # ctre
  97. """
  98. ###### ######## ######## ########
  99. ## ## ## ## ## ##
  100. ## ## ## ## ##
  101. ## ## ######## ######
  102. ## ## ## ## ##
  103. ## ## ## ## ## ##
  104. ###### ## ## ## ########
  105. """
  106. add_cases(
  107. 'ctre', 'hanickadot/ctre', ['auto'], r'''
  108. #include <ctre.hpp>
  109. constexpr ctll::fixed_string MY_REGEX{"\\w+-[0-9]+"};
  110. int main() {
  111. auto [did_match] = ctre::match<MY_REGEX>("foo-44");
  112. if (!did_match) {
  113. return 1;
  114. }
  115. auto [did_match_2] = ctre::match<MY_REGEX>("bar-1ff");
  116. if (did_match_2) {
  117. return 2;
  118. }
  119. }
  120. ''')
  121. # fmt
  122. """
  123. ######## ## ## ########
  124. ## ### ### ##
  125. ## #### #### ##
  126. ###### ## ### ## ##
  127. ## ## ## ##
  128. ## ## ## ##
  129. ## ## ## ##
  130. """
  131. add_cases('fmt', 'fmt/fmt', ['auto'], r'''
  132. #include <fmt/core.h>
  133. int main() {
  134. fmt::print("Hello!");
  135. }
  136. ''')
  137. # Catch2
  138. """
  139. ###### ### ######## ###### ## ## #######
  140. ## ## ## ## ## ## ## ## ## ## ##
  141. ## ## ## ## ## ## ## ##
  142. ## ## ## ## ## ######### #######
  143. ## ######### ## ## ## ## ##
  144. ## ## ## ## ## ## ## ## ## ##
  145. ###### ## ## ## ###### ## ## #########
  146. """
  147. add_cases(
  148. 'catch2', 'catch2/catch2', ['auto'], r'''
  149. #include <catch2/catch_with_main.hpp>
  150. TEST_CASE("I am a test case") {
  151. CHECK((2 + 2) == 4);
  152. CHECK_FALSE((2 + 2) == 5);
  153. }
  154. ''')
  155. # Asio
  156. """
  157. ### ###### #### #######
  158. ## ## ## ## ## ## ##
  159. ## ## ## ## ## ##
  160. ## ## ###### ## ## ##
  161. ######### ## ## ## ##
  162. ## ## ## ## ## ## ##
  163. ## ## ###### #### #######
  164. """
  165. add_cases(
  166. 'asio', 'asio/asio', ['auto'], r'''
  167. #include <asio.hpp>
  168. int main() {
  169. asio::io_context ioc;
  170. int retcode = 12;
  171. ioc.post([&] {
  172. retcode = 0;
  173. });
  174. ioc.run();
  175. return retcode;
  176. }
  177. ''')
  178. # Abseil
  179. """
  180. ### ######## ###### ######## #### ##
  181. ## ## ## ## ## ## ## ## ##
  182. ## ## ## ## ## ## ## ##
  183. ## ## ######## ###### ###### ## ##
  184. ######### ## ## ## ## ## ##
  185. ## ## ## ## ## ## ## ## ##
  186. ## ## ######## ###### ######## #### ########
  187. """
  188. add_cases(
  189. 'abseil', 'abseil/abseil', ['auto'], r'''
  190. #include <absl/strings/str_cat.h>
  191. int main() {
  192. std::string_view foo = "foo";
  193. std::string_view bar = "bar";
  194. auto cat = absl::StrCat(foo, bar);
  195. return cat != "foobar";
  196. }
  197. ''')
  198. # Zlib
  199. """
  200. ######## ## #### ########
  201. ## ## ## ## ##
  202. ## ## ## ## ##
  203. ## ## ## ########
  204. ## ## ## ## ##
  205. ## ## ## ## ##
  206. ######## ######## #### ########
  207. """
  208. add_cases(
  209. 'zlib', 'zlib/zlib', ['auto'], r'''
  210. #include <zlib.h>
  211. #include <cassert>
  212. int main() {
  213. ::z_stream strm = {};
  214. deflateInit(&strm, 6);
  215. const char buffer[] = "foo bar baz";
  216. strm.next_in = (Bytef*)buffer;
  217. strm.avail_in = sizeof buffer;
  218. char dest[256] = {};
  219. strm.next_out = (Bytef*)dest;
  220. strm.avail_out = sizeof dest;
  221. auto ret = deflate(&strm, Z_FINISH);
  222. deflateEnd(&strm);
  223. assert(ret == Z_STREAM_END);
  224. assert(strm.avail_in == 0);
  225. assert(strm.avail_out != sizeof dest);
  226. }
  227. ''')
  228. # sol2
  229. """
  230. ###### ####### ## #######
  231. ## ## ## ## ## ## ##
  232. ## ## ## ## ##
  233. ###### ## ## ## #######
  234. ## ## ## ## ##
  235. ## ## ## ## ## ##
  236. ###### ####### ######## #########
  237. """
  238. add_cases(
  239. 'sol2', 'sol2/sol2', ['3.2.1', '3.2.0', '3.0.3', '3.0.2'], r'''
  240. #include <sol/sol.hpp>
  241. int main() {
  242. sol::state lua;
  243. int x = 0;
  244. lua.set_function("beepboop", [&]{ ++x; });
  245. lua.script("beepboop()");
  246. return x != 1;
  247. }
  248. ''')
  249. # pegtl
  250. """
  251. ######## ######## ###### ######## ##
  252. ## ## ## ## ## ## ##
  253. ## ## ## ## ## ##
  254. ######## ###### ## #### ## ##
  255. ## ## ## ## ## ##
  256. ## ## ## ## ## ##
  257. ## ######## ###### ## ########
  258. """
  259. add_cases(
  260. 'pegtl', 'tao/pegtl', ['auto'], r'''
  261. #include <tao/pegtl.hpp>
  262. using namespace tao::pegtl;
  263. struct sign : one<'+', '-'> {};
  264. struct integer : seq<opt<sign>, plus<digit>> {};
  265. int main() {
  266. tao::pegtl::string_input str{"+44", "[test string]"};
  267. tao::pegtl::parse<integer>(str);
  268. }
  269. ''')
  270. # Boost.PFR
  271. """
  272. ######## ####### ####### ###### ######## ######## ######## ########
  273. ## ## ## ## ## ## ## ## ## ## ## ## ## ##
  274. ## ## ## ## ## ## ## ## ## ## ## ## ##
  275. ######## ## ## ## ## ###### ## ######## ###### ########
  276. ## ## ## ## ## ## ## ## ## ## ## ##
  277. ## ## ## ## ## ## ## ## ## ### ## ## ## ##
  278. ######## ####### ####### ###### ## ### ## ## ## ##
  279. """
  280. add_cases(
  281. 'boost.pfr', 'boost/pfr', ['auto'], r'''
  282. #include <iostream>
  283. #include <string>
  284. #include <boost/pfr/precise.hpp>
  285. struct some_person {
  286. std::string name;
  287. unsigned birth_year;
  288. };
  289. int main() {
  290. some_person val{"Edgar Allan Poe", 1809};
  291. std::cout << boost::pfr::get<0>(val) // No macro!
  292. << " was born in " << boost::pfr::get<1>(val); // Works with any aggregate initializables!
  293. return boost::pfr::get<0>(val) != "Edgar Allan Poe";
  294. }
  295. ''')
  296. # Boost.LEAF
  297. """
  298. ## ######## ### ########
  299. ## ## ## ## ##
  300. ## ## ## ## ##
  301. ## ###### ## ## ######
  302. ## ## ######### ##
  303. ## ## ## ## ##
  304. ######## ######## ## ## ##
  305. """
  306. add_cases(
  307. 'boost.leaf', 'boost/leaf', ['auto'], r'''
  308. #include <boost/leaf/all.hpp>
  309. namespace leaf = boost::leaf;
  310. int main() {
  311. return leaf::try_handle_all(
  312. [&]() -> leaf::result<int> {
  313. return 0;
  314. },
  315. [](leaf::error_info const&) {
  316. return 32;
  317. }
  318. );
  319. }
  320. ''')
  321. # Boost.mp11
  322. """
  323. ######## ####### ####### ###### ######## ## ## ######## ## ##
  324. ## ## ## ## ## ## ## ## ## ### ### ## ## #### ####
  325. ## ## ## ## ## ## ## ## #### #### ## ## ## ##
  326. ######## ## ## ## ## ###### ## ## ### ## ######## ## ##
  327. ## ## ## ## ## ## ## ## ## ## ## ## ##
  328. ## ## ## ## ## ## ## ## ## ### ## ## ## ## ##
  329. ######## ####### ####### ###### ## ### ## ## ## ###### ######
  330. """
  331. add_cases(
  332. 'boost.mp11', 'boost/mp11', ['auto'], r'''
  333. #include <boost/mp11.hpp>
  334. int main() {
  335. return boost::mp11::mp_false() == boost::mp11::mp_true();
  336. }
  337. ''')
  338. # libsodium
  339. """
  340. ## #### ######## ###### ####### ######## #### ## ## ## ##
  341. ## ## ## ## ## ## ## ## ## ## ## ## ## ### ###
  342. ## ## ## ## ## ## ## ## ## ## ## ## #### ####
  343. ## ## ######## ###### ## ## ## ## ## ## ## ## ### ##
  344. ## ## ## ## ## ## ## ## ## ## ## ## ## ##
  345. ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
  346. ######## #### ######## ###### ####### ######## #### ####### ## ##
  347. """
  348. add_cases(
  349. 'libsodium', 'sodium/sodium', ['auto'], r'''
  350. #include <sodium.h>
  351. #include <algorithm>
  352. int main() {
  353. char arr[256] = {};
  354. ::randombytes_buf(arr, sizeof arr);
  355. for (auto b : arr) {
  356. if (b != '\x00') {
  357. return 0;
  358. }
  359. }
  360. return 1;
  361. }
  362. ''')
  363. # toml++
  364. """
  365. ######## ####### ## ## ##
  366. ## ## ## ### ### ## ## ##
  367. ## ## ## #### #### ## ## ##
  368. ## ## ## ## ### ## ## ###### ######
  369. ## ## ## ## ## ## ## ##
  370. ## ## ## ## ## ## ## ##
  371. ## ####### ## ## ########
  372. """
  373. add_cases(
  374. 'tomlpp', 'tomlpp/tomlpp', ['auto'], r'''
  375. #include <toml++/toml.h>
  376. #include <string_view>
  377. int main() {
  378. std::string_view sv = R"(
  379. [library]
  380. something = "cats"
  381. person = "Joe"
  382. )";
  383. toml::table tbl = toml::parse(sv);
  384. return tbl["library"]["person"] != "Joe";
  385. }
  386. ''')
  387. # Inja
  388. """
  389. #### ## ## ## ###
  390. ## ### ## ## ## ##
  391. ## #### ## ## ## ##
  392. ## ## ## ## ## ## ##
  393. ## ## #### ## ## #########
  394. ## ## ### ## ## ## ##
  395. #### ## ## ###### ## ##
  396. """
  397. add_cases(
  398. 'inja', 'inja/inja', ['2.0.0', '2.0.1', '2.1.0', '2.2.0'], r'''
  399. #include <inja/inja.hpp>
  400. #include <nlohmann/json.hpp>
  401. int main() {
  402. nlohmann::json data;
  403. data["foo"] = "bar";
  404. auto result = inja::render("foo {{foo}}", data);
  405. return result != "foo bar";
  406. }
  407. ''')
  408. # Cereal
  409. """
  410. ###### ######## ######## ######## ### ##
  411. ## ## ## ## ## ## ## ## ##
  412. ## ## ## ## ## ## ## ##
  413. ## ###### ######## ###### ## ## ##
  414. ## ## ## ## ## ######### ##
  415. ## ## ## ## ## ## ## ## ##
  416. ###### ######## ## ## ######## ## ## ########
  417. """
  418. add_cases(
  419. 'cereal', 'cereal/cereal', ['auto'], r'''
  420. #include <cereal/types/memory.hpp>
  421. #include <cereal/types/string.hpp>
  422. #include <cereal/archives/binary.hpp>
  423. #include <sstream>
  424. struct something {
  425. int a, b, c;
  426. std::string str;
  427. template <typename Ar>
  428. void serialize(Ar& ar) {
  429. ar(a, b, c, str);
  430. }
  431. };
  432. int main() {
  433. std::stringstream strm;
  434. cereal::BinaryOutputArchive ar{strm};
  435. something s;
  436. ar(s);
  437. return 0;
  438. }
  439. ''')
  440. # pcg
  441. """
  442. ######## ###### ######
  443. ## ## ## ## ## ##
  444. ## ## ## ##
  445. ######## ## ## ####
  446. ## ## ## ##
  447. ## ## ## ## ##
  448. ## ###### ######
  449. """
  450. add_cases(
  451. 'pcg-cpp', 'pcg/pcg-cpp', ['auto'], r'''
  452. #include <pcg_random.hpp>
  453. #include <iostream>
  454. int main() {
  455. pcg64 rng{1729};
  456. return rng() != 14925250045015479985;
  457. }
  458. ''')
  459. # spdlog
  460. """
  461. ###### ######## ######## ## ####### ######
  462. ## ## ## ## ## ## ## ## ## ## ##
  463. ## ## ## ## ## ## ## ## ##
  464. ###### ######## ## ## ## ## ## ## ####
  465. ## ## ## ## ## ## ## ## ##
  466. ## ## ## ## ## ## ## ## ## ##
  467. ###### ## ######## ######## ####### ######
  468. """
  469. add_cases('spdlog', 'spdlog/spdlog', ['auto'], r'''
  470. #include <spdlog/spdlog.h>
  471. int main() {
  472. spdlog::info("Howdy!");
  473. }
  474. ''')
  475. # date
  476. """
  477. ######## ### ######## ########
  478. ## ## ## ## ## ##
  479. ## ## ## ## ## ##
  480. ## ## ## ## ## ######
  481. ## ## ######### ## ##
  482. ## ## ## ## ## ##
  483. ######## ## ## ## ########
  484. """
  485. add_cases(
  486. 'hinnant-date', 'hinnant/date', ['auto'], r'''
  487. #include <date/date.h>
  488. #include <iostream>
  489. int main() {
  490. auto now = std::chrono::system_clock::now();
  491. using namespace date::literals;
  492. auto year = date::year_month_day{date::floor<date::days>(now)}.year();
  493. std::cout << "The current year is " << year << '\n';
  494. return year < 2020_y;
  495. }
  496. ''')
  497. @pytest.mark.deps_test
  498. @pytest.mark.parametrize('case', CASES, ids=[c.dep for c in CASES])
  499. def test_dep(case: DepsCase, dds_pizza_catalog: Path, dds: DDS) -> None:
  500. case.setup_root(dds)
  501. dds.build(catalog_path=dds_pizza_catalog)