Skip to content

Commit 9a158e4

Browse files
committed
Adding tests for types in namespaces.
1 parent cca5215 commit 9a158e4

File tree

4 files changed

+152
-0
lines changed

4 files changed

+152
-0
lines changed

tests/ffi/lib.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,32 @@ pub mod ffi {
4949
CVal,
5050
}
5151

52+
#[namespace(namespace = A)]
53+
#[derive(Clone)]
54+
struct AShared {
55+
z: usize,
56+
}
57+
58+
#[namespace(namespace = A)]
59+
enum AEnum {
60+
AAVal,
61+
ABVal = 2020,
62+
ACVal,
63+
}
64+
65+
#[namespace(namespace = A::B)]
66+
enum ABEnum {
67+
ABAVal,
68+
ABBVal = 2020,
69+
ABCVal,
70+
}
71+
72+
#[namespace(namespace = A::B)]
73+
#[derive(Clone)]
74+
struct ABShared {
75+
z: usize,
76+
}
77+
5278
extern "C" {
5379
include!("tests/ffi/tests.h");
5480

@@ -78,6 +104,10 @@ pub mod ffi {
78104
fn c_return_identity(_: usize) -> usize;
79105
fn c_return_sum(_: usize, _: usize) -> usize;
80106
fn c_return_enum(n: u16) -> Enum;
107+
fn c_return_ns_ref(shared: &AShared) -> &usize;
108+
fn c_return_nested_ns_ref(shared: &ABShared) -> &usize;
109+
fn c_return_ns_enum(n: u16) -> AEnum;
110+
fn c_return_nested_ns_enum(n: u16) -> ABEnum;
81111

82112
fn c_take_primitive(n: usize);
83113
fn c_take_shared(shared: Shared);
@@ -108,6 +138,12 @@ pub mod ffi {
108138
fn c_take_callback(callback: fn(String) -> usize);
109139
*/
110140
fn c_take_enum(e: Enum);
141+
fn c_take_ns_enum(e: AEnum);
142+
fn c_take_nested_ns_enum(e: ABEnum);
143+
fn c_take_ns_shared(shared: AShared);
144+
fn c_take_nested_ns_shared(shared: ABShared);
145+
fn c_take_rust_vec_ns_shared(v: Vec<AShared>);
146+
fn c_take_rust_vec_nested_ns_shared(v: Vec<ABShared>);
111147

112148
fn c_try_return_void() -> Result<()>;
113149
fn c_try_return_primitive() -> Result<usize>;

tests/ffi/tests.cc

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ size_t c_return_primitive() { return 2020; }
4343

4444
Shared c_return_shared() { return Shared{2020}; }
4545

46+
::A::AShared c_return_ns_shared() { return ::A::AShared{2020}; }
47+
48+
::A::B::ABShared c_return_nested_ns_shared() { return ::A::B::ABShared{2020}; }
49+
4650
rust::Box<R> c_return_box() {
4751
return rust::Box<R>::from_raw(cxx_test_suite_get_box());
4852
}
@@ -53,6 +57,10 @@ std::unique_ptr<C> c_return_unique_ptr() {
5357

5458
const size_t &c_return_ref(const Shared &shared) { return shared.z; }
5559

60+
const size_t &c_return_ns_ref(const ::A::AShared &shared) { return shared.z; }
61+
62+
const size_t &c_return_nested_ns_ref(const ::A::B::ABShared &shared) { return shared.z; }
63+
5664
size_t &c_return_mut(Shared &shared) { return shared.z; }
5765

5866
rust::Str c_return_str(const Shared &shared) {
@@ -144,6 +152,26 @@ Enum c_return_enum(uint16_t n) {
144152
}
145153
}
146154

155+
::A::AEnum c_return_ns_enum(uint16_t n) {
156+
if (n <= static_cast<uint16_t>(::A::AEnum::AAVal)) {
157+
return ::A::AEnum::AAVal;
158+
} else if (n <= static_cast<uint16_t>(::A::AEnum::ABVal)) {
159+
return ::A::AEnum::ABVal;
160+
} else {
161+
return ::A::AEnum::ACVal;
162+
}
163+
}
164+
165+
::A::B::ABEnum c_return_nested_ns_enum(uint16_t n) {
166+
if (n <= static_cast<uint16_t>(::A::B::ABEnum::ABAVal)) {
167+
return ::A::B::ABEnum::ABAVal;
168+
} else if (n <= static_cast<uint16_t>(::A::B::ABEnum::ABBVal)) {
169+
return ::A::B::ABEnum::ABBVal;
170+
} else {
171+
return ::A::B::ABEnum::ABCVal;
172+
}
173+
}
174+
147175
void c_take_primitive(size_t n) {
148176
if (n == 2020) {
149177
cxx_test_suite_set_correct();
@@ -156,6 +184,18 @@ void c_take_shared(Shared shared) {
156184
}
157185
}
158186

187+
void c_take_ns_shared(::A::AShared shared) {
188+
if (shared.z == 2020) {
189+
cxx_test_suite_set_correct();
190+
}
191+
}
192+
193+
void c_take_nested_ns_shared(::A::B::ABShared shared) {
194+
if (shared.z == 2020) {
195+
cxx_test_suite_set_correct();
196+
}
197+
}
198+
159199
void c_take_box(rust::Box<R> r) {
160200
if (cxx_test_suite_r_is_correct(&*r)) {
161201
cxx_test_suite_set_correct();
@@ -258,6 +298,26 @@ void c_take_rust_vec_shared(rust::Vec<Shared> v) {
258298
}
259299
}
260300

301+
void c_take_rust_vec_ns_shared(rust::Vec<::A::AShared> v) {
302+
uint32_t sum = 0;
303+
for (auto i : v) {
304+
sum += i.z;
305+
}
306+
if (sum == 2021) {
307+
cxx_test_suite_set_correct();
308+
}
309+
}
310+
311+
void c_take_rust_vec_nested_ns_shared(rust::Vec<::A::B::ABShared> v) {
312+
uint32_t sum = 0;
313+
for (auto i : v) {
314+
sum += i.z;
315+
}
316+
if (sum == 2021) {
317+
cxx_test_suite_set_correct();
318+
}
319+
}
320+
261321
void c_take_rust_vec_string(rust::Vec<rust::String> v) {
262322
(void)v;
263323
cxx_test_suite_set_correct();
@@ -326,6 +386,18 @@ void c_take_enum(Enum e) {
326386
}
327387
}
328388

389+
void c_take_ns_enum(::A::AEnum e) {
390+
if (e == ::A::AEnum::AAVal) {
391+
cxx_test_suite_set_correct();
392+
}
393+
}
394+
395+
void c_take_nested_ns_enum(::A::B::ABEnum e) {
396+
if (e == ::A::B::ABEnum::ABAVal) {
397+
cxx_test_suite_set_correct();
398+
}
399+
}
400+
329401
void c_try_return_void() {}
330402

331403
size_t c_try_return_primitive() { return 2020; }

tests/ffi/tests.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@
33
#include <memory>
44
#include <string>
55

6+
namespace A {
7+
struct AShared;
8+
enum class AEnum : uint16_t;
9+
namespace B {
10+
struct ABShared;
11+
enum class ABEnum : uint16_t;
12+
} // namespace B
13+
} // namespace A
14+
615
namespace tests {
716

817
struct R;
@@ -44,9 +53,13 @@ enum COwnedEnum {
4453

4554
size_t c_return_primitive();
4655
Shared c_return_shared();
56+
::A::AShared c_return_ns_shared();
57+
::A::B::ABShared c_return_nested_ns_shared();
4758
rust::Box<R> c_return_box();
4859
std::unique_ptr<C> c_return_unique_ptr();
4960
const size_t &c_return_ref(const Shared &shared);
61+
const size_t &c_return_ns_ref(const ::A::AShared &shared);
62+
const size_t &c_return_nested_ns_ref(const ::A::B::ABShared &shared);
5063
size_t &c_return_mut(Shared &shared);
5164
rust::Str c_return_str(const Shared &shared);
5265
rust::Slice<uint8_t> c_return_sliceu8(const Shared &shared);
@@ -66,9 +79,13 @@ rust::Vec<rust::String> c_return_rust_vec_string();
6679
size_t c_return_identity(size_t n);
6780
size_t c_return_sum(size_t n1, size_t n2);
6881
Enum c_return_enum(uint16_t n);
82+
::A::AEnum c_return_ns_enum(uint16_t n);
83+
::A::B::ABEnum c_return_nested_ns_enum(uint16_t n);
6984

7085
void c_take_primitive(size_t n);
7186
void c_take_shared(Shared shared);
87+
void c_take_ns_shared(::A::AShared shared);
88+
void c_take_nested_ns_shared(::A::B::ABShared shared);
7289
void c_take_box(rust::Box<R> r);
7390
void c_take_unique_ptr(std::unique_ptr<C> c);
7491
void c_take_ref_r(const R &r);
@@ -86,6 +103,8 @@ void c_take_ref_vector(const std::vector<uint8_t> &v);
86103
void c_take_rust_vec(rust::Vec<uint8_t> v);
87104
void c_take_rust_vec_index(rust::Vec<uint8_t> v);
88105
void c_take_rust_vec_shared(rust::Vec<Shared> v);
106+
void c_take_rust_vec_ns_shared(rust::Vec<::A::AShared> v);
107+
void c_take_rust_vec_nested_ns_shared(rust::Vec<::A::B::ABShared> v);
89108
void c_take_rust_vec_string(rust::Vec<rust::String> v);
90109
void c_take_rust_vec_shared_index(rust::Vec<Shared> v);
91110
void c_take_rust_vec_shared_forward_iterator(rust::Vec<Shared> v);
@@ -98,6 +117,8 @@ void c_take_ref_rust_vec_copy(const rust::Vec<uint8_t> &v);
98117
void c_take_callback(rust::Fn<size_t(rust::String)> callback);
99118
*/
100119
void c_take_enum(Enum e);
120+
void c_take_ns_enum(::A::AEnum e);
121+
void c_take_nested_ns_enum(::A::B::ABEnum e);
101122

102123
void c_try_return_void();
103124
size_t c_try_return_primitive();

tests/test.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,16 @@ macro_rules! check {
2323
#[test]
2424
fn test_c_return() {
2525
let shared = ffi::Shared { z: 2020 };
26+
let ns_shared = ffi::AShared { z: 2020 };
27+
let nested_ns_shared = ffi::ABShared { z: 2020 };
2628

2729
assert_eq!(2020, ffi::c_return_primitive());
2830
assert_eq!(2020, ffi::c_return_shared().z);
2931
assert_eq!(2020, *ffi::c_return_box());
3032
ffi::c_return_unique_ptr();
3133
assert_eq!(2020, *ffi::c_return_ref(&shared));
34+
assert_eq!(2020, *ffi::c_return_ns_ref(&ns_shared));
35+
assert_eq!(2020, *ffi::c_return_nested_ns_ref(&nested_ns_shared));
3236
assert_eq!("2020", ffi::c_return_str(&shared));
3337
assert_eq!(b"2020\0", ffi::c_return_sliceu8(&shared));
3438
assert_eq!("2020", ffi::c_return_rust_string());
@@ -64,6 +68,14 @@ fn test_c_return() {
6468
enm @ ffi::Enum::CVal => assert_eq!(2021, enm.repr),
6569
_ => assert!(false),
6670
}
71+
match ffi::c_return_ns_enum(0) {
72+
enm @ ffi::AEnum::AAVal => assert_eq!(0, enm.repr),
73+
_ => assert!(false),
74+
}
75+
match ffi::c_return_nested_ns_enum(0) {
76+
enm @ ffi::ABEnum::ABAVal => assert_eq!(0, enm.repr),
77+
_ => assert!(false),
78+
}
6779
}
6880

6981
#[test]
@@ -88,6 +100,8 @@ fn test_c_take() {
88100

89101
check!(ffi::c_take_primitive(2020));
90102
check!(ffi::c_take_shared(ffi::Shared { z: 2020 }));
103+
check!(ffi::c_take_ns_shared(ffi::AShared { z: 2020 }));
104+
check!(ffi::c_take_nested_ns_shared(ffi::ABShared { z: 2020 }));
91105
check!(ffi::c_take_box(Box::new(2020)));
92106
check!(ffi::c_take_ref_c(&unique_ptr));
93107
check!(cxx_test_suite::module::ffi::c_take_unique_ptr(unique_ptr));
@@ -119,7 +133,16 @@ fn test_c_take() {
119133
check!(ffi::c_take_ref_rust_vec(&test_vec));
120134
check!(ffi::c_take_ref_rust_vec_index(&test_vec));
121135
check!(ffi::c_take_ref_rust_vec_copy(&test_vec));
136+
let ns_shared_test_vec = vec![ffi::AShared { z: 1010 }, ffi::AShared { z: 1011 }];
137+
check!(ffi::c_take_rust_vec_ns_shared(ns_shared_test_vec));
138+
let nested_ns_shared_test_vec = vec![ffi::ABShared { z: 1010 }, ffi::ABShared { z: 1011 }];
139+
check!(ffi::c_take_rust_vec_nested_ns_shared(
140+
nested_ns_shared_test_vec
141+
));
142+
122143
check!(ffi::c_take_enum(ffi::Enum::AVal));
144+
check!(ffi::c_take_ns_enum(ffi::AEnum::AAVal));
145+
check!(ffi::c_take_nested_ns_enum(ffi::ABEnum::ABAVal));
123146
}
124147

125148
/*

0 commit comments

Comments
 (0)