@@ -254,6 +254,7 @@ use core::marker;
254
254
use core:: mem;
255
255
#[ cfg( feature="std" ) ] use std:: cell:: RefCell ;
256
256
#[ cfg( feature="std" ) ] use std:: rc:: Rc ;
257
+ #[ cfg( all( feature="alloc" , not( feature="std" ) ) ) ] use alloc:: boxed:: Box ;
257
258
258
259
// external rngs
259
260
pub use jitter:: JitterRng ;
@@ -654,7 +655,7 @@ impl<'a, R: ?Sized> Rng for &'a mut R where R: Rng {
654
655
}
655
656
}
656
657
657
- #[ cfg( feature="std" ) ]
658
+ #[ cfg( any ( feature="std" , feature= "alloc" ) ) ]
658
659
impl < R : ?Sized > Rng for Box < R > where R : Rng {
659
660
#[ inline]
660
661
fn next_u32 ( & mut self ) -> u32 {
@@ -1034,12 +1035,15 @@ pub fn sample<T, I, R>(rng: &mut R, iterable: I, amount: usize) -> Vec<T>
1034
1035
#[ cfg( test) ]
1035
1036
mod test {
1036
1037
use impls;
1037
- use super :: { Rng , thread_rng, random, SeedableRng , StdRng , weak_rng} ;
1038
- use std:: iter:: repeat;
1038
+ #[ cfg( feature="std" ) ]
1039
+ use super :: { random, thread_rng, weak_rng} ;
1040
+ use super :: { Rng , SeedableRng , StdRng } ;
1041
+ #[ cfg( feature="alloc" ) ]
1042
+ use alloc:: boxed:: Box ;
1039
1043
1040
- pub struct MyRng < R > { inner : R }
1044
+ pub struct TestRng < R > { inner : R }
1041
1045
1042
- impl < R : Rng > Rng for MyRng < R > {
1046
+ impl < R : Rng > Rng for TestRng < R > {
1043
1047
fn next_u32 ( & mut self ) -> u32 {
1044
1048
self . inner . next_u32 ( )
1045
1049
}
@@ -1051,8 +1055,9 @@ mod test {
1051
1055
}
1052
1056
}
1053
1057
1054
- pub fn rng ( ) -> MyRng < :: ThreadRng > {
1055
- MyRng { inner : :: thread_rng ( ) }
1058
+ pub fn rng ( seed : u64 ) -> TestRng < StdRng > {
1059
+ let seed = [ seed as usize ] ;
1060
+ TestRng { inner : StdRng :: from_seed ( & seed) }
1056
1061
}
1057
1062
1058
1063
struct ConstRng { i : u64 }
@@ -1090,8 +1095,9 @@ mod test {
1090
1095
let lengths = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ,
1091
1096
80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 ] ;
1092
1097
for & n in lengths. iter ( ) {
1093
- let mut v = repeat ( 0u8 ) . take ( n) . collect :: < Vec < _ > > ( ) ;
1094
- r. fill_bytes ( & mut v) ;
1098
+ let mut buffer = [ 0u8 ; 87 ] ;
1099
+ let mut v = & mut buffer[ 0 ..n] ;
1100
+ r. fill_bytes ( v) ;
1095
1101
1096
1102
// use this to get nicer error messages.
1097
1103
for ( i, & byte) in v. iter ( ) . enumerate ( ) {
@@ -1104,7 +1110,7 @@ mod test {
1104
1110
1105
1111
#[ test]
1106
1112
fn test_gen_range ( ) {
1107
- let mut r = thread_rng ( ) ;
1113
+ let mut r = rng ( 101 ) ;
1108
1114
for _ in 0 ..1000 {
1109
1115
let a = r. gen_range ( -3 , 42 ) ;
1110
1116
assert ! ( a >= -3 && a < 42 ) ;
@@ -1124,43 +1130,43 @@ mod test {
1124
1130
#[ test]
1125
1131
#[ should_panic]
1126
1132
fn test_gen_range_panic_int ( ) {
1127
- let mut r = thread_rng ( ) ;
1133
+ let mut r = rng ( 102 ) ;
1128
1134
r. gen_range ( 5 , -2 ) ;
1129
1135
}
1130
1136
1131
1137
#[ test]
1132
1138
#[ should_panic]
1133
1139
fn test_gen_range_panic_usize ( ) {
1134
- let mut r = thread_rng ( ) ;
1140
+ let mut r = rng ( 103 ) ;
1135
1141
r. gen_range ( 5 , 2 ) ;
1136
1142
}
1137
1143
1138
1144
#[ test]
1139
1145
fn test_gen_weighted_bool ( ) {
1140
- let mut r = thread_rng ( ) ;
1146
+ let mut r = rng ( 104 ) ;
1141
1147
assert_eq ! ( r. gen_weighted_bool( 0 ) , true ) ;
1142
1148
assert_eq ! ( r. gen_weighted_bool( 1 ) , true ) ;
1143
1149
}
1144
1150
1145
1151
#[ test]
1146
1152
fn test_gen_ascii_str ( ) {
1147
- let mut r = thread_rng ( ) ;
1153
+ let mut r = rng ( 105 ) ;
1148
1154
assert_eq ! ( r. gen_ascii_chars( ) . take( 0 ) . count( ) , 0 ) ;
1149
1155
assert_eq ! ( r. gen_ascii_chars( ) . take( 10 ) . count( ) , 10 ) ;
1150
1156
assert_eq ! ( r. gen_ascii_chars( ) . take( 16 ) . count( ) , 16 ) ;
1151
1157
}
1152
1158
1153
1159
#[ test]
1154
1160
fn test_gen_vec ( ) {
1155
- let mut r = thread_rng ( ) ;
1161
+ let mut r = rng ( 106 ) ;
1156
1162
assert_eq ! ( r. gen_iter:: <u8 >( ) . take( 0 ) . count( ) , 0 ) ;
1157
1163
assert_eq ! ( r. gen_iter:: <u8 >( ) . take( 10 ) . count( ) , 10 ) ;
1158
1164
assert_eq ! ( r. gen_iter:: <f64 >( ) . take( 16 ) . count( ) , 16 ) ;
1159
1165
}
1160
1166
1161
1167
#[ test]
1162
1168
fn test_choose ( ) {
1163
- let mut r = thread_rng ( ) ;
1169
+ let mut r = rng ( 107 ) ;
1164
1170
assert_eq ! ( r. choose( & [ 1 , 1 , 1 ] ) . map( |& x|x) , Some ( 1 ) ) ;
1165
1171
1166
1172
let v: & [ isize ] = & [ ] ;
@@ -1169,7 +1175,7 @@ mod test {
1169
1175
1170
1176
#[ test]
1171
1177
fn test_shuffle ( ) {
1172
- let mut r = thread_rng ( ) ;
1178
+ let mut r = rng ( 108 ) ;
1173
1179
let empty: & mut [ isize ] = & mut [ ] ;
1174
1180
r. shuffle ( empty) ;
1175
1181
let mut one = [ 1 ] ;
@@ -1188,6 +1194,7 @@ mod test {
1188
1194
}
1189
1195
1190
1196
#[ test]
1197
+ #[ cfg( feature="std" ) ]
1191
1198
fn test_thread_rng ( ) {
1192
1199
let mut r = thread_rng ( ) ;
1193
1200
r. gen :: < i32 > ( ) ;
@@ -1199,8 +1206,9 @@ mod test {
1199
1206
}
1200
1207
1201
1208
#[ test]
1209
+ #[ cfg( any( feature="std" , feature="alloc" ) ) ]
1202
1210
fn test_rng_trait_object ( ) {
1203
- let mut rng = thread_rng ( ) ;
1211
+ let mut rng = rng ( 109 ) ;
1204
1212
{
1205
1213
let mut r = & mut rng as & mut Rng ;
1206
1214
r. next_u32 ( ) ;
@@ -1224,6 +1232,7 @@ mod test {
1224
1232
}
1225
1233
1226
1234
#[ test]
1235
+ #[ cfg( feature="std" ) ]
1227
1236
fn test_random ( ) {
1228
1237
// not sure how to test this aside from just getting some values
1229
1238
let _n : usize = random ( ) ;
@@ -1238,27 +1247,32 @@ mod test {
1238
1247
}
1239
1248
1240
1249
#[ test]
1241
- fn test_std_rng_seeded ( ) {
1242
- let s = thread_rng ( ) . gen_iter :: < usize > ( ) . take ( 256 ) . collect :: < Vec < usize > > ( ) ;
1243
- let mut ra: StdRng = SeedableRng :: from_seed ( & s[ ..] ) ;
1244
- let mut rb: StdRng = SeedableRng :: from_seed ( & s[ ..] ) ;
1245
- assert ! ( iter_eq( ra. gen_ascii_chars( ) . take( 100 ) ,
1246
- rb. gen_ascii_chars( ) . take( 100 ) ) ) ;
1250
+ #[ cfg( target_pointer_width = "32" ) ]
1251
+ fn test_stdrng_construction ( ) {
1252
+ let seed = [ 1 , 23 , 456 , 7890 , 0 , 0 , 0 , 0 ] ;
1253
+ let mut rng1 = StdRng :: from_seed ( & seed) ;
1254
+ assert_eq ! ( rng1. next_u32( ) , 2869442790 ) ;
1255
+
1256
+ /* FIXME: enable once `from_rng` has landed
1257
+ let mut rng2 = StdRng::from_rng(&mut rng1).unwrap();
1258
+ assert_eq!(rng1.next_u32(), 3094074039);
1259
+ */
1247
1260
}
1248
-
1249
1261
#[ test]
1250
- fn test_std_rng_reseed ( ) {
1251
- let s = thread_rng ( ) . gen_iter :: < usize > ( ) . take ( 256 ) . collect :: < Vec < usize > > ( ) ;
1252
- let mut r: StdRng = SeedableRng :: from_seed ( & s[ ..] ) ;
1253
- let string1 = r. gen_ascii_chars ( ) . take ( 100 ) . collect :: < String > ( ) ;
1254
-
1255
- r. reseed ( & s) ;
1256
-
1257
- let string2 = r. gen_ascii_chars ( ) . take ( 100 ) . collect :: < String > ( ) ;
1258
- assert_eq ! ( string1, string2) ;
1262
+ #[ cfg( target_pointer_width = "64" ) ]
1263
+ fn test_stdrng_construction ( ) {
1264
+ let seed = [ 1 , 23 , 456 , 7890 , 0 , 0 , 0 , 0 ] ;
1265
+ let mut rng1 = StdRng :: from_seed ( & seed) ;
1266
+ assert_eq ! ( rng1. next_u32( ) , 3477963620 ) ;
1267
+
1268
+ /* FIXME: enable once `from_rng` has landed
1269
+ let mut rng2 = StdRng::from_rng(&mut rng1).unwrap();
1270
+ assert_eq!(rng1.next_u32(), 3094074039);
1271
+ */
1259
1272
}
1260
1273
1261
1274
#[ test]
1275
+ #[ cfg( feature="std" ) ]
1262
1276
fn test_weak_rng ( ) {
1263
1277
let s = weak_rng ( ) . gen_iter :: < usize > ( ) . take ( 256 ) . collect :: < Vec < usize > > ( ) ;
1264
1278
let mut ra: StdRng = SeedableRng :: from_seed ( & s[ ..] ) ;
0 commit comments