yerba 0.3.0

YAML Editing and Refactoring with Better Accuracy
mod support;
use indoc::indoc;
use support::parse;

fn get_selectors(yaml: &str) -> Vec<String> {
  parse(yaml).selectors()
}

#[test]
fn test_selectors_simple_map() {
  let selectors = get_selectors(indoc! {"
    host: localhost
    port: 5432
    name: myapp
  "});

  assert_eq!(selectors, vec!["host", "name", "port"]);
}

#[test]
fn test_selectors_nested_map() {
  let selectors = get_selectors(indoc! {"
    database:
      host: localhost
      port: 5432
  "});

  assert_eq!(selectors, vec!["database", "database.host", "database.port"]);
}

#[test]
fn test_selectors_sequence_of_scalars() {
  let selectors = get_selectors(indoc! {"
    tags:
      - ruby
      - rust
  "});

  assert_eq!(selectors, vec!["tags", "tags[]"]);
}

#[test]
fn test_selectors_sequence_of_objects() {
  let selectors = get_selectors(indoc! {"
    - id: talk-1
      title: First
    - id: talk-2
      title: Second
  "});

  assert_eq!(selectors, vec!["[]", "[].id", "[].title"]);
}

#[test]
fn test_selectors_nested_sequence() {
  let selectors = get_selectors(indoc! {"
    - id: talk-1
      speakers:
        - name: Alice
          slug: alice
  "});

  assert_eq!(
    selectors,
    vec![
      "[]",
      "[].id",
      "[].speakers",
      "[].speakers[]",
      "[].speakers[].name",
      "[].speakers[].slug",
    ]
  );
}

#[test]
fn test_selectors_mixed_structure() {
  let selectors = get_selectors(indoc! {"
    database:
      host: localhost
      port: 5432
    tags:
      - ruby
      - rust
  "});

  assert_eq!(
    selectors,
    vec!["database", "database.host", "database.port", "tags", "tags[]"]
  );
}

#[test]
fn test_selectors_deep_nesting() {
  let selectors = get_selectors(indoc! {"
    - id: talk-1
      talks:
        - title: Sub Talk
          speakers:
            - Alice
  "});

  assert_eq!(
    selectors,
    vec![
      "[]",
      "[].id",
      "[].talks",
      "[].talks[]",
      "[].talks[].speakers",
      "[].talks[].speakers[]",
      "[].talks[].title",
    ]
  );
}