1 module test_helpers;
2 
3 import std.stdint;
4 import std.datetime;
5 
6 /** Shorthand for 2^^20 bytes */
7 enum mega = 1024 * 1024;
8 
9 /** Get duration as a float in seconds
10  * Param: duration
11  * Returns: duration as float, unit seconds
12  */
13 float getFloatSecond(Duration duration)
14 {
15     const auto ns_duration = duration.total!"nsecs";
16     const float second_duration = float(ns_duration) / 10 ^^ 9;
17     return second_duration;
18 }
19 
20 unittest
21 {
22     import std.math.operations;
23 
24     auto s = getFloatSecond(dur!"seconds"(1));
25     assert(isClose(s, 1.0));
26     s = getFloatSecond(dur!"msecs"(500));
27     assert(isClose(s, 0.5));
28     s = getFloatSecond(dur!"usecs"(500));
29     assert(isClose(s, 0.0005));
30 }
31 
32 /** Calculate MB/s from bytesize and a Duration value
33  * Param: byteSize - size_t Size of Data processed
34  * Param: duration - Duration of processing
35  * Returns:
36  *   float Megabyte per second
37  */
38 float getMegaBytePerSeconds(size_t byteSize, Duration duration)
39 {
40     enum mega = 2 ^^ 20;
41     const float second_duration = getFloatSecond(duration);
42     const float megaBytesPerSec = (byteSize != 0) ?
43         (float(byteSize) / mega) / float(second_duration) :
44         float.nan;
45     return megaBytesPerSec;
46 }
47 
48 unittest
49 {
50     import std.math.operations;
51 
52     auto mbs = getMegaBytePerSeconds(150 * 2 ^^ 20, dur!"seconds"(1));
53     assert(isClose(mbs, 150.0));
54     mbs = getMegaBytePerSeconds(10 * 2 ^^ 20, dur!"msecs"(500));
55     assert(isClose(mbs, 20.0));
56     mbs = getMegaBytePerSeconds(10 * 2 ^^ 20, dur!"usecs"(500));
57     assert(isClose(mbs, 20_000.0));
58 }
59 
60 /** Return compression ratio from unpacked/packed sizes
61  * Param: unpacked_size - size_t Unpacked length
62  * Param: packed_size - size_t Packed length
63  * Returns:
64  *   float with ratio. Values > 1.0 denote increased size after compression
65  */
66 float getCompressionRatio(size_t unpacked_size, size_t packed_size)
67 {
68     return packed_size > 0 ? float(packed_size) / float(unpacked_size) : float.nan;
69 }
70 
71 unittest
72 {
73     import std.math.operations;
74     float ratio;
75     ratio = getCompressionRatio( 1000, 1000);
76     assert( isClose( ratio, 1.0f ));
77     ratio = getCompressionRatio( 1000, 500);
78     assert( isClose( ratio, 0.5f ));
79     ratio = getCompressionRatio( 1000, 2000);
80     assert( isClose( ratio, 2.0f ));
81     ratio = getCompressionRatio( 0, 0);
82     import std.math;
83     assert( isNaN( ratio ));
84 }