Skip to content

Commit 8dba06a

Browse files
committed
Auto merge of #28052 - Manishearth:rollup, r=Manishearth
- Successful merges: #28010, #28013, #28022, #28029, #28033, #28039, #28045, #28048 - Failed merges:
2 parents 79dd92f + a63cd9b commit 8dba06a

File tree

21 files changed

+430
-145
lines changed

21 files changed

+430
-145
lines changed

Diff for: src/doc/trpl/testing.md

+14-1
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,26 @@ And that's reflected in the summary line:
120120
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured
121121
```
122122

123-
We also get a non-zero status code:
123+
We also get a non-zero status code. We can use `$?` on OS X and Linux:
124124

125125
```bash
126126
$ echo $?
127127
101
128128
```
129129

130+
On Windows, if you’re using `cmd`:
131+
132+
```bash
133+
> echo %ERRORLEVEL%
134+
```
135+
136+
And if you’re using PowerShell:
137+
138+
```bash
139+
> echo $LASTEXITCODE # the code itself
140+
> echo $? # a boolean, fail or succeed
141+
```
142+
130143
This is useful if you want to integrate `cargo test` into other tooling.
131144

132145
We can invert our test's failure with another attribute: `should_panic`:

Diff for: src/libcore/macros.rs

+45
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,51 @@ macro_rules! unreachable {
254254

255255
/// A standardised placeholder for marking unfinished code. It panics with the
256256
/// message `"not yet implemented"` when executed.
257+
///
258+
/// This can be useful if you are prototyping and are just looking to have your
259+
/// code typecheck, or if you're implementing a trait that requires multiple
260+
/// methods, and you're only planning on using one of them.
261+
///
262+
/// # Examples
263+
///
264+
/// Here's an example of some in-progress code. We have a trait `Foo`:
265+
///
266+
/// ```
267+
/// trait Foo {
268+
/// fn bar(&self);
269+
/// fn baz(&self);
270+
/// }
271+
/// ```
272+
///
273+
/// We want to implement `Foo` on one of our types, but we also want to work on
274+
/// just `bar()` first. In order for our code to compile, we need to implement
275+
/// `baz()`, so we can use `unimplemented!`:
276+
///
277+
/// ```
278+
/// # trait Foo {
279+
/// # fn foo(&self);
280+
/// # fn bar(&self);
281+
/// # }
282+
/// struct MyStruct;
283+
///
284+
/// impl Foo for MyStruct {
285+
/// fn foo(&self) {
286+
/// // implementation goes here
287+
/// }
288+
///
289+
/// fn bar(&self) {
290+
/// // let's not worry about implementing bar() for now
291+
/// unimplemented!();
292+
/// }
293+
/// }
294+
///
295+
/// fn main() {
296+
/// let s = MyStruct;
297+
/// s.foo();
298+
///
299+
/// // we aren't even using bar() yet, so this is fine.
300+
/// }
301+
/// ```
257302
#[macro_export]
258303
#[unstable(feature = "core",
259304
reason = "relationship with panic is unclear")]

Diff for: src/libcore/option.rs

+20
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,26 @@ impl<T> IntoIterator for Option<T> {
779779
}
780780
}
781781

782+
#[stable(since = "1.4.0", feature = "option_iter")]
783+
impl<'a, T> IntoIterator for &'a Option<T> {
784+
type Item = &'a T;
785+
type IntoIter = Iter<'a, T>;
786+
787+
fn into_iter(self) -> Iter<'a, T> {
788+
self.iter()
789+
}
790+
}
791+
792+
#[stable(since = "1.4.0", feature = "option_iter")]
793+
impl<'a, T> IntoIterator for &'a mut Option<T> {
794+
type Item = &'a mut T;
795+
type IntoIter = IterMut<'a, T>;
796+
797+
fn into_iter(mut self) -> IterMut<'a, T> {
798+
self.iter_mut()
799+
}
800+
}
801+
782802
/////////////////////////////////////////////////////////////////////////////
783803
// The Option Iterators
784804
/////////////////////////////////////////////////////////////////////////////

Diff for: src/libcore/result.rs

+20
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,26 @@ impl<T, E> IntoIterator for Result<T, E> {
815815
}
816816
}
817817

818+
#[stable(since = "1.4.0", feature = "result_iter")]
819+
impl<'a, T, E> IntoIterator for &'a Result<T, E> {
820+
type Item = &'a T;
821+
type IntoIter = Iter<'a, T>;
822+
823+
fn into_iter(self) -> Iter<'a, T> {
824+
self.iter()
825+
}
826+
}
827+
828+
#[stable(since = "1.4.0", feature = "result_iter")]
829+
impl<'a, T, E> IntoIterator for &'a mut Result<T, E> {
830+
type Item = &'a mut T;
831+
type IntoIter = IterMut<'a, T>;
832+
833+
fn into_iter(mut self) -> IterMut<'a, T> {
834+
self.iter_mut()
835+
}
836+
}
837+
818838
/////////////////////////////////////////////////////////////////////////////
819839
// The Result Iterators
820840
/////////////////////////////////////////////////////////////////////////////

Diff for: src/libcoretest/iter.rs

+26-27
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
// except according to those terms.
1010

1111
use core::iter::*;
12-
use core::iter::order::*;
1312
use core::{i8, i16, isize};
1413
use core::usize;
1514

@@ -21,51 +20,51 @@ fn test_lt() {
2120
let xs = [1,2,3];
2221
let ys = [1,2,0];
2322

24-
assert!(!lt(xs.iter(), ys.iter()));
25-
assert!(!le(xs.iter(), ys.iter()));
26-
assert!( gt(xs.iter(), ys.iter()));
27-
assert!( ge(xs.iter(), ys.iter()));
23+
assert!(!xs.iter().lt(ys.iter()));
24+
assert!(!xs.iter().le(ys.iter()));
25+
assert!( xs.iter().gt(ys.iter()));
26+
assert!( xs.iter().ge(ys.iter()));
2827

29-
assert!( lt(ys.iter(), xs.iter()));
30-
assert!( le(ys.iter(), xs.iter()));
31-
assert!(!gt(ys.iter(), xs.iter()));
32-
assert!(!ge(ys.iter(), xs.iter()));
28+
assert!( ys.iter().lt(xs.iter()));
29+
assert!( ys.iter().le(xs.iter()));
30+
assert!(!ys.iter().gt(xs.iter()));
31+
assert!(!ys.iter().ge(xs.iter()));
3332

34-
assert!( lt(empty.iter(), xs.iter()));
35-
assert!( le(empty.iter(), xs.iter()));
36-
assert!(!gt(empty.iter(), xs.iter()));
37-
assert!(!ge(empty.iter(), xs.iter()));
33+
assert!( empty.iter().lt(xs.iter()));
34+
assert!( empty.iter().le(xs.iter()));
35+
assert!(!empty.iter().gt(xs.iter()));
36+
assert!(!empty.iter().ge(xs.iter()));
3837

3938
// Sequence with NaN
4039
let u = [1.0f64, 2.0];
4140
let v = [0.0f64/0.0, 3.0];
4241

43-
assert!(!lt(u.iter(), v.iter()));
44-
assert!(!le(u.iter(), v.iter()));
45-
assert!(!gt(u.iter(), v.iter()));
46-
assert!(!ge(u.iter(), v.iter()));
42+
assert!(!u.iter().lt(v.iter()));
43+
assert!(!u.iter().le(v.iter()));
44+
assert!(!u.iter().gt(v.iter()));
45+
assert!(!u.iter().ge(v.iter()));
4746

4847
let a = [0.0f64/0.0];
4948
let b = [1.0f64];
5049
let c = [2.0f64];
5150

52-
assert!(lt(a.iter(), b.iter()) == (a[0] < b[0]));
53-
assert!(le(a.iter(), b.iter()) == (a[0] <= b[0]));
54-
assert!(gt(a.iter(), b.iter()) == (a[0] > b[0]));
55-
assert!(ge(a.iter(), b.iter()) == (a[0] >= b[0]));
51+
assert!(a.iter().lt(b.iter()) == (a[0] < b[0]));
52+
assert!(a.iter().le(b.iter()) == (a[0] <= b[0]));
53+
assert!(a.iter().gt(b.iter()) == (a[0] > b[0]));
54+
assert!(a.iter().ge(b.iter()) == (a[0] >= b[0]));
5655

57-
assert!(lt(c.iter(), b.iter()) == (c[0] < b[0]));
58-
assert!(le(c.iter(), b.iter()) == (c[0] <= b[0]));
59-
assert!(gt(c.iter(), b.iter()) == (c[0] > b[0]));
60-
assert!(ge(c.iter(), b.iter()) == (c[0] >= b[0]));
56+
assert!(c.iter().lt(b.iter()) == (c[0] < b[0]));
57+
assert!(c.iter().le(b.iter()) == (c[0] <= b[0]));
58+
assert!(c.iter().gt(b.iter()) == (c[0] > b[0]));
59+
assert!(c.iter().ge(b.iter()) == (c[0] >= b[0]));
6160
}
6261

6362
#[test]
6463
fn test_multi_iter() {
6564
let xs = [1,2,3,4];
6665
let ys = [4,3,2,1];
67-
assert!(eq(xs.iter(), ys.iter().rev()));
68-
assert!(lt(xs.iter(), xs.iter().skip(2)));
66+
assert!(xs.iter().eq(ys.iter().rev()));
67+
assert!(xs.iter().lt(xs.iter().skip(2)));
6968
}
7069

7170
#[test]

Diff for: src/libcoretest/option.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,14 @@ fn test_iter() {
180180
assert_eq!(it.next(), Some(&val));
181181
assert_eq!(it.size_hint(), (0, Some(0)));
182182
assert!(it.next().is_none());
183+
184+
let mut it = (&x).into_iter();
185+
assert_eq!(it.next(), Some(&val));
183186
}
184187

185188
#[test]
186189
fn test_mut_iter() {
187-
let val = 5;
190+
let mut val = 5;
188191
let new_val = 11;
189192

190193
let mut x = Some(val);
@@ -205,6 +208,10 @@ fn test_mut_iter() {
205208
assert!(it.next().is_none());
206209
}
207210
assert_eq!(x, Some(new_val));
211+
212+
let mut y = Some(val);
213+
let mut it = (&mut y).into_iter();
214+
assert_eq!(it.next(), Some(&mut val));
208215
}
209216

210217
#[test]

Diff for: src/libcoretest/result.rs

+33
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,36 @@ pub fn test_expect_err() {
150150
let err: Result<isize, &'static str> = Err("All good");
151151
err.expect("Got expected error");
152152
}
153+
154+
#[test]
155+
pub fn test_iter() {
156+
let ok: Result<isize, &'static str> = Ok(100);
157+
let mut it = ok.iter();
158+
assert_eq!(it.size_hint(), (1, Some(1)));
159+
assert_eq!(it.next(), Some(&100));
160+
assert_eq!(it.size_hint(), (0, Some(0)));
161+
assert!(it.next().is_none());
162+
assert_eq!((&ok).into_iter().next(), Some(&100));
163+
164+
let err: Result<isize, &'static str> = Err("error");
165+
assert_eq!(err.iter().next(), None);
166+
}
167+
168+
#[test]
169+
pub fn test_iter_mut() {
170+
let mut ok: Result<isize, &'static str> = Ok(100);
171+
for loc in ok.iter_mut() {
172+
*loc = 200;
173+
}
174+
assert_eq!(ok, Ok(200));
175+
for loc in &mut ok {
176+
*loc = 300;
177+
}
178+
assert_eq!(ok, Ok(300));
179+
180+
let mut err: Result<isize, &'static str> = Err("error");
181+
for loc in err.iter_mut() {
182+
*loc = 200;
183+
}
184+
assert_eq!(err, Err("error"));
185+
}

0 commit comments

Comments
 (0)