1 module pynih.python.conv;
2 
3 
4 import unit_threaded;
5 import python.conv;
6 import std.datetime: Date, DateTime;
7 import std.typecons: tuple;
8 
9 
10 struct IntString {
11     int i;
12     string s;
13 }
14 
15 
16 // helper function to test that converting to python and back yields the same value
17 private void backAndForth(T)
18                          (T value, in string file = __FILE__, in size_t line = __LINE__)
19 {
20     value.toPython.to!(typeof(value)).shouldEqual(value, file, line);
21 }
22 
23 
24 @Types!(
25     bool,
26     byte, ubyte, short, ushort, int, uint, long, ulong,  // integral
27     float, double,
28     int[], double[],
29 )
30 void testBackAndForth(T)()
31 {
32     check!((T d) => d.toPython.to!T == d);
33 }
34 
35 
36 @("DateTime")
37 unittest {
38     backAndForth(DateTime(2018, 1, 2, 3, 4, 5));
39 }
40 
41 
42 @("Date")
43 unittest {
44     backAndForth(Date(2018, 1, 2));
45 }
46 
47 
48 @Values("foobar", "quux")
49 @("string.ascii")
50 unittest {
51     const value = getValue!string;
52     backAndForth(value);
53 }
54 
55 
56 @ShouldFail
57 @Values("café", "açaí")
58 @("string.unicode")
59 unittest {
60     const value = getValue!string;
61     backAndForth(value);
62 }
63 
64 
65 @("array.static.int")
66 unittest {
67     int[2] value = [1, 2];
68     backAndForth(value);
69 }
70 
71 
72 @("array.static.double")
73 unittest {
74     double[3] value = [11.1, 22.2, 33.3];
75     backAndForth(value);
76 }
77 
78 
79 @("array.slice.char")
80 unittest {
81     auto chars = ['a', 'b', 'c'];
82     backAndForth(chars);
83 }
84 
85 
86 @("aa.int.string")
87 unittest {
88     backAndForth([1: "foo", 2: "bar"]);
89 }
90 
91 
92 @("aa.string.int")
93 unittest {
94     backAndForth(["foo": 1, "bar": 2]);
95 }
96 
97 
98 @("tuple.int.int.int")
99 unittest {
100     backAndForth(tuple(3, 5, 7));
101 }
102 
103 
104 @("tuple.int.string")
105 unittest {
106     backAndForth(tuple(42, "foo"));
107 }
108 
109 
110 @("udt.intstring.val")
111 unittest {
112     backAndForth(IntString(42, "quux"));
113 }
114 
115 @("udt.intstring.ptr")
116 unittest {
117     const value = new IntString(42, "quux");
118     const back = value.toPython.to!(typeof(value));
119     (*back).should == *value;
120 }
121 
122 
123 @("udt.class")
124 unittest {
125 
126     static class Class {
127         int i;
128         this(int i) { this.i = i; }
129         int twice() @safe @nogc pure nothrow const { return i * 2; }
130         override string toString() @safe pure const {
131             import std.conv: text;
132             return text("Class(", i, ")");
133         }
134     }
135 
136     backAndForth(new Class(42));
137 }