From c33bdc577866359c56f1aed211451a7504c14fb2 Mon Sep 17 00:00:00 2001 From: minhtrannhat Date: Thu, 20 Jul 2023 02:42:12 -0400 Subject: [PATCH] Feat: Finished functionality - Added test suite - Added README.md --- Cargo.lock | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 4 ++ README.md | 8 +++ src/main.rs | 26 ++++++-- tests/cli.rs | 18 +++++ 5 files changed, 232 insertions(+), 5 deletions(-) create mode 100644 README.md create mode 100644 tests/cli.rs diff --git a/Cargo.lock b/Cargo.lock index 48b9682..a9a3c6a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + [[package]] name = "anstream" version = "0.3.2" @@ -51,12 +60,44 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "assert_cmd" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88903cb14723e4d4003335bb7f8a14f27691649105346a0f0957466c096adfe6" +dependencies = [ + "anstyle", + "bstr", + "doc-comment", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + [[package]] name = "bitflags" version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +[[package]] +name = "bstr" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "cc" version = "1.0.79" @@ -97,13 +138,33 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + [[package]] name = "echor" version = "0.1.0" dependencies = [ + "assert_cmd", "clap", + "predicates", ] +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + [[package]] name = "errno" version = "0.3.1" @@ -125,6 +186,15 @@ dependencies = [ "libc", ] +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + [[package]] name = "hermit-abi" version = "0.3.2" @@ -142,6 +212,15 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "libc" version = "0.2.147" @@ -154,12 +233,93 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + [[package]] name = "once_cell" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "predicates" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9" +dependencies = [ + "anstyle", + "difflib", + "float-cmp", + "itertools", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" + +[[package]] +name = "predicates-tree" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "regex" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + [[package]] name = "rustix" version = "0.38.4" @@ -173,18 +333,39 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "serde" +version = "1.0.173" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91f70896d6720bc714a4a57d22fc91f1db634680e65c8efe13323f1fa38d53f" + [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "termtree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" + [[package]] name = "utf8parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/Cargo.toml b/Cargo.toml index d3b7097..3307c6d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,3 +9,7 @@ description = "Rust rewrite of echo" [dependencies] clap = { version = "4", features = ["cargo", "help"] } + +[dev-dependencies] +assert_cmd = "2.0.12" +predicates = "3.0.3" diff --git a/README.md b/README.md new file mode 100644 index 0000000..ee48cd6 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Echor - A Rust Rewrite of GNU/BSD echo program + +## Build + +`cargo build` + +## Test +`cargo test` diff --git a/src/main.rs b/src/main.rs index 6c8fd26..7eb06d6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,8 @@ use clap::builder::{Arg, Command}; -use clap::{crate_authors, crate_description, crate_name, crate_version}; +use clap::{crate_authors, crate_description, crate_name, crate_version, ArgAction, ArgMatches}; fn main() { - let matches = Command::new(crate_name!()) + let matches: ArgMatches = Command::new(crate_name!()) .version(crate_version!()) .author(crate_authors!("\n")) .about(crate_description!()) @@ -15,7 +15,7 @@ fn main() { ", ) .arg( - Arg::new("test") + Arg::new("text") .value_name("TEXT") .help("Input text") .required(true) @@ -25,9 +25,25 @@ fn main() { Arg::new("omit_newline") .short('n') .help("Do not print newline") - .num_args(0), + .num_args(0) + .action(ArgAction::SetTrue), ) .get_matches(); - println!("{:#?}", matches); + let text: Vec<&str> = matches + .get_many::("text") + .expect("Must contains text argument") + .map(|s| s.as_str()) + .collect(); + + // If the -n flag is passed, we do not print new line + print!( + "{}{}", + text.join(" "), + if matches.get_flag("omit_newline") { + "" + } else { + "\n" + } + ); } diff --git a/tests/cli.rs b/tests/cli.rs new file mode 100644 index 0000000..bb23235 --- /dev/null +++ b/tests/cli.rs @@ -0,0 +1,18 @@ +use assert_cmd::Command; +use predicates::prelude::*; + +#[test] +fn dies_no_args() { + let mut cmd = Command::cargo_bin("echor").expect("cargo binary error"); + + cmd.assert() + .failure() + .stderr(predicate::str::contains("Usage")); +} + +#[test] +fn runs() { + let mut cmd = Command::cargo_bin("echor").expect("cargo binary error"); + + cmd.arg("hello").assert().success(); +}