yerba 0.5.1

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

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

  document.move_item("tags", 2, 0).unwrap();

  assert_eq!(
    document.to_string(),
    indoc! {"
      tags:
        - yaml
        - ruby
        - rust
    "}
  );
}

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

  document.move_item("tags", 0, 2).unwrap();

  assert_eq!(
    document.to_string(),
    indoc! {"
      tags:
        - rust
        - yaml
        - ruby
    "}
  );
}

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

  document.move_item("tags", 0, 0).unwrap();

  assert_eq!(
    document.to_string(),
    indoc! {"
      tags:
        - ruby
        - rust
    "}
  );
}

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

  assert!(document.move_item("tags", 5, 0).is_err());
}

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

  document.move_item("tags", 1, 0).unwrap();

  assert_eq!(
    document.to_string(),
    indoc! {"
      # Tags
      tags:
        - rust
        - ruby
      # End
    "}
  );
}

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

  assert_eq!(document.resolve_sequence_index("tags", "ruby").unwrap(), 0);
  assert_eq!(document.resolve_sequence_index("tags", "rust").unwrap(), 1);
  assert_eq!(document.resolve_sequence_index("tags", "yaml").unwrap(), 2);
}

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

  assert_eq!(document.resolve_sequence_index("tags", "0").unwrap(), 0);
  assert_eq!(document.resolve_sequence_index("tags", "1").unwrap(), 1);
}

#[test]
fn test_move_item_preserves_inline_comment() {
  let mut document = parse(indoc! {"
    - name: Charlie # VIP
      slug: charlie
    - name: Alice
      slug: alice
  "});

  document.move_item("", 0, 1).unwrap();

  assert_eq!(
    document.to_string(),
    indoc! {"
      - name: Alice
        slug: alice
      - name: Charlie # VIP
        slug: charlie
    "}
  );
}

#[test]
fn test_move_item_preserves_preceding_section_comment() {
  let mut document = parse(indoc! {"
    ## Section A
    - name: Alice

    ## Section B
    - name: Bob
  "});

  document.move_item("", 1, 0).unwrap();

  assert_eq!(
    document.to_string(),
    indoc! {"
      ## Section B
      - name: Bob

      ## Section A
      - name: Alice
    "}
  );
}

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

  assert_eq!(document.resolve_sequence_index("", ".id == talk-a").unwrap(), 0);
  assert_eq!(document.resolve_sequence_index("", ".id == talk-b").unwrap(), 1);
  assert_eq!(document.resolve_sequence_index("", ".id == talk-c").unwrap(), 2);
  assert!(document.resolve_sequence_index("", ".id == missing").is_err());
}

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

  let from = document.resolve_sequence_index("", ".id == talk-c").unwrap();
  let to = document.resolve_sequence_index("", ".id == talk-a").unwrap();
  document.move_item("", from, to).unwrap();

  assert_eq!(
    document.to_string(),
    indoc! {"
      - id: talk-c
        title: Third
      - id: talk-a
        title: First
      - id: talk-b
        title: Second
    "}
  );
}