1
0
mirror of https://github.com/rust-lang/rustlings.git synced 2025-12-26 00:11:49 +02:00

Compare commits

..

26 Commits
1.2.0 ... 1.3.0

Author SHA1 Message Date
liv
7fca1d28af 1.3.0 2019-06-05 12:37:02 +02:00
bors
9c3d765403 Auto merge of #167 - rust-lang:fix/remove-highlighting, r=komaeda
Remove highlighting and syntect

Closes #166 and #122
2019-06-05 10:23:37 +00:00
liv
bb652ceb91 Commit Cargo.lock file 2019-06-05 12:22:41 +02:00
liv
62696f5819 Remove highlighting and syntect 2019-06-05 12:18:50 +02:00
bors
41170ce341 Auto merge of #164 - HanKruiger:master, r=komaeda
Fix broken link
2019-05-26 14:07:16 +00:00
bors
e2092a4ddd Auto merge of #165 - gushroom:fix-outdated-links, r=komaeda
fixed outdated links

The links had the 2018 book in them and they were outdated.
2019-05-26 13:58:24 +00:00
gushroom
fd1441d122 fixed outdated links 2019-05-26 14:57:56 +02:00
HanKruiger
e1422c6443 Fix broken link 2019-05-26 14:45:04 +02:00
bors
1f07fd4150 Auto merge of #163 - briankung:add_structs, r=komaeda
Adds a simple exercise for structures

Thanks for rustlings! Here's a small contribution in return.
2019-05-25 13:40:15 +00:00
Brian Kung
9b92aa08ae Adds a simple exercise for structures 2019-05-25 06:39:58 -05:00
bors
8bf8cbbd61 Auto merge of #162 - c-rustacean:rustfmt-and-ws-fixes, r=komaeda
errorsn.rs: Separate also the hints from each other to avoid accidental viewing
2019-05-23 11:01:15 +00:00
Eddy Petrisor
f507844102 errorsn.rs: Separate also the hints from each other to avoid accidental viewing
Signed-off-by: Eddy Petrisor <eddy.petrisor@gmail.com>
2019-05-23 12:21:42 +03:00
bors
fffbb60ed9 Auto merge of #161 - c-rustacean:rustfmt-and-ws-fixes, r=komaeda
Rustfmt and ws fixes
2019-05-22 12:29:20 +00:00
Eddy Petrisor
9aec4abc4d rustfmt the exercises
Signed-off-by: Eddy Petrisor <eddy.petrisor@gmail.com>
2019-05-22 14:50:40 +03:00
Eddy Petrisor
a53b3f199f iterator3.rs: whitespace fixes
Signed-off-by: Eddy Petrisor <eddy.petrisor@gmail.com>
2019-05-22 14:50:40 +03:00
Eddy Petrisor
d6d696b66a errorsn.rs: Separate hints from code, so hints are not accidentally seen
Signed-off-by: Eddy Petrisor <eddy.petrisor@gmail.com>
2019-05-22 14:50:39 +03:00
Eddy Petrisor
ca6bf966dd Cargo fmt the rustlings application code
Signed-off-by: Eddy Petrisor <eddy.petrisor@gmail.com>
2019-05-22 14:50:23 +03:00
liv
5a9f8860ca Add not passing integration test (#154)
Add not passing integration test
2019-05-22 10:53:46 +02:00
liv
5423bc66a9 Update errors1.rs - Add Result type signature as it is difficult for new comers to understand Generics and Error all at once. (#157)
Update errors1.rs - Add Result type signature as it is difficult for new comers to understand Generics and Error all at once.
2019-05-22 10:53:18 +02:00
Julien Bisconti
187d2ad226 Update errors1.rs
Add Result type signature as it is difficult for new comers to understand Generics and Error all at once
2019-05-12 14:54:37 +02:00
Denys Smirnov
7cf0d5d15e Add not passing integration test 2019-05-09 20:17:38 +03:00
liv
1f2ee8cb62 1.2.2 2019-05-07 12:32:50 +02:00
liv
35c3d0b3fc Revert --nocapture flag
This closes #149 and #152
2019-05-07 12:31:02 +02:00
liv
0279294972 1.2.1 2019-04-22 19:12:30 +08:00
liv
7eddee6f7a add a slightly more helpful error message 2019-04-22 18:43:39 +08:00
liv
f2c48cfac5 fix the --nocapture functionality 2019-04-22 18:42:32 +08:00
22 changed files with 1366 additions and 46 deletions

1
.gitignore vendored
View File

@@ -1,5 +1,4 @@
*.swp
target/
**/*.rs.bk
Cargo.lock
.DS_Store

1152
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
[package]
name = "rustlings"
version = "1.2.0"
version = "1.3.0"
authors = ["Olivia <819880950@qq.com>", "Carol (Nichols || Goulding) <carol.nichols@gmail.com"]
edition = "2018"
@@ -8,7 +8,6 @@ edition = "2018"
clap = "2.32.0"
indicatif = "0.9.0"
console = "0.6.2"
syntect = "3.0.2"
notify = "4.0.0"
toml = "0.4.10"
serde = {version = "1.0.10", features = ["derive"]}

View File

@@ -1,6 +1,6 @@
Thanks for installing `rustlings`!
Thanks for installing Rustlings!
## Is this your first time?
Is this your first time?
Let's make sure you're up to speed:
- You have Rust installed, preferably via `rustup`
@@ -9,9 +9,7 @@ Let's make sure you're up to speed:
- You have installed Rust language support for your editor
- You have locally installed the `rustlings` command by running:
```sh
cargo install --path .
```
If you've done all of this (or even most of it), congrats! You're ready
to start working with Rust.

View File

@@ -63,7 +63,7 @@ mod tests {
// `Option`.
// To make this change, you'll need to:
// - update the return type in the function signature to be a Result that
// - update the return type in the function signature to be a Result<String, String> that
// could be the variants `Ok(String)` and `Err(String)`
// - change the body of the function to return `Ok(stuff)` where it currently
// returns `Some(stuff)`

View File

@@ -32,10 +32,7 @@ mod tests {
#[test]
fn item_quantity_is_a_valid_number() {
assert_eq!(
total_cost("34"),
Ok(171)
);
assert_eq!(total_cost("34"), Ok(171));
}
#[test]

View File

@@ -65,7 +65,7 @@ fn test_ioerror() {
assert_eq!("uh-oh!", read_and_validate(&mut b).unwrap_err().to_string());
}
#[derive(PartialEq,Debug)]
#[derive(PartialEq, Debug)]
struct PositiveNonzeroInteger(u64);
impl PositiveNonzeroInteger {
@@ -83,11 +83,14 @@ impl PositiveNonzeroInteger {
#[test]
fn test_positive_nonzero_integer_creation() {
assert!(PositiveNonzeroInteger::new(10).is_ok());
assert_eq!(Err(CreationError::Negative), PositiveNonzeroInteger::new(-10));
assert_eq!(
Err(CreationError::Negative),
PositiveNonzeroInteger::new(-10)
);
assert_eq!(Err(CreationError::Zero), PositiveNonzeroInteger::new(0));
}
#[derive(PartialEq,Debug)]
#[derive(PartialEq, Debug)]
enum CreationError {
Negative,
Zero,
@@ -108,16 +111,84 @@ impl error::Error for CreationError {
}
}
// First hint: To figure out what type should go where the ??? is, take a look
// at the test helper function `test_with_str`, since it returns whatever
// `read_and_validate` returns and`test_with_str` has its signature fully
// specified.
// Next hint: There are three places in `read_and_validate` that we call a
// function that returns a `Result` (that is, the functions might fail).
// Apply the `?` operator on those calls so that we return immediately from
// `read_and_validate` if those function calls fail.
// Another hint: under the hood, the `?` operator calls `From::from`
// on the error value to convert it to a boxed trait object, a Box<error::Error>,
// which is polymorphic-- that means that lots of different kinds of errors
@@ -126,12 +197,50 @@ impl error::Error for CreationError {
// Check out this section of the book:
// https://doc.rust-lang.org/stable/book/second-edition/ch09-02-recoverable-errors-with-result.html#a-shortcut-for-propagating-errors-the--operator
// Another another hint: Note that because the `?` operator returns
// the *unwrapped* value in the `Ok` case, if we want to return a `Result` from
// `read_and_validate` for *its* success case, we'll have to rewrap a value
// that we got from the return value of a `?`ed call in an `Ok`-- this will
// look like `Ok(something)`.
// Another another another hint: `Result`s must be "used", that is, you'll
// get a warning if you don't handle a `Result` that you get in your
// function. Read more about that in the `std::result` module docs:

View File

@@ -11,7 +11,10 @@ fn main() {
println!("The last item in the list is {:?}", last);
let second_to_last = list.pop().unwrap();
println!("The second-to-last item in the list is {:?}", second_to_last);
println!(
"The second-to-last item in the list is {:?}",
second_to_last
);
}

View File

@@ -1,10 +1,10 @@
// result1.rs
// Make this test pass! Scroll down for hints :)
#[derive(PartialEq,Debug)]
#[derive(PartialEq, Debug)]
struct PositiveNonzeroInteger(u64);
#[derive(PartialEq,Debug)]
#[derive(PartialEq, Debug)]
enum CreationError {
Negative,
Zero,
@@ -19,7 +19,10 @@ impl PositiveNonzeroInteger {
#[test]
fn test_creation() {
assert!(PositiveNonzeroInteger::new(10).is_ok());
assert_eq!(Err(CreationError::Negative), PositiveNonzeroInteger::new(-10));
assert_eq!(
Err(CreationError::Negative),
PositiveNonzeroInteger::new(-10)
);
assert_eq!(Err(CreationError::Zero), PositiveNonzeroInteger::new(0));
}

View File

@@ -4,4 +4,4 @@ In this section we'll give you an introduction to Rust's module system.
#### Book Sections
- [The Module System](https://doc.rust-lang.org/stable/book/ch07-02-modules-and-use-to-control-scope-and-privacy.html)
- [The Module System](https://doc.rust-lang.org/stable/book/ch07-02-defining-modules-to-control-scope-and-privacy.html)

View File

@@ -1,5 +1,5 @@
For the Arc exercise check out the chapter [Shared-State Concurrency](https://doc.rust-lang.org/book/2018-edition/ch16-03-shared-state.html) of the Rust Book.
For the Arc exercise check out the chapter [Shared-State Concurrency](https://doc.rust-lang.org/book/ch16-03-shared-state.html) of the Rust Book.
For the Iterator exercise check out the chapters [Iterator](https://doc.rust-lang.org/book/2018-edition/ch13-02-iterators.html) of the Rust Book and the [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/trait.Iterator.htmlj).
For the Iterator exercise check out the chapters [Iterator](https://doc.rust-lang.org/book/ch13-02-iterators.html) of the Rust Book and the [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/).
Do not adjust your monitors-- iterators 1 and 2 are indeed missing. Iterator 3 is a bit challenging so we're leaving space for some exercises to lead up to it!

View File

@@ -114,7 +114,7 @@ mod tests {
// Minor hint: In each of the two cases in the match in main, you can create x with either
// Minor hint: In each of the two cases in the match in main, you can create x with either
// a 'turbofish' or by hinting the type of x to the compiler. You may try both.
@@ -143,5 +143,5 @@ mod tests {
// Major hint: Have a look at the Iter trait and at the explanation of its collect function.
// Major hint: Have a look at the Iter trait and at the explanation of its collect function.
// Especially the part about Result is interesting.

View File

@@ -0,0 +1,7 @@
### Strings
Rust has three struct types: a classic c struct, a tuple struct, and a unit struct.
#### Book Sections
- [Structures](https://doc.rust-lang.org/rust-by-example/custom_types/structs.html)

View File

@@ -0,0 +1,46 @@
// structs1.rs
// Address all the TODOs to make the tests pass!
struct ColorClassicStruct {
// TODO: Something goes here
}
struct ColorTupleStruct(/* TODO: Something goes here */);
struct ColorUnitStruct;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn classic_c_structs() {
// TODO: Instantiate a classic c struct!
// let green =
assert_eq!(green.name, "green");
assert_eq!(green.hex, "#00FF00");
}
#[test]
fn tuple_structs() {
// TODO: Instantiate a tuple struct!
// For more fun, use the field initialization shorthand.
// let green =
assert_eq!(green.0, "green");
assert_eq!(green.1, "#00FF00");
}
#[test]
fn unit_structs() {
// TODO: Instantiate a unit struct!
// let green =
if let ColorUnitStruct = green {
assert!(true);
} else {
assert!(false);
}
}
}

View File

@@ -1 +1 @@
For this exercise check out the [Dining Philosophers example](https://doc.rust-lang.org/1.4.0/book/dining-philosophers.html) and the chapter [Concurrency](https://doc.rust-lang.org/book/2018-edition/ch16-01-threads.html) of the Rust Book.
For this exercise check out the [Dining Philosophers example](https://doc.rust-lang.org/1.4.0/book/dining-philosophers.html) and the chapter [Concurrency](https://doc.rust-lang.org/book/ch16-01-threads.html) of the Rust Book.

View File

@@ -76,6 +76,12 @@ mode = "compile"
path = "exercises/primitive_types/primitive_types6.rs"
mode = "compile"
# STRUCTS
[[exercises]]
path = "exercises/structs/structs1.rs"
mode = "test"
# TESTS
[[exercises]]

View File

@@ -1,7 +1,7 @@
use serde::Deserialize;
use std::fmt::{self, Display, Formatter};
use std::fs::{remove_file};
use std::path::{PathBuf};
use std::fs::remove_file;
use std::path::PathBuf;
use std::process::{self, Command, Output};
const RUSTC_COLOR_ARGS: &[&str] = &["--color", "always"];
@@ -38,7 +38,6 @@ impl Exercise {
Mode::Test => Command::new("rustc")
.args(&["--test", self.path.to_str().unwrap(), "-o", &temp_file()])
.args(RUSTC_COLOR_ARGS)
.args(&["--", "--nocapture"])
.output(),
}
.expect("Failed to run 'compile' command.")
@@ -64,8 +63,8 @@ impl Display for Exercise {
#[cfg(test)]
mod test {
use super::*;
use std::path::Path;
use std::fs::File;
use std::path::Path;
#[test]
fn test_clean() {

View File

@@ -6,14 +6,9 @@ use notify::DebouncedEvent;
use notify::{RecommendedWatcher, RecursiveMode, Watcher};
use std::ffi::OsStr;
use std::fs;
use std::io::BufRead;
use std::path::Path;
use std::sync::mpsc::channel;
use std::time::Duration;
use syntect::easy::HighlightFile;
use syntect::highlighting::{Style, ThemeSet};
use syntect::parsing::SyntaxSet;
use syntect::util::as_24_bit_terminal_escaped;
mod exercise;
mod run;
@@ -35,9 +30,6 @@ fn main() {
)
.get_matches();
let ss = SyntaxSet::load_defaults_newlines();
let ts = ThemeSet::load_defaults();
if None == matches.subcommand_name() {
println!();
println!(r#" welcome to... "#);
@@ -55,6 +47,7 @@ fn main() {
"{} must be run from the rustlings directory",
std::env::current_exe().unwrap().to_str().unwrap()
);
println!("Try `cd rustlings/`!");
std::process::exit(1);
}
@@ -91,13 +84,8 @@ fn main() {
}
if matches.subcommand_name().is_none() {
let mut highlighter =
HighlightFile::new("default_out.md", &ss, &ts.themes["base16-eighties.dark"]).unwrap();
for maybe_line in highlighter.reader.lines() {
let line = maybe_line.unwrap();
let regions: Vec<(Style, &str)> = highlighter.highlight_lines.highlight(&line, &ss);
println!("{}", as_24_bit_terminal_escaped(&regions[..], true));
}
let text = fs::read_to_string("default_out.txt").unwrap();
println!("{}", text);
}
println!("\x1b[0m");

View File

@@ -1,4 +1,4 @@
use crate::exercise::{Mode, Exercise};
use crate::exercise::{Exercise, Mode};
use crate::verify::test;
use console::{style, Emoji};
use indicatif::ProgressBar;

View File

@@ -2,7 +2,7 @@ use crate::exercise::{Exercise, Mode};
use console::{style, Emoji};
use indicatif::ProgressBar;
pub fn verify<'a>(start_at: impl IntoIterator<Item=&'a Exercise>) -> Result<(), ()> {
pub fn verify<'a>(start_at: impl IntoIterator<Item = &'a Exercise>) -> Result<(), ()> {
for exercise in start_at {
match exercise.mode {
Mode::Test => test(&exercise)?,

View File

@@ -0,0 +1,4 @@
#[test]
fn not_passing() {
assert!(false);
}

View File

@@ -76,6 +76,16 @@ fn run_single_test_failure() {
.code(1);
}
#[test]
fn run_single_test_not_passed() {
Command::cargo_bin("rustlings")
.unwrap()
.args(&["r", "testNotPassed.rs"])
.current_dir("tests/fixture/failure/")
.assert()
.code(1);
}
#[test]
fn run_single_test_no_filename() {
Command::cargo_bin("rustlings")