@@ -125,13 +125,74 @@ impl SeedableRng for XorShiftRng {
125
125
126
126
#[ cfg( test) ]
127
127
mod tests {
128
- #[ cfg( all( feature="serde-1" , feature="std" ) ) ]
129
128
use { Rng , SeedableRng } ;
129
+ use super :: XorShiftRng ;
130
+
131
+ #[ test]
132
+ fn test_xorshift_construction ( ) {
133
+ // Test that various construction techniques produce a working RNG.
134
+ let seed = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ] ;
135
+ let mut rng1 = XorShiftRng :: from_seed ( seed) ;
136
+ assert_eq ! ( rng1. next_u64( ) , 4325440999699518727 ) ;
137
+
138
+ let mut rng2 = XorShiftRng :: from_rng ( & mut rng1) . unwrap ( ) ;
139
+ assert_eq ! ( rng2. next_u64( ) , 15614385950550801700 ) ;
140
+ }
141
+
142
+ #[ test]
143
+ fn test_xorshift_true_values ( ) {
144
+ let seed = [ 16 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ] ;
145
+ let mut rng = XorShiftRng :: from_seed ( seed) ;
146
+
147
+ let mut results = [ 0u32 ; 9 ] ;
148
+ for i in results. iter_mut ( ) { * i = rng. next_u32 ( ) ; }
149
+ let expected: [ u32 ; 9 ] = [
150
+ 2081028795 , 620940381 , 269070770 , 16943764 , 854422573 , 29242889 ,
151
+ 1550291885 , 1227154591 , 271695242 ] ;
152
+ assert_eq ! ( results, expected) ;
153
+
154
+ let mut results = [ 0u64 ; 9 ] ;
155
+ for i in results. iter_mut ( ) { * i = rng. next_u64 ( ) ; }
156
+ let expected: [ u64 ; 9 ] = [
157
+ 9247529084182843387 , 8321512596129439293 , 14104136531997710878 ,
158
+ 6848554330849612046 , 343577296533772213 , 17828467390962600268 ,
159
+ 9847333257685787782 , 7717352744383350108 , 1133407547287910111 ] ;
160
+ assert_eq ! ( results, expected) ;
161
+
162
+ let mut results = [ 0u8 ; 32 ] ;
163
+ rng. fill_bytes ( & mut results) ;
164
+ let expected = [ 102 , 57 , 212 , 16 , 233 , 130 , 49 , 183 ,
165
+ 158 , 187 , 44 , 203 , 63 , 149 , 45 , 17 ,
166
+ 117 , 129 , 131 , 160 , 70 , 121 , 158 , 155 ,
167
+ 224 , 209 , 192 , 53 , 10 , 62 , 57 , 72 ] ;
168
+ assert_eq ! ( results, expected) ;
169
+ }
170
+
171
+ #[ test]
172
+ fn test_xorshift_zero_seed ( ) {
173
+ // Xorshift does not work with an all zero seed.
174
+ // Assert it does not panic.
175
+ let seed = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ;
176
+ let mut rng = XorShiftRng :: from_seed ( seed) ;
177
+ let a = rng. next_u64 ( ) ;
178
+ let b = rng. next_u64 ( ) ;
179
+ assert ! ( a != 0 ) ;
180
+ assert ! ( b != a) ;
181
+ }
182
+
183
+ #[ test]
184
+ fn test_xorshift_clone ( ) {
185
+ let seed = [ 1 , 2 , 3 , 4 , 5 , 5 , 7 , 8 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ] ;
186
+ let mut rng1 = XorShiftRng :: from_seed ( seed) ;
187
+ let mut rng2 = rng1. clone ( ) ;
188
+ for _ in 0 ..16 {
189
+ assert_eq ! ( rng1. next_u64( ) , rng2. next_u64( ) ) ;
190
+ }
191
+ }
130
192
131
193
#[ cfg( all( feature="serde-1" , feature="std" ) ) ]
132
194
#[ test]
133
195
fn test_xorshift_serde ( ) {
134
- use super :: XorShiftRng ;
135
196
use bincode;
136
197
use std:: io:: { BufWriter , BufReader } ;
137
198
0 commit comments