yerba 0.1.2

YAML Editing and Refactoring with Better Accuracy
Documentation
use yerba::Document;

#[test]
fn test_move_key_by_name() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n  name: myapp\n";
  let mut document = Document::parse(yaml).unwrap();

  document.move_key("database", 2, 0).unwrap();

  assert_eq!(
    document.to_string(),
    "database:\n  name: myapp\n  host: localhost\n  port: 5432\n"
  );
}

#[test]
fn test_move_key_forward() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n  name: myapp\n";
  let mut document = Document::parse(yaml).unwrap();

  document.move_key("database", 0, 2).unwrap();

  assert_eq!(
    document.to_string(),
    "database:\n  port: 5432\n  name: myapp\n  host: localhost\n"
  );
}

#[test]
fn test_move_key_preserves_comments() {
  let yaml = "# Config\ndatabase:\n  host: localhost\n  port: 5432\n# End\n";
  let mut document = Document::parse(yaml).unwrap();

  document.move_key("database", 1, 0).unwrap();

  assert_eq!(
    document.to_string(),
    "# Config\ndatabase:\n  port: 5432\n  host: localhost\n# End\n"
  );
}

#[test]
fn test_move_key_out_of_bounds() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n";
  let mut document = Document::parse(yaml).unwrap();

  assert!(document.move_key("database", 5, 0).is_err());
}

#[test]
fn test_move_key_same_index_noop() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n";
  let mut document = Document::parse(yaml).unwrap();

  document.move_key("database", 0, 0).unwrap();

  assert_eq!(document.to_string(), "database:\n  host: localhost\n  port: 5432\n");
}

#[test]
fn test_move_key_root_level() {
  let yaml = "host: localhost\nport: 5432\nname: myapp\n";
  let mut document = Document::parse(yaml).unwrap();

  document.move_key("", 2, 0).unwrap();

  assert_eq!(document.to_string(), "name: myapp\nhost: localhost\nport: 5432\n");
}

#[test]
fn test_resolve_key_index_by_name() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n  name: myapp\n";
  let document = Document::parse(yaml).unwrap();

  assert_eq!(document.resolve_key_index("database", "host").unwrap(), 0);
  assert_eq!(document.resolve_key_index("database", "port").unwrap(), 1);
  assert_eq!(document.resolve_key_index("database", "name").unwrap(), 2);
}

#[test]
fn test_resolve_key_index_by_number() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n";
  let document = Document::parse(yaml).unwrap();

  assert_eq!(document.resolve_key_index("database", "0").unwrap(), 0);
  assert_eq!(document.resolve_key_index("database", "1").unwrap(), 1);
}

#[test]
fn test_move_key_by_resolve_index() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n  name: myapp\n";
  let document = Document::parse(yaml).unwrap();

  let from = document.resolve_key_index("database", "name").unwrap();
  let to = document.resolve_key_index("database", "host").unwrap();

  assert_eq!(from, 2);
  assert_eq!(to, 0);
}

#[test]
fn test_resolve_key_index_nonexistent() {
  let yaml = "database:\n  host: localhost\n";
  let document = Document::parse(yaml).unwrap();

  assert!(document.resolve_key_index("database", "missing").is_err());
}

#[test]
fn test_resolve_key_index_out_of_bounds() {
  let yaml = "database:\n  host: localhost\n";
  let document = Document::parse(yaml).unwrap();

  assert!(document.resolve_key_index("database", "99").is_err());
}