use std::path::PathBuf; use lsp_types::Uri; use crate::config::{lsp_uri_to_path, path_to_lsp_uri}; // Unix-specific tests use Unix paths #[cfg(not(windows))] mod unix_tests { use super::*; #[test] fn test_lsp_uri_to_path_basic() { let uri: Uri = "file:///Users/test/project/src/main.rs".parse().unwrap(); let path = lsp_uri_to_path(&uri).unwrap(); assert_eq!(path, PathBuf::from("/Users/test/project/src/main.rs")); } #[test] fn test_lsp_uri_to_path_decodes_at_symbol() { // %40 is the URL encoding for @ let uri: Uri = "file:///Users/test/node_modules/%40firebase/auth/dist/index.d.ts" .parse() .unwrap(); let path = lsp_uri_to_path(&uri).unwrap(); assert_eq!( path, PathBuf::from("/Users/test/node_modules/@firebase/auth/dist/index.d.ts") ); } #[test] fn test_lsp_uri_to_path_decodes_spaces() { // %20 is the URL encoding for space let uri: Uri = "file:///Users/test/My%20Project/src/main.rs" .parse() .unwrap(); let path = lsp_uri_to_path(&uri).unwrap(); assert_eq!(path, PathBuf::from("/Users/test/My Project/src/main.rs")); } #[test] fn test_lsp_uri_to_path_decodes_multiple_special_chars() { // Test multiple encoded characters: @ (%40), space (%20), # (%23) let uri: Uri = "file:///Users/test/%40scope/my%20package%23v1/index.ts" .parse() .unwrap(); let path = lsp_uri_to_path(&uri).unwrap(); assert_eq!( path, PathBuf::from("/Users/test/@scope/my package#v1/index.ts") ); } #[test] fn test_path_to_lsp_uri_basic() { let path = PathBuf::from("/Users/test/project/src/main.rs"); let uri = path_to_lsp_uri(&path).unwrap(); assert_eq!(uri.as_str(), "file:///Users/test/project/src/main.rs"); } #[test] fn test_path_to_lsp_uri_encodes_spaces() { let path = PathBuf::from("/Users/test/My Project/src/main.rs"); let uri = path_to_lsp_uri(&path).unwrap(); assert_eq!(uri.as_str(), "file:///Users/test/My%20Project/src/main.rs"); } #[test] fn test_path_to_lsp_uri_encodes_non_ascii() { let path = PathBuf::from("/Users/관리자/project/src/main.rs"); let uri = path_to_lsp_uri(&path).unwrap(); assert!(uri.as_str().starts_with("file:///Users/%")); } #[test] fn test_path_to_lsp_uri_encodes_accented_chars() { let path = PathBuf::from("/Users/José/project/src/main.rs"); let uri = path_to_lsp_uri(&path).unwrap(); assert!(uri.as_str().starts_with("file:///Users/Jos%")); } #[test] fn test_path_to_lsp_uri_encodes_hash() { let path = PathBuf::from("/Users/test/my#project/src/main.rs"); let uri = path_to_lsp_uri(&path).unwrap(); assert_eq!(uri.as_str(), "file:///Users/test/my%23project/src/main.rs"); } #[test] fn test_roundtrip_path_to_uri_to_path() { let original_path = PathBuf::from("/Users/test/project/src/main.rs"); let uri = path_to_lsp_uri(&original_path).unwrap(); let roundtrip_path = lsp_uri_to_path(&uri).unwrap(); assert_eq!(original_path, roundtrip_path); } #[test] fn test_roundtrip_non_ascii_path() { let original_path = PathBuf::from("/Users/관리자/project/src/main.rs"); let uri = path_to_lsp_uri(&original_path).unwrap(); let roundtrip_path = lsp_uri_to_path(&uri).unwrap(); assert_eq!(original_path, roundtrip_path); } #[test] fn test_roundtrip_path_with_spaces() { let original_path = PathBuf::from("/Users/test/My Project/src/main.rs"); let uri = path_to_lsp_uri(&original_path).unwrap(); let roundtrip_path = lsp_uri_to_path(&uri).unwrap(); assert_eq!(original_path, roundtrip_path); } #[test] fn test_path_to_lsp_uri_encodes_brackets() { let path = PathBuf::from("/Users/test/routes/blog/[slug].tsx"); let uri = path_to_lsp_uri(&path).unwrap(); assert_eq!( uri.as_str(), "file:///Users/test/routes/blog/%5Bslug%5D.tsx" ); } #[test] fn test_roundtrip_path_with_brackets() { let original_path = PathBuf::from("/Users/test/routes/[id]/[slug].tsx"); let uri = path_to_lsp_uri(&original_path).unwrap(); let roundtrip_path = lsp_uri_to_path(&uri).unwrap(); assert_eq!(original_path, roundtrip_path); } } // Windows-specific tests use Windows paths #[cfg(windows)] mod windows_tests { #[test] fn test_lsp_uri_to_path_basic() { let uri: Uri = "file:///C:/Users/test/project/src/main.rs".parse().unwrap(); let path = lsp_uri_to_path(&uri).unwrap(); assert_eq!( path, PathBuf::from("C:\\Users\\test\\project\\src\\main.rs") ); } #[test] fn test_lsp_uri_to_path_decodes_at_symbol() { // %40 is the URL encoding for @ let uri: Uri = "file:///C:/Users/test/node_modules/%40firebase/auth/dist/index.d.ts" .parse() .unwrap(); let path = lsp_uri_to_path(&uri).unwrap(); assert_eq!( path, PathBuf::from("C:\\Users\\test\\node_modules\\@firebase\\auth\\dist\\index.d.ts") ); } #[test] fn test_lsp_uri_to_path_decodes_spaces() { // %20 is the URL encoding for space let uri: Uri = "file:///C:/Users/test/My%20Project/src/main.rs" .parse() .unwrap(); let path = lsp_uri_to_path(&uri).unwrap(); assert_eq!( path, PathBuf::from("C:\\Users\\test\\My Project\\src\\main.rs") ); } #[test] fn test_lsp_uri_to_path_decodes_multiple_special_chars() { // Test multiple encoded characters: @ (%40), space (%20), # (%23) let uri: Uri = "file:///C:/Users/test/%40scope/my%20package%23v1/index.ts" .parse() .unwrap(); let path = lsp_uri_to_path(&uri).unwrap(); assert_eq!( path, PathBuf::from("C:\\Users\\test\\@scope\\my package#v1\\index.ts") ); } #[test] fn test_path_to_lsp_uri_basic() { let path = PathBuf::from("C:\\Users\\test\\project\\src\\main.rs"); let uri = path_to_lsp_uri(&path).unwrap(); assert_eq!(uri.as_str(), "file:///C:/Users/test/project/src/main.rs"); } #[test] fn test_roundtrip_path_to_uri_to_path() { let original_path = PathBuf::from("C:\\Users\\test\\project\\src\\main.rs"); let uri = path_to_lsp_uri(&original_path).unwrap(); let roundtrip_path = lsp_uri_to_path(&uri).unwrap(); assert_eq!(original_path, roundtrip_path); } } // Platform-independent tests #[test] fn test_lsp_uri_to_path_rejects_non_file_uri() { let uri: Uri = "https://example.com/path".parse().unwrap(); let result = lsp_uri_to_path(&uri); assert!(result.is_err()); assert!(result.unwrap_err().to_string().contains("Invalid file URI")); } #[test] fn test_path_to_lsp_uri_rejects_relative_path() { let path = PathBuf::from("relative/path/file.rs"); let result = path_to_lsp_uri(&path); assert!(result.is_err()); assert!(result.unwrap_err().to_string().contains("must be absolute")); }