lib/std/tests.rad 11.6 KiB raw
1
//! Tests for formatting functions.
2
3
use std::fmt;
4
use std::mem;
5
use std::vec;
6
use std::testing;
7
8
// Data types //////////////////////////////////////////////////////////////////
9
10
record Point {
11
    x: i32,
12
    y: i32,
13
}
14
15
// fmt /////////////////////////////////////////////////////////////////////////
16
17
@test fn testFormatU32Zero() throws (testing::TestError) {
18
    let mut buffer: [u8; 11] = [0; 11];
19
    let result: *[u8] = fmt::formatU32(0, &mut buffer[..]);
20
    try testing::expect(result.len == 1);
21
    try testing::expectBytesEq(result, "0");
22
}
23
24
@test fn testFormatU32Basic() throws (testing::TestError) {
25
    let mut buffer: [u8; 11] = [0; 11];
26
    let result: *[u8] = fmt::formatU32(123, &mut buffer[..]);
27
    try testing::expect(result.len == 3);
28
    try testing::expectBytesEq(result, "123");
29
}
30
31
@test fn testFormatU32Large() throws (testing::TestError) {
32
    let mut buffer: [u8; 11] = [0; 11];
33
    let result: *[u8] = fmt::formatU32(90000, &mut buffer[..]);
34
    try testing::expect(result.len == 5);
35
    try testing::expectBytesEq(result, "90000");
36
}
37
38
@test fn testFormatU32Max() throws (testing::TestError) {
39
    let mut buffer: [u8; 11] = [0; 11];
40
    let result: *[u8] = fmt::formatU32(4294967295, &mut buffer[..]);
41
    try testing::expect(result.len == 10);
42
    try testing::expectBytesEq(result, "4294967295");
43
}
44
45
@test fn testFormatI32Positive() throws (testing::TestError) {
46
    let mut buffer: [u8; 11] = [0; 11];
47
    let result: *[u8] = fmt::formatI32(456, &mut buffer[..]);
48
    try testing::expect(result.len == 3);
49
    try testing::expectBytesEq(result, "456");
50
}
51
52
@test fn testFormatI32Negative() throws (testing::TestError) {
53
    let mut buffer: [u8; 11] = [0; 11];
54
    let result: *[u8] = fmt::formatI32(-789, &mut buffer[..]);
55
    try testing::expect(result.len == 4);
56
    try testing::expectBytesEq(result, "-789");
57
}
58
59
@test fn testFormatI32Zero() throws (testing::TestError) {
60
    let mut buffer: [u8; 11] = [0; 11];
61
    let result: *[u8] = fmt::formatI32(0, &mut buffer[..]);
62
    try testing::expect(result.len == 1);
63
    try testing::expectBytesEq(result, "0");
64
}
65
66
@test fn testFormatI32Max() throws (testing::TestError) {
67
    let mut buffer: [u8; 11] = [0; 11];
68
    let result: *[u8] = fmt::formatI32(2147483647, &mut buffer[..]);
69
    try testing::expect(result.len == 10);
70
    try testing::expectBytesEq(result, "2147483647");
71
}
72
73
@test fn testFormatI32Min() throws (testing::TestError) {
74
    let mut buffer: [u8; 11] = [0; 11];
75
    let result: *[u8] = fmt::formatI32(-2147483648, &mut buffer[..]);
76
    try testing::expect(result.len == 11);
77
    try testing::expectBytesEq(result, "-2147483648");
78
}
79
80
@test fn testFormatU64Zero() throws (testing::TestError) {
81
    let mut buffer: [u8; 20] = [0; 20];
82
    let result: *[u8] = fmt::formatU64(0, &mut buffer[..]);
83
    try testing::expect(result.len == 1);
84
    try testing::expectBytesEq(result, "0");
85
}
86
87
@test fn testFormatU64Max() throws (testing::TestError) {
88
    let mut buffer: [u8; 20] = [0; 20];
89
    let result: *[u8] = fmt::formatU64(18446744073709551615, &mut buffer[..]);
90
    try testing::expect(result.len == 20);
91
    try testing::expectBytesEq(result, "18446744073709551615");
92
}
93
94
@test fn testFormatI64Negative() throws (testing::TestError) {
95
    let mut buffer: [u8; 20] = [0; 20];
96
    let result: *[u8] = fmt::formatI64(-9876543210, &mut buffer[..]);
97
    try testing::expect(result.len == 11);
98
    try testing::expectBytesEq(result, "-9876543210");
99
}
100
101
@test fn testFormatI64Min() throws (testing::TestError) {
102
    let mut buffer: [u8; 20] = [0; 20];
103
    let result: *[u8] = fmt::formatI64(-9223372036854775808, &mut buffer[..]);
104
    try testing::expect(result.len == 20);
105
    try testing::expectBytesEq(result, "-9223372036854775808");
106
}
107
108
// mem /////////////////////////////////////////////////////////////////////////
109
110
@test fn testCopyFullSlice() throws (testing::TestError) {
111
    let mut xs: [u8; 3] = [1, 2, 3];
112
    let mut ys: [u8; 3] = [4, 5, 6];
113
114
    try! mem::copy(&mut xs[..], &ys[..]);
115
    try testing::expectBytesEq(&xs[..], &ys[..]);
116
    try testing::expectBytesEq(&xs[..], &[4, 5, 6]);
117
}
118
119
@test fn testCopyPartialSlice() throws (testing::TestError) {
120
    let mut xs: [u8; 3] = [1, 2, 3];
121
122
    try! mem::copy(&mut xs[..2], &[8, 9]);
123
    try testing::expectBytesEq(&xs[..], &[8, 9, 3]);
124
}
125
126
@test fn testCopySingleElement() throws (testing::TestError) {
127
    let mut xs: [u8; 3] = [1, 2, 3];
128
129
    try! mem::copy(&mut xs[..], &[7]);
130
    try testing::expectBytesEq(&xs[..], &[7, 2, 3]);
131
}
132
133
@test fn testCopyBufferTooSmallError() throws (testing::TestError) {
134
    let mut xs: [u8; 2] = [1, 2];
135
    let ys: [u8; 3] = [4, 5, 6];
136
137
    let mut threw = false;
138
    try mem::copy(&mut xs[..], &ys[..]) catch {
139
        threw = true;
140
    };
141
    try testing::expect(threw);
142
}
143
144
@test fn testStripPrefixMatch() throws (testing::TestError) {
145
    let input: *[u8] = "hello world";
146
    let prefix: *[u8] = "hello";
147
148
    let result = mem::stripPrefix(prefix, input) else {
149
        throw testing::TestError::Failed;
150
    };
151
    try testing::expectBytesEq(result, " world");
152
}
153
154
@test fn testStripPrefixNoMatch() throws (testing::TestError) {
155
    let input: *[u8] = "hello world";
156
    let prefix: *[u8] = "goodbye";
157
158
    let result = mem::stripPrefix(prefix, input);
159
    try testing::expect(result == nil);
160
}
161
162
@test fn testStripPrefixEmpty() throws (testing::TestError) {
163
    let input: *[u8] = "hello";
164
    let prefix: *[u8] = "";
165
166
    let result = mem::stripPrefix(prefix, input) else {
167
        throw testing::TestError::Failed;
168
    };
169
    try testing::expectBytesEq(result, input);
170
}
171
172
@test fn testStripPrefixTooLong() throws (testing::TestError) {
173
    let input: *[u8] = "hi";
174
    let prefix: *[u8] = "hello";
175
176
    let result = mem::stripPrefix(prefix, input);
177
    try testing::expect(result == nil);
178
}
179
180
@test fn testEqMatchingSlices() throws (testing::TestError) {
181
    let a: *[u8] = "abc";
182
    let b: *[u8] = "abc";
183
184
    try testing::expect(mem::eq(a, b));
185
}
186
187
@test fn testEqDifferentContents() throws (testing::TestError) {
188
    let a: *[u8] = "abc";
189
    let b: *[u8] = "abd";
190
191
    try testing::expectNot(mem::eq(a, b));
192
}
193
194
@test fn testEqDifferentLengths() throws (testing::TestError) {
195
    let a: *[u8] = "abc";
196
    let b: *[u8] = "abcd";
197
198
    try testing::expectNot(mem::eq(a, b));
199
}
200
201
@test fn testEqEmptySlices() throws (testing::TestError) {
202
    let a: *[u8] = "";
203
    let b: *[u8] = "";
204
205
    try testing::expect(mem::eq(a, b));
206
}
207
208
@test fn testCmpEqualSlices() throws (testing::TestError) {
209
    try testing::expect(mem::cmp("abc", "abc") == 0);
210
}
211
212
@test fn testCmpLessThanByContent() throws (testing::TestError) {
213
    try testing::expect(mem::cmp("abc", "abd") < 0);
214
}
215
216
@test fn testCmpGreaterThanByContent() throws (testing::TestError) {
217
    try testing::expect(mem::cmp("abd", "abc") > 0);
218
}
219
220
@test fn testCmpPrefixOrdering() throws (testing::TestError) {
221
    try testing::expect(mem::cmp("abc", "abcd") < 0);
222
    try testing::expect(mem::cmp("abcd", "abc") > 0);
223
}
224
225
// vec /////////////////////////////////////////////////////////////////////////
226
227
@test fn testVecInitialState() throws (testing::TestError) {
228
    let mut arena: [u8; 16] align(4) = undefined;
229
    let mut v = vec::new(&mut arena[..], @sizeOf(i32), @alignOf(i32));
230
231
    try testing::expect(vec::len(&v) == 0);
232
    try testing::expect(vec::capacity(&v) == 4);
233
}
234
235
@test fn testVecPushAndGet() throws (testing::TestError) {
236
    let mut arena: [u8; 16] align(4) = undefined;
237
    let mut v = vec::new(&mut arena[..], @sizeOf(i32), @alignOf(i32));
238
239
    let val1: i32 = 42;
240
    try testing::expect(vec::push(&mut v, &val1));
241
    try testing::expect(vec::len(&v) == 1);
242
243
    let ptr = vec::get(&v, 0) else {
244
        throw testing::TestError::Failed;
245
    };
246
    let i32ptr: *i32 = ptr as *i32;
247
    let value: i32 = *i32ptr;
248
    try testing::expect(value == 42);
249
}
250
251
@test fn testVecPushPop() throws (testing::TestError) {
252
    let mut arena: [u8; 16] align(4) = undefined;
253
    let mut v = vec::new(&mut arena[..], @sizeOf(i32), @alignOf(i32));
254
255
    let val1: i32 = 42;
256
    let val2: i32 = 100;
257
    let val3: i32 = -5;
258
259
    try testing::expect(vec::push(&mut v, &val1));
260
    try testing::expect(vec::len(&v) == 1);
261
262
    try testing::expect(vec::push(&mut v, &val2));
263
    try testing::expect(vec::len(&v) == 2);
264
265
    try testing::expect(vec::push(&mut v, &val3));
266
    try testing::expect(vec::len(&v) == 3);
267
268
    let mut popped: i32 = 0;
269
270
    try testing::expect(vec::pop(&mut v, &mut popped));
271
    try testing::expect(popped == -5);
272
    try testing::expect(vec::len(&v) == 2);
273
274
    try testing::expect(vec::pop(&mut v, &mut popped));
275
    try testing::expect(popped == 100);
276
    try testing::expect(vec::len(&v) == 1);
277
278
    try testing::expect(vec::pop(&mut v, &mut popped));
279
    try testing::expect(popped == 42);
280
    try testing::expect(vec::len(&v) == 0);
281
282
    try testing::expectNot(vec::pop(&mut v, &mut popped));
283
}
284
285
@test fn testVecGetSet() throws (testing::TestError) {
286
    let mut arena: [u8; 32] align(4) = undefined;
287
    let mut v = vec::new(&mut arena[..], @sizeOf(i32), @alignOf(i32));
288
289
    let val1: i32 = 10;
290
    let val2: i32 = 20;
291
    let val3: i32 = 30;
292
293
    vec::push(&mut v, &val1);
294
    vec::push(&mut v, &val2);
295
    vec::push(&mut v, &val3);
296
297
    if let ptr = vec::get(&v, 0) {
298
        let value: i32 = *(ptr as *i32);
299
        try testing::expect(value == 10);
300
    } else {
301
        throw testing::TestError::Failed;
302
    }
303
304
    if let ptr = vec::get(&v, 1) {
305
        let value: i32 = *(ptr as *i32);
306
        try testing::expect(value == 20);
307
    } else {
308
        throw testing::TestError::Failed;
309
    }
310
311
    if let ptr = vec::get(&v, 2) {
312
        let value: i32 = *(ptr as *i32);
313
        try testing::expect(value == 30);
314
    } else {
315
        throw testing::TestError::Failed;
316
    }
317
    try testing::expect(vec::get(&v, 3) == nil);
318
319
    let new: i32 = 999;
320
    try testing::expect(vec::set(&mut v, 1, &new));
321
322
    if let ptr = vec::get(&v, 1) {
323
        let value: i32 = *(ptr as *i32);
324
        try testing::expect(value == 999);
325
    } else {
326
        throw testing::TestError::Failed;
327
    }
328
    try testing::expectNot(vec::set(&mut v, 5, &new));
329
}
330
331
@test fn testVecCapacity() throws (testing::TestError) {
332
    let mut arena: [u8; 16] align(4) = undefined;
333
    let mut v = vec::new(&mut arena[..], @sizeOf(i32), @alignOf(i32));
334
335
    let val: i32 = 7;
336
    try testing::expect(vec::push(&mut v, &val));
337
    try testing::expect(vec::push(&mut v, &val));
338
    try testing::expect(vec::push(&mut v, &val));
339
    try testing::expect(vec::push(&mut v, &val));
340
    try testing::expect(vec::len(&v) == 4);
341
342
    try testing::expectNot(vec::push(&mut v, &val));
343
    try testing::expect(vec::len(&v) == 4);
344
}
345
346
@test fn testVecReset() throws (testing::TestError) {
347
    let mut arena: [u8; 16] align(4) = undefined;
348
    let mut v = vec::new(&mut arena[..], @sizeOf(i32), @alignOf(i32));
349
350
    let val: i32 = 123;
351
    vec::push(&mut v, &val);
352
    vec::push(&mut v, &val);
353
    try testing::expect(vec::len(&v) == 2);
354
355
    vec::reset(&mut v);
356
    try testing::expect(vec::len(&v) == 0);
357
358
    try testing::expect(vec::push(&mut v, &val));
359
    try testing::expect(vec::len(&v) == 1);
360
}
361
362
@test fn testVecStruct() throws (testing::TestError) {
363
    let mut arena: [u8; 64] align(4) = undefined;
364
    let mut v = vec::new(&mut arena[..], @sizeOf(Point), @alignOf(Point));
365
366
    let p1: Point = Point { x: 1, y: 2 };
367
    let p2: Point = Point { x: 3, y: 4 };
368
369
    try testing::expect(vec::push(&mut v, &p1));
370
    try testing::expect(vec::push(&mut v, &p2));
371
372
    if let ptr = vec::get(&v, 0) {
373
        let p: *Point = ptr as *Point;
374
        try testing::expect(p.x == 1);
375
        try testing::expect(p.y == 2);
376
    } else {
377
        throw testing::TestError::Failed;
378
    }
379
    let mut popped: Point = Point { x: 0, y: 0 };
380
381
    try testing::expect(vec::pop(&mut v, &mut popped));
382
    try testing::expect(popped.x == 3);
383
    try testing::expect(popped.y == 4);
384
}