lib/std/tests.rad 15.4 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
use std::sys::unix;
8
9
// Data types //////////////////////////////////////////////////////////////////
10
11
record Point {
12
    x: i32,
13
    y: i32,
14
}
15
16
// fmt /////////////////////////////////////////////////////////////////////////
17
18
@test fn testFormatU32Zero() throws (testing::TestError) {
19
    let mut buffer: [u8; 11] = [0; 11];
20
    let result: *[u8] = fmt::formatU32(0, &mut buffer[..]);
21
    try testing::expect(result.len == 1);
22
    try testing::expectBytesEq(result, "0");
23
}
24
25
@test fn testFormatU32Basic() throws (testing::TestError) {
26
    let mut buffer: [u8; 11] = [0; 11];
27
    let result: *[u8] = fmt::formatU32(123, &mut buffer[..]);
28
    try testing::expect(result.len == 3);
29
    try testing::expectBytesEq(result, "123");
30
}
31
32
@test fn testFormatU32Large() throws (testing::TestError) {
33
    let mut buffer: [u8; 11] = [0; 11];
34
    let result: *[u8] = fmt::formatU32(90000, &mut buffer[..]);
35
    try testing::expect(result.len == 5);
36
    try testing::expectBytesEq(result, "90000");
37
}
38
39
@test fn testFormatU32Max() throws (testing::TestError) {
40
    let mut buffer: [u8; 11] = [0; 11];
41
    let result: *[u8] = fmt::formatU32(4294967295, &mut buffer[..]);
42
    try testing::expect(result.len == 10);
43
    try testing::expectBytesEq(result, "4294967295");
44
}
45
46
@test fn testFormatI32Positive() throws (testing::TestError) {
47
    let mut buffer: [u8; 11] = [0; 11];
48
    let result: *[u8] = fmt::formatI32(456, &mut buffer[..]);
49
    try testing::expect(result.len == 3);
50
    try testing::expectBytesEq(result, "456");
51
}
52
53
@test fn testFormatI32Negative() throws (testing::TestError) {
54
    let mut buffer: [u8; 11] = [0; 11];
55
    let result: *[u8] = fmt::formatI32(-789, &mut buffer[..]);
56
    try testing::expect(result.len == 4);
57
    try testing::expectBytesEq(result, "-789");
58
}
59
60
@test fn testFormatI32Zero() throws (testing::TestError) {
61
    let mut buffer: [u8; 11] = [0; 11];
62
    let result: *[u8] = fmt::formatI32(0, &mut buffer[..]);
63
    try testing::expect(result.len == 1);
64
    try testing::expectBytesEq(result, "0");
65
}
66
67
@test fn testFormatI32Max() throws (testing::TestError) {
68
    let mut buffer: [u8; 11] = [0; 11];
69
    let result: *[u8] = fmt::formatI32(2147483647, &mut buffer[..]);
70
    try testing::expect(result.len == 10);
71
    try testing::expectBytesEq(result, "2147483647");
72
}
73
74
@test fn testFormatI32Min() throws (testing::TestError) {
75
    let mut buffer: [u8; 11] = [0; 11];
76
    let result: *[u8] = fmt::formatI32(-2147483648, &mut buffer[..]);
77
    try testing::expect(result.len == 11);
78
    try testing::expectBytesEq(result, "-2147483648");
79
}
80
81
@test fn testFormatU64Zero() throws (testing::TestError) {
82
    let mut buffer: [u8; 20] = [0; 20];
83
    let result: *[u8] = fmt::formatU64(0, &mut buffer[..]);
84
    try testing::expect(result.len == 1);
85
    try testing::expectBytesEq(result, "0");
86
}
87
88
@test fn testFormatU64Max() throws (testing::TestError) {
89
    let mut buffer: [u8; 20] = [0; 20];
90
    let result: *[u8] = fmt::formatU64(18446744073709551615, &mut buffer[..]);
91
    try testing::expect(result.len == 20);
92
    try testing::expectBytesEq(result, "18446744073709551615");
93
}
94
95
@test fn testFormatI64Negative() throws (testing::TestError) {
96
    let mut buffer: [u8; 20] = [0; 20];
97
    let result: *[u8] = fmt::formatI64(-9876543210, &mut buffer[..]);
98
    try testing::expect(result.len == 11);
99
    try testing::expectBytesEq(result, "-9876543210");
100
}
101
102
@test fn testFormatI64Min() throws (testing::TestError) {
103
    let mut buffer: [u8; 20] = [0; 20];
104
    let result: *[u8] = fmt::formatI64(-9223372036854775808, &mut buffer[..]);
105
    try testing::expect(result.len == 20);
106
    try testing::expectBytesEq(result, "-9223372036854775808");
107
}
108
109
@test fn testParseIntLiteralText() throws (testing::TestError) {
110
    let dec = try fmt::parseInt("123") catch {
111
        throw testing::TestError::Failed;
112
    };
113
    try testing::expect(dec.magnitude == 123);
114
    try testing::expect(dec.radix == fmt::Radix::Decimal);
115
116
    let hex = try fmt::parseInt("0x2a") catch {
117
        throw testing::TestError::Failed;
118
    };
119
    try testing::expect(hex.magnitude == 42);
120
    try testing::expect(hex.radix == fmt::Radix::Hex);
121
122
    let bin = try fmt::parseInt("0b101") catch {
123
        throw testing::TestError::Failed;
124
    };
125
    try testing::expect(bin.magnitude == 5);
126
    try testing::expect(bin.radix == fmt::Radix::Binary);
127
}
128
129
@test fn testDigitFromAscii() throws (testing::TestError) {
130
    let zero = fmt::digitFromAscii('0', 10) else throw testing::TestError::Failed;
131
    try testing::expect(zero == 0);
132
133
    let nine = fmt::digitFromAscii('9', 10) else throw testing::TestError::Failed;
134
    try testing::expect(nine == 9);
135
136
    let lower = fmt::digitFromAscii('a', 16) else throw testing::TestError::Failed;
137
    try testing::expect(lower == 10);
138
139
    let lowerF = fmt::digitFromAscii('f', 16) else throw testing::TestError::Failed;
140
    try testing::expect(lowerF == 15);
141
142
    let upper = fmt::digitFromAscii('A', 16) else throw testing::TestError::Failed;
143
    try testing::expect(upper == 10);
144
145
    let upperF = fmt::digitFromAscii('F', 16) else throw testing::TestError::Failed;
146
    try testing::expect(upperF == 15);
147
148
    try testing::expect(fmt::digitFromAscii('g', 16) == nil);
149
    try testing::expect(fmt::digitFromAscii('_', 10) == nil);
150
}
151
152
@test fn testParseIntLiteralTextErrors() throws (testing::TestError) {
153
    try fmt::parseInt("") catch {
154
        return;
155
    };
156
    throw testing::TestError::Failed;
157
}
158
159
@test fn testParseIntLiteralTextRejectsSigns() throws (testing::TestError) {
160
    try fmt::parseInt("-1") catch {
161
        try fmt::parseInt("+1") catch {
162
            return;
163
        };
164
    };
165
    throw testing::TestError::Failed;
166
}
167
168
@test fn testParseIntLiteralTextInvalidDigitErrors() throws (testing::TestError) {
169
    try fmt::parseInt("0b2") catch {
170
        return;
171
    };
172
    throw testing::TestError::Failed;
173
}
174
175
@test fn testParseIntLiteralTextOverflowErrors() throws (testing::TestError) {
176
    try fmt::parseInt("18446744073709551616") catch {
177
        return;
178
    };
179
    throw testing::TestError::Failed;
180
}
181
182
@test fn testParseCharLiteralText() throws (testing::TestError) {
183
    let x = try fmt::parseChar("'x'") catch {
184
        throw testing::TestError::Failed;
185
    };
186
    try testing::expect(x == 'x');
187
188
    let newline = try fmt::parseChar("'\\n'") catch {
189
        throw testing::TestError::Failed;
190
    };
191
    try testing::expect(newline == '\n');
192
}
193
194
@test fn testParseCharLiteralTextErrors() throws (testing::TestError) {
195
    try fmt::parseChar("''") catch {
196
        return;
197
    };
198
    throw testing::TestError::Failed;
199
}
200
201
@test fn testUnescapeString() throws (testing::TestError) {
202
    let mut buffer: [u8; 8] = [0; 8];
203
    let len = fmt::unescapeString("a\\n\\0", &mut buffer[..]);
204
205
    try testing::expect(len == 3);
206
    try testing::expect(buffer[0] == 'a');
207
    try testing::expect(buffer[1] == '\n');
208
    try testing::expect(buffer[2] == 0);
209
}
210
211
// mem /////////////////////////////////////////////////////////////////////////
212
213
@test fn testCopyFullSlice() throws (testing::TestError) {
214
    let mut xs: [u8; 3] = [1, 2, 3];
215
    let mut ys: [u8; 3] = [4, 5, 6];
216
217
    try! mem::copy(&mut xs[..], &ys[..]);
218
    try testing::expectBytesEq(&xs[..], &ys[..]);
219
    try testing::expectBytesEq(&xs[..], &[4, 5, 6]);
220
}
221
222
@test fn testCopyPartialSlice() throws (testing::TestError) {
223
    let mut xs: [u8; 3] = [1, 2, 3];
224
225
    try! mem::copy(&mut xs[..2], &[8, 9]);
226
    try testing::expectBytesEq(&xs[..], &[8, 9, 3]);
227
}
228
229
@test fn testCopySingleElement() throws (testing::TestError) {
230
    let mut xs: [u8; 3] = [1, 2, 3];
231
232
    try! mem::copy(&mut xs[..], &[7]);
233
    try testing::expectBytesEq(&xs[..], &[7, 2, 3]);
234
}
235
236
@test fn testCopyBufferTooSmallError() throws (testing::TestError) {
237
    let mut xs: [u8; 2] = [1, 2];
238
    let ys: [u8; 3] = [4, 5, 6];
239
240
    let mut threw = false;
241
    try mem::copy(&mut xs[..], &ys[..]) catch {
242
        set threw = true;
243
    };
244
    try testing::expect(threw);
245
}
246
247
@test fn testWriteFileParts() throws (testing::TestError) {
248
    let path = "/tmp/radiance-std-write-file-parts.test";
249
    let mut buffer: [u8; 16] = undefined;
250
251
    let mut wrote = false;
252
    unsafe { set wrote = unix::writeFileParts(path, &["hello", " ", "world"]); }
253
    if not wrote {
254
        throw testing::TestError::Failed;
255
    }
256
    let mut readResult: ?*[u8] = nil;
257
    unsafe { set readResult = unix::readFile(path, &mut buffer[..]); }
258
    let data = readResult else {
259
        throw testing::TestError::Failed;
260
    };
261
    try testing::expectBytesEq(data, "hello world");
262
}
263
264
@test fn testStripPrefixMatch() throws (testing::TestError) {
265
    let input: *[u8] = "hello world";
266
    let prefix: *[u8] = "hello";
267
268
    let result = mem::stripPrefix(prefix, input) else {
269
        throw testing::TestError::Failed;
270
    };
271
    try testing::expectBytesEq(result, " world");
272
}
273
274
@test fn testStripPrefixNoMatch() throws (testing::TestError) {
275
    let input: *[u8] = "hello world";
276
    let prefix: *[u8] = "goodbye";
277
278
    let result = mem::stripPrefix(prefix, input);
279
    try testing::expect(result == nil);
280
}
281
282
@test fn testStripPrefixEmpty() throws (testing::TestError) {
283
    let input: *[u8] = "hello";
284
    let prefix: *[u8] = "";
285
286
    let result = mem::stripPrefix(prefix, input) else {
287
        throw testing::TestError::Failed;
288
    };
289
    try testing::expectBytesEq(result, input);
290
}
291
292
@test fn testStripPrefixTooLong() throws (testing::TestError) {
293
    let input: *[u8] = "hi";
294
    let prefix: *[u8] = "hello";
295
296
    let result = mem::stripPrefix(prefix, input);
297
    try testing::expect(result == nil);
298
}
299
300
@test fn testEqMatchingSlices() throws (testing::TestError) {
301
    let a: *[u8] = "abc";
302
    let b: *[u8] = "abc";
303
304
    try testing::expect(mem::eq(a, b));
305
}
306
307
@test fn testEqDifferentContents() throws (testing::TestError) {
308
    let a: *[u8] = "abc";
309
    let b: *[u8] = "abd";
310
311
    try testing::expectNot(mem::eq(a, b));
312
}
313
314
@test fn testEqDifferentLengths() throws (testing::TestError) {
315
    let a: *[u8] = "abc";
316
    let b: *[u8] = "abcd";
317
318
    try testing::expectNot(mem::eq(a, b));
319
}
320
321
@test fn testEqEmptySlices() throws (testing::TestError) {
322
    let a: *[u8] = "";
323
    let b: *[u8] = "";
324
325
    try testing::expect(mem::eq(a, b));
326
}
327
328
@test fn testCmpEqualSlices() throws (testing::TestError) {
329
    try testing::expect(mem::cmp("abc", "abc") == 0);
330
}
331
332
@test fn testCmpLessThanByContent() throws (testing::TestError) {
333
    try testing::expect(mem::cmp("abc", "abd") < 0);
334
}
335
336
@test fn testCmpGreaterThanByContent() throws (testing::TestError) {
337
    try testing::expect(mem::cmp("abd", "abc") > 0);
338
}
339
340
@test fn testCmpPrefixOrdering() throws (testing::TestError) {
341
    try testing::expect(mem::cmp("abc", "abcd") < 0);
342
    try testing::expect(mem::cmp("abcd", "abc") > 0);
343
}
344
345
// vec /////////////////////////////////////////////////////////////////////////
346
347
@test fn testVecInitialState() throws (testing::TestError) {
348
    let mut arena: [u8; 16] align(4) = undefined;
349
    let mut v = vec::new(&mut arena[..], @sizeOf(i32), @alignOf(i32));
350
351
    try testing::expect(vec::len(&v) == 0);
352
    try testing::expect(vec::capacity(&v) == 4);
353
}
354
355
@test fn testVecPushAndGet() throws (testing::TestError) {
356
    let mut arena: [u8; 16] align(4) = undefined;
357
    let mut v = vec::new(&mut arena[..], @sizeOf(i32), @alignOf(i32));
358
359
    let val1: i32 = 42;
360
    try testing::expect(vec::push(&mut v, &val1));
361
    try testing::expect(vec::len(&v) == 1);
362
363
    let ptr = vec::get(&v, 0) else {
364
        throw testing::TestError::Failed;
365
    };
366
    let i32ptr: *i32 = ptr as *i32;
367
    let value: i32 = *i32ptr;
368
    try testing::expect(value == 42);
369
}
370
371
@test fn testVecPushPop() throws (testing::TestError) {
372
    let mut arena: [u8; 16] align(4) = undefined;
373
    let mut v = vec::new(&mut arena[..], @sizeOf(i32), @alignOf(i32));
374
375
    let val1: i32 = 42;
376
    let val2: i32 = 100;
377
    let val3: i32 = -5;
378
379
    try testing::expect(vec::push(&mut v, &val1));
380
    try testing::expect(vec::len(&v) == 1);
381
382
    try testing::expect(vec::push(&mut v, &val2));
383
    try testing::expect(vec::len(&v) == 2);
384
385
    try testing::expect(vec::push(&mut v, &val3));
386
    try testing::expect(vec::len(&v) == 3);
387
388
    let mut popped: i32 = 0;
389
390
    try testing::expect(vec::pop(&mut v, &mut popped));
391
    try testing::expect(popped == -5);
392
    try testing::expect(vec::len(&v) == 2);
393
394
    try testing::expect(vec::pop(&mut v, &mut popped));
395
    try testing::expect(popped == 100);
396
    try testing::expect(vec::len(&v) == 1);
397
398
    try testing::expect(vec::pop(&mut v, &mut popped));
399
    try testing::expect(popped == 42);
400
    try testing::expect(vec::len(&v) == 0);
401
402
    try testing::expectNot(vec::pop(&mut v, &mut popped));
403
}
404
405
@test fn testVecGetSet() throws (testing::TestError) {
406
    let mut arena: [u8; 32] align(4) = undefined;
407
    let mut v = vec::new(&mut arena[..], @sizeOf(i32), @alignOf(i32));
408
409
    let val1: i32 = 10;
410
    let val2: i32 = 20;
411
    let val3: i32 = 30;
412
413
    vec::push(&mut v, &val1);
414
    vec::push(&mut v, &val2);
415
    vec::push(&mut v, &val3);
416
417
    if let ptr = vec::get(&v, 0) {
418
        let value: i32 = *(ptr as *i32);
419
        try testing::expect(value == 10);
420
    } else {
421
        throw testing::TestError::Failed;
422
    }
423
424
    if let ptr = vec::get(&v, 1) {
425
        let value: i32 = *(ptr as *i32);
426
        try testing::expect(value == 20);
427
    } else {
428
        throw testing::TestError::Failed;
429
    }
430
431
    if let ptr = vec::get(&v, 2) {
432
        let value: i32 = *(ptr as *i32);
433
        try testing::expect(value == 30);
434
    } else {
435
        throw testing::TestError::Failed;
436
    }
437
    try testing::expect(vec::get(&v, 3) == nil);
438
439
    let new: i32 = 999;
440
    try testing::expect(vec::put(&mut v, 1, &new));
441
442
    if let ptr = vec::get(&v, 1) {
443
        let value: i32 = *(ptr as *i32);
444
        try testing::expect(value == 999);
445
    } else {
446
        throw testing::TestError::Failed;
447
    }
448
    try testing::expectNot(vec::put(&mut v, 5, &new));
449
}
450
451
@test fn testVecCapacity() throws (testing::TestError) {
452
    let mut arena: [u8; 16] align(4) = undefined;
453
    let mut v = vec::new(&mut arena[..], @sizeOf(i32), @alignOf(i32));
454
455
    let val: i32 = 7;
456
    try testing::expect(vec::push(&mut v, &val));
457
    try testing::expect(vec::push(&mut v, &val));
458
    try testing::expect(vec::push(&mut v, &val));
459
    try testing::expect(vec::push(&mut v, &val));
460
    try testing::expect(vec::len(&v) == 4);
461
462
    try testing::expectNot(vec::push(&mut v, &val));
463
    try testing::expect(vec::len(&v) == 4);
464
}
465
466
@test fn testVecReset() throws (testing::TestError) {
467
    let mut arena: [u8; 16] align(4) = undefined;
468
    let mut v = vec::new(&mut arena[..], @sizeOf(i32), @alignOf(i32));
469
470
    let val: i32 = 123;
471
    vec::push(&mut v, &val);
472
    vec::push(&mut v, &val);
473
    try testing::expect(vec::len(&v) == 2);
474
475
    vec::reset(&mut v);
476
    try testing::expect(vec::len(&v) == 0);
477
478
    try testing::expect(vec::push(&mut v, &val));
479
    try testing::expect(vec::len(&v) == 1);
480
}
481
482
@test fn testVecStruct() throws (testing::TestError) {
483
    let mut arena: [u8; 64] align(4) = undefined;
484
    let mut v = vec::new(&mut arena[..], @sizeOf(Point), @alignOf(Point));
485
486
    let p1: Point = Point { x: 1, y: 2 };
487
    let p2: Point = Point { x: 3, y: 4 };
488
489
    try testing::expect(vec::push(&mut v, &p1));
490
    try testing::expect(vec::push(&mut v, &p2));
491
492
    if let ptr = vec::get(&v, 0) {
493
        let p: *Point = ptr as *Point;
494
        try testing::expect(p.x == 1);
495
        try testing::expect(p.y == 2);
496
    } else {
497
        throw testing::TestError::Failed;
498
    }
499
    let mut popped: Point = Point { x: 0, y: 0 };
500
501
    try testing::expect(vec::pop(&mut v, &mut popped));
502
    try testing::expect(popped.x == 3);
503
    try testing::expect(popped.y == 4);
504
}