magic_string 0.3.4

magic string
Documentation
#[cfg(test)]
mod overwrite {
  use magic_string::{MagicString, OverwriteOptions, Result};

  #[test]
  fn should_replace_characters() -> Result {
    let mut s = MagicString::new("abcdefghijkl");

    s.overwrite(5, 8, "FGH", OverwriteOptions::default())?;
    assert_eq!(s.to_string(), "abcdeFGHijkl");

    Ok(())
  }

  #[test]
  #[should_panic]
  fn should_panic_if_overlapping_replacements_are_attempted() {
    let mut s = MagicString::new("abcdefghijkl");

    assert!(s
      .overwrite(7, 11, "xx", OverwriteOptions::default())
      .is_ok());

    assert!(s
      .overwrite(8, 12, "yy", OverwriteOptions::default())
      .is_ok());
  }

  #[test]
  fn should_allow_contiguous_but_non_overlapping_replacements() -> Result {
    let mut s = MagicString::new("abcdefghijkl");

    s.overwrite(3, 6, "DEF", OverwriteOptions::default())?;
    assert_eq!(s.to_string(), "abcDEFghijkl");

    s.overwrite(6, 9, "GHI", OverwriteOptions::default())?;
    assert_eq!(s.to_string(), "abcDEFGHIjkl");

    s.overwrite(0, 3, "ABC", OverwriteOptions::default())?;
    assert_eq!(s.to_string(), "ABCDEFGHIjkl");

    s.overwrite(9, 12, "JKL", OverwriteOptions::default())?;
    assert_eq!(s.to_string(), "ABCDEFGHIJKL");

    Ok(())
  }

  #[test]
  fn replaces_zero_length_inserts_inside_overwrite() -> Result {
    let mut s = MagicString::new("abcdefghijkl");

    s.append_left(6, "XXX")?;
    s.overwrite(3, 9, "DEFGHI", OverwriteOptions::default())?;

    assert_eq!(s.to_string(), "abcDEFGHIjkl");

    Ok(())
  }

  #[test]
  fn replaces_non_zero_length_inserts_inside_overwrite() -> Result {
    let mut s = MagicString::new("abcdefghijkl");

    s.overwrite(3, 4, "XXX", OverwriteOptions::default())?;
    s.overwrite(3, 5, "DE", OverwriteOptions::default())?;
    assert_eq!(s.to_string(), "abcDEfghijkl");

    s.overwrite(7, 8, "YYY", OverwriteOptions::default())?;
    s.overwrite(6, 8, "GH", OverwriteOptions::default())?;
    assert_eq!(s.to_string(), "abcDEfGHijkl");

    Ok(())
  }

  #[test]
  fn should_not_replace_zero_length_inserts_at_overwrite_start_location() -> Result {
    let mut s = MagicString::new("abcdefghijkl");

    s.remove(0, 6)?;
    s.append_left(6, "DEF")?;
    s.overwrite(6, 9, "GHI", OverwriteOptions::default())?;

    assert_eq!(s.to_string(), "DEFGHIjkl");

    Ok(())
  }

  #[test]
  fn should_return_self() -> Result {
    let mut s = MagicString::new("abcdefghijkl");

    let result = s.overwrite(3, 4, "D", OverwriteOptions::default())?;

    let result_ptr = result as *mut _;
    let s_ptr = &s as *const _;

    assert_eq!(s_ptr, result_ptr);

    Ok(())
  }

  #[test]
  fn replaces_interior_inserts() -> Result {
    let mut s = MagicString::new("abcdefghijkl");

    s.append_left(1, "&")?;
    s.prepend_right(1, "^")?;
    s.append_left(3, "!")?;
    s.prepend_right(3, "?")?;
    s.overwrite(1, 3, "...", OverwriteOptions::default())?;

    assert_eq!(s.to_string(), "a&...?defghijkl");

    Ok(())
  }

  #[test]
  fn preserves_interior_inserts_with_content_only_true() -> Result {
    let mut s = MagicString::new("abcdefghijkl");

    s.append_left(1, "&")?;
    s.prepend_right(1, "^")?;
    s.append_left(3, "!")?;
    s.prepend_right(3, "?")?;
    s.overwrite(1, 3, "...", OverwriteOptions { content_only: true })?;

    assert_eq!(s.to_string(), "a&^...!?defghijkl");

    Ok(())
  }

  #[test]
  fn allows_later_insertions_at_the_end() -> Result {
    let mut s = MagicString::new("abcdefg");

    s.append_left(4, "(")?;
    s.overwrite(2, 7, "", OverwriteOptions::default())?;
    s.append_left(7, "h")?;

    assert_eq!(s.to_string(), "abh");

    Ok(())
  }
}