freneng 0.1.2

A useful, async-first file renaming library
Documentation
// Test to verify same-name handling and apply action logic
use freneng::{RenamingEngine, FileRename};
use std::path::PathBuf;
use tokio::fs;
use tempfile::TempDir;

#[tokio::main]
async fn main() {
    let engine = RenamingEngine;
    let temp_dir = TempDir::new().unwrap();
    
    // Create a test file
    let test_file = temp_dir.path().join("test.txt");
    fs::write(&test_file, "test content").await.unwrap();
    
    println!("=== Test 1: Same-name rename (old_path == new_path) ===");
    
    // Create a rename where old and new paths are identical
    let same_name_rename = FileRename {
        old_path: test_file.clone(),
        new_path: test_file.clone(),  // Same path!
        new_name: "test.txt".to_string(),
    };
    
    // Perform the rename
    let result = freneng::perform_renames(&[same_name_rename], false).await.unwrap();
    
    println!("  Successful: {}", result.successful.len());
    println!("  Skipped: {}", result.skipped.len());
    println!("  Errors: {}", result.errors.len());
    
    if result.successful.is_empty() && result.skipped.len() == 1 {
        println!("  ✓ PASS: Same-name rename was skipped, no file operation occurred");
    } else {
        println!("  ✗ FAIL: Same-name rename was not handled correctly");
    }
    
    // Verify file still exists and wasn't moved
    assert!(test_file.exists(), "File should still exist after same-name skip");
    println!("  ✓ File still exists at original location");
    
    println!("\n=== Test 2: Pattern %N.%E (no change) ===");
    
    // Test with %N.%E pattern (should result in same names)
    let files = vec![test_file.clone()];
    let preview = engine.generate_preview(&files, "%N.%E").await.unwrap();
    
    println!("  Original file: {}", test_file.file_name().unwrap().to_string_lossy());
    println!("  New name: {}", preview.renames[0].new_name);
    
    // Check if old and new names are the same
    let old_name = test_file.file_name().unwrap().to_string_lossy();
    let new_name = &preview.renames[0].new_name;
    let names_same = old_name == new_name.as_str();
    
    if names_same {
        println!("  ✓ Pattern %N.%E results in same name (no change)");
        
        // Check if the paths would be the same
        let old_path = &preview.renames[0].old_path;
        let new_path = &preview.renames[0].new_path;
        let paths_same = old_path == new_path;
        
        if paths_same {
            println!("  ✓ Old and new paths are identical");
            println!("  ✓ This rename would be skipped by perform_renames()");
        } else {
            println!("  ⚠ Paths differ (but names are same)");
        }
    } else {
        println!("  ✗ FAIL: Pattern %N.%E did not result in same name");
    }
    
    println!("\n=== Summary ===");
    println!("1. Same-name renames are skipped: ✓");
    println!("2. Pattern %N.%E results in no change: {}", if names_same { "" } else { "" });
    println!("\nNOTE: Apply action should be disabled when pattern is %N.%E");
    println!("      This requires checking if all renames would result in same names.");
}