#![allow(missing_docs)]
use noyalib::cst::parse_document;
#[test]
fn swap_root_sequence_ends() {
let mut doc = parse_document("- a\n- b\n- c\n").unwrap();
doc.swap_items("", 0, 2).unwrap();
assert_eq!(doc.source(), "- c\n- b\n- a\n");
}
#[test]
fn swap_is_order_independent() {
let mut doc = parse_document("- a\n- b\n- c\n").unwrap();
doc.swap_items("", 2, 0).unwrap();
assert_eq!(doc.source(), "- c\n- b\n- a\n");
}
#[test]
fn swap_adjacent_items() {
let mut doc = parse_document("- a\n- b\n").unwrap();
doc.swap_items("", 0, 1).unwrap();
assert_eq!(doc.source(), "- b\n- a\n");
}
#[test]
fn swap_nested_sequence_under_a_key() {
let mut doc = parse_document("items:\n - a\n - b\n - c\n").unwrap();
doc.swap_items("items", 0, 2).unwrap();
assert_eq!(doc.source(), "items:\n - c\n - b\n - a\n");
}
#[test]
fn swap_preserves_inline_comment_position() {
let mut doc = parse_document("- a # first\n- b # second\n").unwrap();
doc.swap_items("", 0, 1).unwrap();
assert_eq!(doc.source(), "- b # first\n- a # second\n");
}
#[test]
fn swap_items_of_different_widths() {
let mut doc = parse_document("- short\n- a_much_longer_value\n").unwrap();
doc.swap_items("", 0, 1).unwrap();
assert_eq!(doc.source(), "- a_much_longer_value\n- short\n");
}
#[test]
fn swap_quoted_and_plain() {
let mut doc = parse_document("- \"q: v\"\n- plain\n").unwrap();
doc.swap_items("", 0, 1).unwrap();
assert_eq!(doc.source(), "- plain\n- \"q: v\"\n");
}
#[test]
fn swap_index_with_itself_is_noop() {
let src = "- a\n- b\n";
let mut doc = parse_document(src).unwrap();
doc.swap_items("", 1, 1).unwrap();
assert_eq!(doc.source(), src);
}
#[test]
fn swap_equal_values_is_byte_preserving() {
let src = "- x\n- x\n";
let mut doc = parse_document(src).unwrap();
doc.swap_items("", 0, 1).unwrap();
assert_eq!(doc.source(), src);
}
#[test]
fn out_of_bounds_is_refused() {
let src = "- a\n- b\n";
let mut doc = parse_document(src).unwrap();
assert!(doc.swap_items("", 0, 5).is_err());
assert_eq!(doc.source(), src);
assert!(doc.swap_items("", 9, 0).is_err());
assert_eq!(doc.source(), src);
}
#[test]
fn path_not_a_sequence_is_refused() {
let src = "a: 1\nb: 2\n";
let mut doc = parse_document(src).unwrap();
assert!(doc.swap_items("", 0, 1).is_err()); assert!(doc.swap_items("a", 0, 1).is_err()); assert_eq!(doc.source(), src);
}
#[test]
fn missing_path_is_refused() {
let src = "items:\n - a\n";
let mut doc = parse_document(src).unwrap();
assert!(doc.swap_items("nope", 0, 0).is_err());
assert_eq!(doc.source(), src);
}
#[test]
fn typed_value_reflects_the_swap() {
use noyalib::Value;
use noyalib::from_str;
let mut doc = parse_document("- 1\n- 2\n- 3\n").unwrap();
doc.swap_items("", 0, 2).unwrap();
let v: Value = from_str(doc.source()).unwrap();
let expected: Value = from_str("- 3\n- 2\n- 1\n").unwrap();
assert_eq!(v, expected);
}