File: integer_traits.rs

package info (click to toggle)
rust-magnus 0.7.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,468 kB
  • sloc: ruby: 150; sh: 17; makefile: 2
file content (223 lines) | stat: -rw-r--r-- 6,844 bytes parent folder | download
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
use std::os::raw::c_long;

use magnus::{eval, Error, Integer, Ruby};

const RUBY_FIXNUM_MAX: u64 = (c_long::MAX / 2) as u64;
const RUBY_FIXNUM_MIN: i64 = (c_long::MIN / 2) as i64;

#[test]
fn test_all() {
    magnus::Ruby::init(|ruby| {
        test_add(ruby)?;
        test_sub(ruby)?;
        test_mul(ruby)?;
        test_div(ruby)?;
        test_ord(ruby)?;
        Ok(())
    })
    .unwrap();
}

fn test_add(ruby: &Ruby) -> Result<(), Error> {
    assert_eq!(
        ruby.integer_from_i64(1) + ruby.integer_from_i64(2),
        ruby.integer_from_i64(3)
    );
    assert_eq!(
        ruby.integer_from_i64(-1) + ruby.integer_from_i64(-2),
        ruby.integer_from_i64(-3)
    );
    assert_eq!(
        ruby.integer_from_i64(1) + ruby.integer_from_i64(-2),
        ruby.integer_from_i64(-1)
    );
    assert_eq!(
        ruby.integer_from_i64(-1) + ruby.integer_from_i64(2),
        ruby.integer_from_i64(1)
    );
    assert_eq!(
        ruby.integer_from_u64(RUBY_FIXNUM_MAX) + ruby.integer_from_i64(1),
        ruby.integer_from_u64(RUBY_FIXNUM_MAX + 1)
    );
    assert_eq!(
        ruby.integer_from_i64(RUBY_FIXNUM_MIN) + ruby.integer_from_i64(-1),
        ruby.integer_from_i64(RUBY_FIXNUM_MIN - 1)
    );
    let a: Integer = ruby.eval("2**1000")?;
    let b: Integer = ruby.eval("2**1000")?;
    let a_b: Integer = ruby.eval("2**1000 + 2**1000")?;
    assert_eq!(a + b, a_b);

    let a: Integer = ruby.eval("2**1000")?;
    let b = ruby.integer_from_i64(1);
    let a_b: Integer = ruby.eval("2**1000 + 1")?;
    assert_eq!(a + b, a_b);

    let a = ruby.integer_from_i64(1);
    let b: Integer = ruby.eval("2**1000")?;
    let a_b: Integer = ruby.eval("2**1000 + 1")?;
    assert_eq!(a + b, a_b);

    let mut a = ruby.integer_from_i64(1);
    a += ruby.integer_from_i64(1);
    assert_eq!(a, ruby.integer_from_i64(2));

    Ok(())
}

fn test_sub(ruby: &Ruby) -> Result<(), Error> {
    assert_eq!(
        ruby.integer_from_i64(1) - ruby.integer_from_i64(2),
        ruby.integer_from_i64(-1)
    );
    assert_eq!(
        ruby.integer_from_i64(-1) - ruby.integer_from_i64(-2),
        ruby.integer_from_i64(1)
    );
    assert_eq!(
        ruby.integer_from_i64(1) - ruby.integer_from_i64(-2),
        ruby.integer_from_i64(3)
    );
    assert_eq!(
        ruby.integer_from_i64(-1) - ruby.integer_from_i64(2),
        ruby.integer_from_i64(-3)
    );
    assert_eq!(
        ruby.integer_from_u64(RUBY_FIXNUM_MAX) - ruby.integer_from_i64(-1),
        ruby.integer_from_u64(RUBY_FIXNUM_MAX + 1)
    );
    assert_eq!(
        ruby.integer_from_i64(RUBY_FIXNUM_MIN) - ruby.integer_from_i64(1),
        ruby.integer_from_i64(RUBY_FIXNUM_MIN - 1)
    );
    let a: Integer = ruby.eval("2**1000")?;
    let b: Integer = ruby.eval("2**999")?;
    let a_b: Integer = ruby.eval("2**1000 - 2**999")?;
    assert_eq!(a - b, a_b);

    let a: Integer = ruby.eval("2**1000")?;
    let b = ruby.integer_from_i64(1);
    let a_b: Integer = ruby.eval("2**1000 - 1")?;
    assert_eq!(a - b, a_b);

    let a = ruby.integer_from_i64(1);
    let b: Integer = ruby.eval("2**1000")?;
    let a_b: Integer = ruby.eval("1 - 2**1000")?;
    assert_eq!(a - b, a_b);

    let mut a = ruby.integer_from_i64(1);
    a -= ruby.integer_from_i64(1);
    assert_eq!(a, ruby.integer_from_i64(0));

    Ok(())
}

fn test_mul(ruby: &Ruby) -> Result<(), Error> {
    assert_eq!(
        ruby.integer_from_i64(1) * ruby.integer_from_i64(2),
        ruby.integer_from_i64(2)
    );
    assert_eq!(
        ruby.integer_from_i64(-1) * ruby.integer_from_i64(-2),
        ruby.integer_from_i64(2)
    );
    assert_eq!(
        ruby.integer_from_i64(1) * ruby.integer_from_i64(-2),
        ruby.integer_from_i64(-2)
    );
    assert_eq!(
        ruby.integer_from_i64(-1) * ruby.integer_from_i64(2),
        ruby.integer_from_i64(-2)
    );
    assert_eq!(
        ruby.integer_from_u64(RUBY_FIXNUM_MAX) * ruby.integer_from_i64(4),
        Integer::from_value(eval(&format!("{} * 4", RUBY_FIXNUM_MAX)).unwrap()).unwrap()
    );
    assert_eq!(
        ruby.integer_from_i64(RUBY_FIXNUM_MIN) * ruby.integer_from_i64(4),
        Integer::from_value(eval(&format!("{} * 4", RUBY_FIXNUM_MIN)).unwrap()).unwrap()
    );

    let a: Integer = ruby.eval("2**1000")?;
    let b: Integer = ruby.eval("2**999")?;
    let a_b: Integer = ruby.eval("2**1000 * 2**999")?;
    assert_eq!(a * b, a_b);

    let a: Integer = ruby.eval("2**1000")?;
    let b = ruby.integer_from_i64(2);
    let a_b: Integer = ruby.eval("2**1000 * 2")?;
    assert_eq!(a * b, a_b);

    let a = ruby.integer_from_i64(2);
    let b: Integer = ruby.eval("2**1000")?;
    let a_b: Integer = ruby.eval("2 * 2**1000")?;
    assert_eq!(a * b, a_b);

    let mut a = ruby.integer_from_i64(1);
    a *= ruby.integer_from_i64(2);
    assert_eq!(a, ruby.integer_from_i64(2));

    Ok(())
}

fn test_div(ruby: &Ruby) -> Result<(), Error> {
    assert_eq!(
        ruby.integer_from_i64(1) / ruby.integer_from_i64(2),
        ruby.integer_from_i64(0)
    );
    assert_eq!(
        ruby.integer_from_i64(-4) / ruby.integer_from_i64(2),
        ruby.integer_from_i64(-2)
    );
    assert_eq!(
        ruby.integer_from_i64(7) / ruby.integer_from_i64(2),
        ruby.integer_from_i64(3)
    );

    let a: Integer = ruby.eval("2**1000")?;
    let b: Integer = ruby.eval("2**999")?;
    let a_b: Integer = ruby.eval("2**1000 / 2**999")?;
    assert_eq!(a / b, a_b);

    let a: Integer = ruby.eval("2**1000")?;
    let b = ruby.integer_from_i64(2);
    let a_b: Integer = ruby.eval("2**1000 / 2")?;
    assert_eq!(a / b, a_b);

    let a = ruby.integer_from_i64(2);
    let b: Integer = ruby.eval("2**1000")?;
    let a_b: Integer = ruby.eval("2 / 2**1000")?;
    assert_eq!(a / b, a_b);

    let mut a = ruby.integer_from_i64(4);
    a /= ruby.integer_from_i64(2);
    assert_eq!(a, ruby.integer_from_i64(2));

    Ok(())
}

fn test_ord(ruby: &Ruby) -> Result<(), Error> {
    assert!(ruby.integer_from_i64(1) < ruby.integer_from_i64(2));
    assert!(ruby.integer_from_i64(2) > ruby.integer_from_i64(1));
    assert!(ruby.integer_from_i64(1) <= ruby.integer_from_i64(2));
    assert!(ruby.integer_from_i64(2) >= ruby.integer_from_i64(1));
    assert!(ruby.integer_from_i64(1) <= ruby.integer_from_i64(1));
    assert!(ruby.integer_from_i64(1) == ruby.integer_from_i64(1));
    assert!(ruby.integer_from_i64(1) >= ruby.integer_from_i64(1));
    let a: Integer = ruby.eval("2**1000")?;
    let b: Integer = ruby.eval("2**999")?;
    let c: Integer = ruby.eval("2**1000")?;
    assert!(a > b);
    assert!(a >= b);
    assert!(b < a);
    assert!(b <= a);
    assert!(a == c);
    assert!(a >= c);
    assert!(a <= c);
    assert!(a > ruby.integer_from_i64(1));
    assert!(a >= ruby.integer_from_i64(1));
    assert!(ruby.integer_from_i64(1) < a);
    assert!(ruby.integer_from_i64(1) <= a);

    Ok(())
}