blob: adbf9451c8163cf2de46829171e2cc6b3e7e2f1e [file] [log] [blame]
David Tolnay97c72102020-01-25 16:49:00 -08001#include "tests/ffi/tests.h"
David Tolnayb8715772020-01-28 00:54:05 -08002#include "tests/ffi/lib.rs"
David Tolnay97c72102020-01-25 16:49:00 -08003
David Tolnay3fd7f562020-01-26 17:47:11 -08004extern "C" void cxx_test_suite_set_correct();
David Tolnaybe13d8a2020-03-06 15:45:39 -08005extern "C" tests::R *cxx_test_suite_get_box();
David Tolnay3fd7f562020-01-26 17:47:11 -08006
David Tolnay97c72102020-01-25 16:49:00 -08007namespace tests {
8
David Tolnayad5b8af2020-01-26 16:59:13 -08009C::C(size_t n) : n(n) {}
10
David Tolnay3fd7f562020-01-26 17:47:11 -080011size_t C::get() const { return this->n; }
12
David Tolnayb8715772020-01-28 00:54:05 -080013size_t c_return_primitive() { return 2020; }
David Tolnayad5b8af2020-01-26 16:59:13 -080014
David Tolnayb8715772020-01-28 00:54:05 -080015Shared c_return_shared() { return Shared{2020}; }
David Tolnayad5b8af2020-01-26 16:59:13 -080016
David Tolnaybe13d8a2020-03-06 15:45:39 -080017rust::Box<R> c_return_box() {
18 return rust::Box<R>::from_raw(cxx_test_suite_get_box());
19}
20
David Tolnayad5b8af2020-01-26 16:59:13 -080021std::unique_ptr<C> c_return_unique_ptr() {
22 return std::unique_ptr<C>(new C{2020});
23}
24
David Tolnayb8715772020-01-28 00:54:05 -080025const size_t &c_return_ref(const Shared &shared) { return shared.z; }
David Tolnayad5b8af2020-01-26 16:59:13 -080026
David Tolnay750755e2020-03-01 13:04:08 -080027rust::Str c_return_str(const Shared &shared) {
David Tolnayad5b8af2020-01-26 16:59:13 -080028 (void)shared;
29 return "2020";
30}
31
David Tolnay750755e2020-03-01 13:04:08 -080032rust::String c_return_rust_string() { return "2020"; }
David Tolnayad5b8af2020-01-26 16:59:13 -080033
34std::unique_ptr<std::string> c_return_unique_ptr_string() {
35 return std::unique_ptr<std::string>(new std::string("2020"));
36}
37
David Tolnay3fd7f562020-01-26 17:47:11 -080038void c_take_primitive(size_t n) {
39 if (n == 2020) {
40 cxx_test_suite_set_correct();
41 }
42}
David Tolnayad5b8af2020-01-26 16:59:13 -080043
David Tolnay3fd7f562020-01-26 17:47:11 -080044void c_take_shared(Shared shared) {
45 if (shared.z == 2020) {
46 cxx_test_suite_set_correct();
47 }
48}
David Tolnayad5b8af2020-01-26 16:59:13 -080049
David Tolnay750755e2020-03-01 13:04:08 -080050void c_take_box(rust::Box<R> r) {
David Tolnay3fd7f562020-01-26 17:47:11 -080051 (void)r;
52 cxx_test_suite_set_correct();
53}
David Tolnayad5b8af2020-01-26 16:59:13 -080054
David Tolnay3fd7f562020-01-26 17:47:11 -080055void c_take_unique_ptr(std::unique_ptr<C> c) {
56 if (c->get() == 2020) {
57 cxx_test_suite_set_correct();
58 }
59}
David Tolnayad5b8af2020-01-26 16:59:13 -080060
David Tolnayb8715772020-01-28 00:54:05 -080061void c_take_ref_r(const R &r) { (void)r; }
David Tolnayad5b8af2020-01-26 16:59:13 -080062
David Tolnay3fd7f562020-01-26 17:47:11 -080063void c_take_ref_c(const C &c) {
64 if (c.get() == 2020) {
65 cxx_test_suite_set_correct();
66 }
67}
David Tolnayad5b8af2020-01-26 16:59:13 -080068
David Tolnay750755e2020-03-01 13:04:08 -080069void c_take_str(rust::Str s) {
David Tolnay3fd7f562020-01-26 17:47:11 -080070 if (std::string(s) == "2020") {
71 cxx_test_suite_set_correct();
72 }
73}
David Tolnayad5b8af2020-01-26 16:59:13 -080074
David Tolnay750755e2020-03-01 13:04:08 -080075void c_take_rust_string(rust::String s) {
David Tolnay3fd7f562020-01-26 17:47:11 -080076 if (std::string(s) == "2020") {
77 cxx_test_suite_set_correct();
78 }
79}
David Tolnayad5b8af2020-01-26 16:59:13 -080080
David Tolnay3fd7f562020-01-26 17:47:11 -080081void c_take_unique_ptr_string(std::unique_ptr<std::string> s) {
82 if (*s == "2020") {
83 cxx_test_suite_set_correct();
84 }
85}
David Tolnayad5b8af2020-01-26 16:59:13 -080086
David Tolnayf306da42020-02-22 19:55:43 -080087extern "C" const char *cxx_run_test() noexcept {
88#define STRINGIFY(x) #x
89#define TOSTRING(x) STRINGIFY(x)
90#define ASSERT(x) \
91 do { \
92 if (!(x)) { \
93 return "Assertion failed: `" #x "`, " __FILE__ ":" TOSTRING(__LINE__); \
94 } \
95 } while (false)
96
97 ASSERT(r_return_primitive() == 2020);
98 ASSERT(r_return_shared().z == 2020);
99 ASSERT(r_return_ref(Shared{2020}) == 2020);
100 ASSERT(std::string(r_return_str(Shared{2020})) == "2020");
101 ASSERT(std::string(r_return_rust_string()) == "2020");
102
103 r_take_primitive(2020);
104 r_take_shared(Shared{2020});
105 r_take_unique_ptr(std::unique_ptr<C>(new C{2020}));
106 r_take_ref_c(C{2020});
David Tolnay750755e2020-03-01 13:04:08 -0800107 r_take_str(rust::Str("2020"));
David Tolnay40226ab2020-03-03 00:05:35 -0800108 r_take_rust_string(rust::String("2020"));
David Tolnayf306da42020-02-22 19:55:43 -0800109 r_take_unique_ptr_string(
110 std::unique_ptr<std::string>(new std::string("2020")));
111
112 cxx_test_suite_set_correct();
113 return nullptr;
114}
115
David Tolnay97c72102020-01-25 16:49:00 -0800116} // namespace tests