1
0
Files
wfassoc/wfassoc/tests/concept.rs

333 lines
8.6 KiB
Rust

use std::{collections::HashMap, str::FromStr};
use wfassoc::win32::concept::*;
// region: File Extension
#[test]
fn test_ext_new() {
fn ok_tester(s: &str, probe: &str) {
let rv = Ext::new(s);
assert!(rv.is_ok());
let rv = rv.unwrap();
assert_eq!(rv.to_string(), probe);
}
fn err_tester(s: &str) {
let rv = Ext::new(s);
assert!(rv.is_err());
}
ok_tester("jpg", ".jpg");
err_tester(".jpg");
err_tester("");
}
#[test]
fn test_ext_parse() {
fn ok_tester(s: &str, probe: &str) {
let rv = Ext::from_str(s);
assert!(rv.is_ok());
let rv = rv.unwrap();
assert_eq!(rv.inner(), probe);
}
fn err_tester(s: &str) {
let rv = Ext::from_str(s);
assert!(rv.is_err());
}
ok_tester(".jpg", "jpg");
err_tester(".");
err_tester(".jar.disabled");
err_tester("jar");
}
// endregion
// region: Programmatic Identifiers
#[test]
fn test_prog_id_new() {
fn ok_tester(vendor: &str, component: &str, version: Option<u32>, probe: &str) {
let rv = ProgId::new(vendor, component, version);
assert!(rv.is_ok());
let rv = rv.unwrap();
assert_eq!(rv.to_string(), probe);
}
fn err_tester(vendor: &str, component: &str, version: Option<u32>) {
let rv = ProgId::new(vendor, component, version);
assert!(rv.is_err());
}
ok_tester("VSCode", "c++", None, "VSCode.c++");
ok_tester("PowerPoint", "Template", Some(12), "PowerPoint.Template.12");
err_tester("", "MyApp", None);
err_tester("Me", "", None);
err_tester("M.e", "MyApp", None);
err_tester("Me", "My.App", None);
}
#[test]
fn test_prog_id_parse() {
fn ok_tester(s: &str, probe_vendor: &str, probe_component: &str, probe_version: Option<u32>) {
let rv = ProgId::from_str(s);
assert!(rv.is_ok());
let rv = rv.unwrap();
assert_eq!(rv.get_vendor(), probe_vendor);
assert_eq!(rv.get_component(), probe_component);
assert_eq!(rv.get_version(), probe_version);
}
fn err_tester(s: &str) {
let rv = ProgId::from_str(s);
assert!(rv.is_err());
}
ok_tester("VSCode.c++", "VSCode", "c++", None);
ok_tester("PowerPoint.Template.12", "PowerPoint", "Template", Some(12));
err_tester("Me.MyApp.");
err_tester("WMP11.AssocFile.3G2");
err_tester("What the f*ck?");
}
// endregion
// region: CLSID
#[test]
fn test_clsid() {
fn ok_tester(s: &str) {
let rv = Clsid::from_str(s);
assert!(rv.is_ok());
let rv = rv.unwrap();
assert_eq!(s.to_lowercase(), rv.to_string().to_lowercase());
}
fn err_tester(s: &str) {
let rv = Clsid::from_str(s);
assert!(rv.is_err());
}
ok_tester("{59031a47-3f72-44a7-89c5-5595fe6b30ee}");
ok_tester("{26EE0668-A00A-44D7-9371-BEB064C98683}");
err_tester("26EE0668-A00A-44D7-9371-BEB064C98683");
err_tester("{26EE0668A00A-44D7-9371-BEB064C98683}");
}
// endregion
// region: Windows Resource Reference String
// region: Icon Reference String
#[test]
fn test_icon_ref_str() {
fn ok_tester(s: &str, probe: (&str, u32)) {
let rv = s.parse::<IconRefStr>();
assert!(rv.is_ok());
let rv = rv.unwrap();
assert_eq!(rv.get_path(), probe.0);
assert_eq!(rv.get_index(), probe.1);
}
fn err_tester(s: &str) {
let rv = s.parse::<IconRefStr>();
assert!(rv.is_err());
}
ok_tester(
r#"%SystemRoot%\System32\imageres.dll,-72"#,
(r#"%SystemRoot%\System32\imageres.dll"#, 72),
);
ok_tester(
r#""D:\Software\Krita\Krita (x64)\shellex\kritafile.ico",0"#,
(
r#""D:\Software\Krita\Krita (x64)\shellex\kritafile.ico""#,
0,
),
);
err_tester(r#"C:\Windows\Cursors\aero_arrow.cur"#);
err_tester(r#"This is my application, OK?"#);
err_tester(r#"@%SystemRoot%\System32\shell32.dll,-30596"#);
}
// endregion
// region: String Reference String
#[test]
fn test_str_ref_str() {
fn ok_tester(s: &str, probe: (&str, u32)) {
let rv = s.parse::<StrRefStr>();
assert!(rv.is_ok());
let rv = rv.unwrap();
assert_eq!(rv.get_path(), probe.0);
assert_eq!(rv.get_index(), probe.1);
}
fn err_tester(s: &str) {
let rv = s.parse::<StrRefStr>();
assert!(rv.is_err());
}
ok_tester(
r#"@%SystemRoot%\System32\shell32.dll,-30596"#,
(r#"%SystemRoot%\System32\shell32.dll"#, 30596),
);
ok_tester(
r#"@%SystemRoot%\System32\shell32.dll,30596"#,
(r#"%SystemRoot%\System32\shell32.dll"#, 30596),
);
err_tester(r#"This is my application, OK?"#);
err_tester(r#"%SystemRoot%\System32\imageres.dll,-72"#);
}
// endregion
// endregion
// region: Windows Resource
// region: Icon Resource
#[test]
fn test_icon_rc() {
fn ok_tester(file: &str, index: u32) {
let icon = IconRc::new(file, index, IconSizeKind::Small);
assert!(icon.is_ok())
}
fn err_tester(file: &str, index: u32) {
let icon = IconRc::new(file, index, IconSizeKind::Small);
assert!(icon.is_err())
}
// We pick it from "jpegfile" ProgId
ok_tester("imageres.dll", 72);
ok_tester("notepad.exe", 0);
err_tester("this-executable-must-inexisting.exe", 114514);
}
// endregion
// region: String Resource
#[test]
fn test_str_rc() {
fn ok_tester(file: &str, index: u32) {
let rv = StrRc::new(file, index);
assert!(rv.is_ok());
}
fn err_tester(file: &str, index: u32) {
let rv = StrRc::new(file, index);
assert!(rv.is_err());
}
// We pick it from "jpegfile" ProgId
ok_tester("shell32.dll", 30596);
err_tester("this-executable-must-inexisting.exe", 114514);
}
// endregion
// endregion
// region: Expand String
#[test]
fn test_expand_string() {
fn tester(fmt: &str, var_name: &str) {
// We first insert variable name into format string to get the final string
let mut vars = HashMap::new();
vars.insert("0".to_string(), var_name.to_string());
let final_string = strfmt::strfmt(fmt, &vars).unwrap();
// The we try expanding final string first
let expand_final_string = ExpandString::new(&final_string);
assert!(expand_final_string.is_ok());
let expand_final_string = expand_final_string.unwrap();
let expanded_final_string = expand_final_string.expand();
assert!(expanded_final_string.is_ok());
let expanded_final_string = expanded_final_string.unwrap();
// Then we expand variable name individually
let expand_var_name = ExpandString::new(var_name);
assert!(expand_var_name.is_ok());
let expand_var_name = expand_var_name.unwrap();
let expanded_var_name = expand_var_name.expand();
assert!(expanded_var_name.is_ok());
let expanded_var_name = expanded_var_name.unwrap();
// Finally, we directly insert expanded variable name into format string
// to get the string which can be compared with final string.
vars.insert("0".to_string(), expanded_var_name.clone());
let built_final_string = strfmt::strfmt(fmt, &vars).unwrap();
assert_eq!(expanded_final_string.to_string(), built_final_string);
}
tester(r#"{0}\System32\shell32.dll"#, "%SystemRoot%");
}
// endregion
// region: File Name
#[test]
fn test_file_name() {
fn ok_tester(s: &str) {
let rv = FileName::from_str(s);
assert!(rv.is_ok());
let rv = rv.unwrap();
assert_eq!(s, rv.inner());
}
fn err_tester(s: &str) {
let rv = FileName::from_str(s);
assert!(rv.is_err());
}
ok_tester("GoodExecutable.exe");
err_tester("");
err_tester("*.?xaml");
err_tester(r#"\\\lol///"#);
}
// endregion
// region: Verb
#[test]
fn test_verb() {
fn ok_tester(s: &str) {
let rv = Verb::from_str(s);
assert!(rv.is_ok());
let rv = rv.unwrap();
assert_eq!(s, rv.inner());
}
fn err_tester(s: &str) {
let rv = Verb::from_str(s);
assert!(rv.is_err());
}
ok_tester("Open");
ok_tester("open");
err_tester("Space Name");
}
// endregion
// region: Command Line
#[test]
fn test_cmd_line() {
fn ok_tester(s: &str) {
let rv = CmdLine::from_str(s);
assert!(rv.is_ok());
// let rv = rv.unwrap();
// assert_eq!(s, rv.full());
}
fn err_tester(s: &str) {
let rv = CmdLine::from_str(s);
assert!(rv.is_err());
}
ok_tester("notepad.exe");
ok_tester("calc.exe /c");
ok_tester("unix-like.exe -i some.file --option");
// err_tester("");
}
// endregion