use std::error::Error;
use std::result::Result as StdResult;
use visdom::Vis;
type Result = StdResult<(), Box<dyn Error>>;
#[test]
fn test_normal_attr() -> Result {
const ATTR_NAME: &str = "contenteditable";
const HTML: &str = r#"<div contenteditable><input type="text" type="file" /></div>"#;
let root = Vis::load(HTML)?;
let mut div = root.children("div");
let value = div.attr(ATTR_NAME);
assert!(value.is_some() && value.unwrap().is_true());
div.remove_attr(ATTR_NAME);
let now_value = div.attr(ATTR_NAME);
assert!(now_value.is_none());
div.set_attr(ATTR_NAME, None);
let value = div.attr(ATTR_NAME);
assert!(value.is_some() && value.unwrap().is_true());
let input = div.children("input");
let value = input.attr("type");
assert!(value.is_some() && value.unwrap().is_str("text"));
let html: &str = r#"<input type="text" READONly /></div>"#;
let root = Vis::load(html)?;
let input = root.children("[readOnly]");
assert_eq!(input.length(), 1);
Ok(())
}
#[test]
fn test_class_attr() -> Result {
const HTML: &str = r#"<div class="first"></div>"#;
const ATTR_NAME: &str = "class";
let root = Vis::load(HTML)?;
let mut div = root.children("div");
let value = div.attr(ATTR_NAME);
assert!(value.is_some() && value.unwrap().is_str("first"));
div.remove_class("first");
let now_value = div.attr(ATTR_NAME);
assert!(now_value.is_some() && now_value.unwrap().is_str(""));
div.add_class("first second");
let value = div.attr(ATTR_NAME);
assert!(value.is_some());
let value = value.unwrap();
let cls_list = value.to_list();
assert!(cls_list.contains(&"first"));
assert!(cls_list.contains(&"second"));
assert!(value.is_str("first second"));
div.toggle_class("first third");
assert!(!div.has_class("first"));
assert!(div.has_class("second"));
assert!(div.has_class("third"));
let value = div.attr(ATTR_NAME).unwrap();
assert!(value.is_str("second third"));
Ok(())
}