summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAbdou Seck <djily02016@gmail.com>2020-12-12 13:48:25 -0500
committerAbdou Seck <djily02016@gmail.com>2021-01-08 13:21:00 -0500
commit8bbe4ff1385c5c169c90cd3ff9253f9a91daaf8e (patch)
tree2041ef8a6c7beea2a2f156c564a1e0b65620171e /tests
parent0b9220c1fc5ae32438f64bf2f5bf5f47d33e3f3f (diff)
feat(cli): Improve the list command with options, and then some
1. `rustlings list` should now display more than just the exercise names. Information such as file paths and exercises statuses should be displayed. The `--paths` option limits the displayed fields to only the path names; while the `--names` option limits the displayed fields to only exercise names. You can also control which exercises are displayed, by using the `--filter` option, or the `--solved` or `--unsolved` flags. Some use cases: - Fetching pending exercise files with the keyword "conversion" to pass to my editor: ```sh vim $(rustlings list --filter "conversion" --paths --unsolved) ``` - Fetching exercise names with keyword "conversion" to pass to `rustlings run`: ```sh for exercise in $(rustlings list --filter "conversion" --names) do rustlings run ${exercise} done ``` 2. This should also fix #465, and will likely fix #585, as well. That bug mentioned in those issues has to do with the way the `watch` command handler fetches the pending exercises. Going forward, the least recently updated exercises along with all the other exercises in a pending state are fetched.
Diffstat (limited to 'tests')
-rw-r--r--tests/fixture/state/info.toml7
-rw-r--r--tests/integration_tests.rs78
2 files changed, 85 insertions, 0 deletions
diff --git a/tests/fixture/state/info.toml b/tests/fixture/state/info.toml
index 7bfc697..547b3a4 100644
--- a/tests/fixture/state/info.toml
+++ b/tests/fixture/state/info.toml
@@ -9,3 +9,10 @@ name = "pending_test_exercise"
path = "pending_test_exercise.rs"
mode = "test"
hint = """"""
+
+[[exercises]]
+name = "finished_exercise"
+path = "finished_exercise.rs"
+mode = "compile"
+hint = """"""
+
diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs
index 2baf9b8..f5211b6 100644
--- a/tests/integration_tests.rs
+++ b/tests/integration_tests.rs
@@ -181,3 +181,81 @@ fn run_single_test_success_without_output() {
.code(0)
.stdout(predicates::str::contains("THIS TEST TOO SHALL PAS").not());
}
+
+#[test]
+fn run_rustlings_list() {
+ Command::cargo_bin("rustlings")
+ .unwrap()
+ .args(&["list"])
+ .current_dir("tests/fixture/success")
+ .assert()
+ .success();
+}
+
+#[test]
+fn run_rustlings_list_conflicting_display_options() {
+ Command::cargo_bin("rustlings")
+ .unwrap()
+ .args(&["list", "--names", "--paths"])
+ .current_dir("tests/fixture/success")
+ .assert()
+ .failure();
+}
+
+#[test]
+fn run_rustlings_list_conflicting_solve_options() {
+ Command::cargo_bin("rustlings")
+ .unwrap()
+ .args(&["list", "--solved", "--unsolved"])
+ .current_dir("tests/fixture/success")
+ .assert()
+ .failure();
+}
+
+#[test]
+fn run_rustlings_list_no_pending() {
+ Command::cargo_bin("rustlings")
+ .unwrap()
+ .args(&["list"])
+ .current_dir("tests/fixture/success")
+ .assert()
+ .success()
+ .stdout(predicates::str::contains("Pending").not());
+}
+
+#[test]
+fn run_rustlings_list_both_done_and_pending() {
+ Command::cargo_bin("rustlings")
+ .unwrap()
+ .args(&["list"])
+ .current_dir("tests/fixture/state")
+ .assert()
+ .success()
+ .stdout(
+ predicates::str::contains("Done")
+ .and(predicates::str::contains("Pending"))
+ );
+}
+
+#[test]
+fn run_rustlings_list_without_pending() {
+ Command::cargo_bin("rustlings")
+ .unwrap()
+ .args(&["list", "--solved"])
+ .current_dir("tests/fixture/state")
+ .assert()
+ .success()
+ .stdout(predicates::str::contains("Pending").not());
+}
+
+#[test]
+fn run_rustlings_list_without_done() {
+ Command::cargo_bin("rustlings")
+ .unwrap()
+ .args(&["list", "--unsolved"])
+ .current_dir("tests/fixture/state")
+ .assert()
+ .success()
+ .stdout(predicates::str::contains("Done").not());
+}
+