mod fmt_debug { use flood_tide::check; use flood_tide::Arg; use flood_tide::Lex; use flood_tide::NameVal; use flood_tide::Opt; use flood_tide::OptNum; use flood_tide::Tokens; // #[test] fn opt() { let opt = Opt { sho: b'n', lon: "name", #[cfg(feature = "option_argument")] has: Arg::Yes, num: 1, }; // let thing = format!("{:?}", opt); #[cfg(feature = "option_argument")] let expect = "Opt { sho: 110, lon: \"name\", has: Yes, num: 1 }"; #[cfg(not(feature = "option_argument"))] let expect = "Opt { sho: 110, lon: \"name\", num: 1 }"; assert_eq!(thing, expect); } #[test] fn has_arg() { assert_eq!(format!("{:?}", Arg::No), "No"); assert_eq!(format!("{:?}", Arg::Yes), "Yes"); assert_eq!(format!("{:?}", Arg::Maybe), "Maybe"); } #[test] fn name_val() { let opt = Opt { sho: b'n', lon: "name", #[cfg(feature = "option_argument")] has: Arg::Yes, num: 1, }; let nv = NameVal { opt: &opt, #[cfg(feature = "option_argument")] val: Some("value"), #[cfg(feature = "was_long")] was_long: true, }; // let thing = format!("{:?}", nv); let expect = "NameVal { opt: Opt { sho: 110, lon: \"name\"".to_string(); #[cfg(feature = "option_argument")] let expect = expect + ", has: Yes"; let expect = expect + ", num: 1 }"; #[cfg(feature = "option_argument")] let expect = expect + ", val: Some(\"value\")"; #[cfg(feature = "was_long")] let expect = expect + ", was_long: true"; let expect = expect + " }"; assert_eq!(thing, expect); } #[test] fn name_val_name() { let opt = Opt { sho: b'n', lon: "name", #[cfg(feature = "option_argument")] has: Arg::Yes, num: 1, }; let nv = NameVal { opt: &opt, #[cfg(feature = "option_argument")] val: Some("value"), #[cfg(feature = "was_long")] was_long: false, }; // let thing = nv.name(); #[cfg(not(feature = "was_long"))] let expect = "name"; #[cfg(feature = "was_long")] let expect = "n"; assert_eq!(thing, expect); } #[test] fn tokens() { #[rustfmt::skip] let opt1 = Opt { sho: b'a', lon: "name1", #[cfg(feature = "option_argument")] has: Arg::Yes, num: 1, }; #[rustfmt::skip] let opt2 = Opt { sho: b'b', lon: "name2", #[cfg(feature = "option_argument")] has: Arg::Yes, num: 2, }; #[rustfmt::skip] let opt3 = Opt { sho: b'c', lon: "name3", #[cfg(feature = "option_argument")] has: Arg::No, num: 3, }; // let tks = Tokens { namevals: vec![ NameVal { opt: &opt1, #[cfg(feature = "option_argument")] val: Some("value1"), #[cfg(feature = "was_long")] was_long: true, }, NameVal { opt: &opt2, #[cfg(feature = "option_argument")] val: Some("value2"), #[cfg(feature = "was_long")] was_long: true, }, NameVal { opt: &opt3, #[cfg(feature = "option_argument")] val: None, #[cfg(feature = "was_long")] was_long: false, }, ], free: vec!["free1", "free2", "free3"], #[cfg(feature = "subcommand")] subcmd: Some("command"), #[cfg(feature = "stop_at_mm")] double_m: true, }; // let thing = format!("{:?}", tks); let subcmd = { #[cfg(feature = "subcommand")] { " subcmd: Some(\"command\")," } #[cfg(not(feature = "subcommand"))] { "" } }; let expect = "Tokens { namevals: ".to_string(); #[cfg(feature = "option_argument")] #[cfg(feature = "was_long")] let expect = expect + concat!( "[NameVal { opt: Opt { sho: 97, lon: \"name1\", has: Yes, num: 1 }, val: Some(\"value1\"), was_long: true },", " NameVal { opt: Opt { sho: 98, lon: \"name2\", has: Yes, num: 2 }, val: Some(\"value2\"), was_long: true },", " NameVal { opt: Opt { sho: 99, lon: \"name3\", has: No, num: 3 }, val: None, was_long: false }", ); #[cfg(feature = "option_argument")] #[cfg(not(feature = "was_long"))] let expect = expect + concat!( "[NameVal { opt: Opt { sho: 97, lon: \"name1\", has: Yes, num: 1 }, val: Some(\"value1\") },", " NameVal { opt: Opt { sho: 98, lon: \"name2\", has: Yes, num: 2 }, val: Some(\"value2\") },", " NameVal { opt: Opt { sho: 99, lon: \"name3\", has: No, num: 3 }, val: None }", ); #[cfg(not(feature = "option_argument"))] #[cfg(feature = "was_long")] let expect = expect + concat!( "[NameVal { opt: Opt { sho: 97, lon: \"name1\", num: 1 }, was_long: true },", " NameVal { opt: Opt { sho: 98, lon: \"name2\", num: 2 }, was_long: true },", " NameVal { opt: Opt { sho: 99, lon: \"name3\", num: 3 }, was_long: false }", ); #[cfg(not(feature = "option_argument"))] #[cfg(not(feature = "was_long"))] let expect = expect + concat!( "[NameVal { opt: Opt { sho: 97, lon: \"name1\", num: 1 } },", " NameVal { opt: Opt { sho: 98, lon: \"name2\", num: 2 } },", " NameVal { opt: Opt { sho: 99, lon: \"name3\", num: 3 } }", ); let expect = expect + "],"; #[cfg(feature = "stop_at_mm")] let expect = expect + " double_m: true,"; let expect = expect + subcmd + " free: [\"free1\", \"free2\", \"free3\"] }"; assert_eq!(thing, expect); } #[test] fn lex() { // #[repr(u8)] #[derive(Debug, PartialEq)] enum CmdOP { Name = 1, Section = 2, Info = 3, } impl CmdOP { pub const fn to(self) -> OptNum { self as OptNum } } // #[cfg(feature = "option_argument")] #[rustfmt::skip] let opt_ary = [ Opt { sho: b'i', lon: "info", has: Arg::No, num: CmdOP::Info.to(), }, Opt { sho: b'n', lon: "name", has: Arg::Yes, num: CmdOP::Name.to(), }, Opt { sho: b's', lon: "section", has: Arg::Maybe, num: CmdOP::Section.to(), }, ]; #[cfg(not(feature = "option_argument"))] #[rustfmt::skip] let opt_ary = [ Opt { sho: b'i', lon: "info", num: CmdOP::Info.to(), }, Opt { sho: b'n', lon: "name", num: CmdOP::Name.to(), }, Opt { sho: b's', lon: "section", num: CmdOP::Section.to(), }, ]; #[rustfmt::skip] let opt_ary_sho_idx = [(b'i',0),(b'n',1),(b's',2)]; // let lex = { assert!(check::check_sorted_opt_ary_and_sho_idx_ary_with( &opt_ary, &opt_ary_sho_idx )); Lex::create_with(&opt_ary, &opt_ary_sho_idx) }; // let thing = format!("{:?}", lex); // let subcmd = { #[cfg(feature = "subcommand")] { ", subcmds: []" } #[cfg(not(feature = "subcommand"))] { "" } }; // #[cfg(feature = "option_argument")] let opts_s = concat!( "opts: ", "[Opt { sho: 105, lon: \"info\", has: No, num: 3 },", " Opt { sho: 110, lon: \"name\", has: Yes, num: 1 },", " Opt { sho: 115, lon: \"section\", has: Maybe, num: 2 }]", ); #[cfg(not(feature = "option_argument"))] let opts_s = concat!( "opts: ", "[Opt { sho: 105, lon: \"info\", num: 3 },", " Opt { sho: 110, lon: \"name\", num: 1 },", " Opt { sho: 115, lon: \"section\", num: 2 }]", ); let sho_idx_s = ", sho_idx: [(105, 0), (110, 1), (115, 2)]"; let expect = "Lex { ".to_string() + opts_s + sho_idx_s + subcmd + " }"; assert_eq!(thing, expect); } #[cfg(feature = "long_only")] #[test] fn lex_single() { // #[repr(u8)] #[derive(Debug, PartialEq)] enum CmdOP { Name = 1, Section = 2, Info = 3, } impl CmdOP { pub const fn to(self) -> OptNum { self as OptNum } } // #[cfg(feature = "option_argument")] #[rustfmt::skip] let opt_ary = [ Opt { sho: b'i', lon: "info", has: Arg::No, num: CmdOP::Info.to(), }, Opt { sho: b'n', lon: "name", has: Arg::Yes, num: CmdOP::Name.to(), }, Opt { sho: b's', lon: "section", has: Arg::Maybe, num: CmdOP::Section.to(), }, ]; #[cfg(not(feature = "option_argument"))] #[rustfmt::skip] let opt_ary = [ Opt { sho: b'i', lon: "info", num: CmdOP::Info.to(), }, Opt { sho: b'n', lon: "name", num: CmdOP::Name.to(), }, Opt { sho: b's', lon: "section", num: CmdOP::Section.to(), }, ]; #[rustfmt::skip] let opt_ary_sho_idx = [(b'i',0),(b'n',1),(b's',2)]; // let lex = { assert!(check::check_sorted_opt_ary_and_sho_idx_ary_with( &opt_ary, &opt_ary_sho_idx )); Lex::create_with(&opt_ary, &opt_ary_sho_idx) }; // let thing = format!("{:?}", lex); // let subcmd = { #[cfg(feature = "subcommand")] { ", subcmds: []" } #[cfg(not(feature = "subcommand"))] { "" } }; #[cfg(feature = "option_argument")] let opts_s = concat!( "opts: ", "[Opt { sho: 105, lon: \"info\", has: No, num: 3 },", " Opt { sho: 110, lon: \"name\", has: Yes, num: 1 },", " Opt { sho: 115, lon: \"section\", has: Maybe, num: 2 }]", ); #[cfg(not(feature = "option_argument"))] let opts_s = concat!( "opts: ", "[Opt { sho: 105, lon: \"info\", num: 3 },", " Opt { sho: 110, lon: \"name\", num: 1 },", " Opt { sho: 115, lon: \"section\", num: 2 }]", ); let sho_idx_s = ", sho_idx: [(105, 0), (110, 1), (115, 2)]"; let expect = "Lex { ".to_string() + opts_s + sho_idx_s + subcmd + " }"; assert_eq!(thing, expect); } #[cfg(feature = "subcommand")] #[test] fn lex_sub_cmd() { // #[repr(u8)] #[derive(Debug, PartialEq)] enum CmdOP { Name = 1, Section = 2, Info = 3, } impl CmdOP { pub const fn to(self) -> OptNum { self as OptNum } } // #[cfg(feature = "option_argument")] #[rustfmt::skip] let opt_ary = [ Opt { sho: b'i', lon: "info", has: Arg::No, num: CmdOP::Info.to(), }, Opt { sho: b'n', lon: "name", has: Arg::Yes, num: CmdOP::Name.to(), }, Opt { sho: b's', lon: "section", has: Arg::Maybe, num: CmdOP::Section.to(), }, ]; #[cfg(not(feature = "option_argument"))] #[rustfmt::skip] let opt_ary = [ Opt { sho: b'i', lon: "info", num: CmdOP::Info.to(), }, Opt { sho: b'n', lon: "name", num: CmdOP::Name.to(), }, Opt { sho: b's', lon: "section", num: CmdOP::Section.to(), }, ]; #[rustfmt::skip] let opt_ary_sho_idx = [(b'i',0),(b'n',1),(b's',2)]; // let lex = { assert!(check::check_sorted_opt_ary_and_sho_idx_ary_with( &opt_ary, &opt_ary_sho_idx )); Lex::create_with(&opt_ary, &opt_ary_sho_idx).subcmd(&["sub_command"]) }; // let thing = format!("{:?}", lex); // let subcmd = ", subcmds: [\"sub_command\"]"; // #[cfg(feature = "option_argument")] let opts_s = concat!( "opts: ", "[Opt { sho: 105, lon: \"info\", has: No, num: 3 },", " Opt { sho: 110, lon: \"name\", has: Yes, num: 1 },", " Opt { sho: 115, lon: \"section\", has: Maybe, num: 2 }]", ); #[cfg(not(feature = "option_argument"))] let opts_s = concat!( "opts: ", "[Opt { sho: 105, lon: \"info\", num: 3 },", " Opt { sho: 110, lon: \"name\", num: 1 },", " Opt { sho: 115, lon: \"section\", num: 2 }]", ); let sho_idx_s = ", sho_idx: [(105, 0), (110, 1), (115, 2)]"; let expect = "Lex { ".to_string() + opts_s + sho_idx_s + subcmd + " }"; assert_eq!(thing, expect); } }