1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//! See https://github.com/extendr/extendr/issues/369
//!
#[test]
fn test_try_from() {
use extendr_api::scalar::{Rbool, Rcplx, Rfloat, Rint};
use extendr_api::{r, test, Result, Robj, TryFrom};
// use extendr_api::wrapper::{Integers, Doubles, Strings};
macro_rules! test_matrix {
(
$value : expr,
int_ok: $int_ok : expr,
float_ok: $float_ok : expr,
cplx_ok: $cplx_ok : expr,
bool_ok: $bool_ok : expr,
str_ok: $str_ok : expr,
int_slice_ok: $int_slice_ok : expr,
float_slice_ok: $float_slice_ok : expr,
) => {
assert!(u8::try_from($value).is_ok() == $int_ok);
assert!(i8::try_from($value).is_ok() == $int_ok);
assert!(u16::try_from($value).is_ok() == $int_ok);
assert!(i16::try_from($value).is_ok() == $int_ok);
assert!(u32::try_from($value).is_ok() == $int_ok);
assert!(i32::try_from($value).is_ok() == $int_ok);
assert!(u64::try_from($value).is_ok() == $int_ok);
assert!(i64::try_from($value).is_ok() == $int_ok);
// assert!(usize::try_from($value).is_ok() == $int_ok);
// assert!(isize::try_from($value).is_ok() == $int_ok);
assert!(f32::try_from($value).is_ok() == $float_ok);
assert!(f64::try_from($value).is_ok() == $float_ok);
assert!(Rint::try_from($value).is_ok() == $int_ok);
assert!(Rfloat::try_from($value).is_ok() == $float_ok);
assert!(Rcplx::try_from($value).is_ok() == $cplx_ok);
// assert!(<&Rstr>::try_from($value).is_ok() == $str_ok);
assert!(Rbool::try_from($value).is_ok() == $bool_ok);
assert!(bool::try_from($value).is_ok() == $bool_ok);
assert!(<&str>::try_from($value).is_ok() == $str_ok);
assert!(String::try_from($value).is_ok() == $str_ok);
assert!(<&[i32]>::try_from($value).is_ok() == $int_slice_ok);
assert!(<&[f64]>::try_from($value).is_ok() == $float_slice_ok);
// assert!(<&Robj>::try_from($value).is_ok() == true);
assert!(<Robj>::try_from($value).is_ok() == true);
// assert!(<&[Rint]>::try_from($value).is_ok() == $int_slice_ok);
// assert!(<&[Rfloat]>::try_from($value).is_ok() == $float_slice_ok);
// assert!(<&[Rcplx]>::try_from($value).is_ok() == $cplx_slice_ok);
// assert!(<&[Rbool]>::try_from($value).is_ok() == $bool_slice_ok);
// assert!(<&[Rstr]>::try_from($value).is_ok() == $str_ok);
// assert!(<&[Robj]>::try_from($value).is_ok() == $list_ok);
// assert!(<&Integers>::try_from($value).is_ok() == $int_ok);
// assert!(<&Doubles>::try_from($value).is_ok() == $float_ok);
// assert!(<&List>::try_from($value).is_ok() == $list_ok);
// assert_eq!(<Option<u8>::try_from($value).is_ok(), $int_ok);
// assert_eq!(<Option<i8>::try_from($value).is_ok(), $int_ok);
// assert_eq!(<Option<u16>::try_from($value).is_ok(), $int_ok);
// assert_eq!(<Option<i16>::try_from($value).is_ok(), $int_ok);
// assert_eq!(<Option<u32>::try_from($value).is_ok(), $int_ok);
// assert_eq!(<Option<i32>::try_from($value).is_ok(), $int_ok);
// assert_eq!(<Option<u64>::try_from($value).is_ok(), $int_ok);
// assert_eq!(<Option<i64>::try_from($value).is_ok(), $int_ok);
// assert_eq!(<Option<usize>::try_from($value).is_ok(), $int_ok);
// assert_eq!(<Option<isize>::try_from($value).is_ok(), $int_ok);
// assert_eq!(<Option<Rint>::try_from($value).is_ok(), $int_ok);
// assert_eq!(<Option<f32>::try_from($value).is_ok(), $float_ok);
// assert_eq!(<Option<f64>::try_from($value).is_ok(), $float_ok);
// assert_eq!(<Option<Rfloat>::try_from($value).is_ok(), $float_ok);
// assert_eq!(<Option<Rcplx>::try_from($value).is_ok(), $float_ok);
// assert_eq!(<Option<bool>::try_from($value).is_ok(), $bool_ok);
// assert_eq!(<Option<&str>>::try_from($value).is_ok(), $str_ok);
// assert_eq!(<Option<String>::try_from($value).is_ok(), $str_ok);
};
}
test! {
let integer = r!(1);
test_matrix!(
integer.clone(),
int_ok : true,
float_ok : true,
cplx_ok: true,
bool_ok : false,
str_ok: false,
int_slice_ok: true,
float_slice_ok: false,
);
let double = r!(1.0);
test_matrix!(
double.clone(),
int_ok : true,
float_ok : true,
cplx_ok: true,
bool_ok : false,
str_ok: false,
int_slice_ok: false,
float_slice_ok: true,
);
let null = r!(());
test_matrix!(
null.clone(),
int_ok : false,
float_ok : false,
cplx_ok: false,
bool_ok : false,
str_ok: false,
int_slice_ok: false,
float_slice_ok: false,
);
let string = r!("1");
test_matrix!(
string.clone(),
int_ok : false,
float_ok : false,
cplx_ok: false,
bool_ok : false,
str_ok: true,
int_slice_ok: false,
float_slice_ok: false,
);
// let integers = Integers::from_values([1]);
// test_matrix!(
// integer.clone(),
// int_ok : true,
// float_ok : true,
// cplx_ok: true,
// bool_ok : false,
// str_ok: false,
// int_slice_ok: true,
// float_slice_ok: false,
// );
// test_matrix!(integers.clone(), int_ok : true, float_ok : true, bool_ok : false, str_ok: false);
// let doubles = Doubles::from_values([1.0]);
// test_matrix!(doubles.clone(), int_ok : true, float_ok : true, bool_ok : false, str_ok: false);
// let strings = Strings::from_values(["1"]);
// test_matrix!(strings.clone(), int_ok : true, float_ok : true, bool_ok : false, str_ok: false);
}
}