rsbx 2.0.0

Enhanced implementation of SeqBox in Rust
Documentation
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
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
#![cfg(test)]

use sbx_specs::Version;
use file_utils::*;

#[test]
fn test_calc_meta_block_count_exc_burst_gaps_rs_disabled() {
    assert_eq!(0, calc_meta_block_count_exc_burst_gaps(Version::V1, Some(false), None));
    assert_eq!(0, calc_meta_block_count_exc_burst_gaps(Version::V2, Some(false), None));
    assert_eq!(0, calc_meta_block_count_exc_burst_gaps(Version::V3, Some(false), None));
}

quickcheck! {
    fn qc_calc_meta_block_count_exc_burst_gaps_rs_enabled(meta_enabled   : Option<bool>,
                                                          data_par_burst : (usize, usize, usize)) -> bool {
        let (_, parity, _) = data_par_burst;

        (1 + parity as u64) == calc_meta_block_count_exc_burst_gaps(Version::V17, meta_enabled, Some(data_par_burst))
            && (1 + parity as u64) == calc_meta_block_count_exc_burst_gaps(Version::V18, meta_enabled, Some(data_par_burst))
            && (1 + parity as u64) == calc_meta_block_count_exc_burst_gaps(Version::V19, meta_enabled, Some(data_par_burst))
    }
}

mod from_orig_file_size {
    use file_utils::from_orig_file_size::*;
    use file_utils::*;
    use sbx_specs::*;

    quickcheck! {
        fn qc_calc_data_only_and_parity_block_count_exc_burst_gaps_rs_disabled(size : u64) -> bool {
            ({
                let version = Version::V1;

                let (data, parity) =
                    calc_data_only_and_parity_block_count_exc_burst_gaps(version, None, size);

                let data_size = ver_to_data_size(version) as u64;

                parity == 0
                    && data * data_size >= size
                    && ((size % data_size == 0 && data * data_size == size)
                        || (size % data_size != 0 && data * data_size > size))
                    && (data == (size + (data_size - 1)) / data_size)
            })
                &&
                ({
                    let version = Version::V2;

                    let (data, parity) =
                        calc_data_only_and_parity_block_count_exc_burst_gaps(version, None, size);

                    let data_size = ver_to_data_size(version) as u64;

                    parity == 0
                        && data * data_size >= size
                        && ((size % data_size == 0 && data * data_size == size)
                            || (size % data_size != 0 && data * data_size > size))
                        && (data == (size + (data_size - 1)) / data_size)
                })
                &&
                ({
                    let version = Version::V3;

                    let (data, parity) =
                        calc_data_only_and_parity_block_count_exc_burst_gaps(version, None, size);

                    let data_size = ver_to_data_size(version) as u64;

                    parity == 0
                        && data * data_size >= size
                        && ((size % data_size == 0 && data * data_size == size)
                            || (size % data_size != 0 && data * data_size > size))
                        && (data == (size + (data_size - 1)) / data_size)
                })
        }

        fn qc_calc_data_only_and_parity_block_count_exc_burst_gaps_rs_enabled(data_par_burst : (usize, usize, usize),
                                                                              size           : u64)
                                                                              -> bool {
            let mut data_par_burst = data_par_burst;
            data_par_burst.0 = if data_par_burst.0 == 0 { 1 } else { data_par_burst.0 };
            data_par_burst.1 = if data_par_burst.1 == 0 { 1 } else { data_par_burst.1 };

            let (data, parity, _) = data_par_burst;
            let data = data as u64;
            let parity = parity as u64;

            ({
                let version = Version::V17;

                let (data_total, parity_total) =
                    calc_data_only_and_parity_block_count_exc_burst_gaps(version, Some(data_par_burst), size);

                let data_size = ver_to_data_size(version) as u64;

                let data_chunks = (size + (data_size - 1)) / data_size;

                let block_set_size = data + parity;

                let block_set_count = (data_chunks + (block_set_size - 1)) / block_set_size;

                data_total * data_size >= size
                    && data_total % data == 0
                    && parity_total % parity == 0
                    && data_total / data == parity_total / parity
                    && data_total / data == block_set_count
            })
                &&
                ({
                    let version = Version::V18;

                    let (data_total, parity_total) =
                        calc_data_only_and_parity_block_count_exc_burst_gaps(version, Some(data_par_burst), size);

                    let data_size = ver_to_data_size(version) as u64;

                    let data_chunks = (size + (data_size - 1)) / data_size;

                    let block_set_size = data + parity;

                    let block_set_count = (data_chunks + (block_set_size - 1)) / block_set_size;

                    data_total * data_size >= size
                        && data_total % data == 0
                        && parity_total % parity == 0
                        && data_total / data == parity_total / parity
                        && data_total / data == block_set_count
                })
                &&
                ({
                    let version = Version::V19;

                    let (data_total, parity_total) =
                        calc_data_only_and_parity_block_count_exc_burst_gaps(version, Some(data_par_burst), size);

                    let data_size = ver_to_data_size(version) as u64;

                    let data_chunks = (size + (data_size - 1)) / data_size;

                    let block_set_size = data + parity;

                    let block_set_count = (data_chunks + (block_set_size - 1)) / block_set_size;

                    data_total * data_size >= size
                        && data_total % data == 0
                        && parity_total % parity == 0
                        && data_total / data == parity_total / parity
                        && data_total / data == block_set_count
                })
        }
        fn qc_calc_data_block_count_exc_burst_gaps_consistent_rs_disabled(size : u64)
                                                                          -> bool {
            ({
                let version = Version::V1;

                let (data_total, parity_total) =
                    calc_data_only_and_parity_block_count_exc_burst_gaps(version, None, size);

                let data_all_total =
                    calc_data_block_count_exc_burst_gaps(version, None, size);

                data_all_total == data_total + parity_total
            })
                &&
                ({
                    let version = Version::V2;

                    let (data_total, parity_total) =
                        calc_data_only_and_parity_block_count_exc_burst_gaps(version, None, size);

                    let data_all_total =
                        calc_data_block_count_exc_burst_gaps(version, None, size);

                    data_all_total == data_total + parity_total
                })
                &&
                ({
                    let version = Version::V3;

                    let (data_total, parity_total) =
                        calc_data_only_and_parity_block_count_exc_burst_gaps(version, None, size);

                    let data_all_total =
                        calc_data_block_count_exc_burst_gaps(version, None, size);

                    data_all_total == data_total + parity_total
                })
        }

        fn qc_calc_data_block_count_exc_burst_gaps_consistent_rs_enabled(data_par_burst : (usize, usize, usize),
                                                                         size           : u64)
                                                                         -> bool {
            let mut data_par_burst = data_par_burst;
            data_par_burst.0 = if data_par_burst.0 == 0 { 1 } else { data_par_burst.0 };
            data_par_burst.1 = if data_par_burst.1 == 0 { 1 } else { data_par_burst.1 };

            ({
                let version = Version::V17;

                let (data_total, parity_total) =
                    calc_data_only_and_parity_block_count_exc_burst_gaps(version, Some(data_par_burst), size);

                let data_all_total =
                    calc_data_block_count_exc_burst_gaps(version, Some(data_par_burst), size);

                data_all_total == data_total + parity_total
            })
                &&
                ({
                    let version = Version::V18;

                    let (data_total, parity_total) =
                        calc_data_only_and_parity_block_count_exc_burst_gaps(version, Some(data_par_burst), size);

                    let data_all_total =
                        calc_data_block_count_exc_burst_gaps(version, Some(data_par_burst), size);

                    data_all_total == data_total + parity_total
                })
                &&
                ({
                    let version = Version::V19;

                    let (data_total, parity_total) =
                        calc_data_only_and_parity_block_count_exc_burst_gaps(version, Some(data_par_burst), size);

                    let data_all_total =
                        calc_data_block_count_exc_burst_gaps(version, Some(data_par_burst), size);

                    data_all_total == data_total + parity_total
                })
        }

        fn qc_calc_total_block_count_exc_burst_gaps_consistent_rs_disabled(size : u64) -> bool {
            ({
                let version = Version::V1;
                calc_meta_block_count_exc_burst_gaps(version, Some(false), None)
                    + calc_data_block_count_exc_burst_gaps(version, None, size)
                    == calc_total_block_count_exc_burst_gaps(version, Some(false), None, size)
                    &&
                    calc_meta_block_count_exc_burst_gaps(version, Some(true), None)
                    + calc_data_block_count_exc_burst_gaps(version, None, size)
                    == calc_total_block_count_exc_burst_gaps(version, Some(true), None, size)
                    &&
                    calc_meta_block_count_exc_burst_gaps(version, None, None)
                    + calc_data_block_count_exc_burst_gaps(version, None, size)
                    == calc_total_block_count_exc_burst_gaps(version, None, None, size)
                    &&
                    calc_total_block_count_exc_burst_gaps(version, Some(true), None, size)
                    == calc_total_block_count_exc_burst_gaps(version, None, None, size)
                    &&
                    calc_total_block_count_exc_burst_gaps(version, Some(false), None, size) + 1
                    == calc_total_block_count_exc_burst_gaps(version, Some(true), None, size)
            })
                &&
                ({
                    let version = Version::V2;
                    calc_meta_block_count_exc_burst_gaps(version, Some(false), None)
                        + calc_data_block_count_exc_burst_gaps(version, None, size)
                        == calc_total_block_count_exc_burst_gaps(version, Some(false), None, size)
                        &&
                        calc_meta_block_count_exc_burst_gaps(version, Some(true), None)
                        + calc_data_block_count_exc_burst_gaps(version, None, size)
                        == calc_total_block_count_exc_burst_gaps(version, Some(true), None, size)
                        &&
                        calc_meta_block_count_exc_burst_gaps(version, None, None)
                        + calc_data_block_count_exc_burst_gaps(version, None, size)
                        == calc_total_block_count_exc_burst_gaps(version, None, None, size)
                        &&
                        calc_total_block_count_exc_burst_gaps(version, Some(true), None, size)
                        == calc_total_block_count_exc_burst_gaps(version, None, None, size)
                        &&
                        calc_total_block_count_exc_burst_gaps(version, Some(false), None, size) + 1
                        == calc_total_block_count_exc_burst_gaps(version, Some(true), None, size)
                })
                &&
                ({
                    let version = Version::V3;
                    calc_meta_block_count_exc_burst_gaps(version, Some(false), None)
                        + calc_data_block_count_exc_burst_gaps(version, None, size)
                        == calc_total_block_count_exc_burst_gaps(version, Some(false), None, size)
                        &&
                        calc_meta_block_count_exc_burst_gaps(version, Some(true), None)
                        + calc_data_block_count_exc_burst_gaps(version, None, size)
                        == calc_total_block_count_exc_burst_gaps(version, Some(true), None, size)
                        &&
                        calc_meta_block_count_exc_burst_gaps(version, None, None)
                        + calc_data_block_count_exc_burst_gaps(version, None, size)
                        == calc_total_block_count_exc_burst_gaps(version, None, None, size)
                        &&
                        calc_total_block_count_exc_burst_gaps(version, Some(true), None, size)
                        == calc_total_block_count_exc_burst_gaps(version, None, None, size)
                        &&
                        calc_total_block_count_exc_burst_gaps(version, Some(false), None, size) + 1
                        == calc_total_block_count_exc_burst_gaps(version, Some(true), None, size)
                })
        }

        fn qc_calc_total_block_count_exc_burst_gaps_consistent_rs_enabled(data_par_burst : (usize, usize, usize),
                                                                          size           : u64)
                                                                          -> bool {
            let mut data_par_burst = data_par_burst;
            data_par_burst.0 = if data_par_burst.0 == 0 { 1 } else { data_par_burst.0 };
            data_par_burst.1 = if data_par_burst.1 == 0 { 1 } else { data_par_burst.1 };

            ({
                let version = Version::V17;
                calc_meta_block_count_exc_burst_gaps(version, Some(false), Some(data_par_burst))
                    + calc_data_block_count_exc_burst_gaps(version, Some(data_par_burst), size)
                    == calc_total_block_count_exc_burst_gaps(version, Some(false), Some(data_par_burst), size)
                    &&
                    calc_meta_block_count_exc_burst_gaps(version, Some(true), Some(data_par_burst))
                    + calc_data_block_count_exc_burst_gaps(version, Some(data_par_burst), size)
                    == calc_total_block_count_exc_burst_gaps(version, Some(true), Some(data_par_burst), size)
                    &&
                    calc_meta_block_count_exc_burst_gaps(version, None, Some(data_par_burst))
                    + calc_data_block_count_exc_burst_gaps(version, Some(data_par_burst), size)
                    == calc_total_block_count_exc_burst_gaps(version, None, Some(data_par_burst), size)
                    &&
                    calc_total_block_count_exc_burst_gaps(version, Some(true), Some(data_par_burst), size)
                    == calc_total_block_count_exc_burst_gaps(version, None, Some(data_par_burst), size)
                    &&
                    calc_total_block_count_exc_burst_gaps(version, Some(false), Some(data_par_burst), size)
                    == calc_total_block_count_exc_burst_gaps(version, Some(true), Some(data_par_burst), size)
            })
                &&
                ({
                    let version = Version::V18;
                    calc_meta_block_count_exc_burst_gaps(version, Some(false), Some(data_par_burst))
                        + calc_data_block_count_exc_burst_gaps(version, Some(data_par_burst), size)
                        == calc_total_block_count_exc_burst_gaps(version, Some(false), Some(data_par_burst), size)
                        &&
                        calc_meta_block_count_exc_burst_gaps(version, Some(true), Some(data_par_burst))
                        + calc_data_block_count_exc_burst_gaps(version, Some(data_par_burst), size)
                        == calc_total_block_count_exc_burst_gaps(version, Some(true), Some(data_par_burst), size)
                        &&
                        calc_meta_block_count_exc_burst_gaps(version, None, Some(data_par_burst))
                        + calc_data_block_count_exc_burst_gaps(version, Some(data_par_burst), size)
                        == calc_total_block_count_exc_burst_gaps(version, None, Some(data_par_burst), size)
                        &&
                        calc_total_block_count_exc_burst_gaps(version, Some(true), Some(data_par_burst), size)
                        == calc_total_block_count_exc_burst_gaps(version, None, Some(data_par_burst), size)
                        &&
                        calc_total_block_count_exc_burst_gaps(version, Some(false), Some(data_par_burst), size)
                        == calc_total_block_count_exc_burst_gaps(version, Some(true), Some(data_par_burst), size)
                })
                &&
                ({
                    let version = Version::V19;
                    calc_meta_block_count_exc_burst_gaps(version, Some(false), Some(data_par_burst))
                        + calc_data_block_count_exc_burst_gaps(version, Some(data_par_burst), size)
                        == calc_total_block_count_exc_burst_gaps(version, Some(false), Some(data_par_burst), size)
                        &&
                        calc_meta_block_count_exc_burst_gaps(version, Some(true), Some(data_par_burst))
                        + calc_data_block_count_exc_burst_gaps(version, Some(data_par_burst), size)
                        == calc_total_block_count_exc_burst_gaps(version, Some(true), Some(data_par_burst), size)
                        &&
                        calc_meta_block_count_exc_burst_gaps(version, None, Some(data_par_burst))
                        + calc_data_block_count_exc_burst_gaps(version, Some(data_par_burst), size)
                        == calc_total_block_count_exc_burst_gaps(version, None, Some(data_par_burst), size)
                        &&
                        calc_total_block_count_exc_burst_gaps(version, Some(true), Some(data_par_burst), size)
                        == calc_total_block_count_exc_burst_gaps(version, None, Some(data_par_burst), size)
                        &&
                        calc_total_block_count_exc_burst_gaps(version, Some(false), Some(data_par_burst), size)
                        == calc_total_block_count_exc_burst_gaps(version, Some(true), Some(data_par_burst), size)
                })
        }
    }

    #[test]
    fn test_calc_container_size_simple_cases() {
        assert_eq!(0, calc_container_size(Version::V1, Some(false), None, 0));
        assert_eq!(0, calc_container_size(Version::V2, Some(false), None, 0));
        assert_eq!(0, calc_container_size(Version::V3, Some(false), None, 0));
        assert_eq!(512, calc_container_size(Version::V1, Some(true), None, 0));
        assert_eq!(128, calc_container_size(Version::V2, Some(true), None, 0));
        assert_eq!(4096, calc_container_size(Version::V3, Some(true), None, 0));
        assert_eq!(512, calc_container_size(Version::V1, None, None, 0));
        assert_eq!(128, calc_container_size(Version::V2, None, None, 0));
        assert_eq!(4096, calc_container_size(Version::V3, None, None, 0));

        assert_eq!(512, calc_container_size(Version::V1, Some(false), None, 1));
        assert_eq!(128, calc_container_size(Version::V2, Some(false), None, 1));
        assert_eq!(4096, calc_container_size(Version::V3, Some(false), None, 1));
        assert_eq!(512 * 2, calc_container_size(Version::V1, Some(true), None, 1));
        assert_eq!(128 * 2, calc_container_size(Version::V2, Some(true), None, 1));
        assert_eq!(4096 * 2, calc_container_size(Version::V3, Some(true), None, 1));
        assert_eq!(512 * 2, calc_container_size(Version::V1, None, None, 1));
        assert_eq!(128 * 2, calc_container_size(Version::V2, None, None, 1));
        assert_eq!(4096 * 2, calc_container_size(Version::V3, None, None, 1));

        assert_eq!(512 * 2, calc_container_size(Version::V17, None, Some((1, 1, 0)), 0));
        assert_eq!(128 * 2, calc_container_size(Version::V18, None, Some((1, 1, 0)), 0));
        assert_eq!(4096 * 2, calc_container_size(Version::V19, None, Some((1, 1, 0)), 0));

        assert_eq!(512 * (2 + 1), calc_container_size(Version::V17, None, Some((1, 1, 1)), 0));
        assert_eq!(128 * (2 + 1), calc_container_size(Version::V18, None, Some((1, 1, 1)), 0));
        assert_eq!(4096 * (2 + 1), calc_container_size(Version::V19, None, Some((1, 1, 1)), 0));

        assert_eq!(512 * (2 + 2), calc_container_size(Version::V17, None, Some((1, 1, 2)), 0));
        assert_eq!(128 * (2 + 2), calc_container_size(Version::V18, None, Some((1, 1, 2)), 0));
        assert_eq!(4096 * (2 + 2), calc_container_size(Version::V19, None, Some((1, 1, 2)), 0));

        assert_eq!(512 * (2 + 3), calc_container_size(Version::V17, None, Some((1, 1, 3)), 0));
        assert_eq!(128 * (2 + 3), calc_container_size(Version::V18, None, Some((1, 1, 3)), 0));
        assert_eq!(4096 * (2 + 3), calc_container_size(Version::V19, None, Some((1, 1, 3)), 0));

        assert_eq!(1536, calc_container_size(Version::V17, None, Some((1, 1, 1)), 0));
        assert_eq!(384, calc_container_size(Version::V18, None, Some((1, 1, 1)), 0));
        assert_eq!(12288, calc_container_size(Version::V19, None, Some((1, 1, 1)), 0));

        assert_eq!(2048, calc_container_size(Version::V17, None, Some((1, 1, 1)), 1));
        assert_eq!(512, calc_container_size(Version::V18, None, Some((1, 1, 1)),  1));
        assert_eq!(16384, calc_container_size(Version::V19, None, Some((1, 1, 1)), 1));

        assert_eq!(4096, calc_container_size(Version::V17, None, Some((1, 1, 1)), 1024));
        assert_eq!(2816, calc_container_size(Version::V18, None, Some((1, 1, 1)),  1024));
        assert_eq!(16384, calc_container_size(Version::V19, None, Some((1, 1, 1)), 1024));

        assert_eq!(12288, calc_container_size(Version::V17, None, Some((1, 1, 1)), 5000));
        assert_eq!(11776, calc_container_size(Version::V18, None, Some((1, 1, 1)),  5000));
        assert_eq!(24576, calc_container_size(Version::V19, None, Some((1, 1, 1)), 5000));

        assert_eq!(2066432, calc_container_size(Version::V17, None, Some((1, 1, 1)), 1_000_000));
        assert_eq!(2286080, calc_container_size(Version::V18, None, Some((1, 1, 1)),  1_000_000));
        assert_eq!(2023424, calc_container_size(Version::V19, None, Some((1, 1, 1)), 1_000_000));

        assert_eq!(12800, calc_container_size(Version::V17, None, Some((11, 3, 7)), 0));
        assert_eq!(3200, calc_container_size(Version::V18, None, Some((11, 3, 7)), 0));
        assert_eq!(102400, calc_container_size(Version::V19, None, Some((11, 3, 7)), 0));

        assert_eq!(49152, calc_container_size(Version::V17, None, Some((11, 3, 7)), 1));
        assert_eq!(12288, calc_container_size(Version::V18, None, Some((11, 3, 7)), 1));
        assert_eq!(393216, calc_container_size(Version::V19, None, Some((11, 3, 7)), 1));

        assert_eq!(49152, calc_container_size(Version::V17, None, Some((11, 3, 7)), 1024));
        assert_eq!(12288, calc_container_size(Version::V18, None, Some((11, 3, 7)), 1024));
        assert_eq!(393216, calc_container_size(Version::V19, None, Some((11, 3, 7)), 1024));

        assert_eq!(49152, calc_container_size(Version::V17, None, Some((11, 3, 7)), 5000));
        assert_eq!(12800, calc_container_size(Version::V18, None, Some((11, 3, 7)), 5000));
        assert_eq!(393216, calc_container_size(Version::V19, None, Some((11, 3, 7)), 5000));

        assert_eq!(50176, calc_container_size(Version::V17, None, Some((11, 3, 7)), 13000));
        assert_eq!(25216, calc_container_size(Version::V18, None, Some((11, 3, 7)), 13000));
        assert_eq!(393216, calc_container_size(Version::V19, None, Some((11, 3, 7)), 13000));

        assert_eq!(1354240, calc_container_size(Version::V17, None, Some((11, 3, 7)), 1_000_000));
        assert_eq!(1455616, calc_container_size(Version::V18, None, Some((11, 3, 7)), 1_000_000));
        assert_eq!(1601536, calc_container_size(Version::V19, None, Some((11, 3, 7)), 1_000_000));

        assert_eq!(38133760, calc_container_size(Version::V17, None, Some((11, 3, 7)), 29_000_000));
        assert_eq!(42185728, calc_container_size(Version::V18, None, Some((11, 3, 7)), 29_000_000));
        assert_eq!(37330944, calc_container_size(Version::V19, None, Some((11, 3, 7)), 29_000_000));
    }

    quickcheck! {
        fn qc_calc_container_size_rs_enabled_no_data(data_par_burst : (usize, usize, usize)) -> bool {
            let mut data_par_burst = data_par_burst;
            data_par_burst.0 = if data_par_burst.0 == 0 { 1 } else { data_par_burst.0 };
            data_par_burst.1 = if data_par_burst.1 == 0 { 1 } else { data_par_burst.1 };

            let (_, parity, burst) = data_par_burst;

            (ver_to_block_size(Version::V17) * ((1 + parity) + parity * burst)) as u64 == calc_container_size(Version::V17, None, Some(data_par_burst), 0)
                && (ver_to_block_size(Version::V18) * ((1 + parity) + parity * burst)) as u64 == calc_container_size(Version::V18, None, Some(data_par_burst), 0)
                && (ver_to_block_size(Version::V19) * ((1 + parity) + parity * burst)) as u64 == calc_container_size(Version::V19, None, Some(data_par_burst), 0)
        }

        fn qc_calc_container_size_rs_enabled_not_too_off(data_par_burst : (usize, usize, usize),
                                                         size           : u64) -> bool {
            let size = if size == 0 { 1 } else { size };

            let mut data_par_burst = data_par_burst;
            data_par_burst.0 = if data_par_burst.0 == 0 { 1 } else { data_par_burst.0 };
            data_par_burst.1 = if data_par_burst.1 == 0 { 1 } else { data_par_burst.1 };
            data_par_burst.2 = if data_par_burst.2 == 0 { 1 } else { data_par_burst.2 };

            let (data, parity, burst) = data_par_burst;

            let super_block_set_size = ((data + parity) * burst) as u64;

            ({
                let version = Version::V17;
                let block_size = ver_to_block_size(version) as u64;
                let container_size = calc_container_size(version, None, Some(data_par_burst), size);
                let super_block_set_count_lower_bound = size / (super_block_set_size * block_size);
                let super_block_set_count_upper_bound = (size + ((super_block_set_size * block_size) - 1)) / (super_block_set_size * block_size);
                let container_size_lower_bound = ((1 + parity as u64) + super_block_set_count_lower_bound * super_block_set_size) * block_size;
                let container_size_upper_bound = ((1 + parity as u64) + super_block_set_count_upper_bound * super_block_set_size) * block_size;

                container_size % block_size == 0
                    && container_size >= container_size_lower_bound
                    && container_size <= container_size_upper_bound
            })
        }
    }
}

#[test]
fn test_get_file_name_part_of_path_simple_cases() {
    assert_eq!("abcd", get_file_name_part_of_path("test/abcd"));
    assert_eq!("test.sbx", get_file_name_part_of_path("test/test.sbx"));
    assert_eq!("abcd", get_file_name_part_of_path("/root/test/abcd"));
    assert_eq!("abcd_defg.sbx", get_file_name_part_of_path("/root/test/abcd_defg.sbx"));
    assert_eq!("abcd", get_file_name_part_of_path("abcd"));
    assert_eq!("test", get_file_name_part_of_path("/test"));
}