Documentation
use vn::TraitField::{GroupName, Name};
use vn::{TraitId, Vndb};

const AIRHEAD: &str = "Airhead";
const AIRHEAD_ID: u16 = 229;
const AIRHEAD_GROUP: &str = "Personality";

#[tokio::test]
async fn get_trait() {
  let vndb = Vndb::new();
  let filters = r#"["id", "=", "i229"]"#;
  let mut results = vndb
    .post()
    .r#trait()
    .filters(filters.try_into().unwrap())
    .fields([Name, GroupName])
    .results(5)
    .send()
    .await
    .unwrap()
    .results;

  assert_eq!(results.len(), 1);

  let r#trait = results.swap_remove(0);
  let name = r#trait.name.as_deref().unwrap();
  let group_name = r#trait.group_name.as_deref().unwrap();

  assert_eq!(r#trait.id, TraitId::from(AIRHEAD_ID));
  assert!(name.eq_ignore_ascii_case(AIRHEAD));
  assert!(group_name.eq_ignore_ascii_case(AIRHEAD_GROUP));
}

#[tokio::test]
async fn find_trait() {
  let r#trait = Vndb::new()
    .find_trait(AIRHEAD_ID)
    .fields([Name, GroupName])
    .send()
    .await
    .unwrap()
    .swap_remove(0);

  assert_eq!(r#trait.id, TraitId::from(AIRHEAD_ID));
  assert_eq!(r#trait.name.as_deref(), Some(AIRHEAD));
  assert_eq!(r#trait.group_name.as_deref(), Some(AIRHEAD_GROUP));
}

#[tokio::test]
async fn search_trait() {
  let r#trait = Vndb::new()
    .search_trait(AIRHEAD.to_ascii_lowercase())
    .fields([Name, GroupName])
    .send()
    .await
    .unwrap()
    .swap_remove(0);

  assert_eq!(r#trait.id, TraitId::from(AIRHEAD_ID));
  assert_eq!(r#trait.name.as_deref(), Some(AIRHEAD));
  assert_eq!(r#trait.group_name.as_deref(), Some(AIRHEAD_GROUP));
}