您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

582 行
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)