yerba 0.5.1

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

#[test]
fn test_location_of_scalar() {
  let document = parse(indoc! {"
    name: Alice
    port: 5432
  "});

  let info = document.get_node_info("name");

  assert_eq!(info.location.start_line, 1);
  assert_eq!(info.location.start_column, 6);
  assert_eq!(info.location.end_line, 1);
  assert_eq!(info.location.end_column, 11);
}

#[test]
fn test_location_of_nested_scalar() {
  let document = parse(indoc! {"
    database:
      host: localhost
      port: 5432
  "});

  let info = document.get_node_info("database.host");

  assert_eq!(info.location.start_line, 2);
  assert_eq!(info.location.start_column, 8);
  assert_eq!(info.location.end_line, 2);
  assert_eq!(info.location.end_column, 17);
}

#[test]
fn test_location_of_map() {
  let document = parse(indoc! {"
    database:
      host: localhost
      port: 5432
  "});

  let info = document.get_node_info("database");

  assert_eq!(info.location.start_line, 2);
  assert_eq!(info.location.end_line, 3);
}

#[test]
fn test_location_of_sequence() {
  let document = parse(indoc! {"
    tags:
      - ruby
      - rust
  "});

  let info = document.get_node_info("tags");

  assert_eq!(info.location.start_line, 2);
  assert_eq!(info.location.end_line, 3);
}

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

  let info = document.get_node_info("[1].title");

  assert_eq!(info.location.start_line, 4);
  assert_eq!(info.location.start_column, 9);
  assert_eq!(info.location.end_line, 4);
  assert_eq!(info.location.end_column, 15);
}

#[test]
fn test_location_of_block_scalar() {
  let document = parse(indoc! {"
    - id: talk-1
      description: |-
        First line.
        Second line.
        Third line.
    - id: talk-2
  "});

  let info = document.get_node_info("[0].description");

  assert_eq!(info.location.start_line, 2);
  assert_eq!(info.location.end_line, 5);
}

#[test]
fn test_location_of_root_map_item() {
  let document = parse(indoc! {"
    - id: talk-1
      title: First
      description: |-
        Some text.
        More text.
    - id: talk-2
  "});

  let info = document.get_node_info("[0]");

  assert_eq!(info.location.start_line, 1);
  assert_eq!(info.location.end_line, 5);
}

#[test]
fn test_location_has_byte_offsets() {
  let document = parse(indoc! {"
    name: Alice
  "});

  let info = document.get_node_info("name");

  assert_eq!(info.location.start_offset, 6);
  assert_eq!(info.location.end_offset, 11);
}

#[test]
fn test_location_of_second_line_scalar() {
  let document = parse(indoc! {"
    name: Alice
    port: 5432
  "});

  let info = document.get_node_info("port");

  assert_eq!(info.location.start_line, 2);
  assert_eq!(info.location.start_column, 6);
  assert_eq!(info.location.start_offset, 18);
  assert_eq!(info.location.end_offset, 22);
}

#[test]
fn test_resolve_selectors_for_locations() {
  let document = parse(indoc! {"
    - id: a
      title: First
    - id: b
      title: Second
    - id: c
      title: Third
  "});

  let selectors = document.resolve_selectors("[].title");

  assert_eq!(selectors, vec!["[0].title", "[1].title", "[2].title"]);
}

#[test]
fn test_resolve_selectors_for_nested_locations() {
  let document = parse(indoc! {"
    - speakers:
        - Alice
        - Bob
    - speakers:
        - Charlie
  "});

  let selectors = document.resolve_selectors("[].speakers[]");

  assert_eq!(selectors, vec!["[0].speakers[0]", "[0].speakers[1]", "[1].speakers[0]"]);
}

#[test]
fn test_location_of_each_resolved_selector() {
  let document = parse(indoc! {"
    - id: a
    - id: b
    - id: c
  "});

  let selectors = document.resolve_selectors("[]");

  assert_eq!(selectors.len(), 3);

  let info0 = document.get_node_info(&selectors[0]);
  let info1 = document.get_node_info(&selectors[1]);
  let info2 = document.get_node_info(&selectors[2]);

  assert_eq!(info0.location.start_line, 1);
  assert_eq!(info1.location.start_line, 2);
  assert_eq!(info2.location.start_line, 3);
}