From 6b66b20f4d0967598a04a25e0e79c0d59a092d31 Mon Sep 17 00:00:00 2001 From: Fomegne Date: Mon, 13 Feb 2023 18:50:15 +0100 Subject: [PATCH 1/5] Add "cli" tests --- cli/src/command.rs | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/cli/src/command.rs b/cli/src/command.rs index 36ed6480c..f061434d5 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -156,7 +156,7 @@ mod tests { #[test] fn parse_command() { - use super::Command; + use super::{Command, SetOption, ShowOption}; let option = PrintOption::default(); let parse = |command| Command::parse(command, &option); @@ -207,6 +207,23 @@ mod tests { parse(".set heading off"), Err(CommandError::WrongOption("run .set tabular OFF".into())) ); + assert_eq!(parse(".abc"), Err(CommandError::NotSupported)); + assert_eq!( + parse(".set abc"), + Err(CommandError::WrongOption("abc".to_owned())) + ); + assert_eq!( + parse(".set tabular abc"), + Err(CommandError::WrongOption("abc".to_owned())) + ); + assert_eq!( + parse(".set tabular off"), + Ok(Command::Set(SetOption::Tabular(false))) + ); + assert_eq!( + parse(".set tabular on"), + Ok(Command::Set(SetOption::Tabular(true))) + ); let mut option = PrintOption::default(); option.tabular(false); @@ -236,5 +253,25 @@ mod tests { "Usage: .set heading {ON|OFF}".into() )) ); + assert_eq!(parse(".set"), Err(CommandError::LackOfOption)); + assert_eq!( + parse(".show tabular"), + Ok(Command::Show(ShowOption::Tabular)) + ); + assert_eq!(parse(".show colsep"), Ok(Command::Show(ShowOption::Colsep))); + assert_eq!( + parse(".show colwrap"), + Ok(Command::Show(ShowOption::Colwrap)) + ); + assert_eq!( + parse(".show heading"), + Ok(Command::Show(ShowOption::Heading)) + ); + assert_eq!(parse(".show all"), Ok(Command::Show(ShowOption::All))); + assert_eq!( + parse(".show abc"), + Err(CommandError::WrongOption("abc".to_owned())) + ); + assert_eq!(parse(".show"), Err(CommandError::LackOfOption)); } } From 47232bf1aac4e7e6d2bf2af8fb086effaeca3c60 Mon Sep 17 00:00:00 2001 From: Fomegne Date: Mon, 13 Feb 2023 21:40:15 +0100 Subject: [PATCH 2/5] add tests --- cli/src/print.rs | 104 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 77 insertions(+), 27 deletions(-) diff --git a/cli/src/print.rs b/cli/src/print.rs index a746078d3..2e5b35ab3 100644 --- a/cli/src/print.rs +++ b/cli/src/print.rs @@ -319,6 +319,7 @@ mod tests { use { super::Print, crate::command::{SetOption, ShowOption}, + std::path::PathBuf, }; #[test] @@ -362,7 +363,7 @@ mod tests { macro_rules! test { ($payload: expr, $expected: literal ) => { - print.payload($payload).unwrap(); + print.payloads(&[$payload]).unwrap(); assert_eq!( String::from_utf8(print.output.clone()) @@ -376,30 +377,30 @@ mod tests { }; } - test!(&Payload::Create, "Table created"); - test!(&Payload::DropTable, "Table dropped"); - test!(&Payload::AlterTable, "Table altered"); - test!(&Payload::CreateIndex, "Index created"); - test!(&Payload::DropIndex, "Index dropped"); - test!(&Payload::Commit, "Commit completed"); - test!(&Payload::Rollback, "Rollback completed"); - test!(&Payload::StartTransaction, "Transaction started"); - test!(&Payload::Insert(0), "0 row inserted"); - test!(&Payload::Insert(1), "1 row inserted"); - test!(&Payload::Insert(7), "7 rows inserted"); - test!(&Payload::Delete(300), "300 rows deleted"); - test!(&Payload::Update(123), "123 rows updated"); + test!(Payload::Create, "Table created"); + test!(Payload::DropTable, "Table dropped"); + test!(Payload::AlterTable, "Table altered"); + test!(Payload::CreateIndex, "Index created"); + test!(Payload::DropIndex, "Index dropped"); + test!(Payload::Commit, "Commit completed"); + test!(Payload::Rollback, "Rollback completed"); + test!(Payload::StartTransaction, "Transaction started"); + test!(Payload::Insert(0), "0 row inserted"); + test!(Payload::Insert(1), "1 row inserted"); + test!(Payload::Insert(7), "7 rows inserted"); + test!(Payload::Delete(300), "300 rows deleted"); + test!(Payload::Update(123), "123 rows updated"); test!( - &Payload::ShowVariable(PayloadVariable::Version("11.6.1989".to_owned())), + Payload::ShowVariable(PayloadVariable::Version("11.6.1989".to_owned())), "v11.6.1989" ); test!( - &Payload::ShowVariable(PayloadVariable::Tables(Vec::new())), + Payload::ShowVariable(PayloadVariable::Tables(Vec::new())), " | tables |" ); test!( - &Payload::ShowVariable(PayloadVariable::Tables( + Payload::ShowVariable(PayloadVariable::Tables( [ "Allocator", "ExtendFromWithin", @@ -421,7 +422,7 @@ mod tests { | Splice |" ); test!( - &Payload::Select { + Payload::Select { labels: vec!["id".to_owned()], rows: [101, 202, 301, 505, 1001] .into_iter() @@ -439,7 +440,7 @@ mod tests { | 1001 |" ); test!( - &Payload::Select { + Payload::Select { labels: ["id", "title", "valid"] .into_iter() .map(ToOwned::to_owned) @@ -483,7 +484,7 @@ mod tests { ); test!( - &Payload::SelectMap(vec![ + Payload::SelectMap(vec![ [ ("id".to_owned(), Value::I64(1)), ("title".to_owned(), Value::Str("foo".to_owned())) @@ -504,7 +505,7 @@ mod tests { ); test!( - &Payload::ShowColumns(vec![ + Payload::ShowColumns(vec![ ("id".to_owned(), DataType::Int), ("name".to_owned(), DataType::Text), ("isabear".to_owned(), DataType::Boolean), @@ -518,7 +519,7 @@ mod tests { ); test!( - &Payload::ShowColumns(vec![ + Payload::ShowColumns(vec![ ("id".to_owned(), DataType::Int8), ("calc1".to_owned(), DataType::Float), ("cost".to_owned(), DataType::Decimal), @@ -548,7 +549,7 @@ mod tests { // ".set tabular OFF" should print SELECTED payload without tabular option print.set_option(SetOption::Tabular(false)); test!( - &Payload::Select { + Payload::Select { labels: ["id", "title", "valid"] .into_iter() .map(ToOwned::to_owned) @@ -573,7 +574,7 @@ id|title|valid ); test!( - &Payload::SelectMap(vec![ + Payload::SelectMap(vec![ [ ("id".to_owned(), Value::I64(1)), ("title".to_owned(), Value::Str("foo".to_owned())) @@ -597,7 +598,7 @@ id|title assert_eq!(print.option.format(ShowOption::Colsep), r#"colsep ",""#); test!( - &Payload::Select { + Payload::Select { labels: ["id", "title", "valid"] .into_iter() .map(ToOwned::to_owned) @@ -625,7 +626,7 @@ id,title,valid print.set_option(SetOption::Colwrap("'".into())); assert_eq!(print.option.format(ShowOption::Colwrap), r#"colwrap "'""#); test!( - &Payload::Select { + Payload::Select { labels: ["id", "title", "valid"] .into_iter() .map(ToOwned::to_owned) @@ -652,7 +653,7 @@ id,title,valid // ".set header OFF should print without column name" print.set_option(SetOption::Heading(false)); test!( - &Payload::Select { + Payload::Select { labels: ["id", "title", "valid"] .into_iter() .map(ToOwned::to_owned) @@ -675,11 +676,60 @@ id,title,valid '2','bar','FALSE'" ); + // ".set header ON should print without column name" + print.set_option(SetOption::Heading(true)); + test!( + Payload::Select { + labels: ["id", "title", "valid"] + .into_iter() + .map(ToOwned::to_owned) + .collect(), + rows: vec![ + vec![ + Value::I64(1), + Value::Str("foo".to_owned()), + Value::Bool(true) + ], + vec![ + Value::I64(2), + Value::Str("bar".to_owned()), + Value::Bool(false) + ], + ], + }, + " +'id','title','valid' +'1','foo','TRUE' +'2','bar','FALSE'" + ); + // ".set tabular ON" should recover default option: colsep("|"), colwrap("") print.set_option(SetOption::Tabular(true)); assert_eq!(print.option.format(ShowOption::Tabular), "tabular ON"); assert_eq!(print.option.format(ShowOption::Colsep), r#"colsep "|""#); assert_eq!(print.option.format(ShowOption::Colwrap), r#"colwrap """#); assert_eq!(print.option.format(ShowOption::Heading), "heading ON"); + assert_eq!( + print.option.format(ShowOption::All), + " +tabular ON +colsep \"|\" +colwrap \"\" +heading ON" + .trim_matches('\n') + ); + } + + #[test] + fn print_spool() { + use std::fs; + + let mut print = Print::new(Vec::new(), None, Default::default()); + + // Spooling on file + fs::create_dir_all("tmp").unwrap(); + assert!(print.spool_on(PathBuf::from("tmp/spool.txt")).is_ok()); + assert!(print.write("Test").is_ok()); + assert!(print.show_option(ShowOption::All).is_ok()); } } From 63b73e60037910a5e2e42b58dea6d33949bd799b Mon Sep 17 00:00:00 2001 From: Fomegne Date: Mon, 13 Feb 2023 23:44:19 +0100 Subject: [PATCH 3/5] update --- cli/src/command.rs | 7 +++++-- cli/src/print.rs | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cli/src/command.rs b/cli/src/command.rs index f061434d5..9299f850c 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -132,8 +132,7 @@ impl Command { }, ".set" => match (params.get(1), params.get(2)) { (Some(key), value) => Ok(Self::Set(SetOption::parse(key, value, option)?)), - (None, Some(_)) => Err(CommandError::LackOfOption), - (None, None) => Err(CommandError::LackOfOption), + (None, _) => Err(CommandError::LackOfOption), }, ".show" => match params.get(1) { Some(key) => Ok(Self::Show(ShowOption::parse(key)?)), @@ -229,6 +228,10 @@ mod tests { option.tabular(false); let parse = |command| Command::parse(command, &option); + assert_eq!( + parse(".set abc false"), + Err(CommandError::WrongOption("abc".to_owned())) + ); assert_eq!( parse(".set tabular"), Err(CommandError::LackOfValue( diff --git a/cli/src/print.rs b/cli/src/print.rs index 2e5b35ab3..a75a2e90d 100644 --- a/cli/src/print.rs +++ b/cli/src/print.rs @@ -731,5 +731,7 @@ heading ON" assert!(print.spool_on(PathBuf::from("tmp/spool.txt")).is_ok()); assert!(print.write("Test").is_ok()); assert!(print.show_option(ShowOption::All).is_ok()); + print.spool_off(); + assert!(print.write("Test").is_ok()); } } From 835f5c1ad724e8e2b546d783a7606cf54ceceb2b Mon Sep 17 00:00:00 2001 From: Fomegne Date: Tue, 14 Feb 2023 00:04:44 +0100 Subject: [PATCH 4/5] update --- cli/src/print.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/src/print.rs b/cli/src/print.rs index a75a2e90d..08c0e9dd6 100644 --- a/cli/src/print.rs +++ b/cli/src/print.rs @@ -678,6 +678,7 @@ id,title,valid // ".set header ON should print without column name" print.set_option(SetOption::Heading(true)); + print.set_option(SetOption::Tabular(false)); test!( Payload::Select { labels: ["id", "title", "valid"] From 1c52fd5e1656d04847600732344ea025c0623932 Mon Sep 17 00:00:00 2001 From: Fomegne Date: Tue, 14 Feb 2023 00:34:26 +0100 Subject: [PATCH 5/5] update --- cli/src/print.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/cli/src/print.rs b/cli/src/print.rs index 08c0e9dd6..b3de10f08 100644 --- a/cli/src/print.rs +++ b/cli/src/print.rs @@ -676,7 +676,7 @@ id,title,valid '2','bar','FALSE'" ); - // ".set header ON should print without column name" + // ".set header ON should print with column name" print.set_option(SetOption::Heading(true)); print.set_option(SetOption::Tabular(false)); test!( @@ -704,6 +704,26 @@ id,title,valid '2','bar','FALSE'" ); + print.set_option(SetOption::Heading(false)); + print.set_option(SetOption::Tabular(false)); + test!( + Payload::Select { + labels: ["id"] + .into_iter() + .map(ToOwned::to_owned) + .collect(), + rows: vec![ + vec![ + Value::I64(1), + ], + vec![ + Value::I64(2), + ], + ], + }, + "'1'\n'2'" + ); + // ".set tabular ON" should recover default option: colsep("|"), colwrap("") print.set_option(SetOption::Tabular(true)); assert_eq!(print.option.format(ShowOption::Tabular), "tabular ON");