@@ -186,3 +186,150 @@ fn parse_prompt(line: &str) -> Option<String> {
186186 }
187187 None
188188}
189+
190+ #[cfg(test)]
191+ mod tests {
192+ use super::*;
193+ use std::io::Write;
194+ use tempfile::tempdir;
195+
196+ #[test]
197+ fn test_parse_version_standard() {
198+ let line = "version = 3.11.4";
199+ let result = parse_version(line, &VERSION);
200+ assert!(result.is_some());
201+ let (ver, major, minor) = result.unwrap();
202+ assert_eq!(ver, "3.11.4");
203+ assert_eq!(major, 3);
204+ assert_eq!(minor, 11);
205+ }
206+
207+ #[test]
208+ fn test_parse_version_info() {
209+ let line = "version_info = 3.12.0.final";
210+ let result = parse_version(line, &VERSION_INFO);
211+ assert!(result.is_some());
212+ let (ver, major, minor) = result.unwrap();
213+ assert_eq!(ver, "3.12.0.final");
214+ assert_eq!(major, 3);
215+ assert_eq!(minor, 12);
216+ }
217+
218+ #[test]
219+ fn test_parse_version_no_match() {
220+ let line = "home = /usr/bin/python";
221+ let result = parse_version(line, &VERSION);
222+ assert!(result.is_none());
223+ }
224+
225+ #[test]
226+ fn test_parse_prompt_double_quotes() {
227+ let line = r#"prompt = "my-env""#;
228+ let result = parse_prompt(line);
229+ assert_eq!(result, Some("my-env".to_string()));
230+ }
231+
232+ #[test]
233+ fn test_parse_prompt_single_quotes() {
234+ let line = "prompt = 'my-env'";
235+ let result = parse_prompt(line);
236+ assert_eq!(result, Some("my-env".to_string()));
237+ }
238+
239+ #[test]
240+ fn test_parse_prompt_no_quotes() {
241+ let line = "prompt = my-venv";
242+ let result = parse_prompt(line);
243+ assert_eq!(result, Some("my-venv".to_string()));
244+ }
245+
246+ #[test]
247+ fn test_parse_prompt_with_spaces() {
248+ let line = "prompt = my-venv ";
249+ let result = parse_prompt(line);
250+ assert_eq!(result, Some("my-venv".to_string()));
251+ }
252+
253+ #[test]
254+ fn test_parse_prompt_empty_value() {
255+ let line = "prompt = ";
256+ let result = parse_prompt(line);
257+ assert!(result.is_none());
258+ }
259+
260+ #[test]
261+ fn test_parse_prompt_not_prompt_line() {
262+ let line = "home = /usr/bin/python";
263+ let result = parse_prompt(line);
264+ assert!(result.is_none());
265+ }
266+
267+ #[test]
268+ fn test_pyvenv_cfg_find_in_directory() {
269+ let dir = tempdir().unwrap();
270+ let cfg_path = dir.path().join("pyvenv.cfg");
271+ let mut file = fs::File::create(&cfg_path).unwrap();
272+ writeln!(file, "version = 3.11.4").unwrap();
273+ writeln!(file, "prompt = test-env").unwrap();
274+
275+ let result = PyVenvCfg::find(dir.path());
276+ assert!(result.is_some());
277+ let cfg = result.unwrap();
278+ assert_eq!(cfg.version, "3.11.4");
279+ assert_eq!(cfg.version_major, 3);
280+ assert_eq!(cfg.version_minor, 11);
281+ assert_eq!(cfg.prompt, Some("test-env".to_string()));
282+ }
283+
284+ #[test]
285+ fn test_pyvenv_cfg_find_from_bin() {
286+ let dir = tempdir().unwrap();
287+ let bin_dir = dir.path().join("bin");
288+ fs::create_dir_all(&bin_dir).unwrap();
289+
290+ let cfg_path = dir.path().join("pyvenv.cfg");
291+ let mut file = fs::File::create(&cfg_path).unwrap();
292+ writeln!(file, "version = 3.10.0").unwrap();
293+
294+ let result = PyVenvCfg::find(&bin_dir);
295+ assert!(result.is_some());
296+ let cfg = result.unwrap();
297+ assert_eq!(cfg.version, "3.10.0");
298+ assert_eq!(cfg.version_major, 3);
299+ assert_eq!(cfg.version_minor, 10);
300+ }
301+
302+ #[test]
303+ fn test_pyvenv_cfg_not_found() {
304+ let dir = tempdir().unwrap();
305+ let result = PyVenvCfg::find(dir.path());
306+ assert!(result.is_none());
307+ }
308+
309+ #[test]
310+ fn test_pyvenv_cfg_missing_version() {
311+ let dir = tempdir().unwrap();
312+ let cfg_path = dir.path().join("pyvenv.cfg");
313+ let mut file = fs::File::create(&cfg_path).unwrap();
314+ writeln!(file, "home = /usr/bin/python").unwrap();
315+ writeln!(file, "prompt = my-env").unwrap();
316+
317+ let result = PyVenvCfg::find(dir.path());
318+ assert!(result.is_none()); // Version is required
319+ }
320+
321+ #[test]
322+ fn test_pyvenv_cfg_version_info_format() {
323+ let dir = tempdir().unwrap();
324+ let cfg_path = dir.path().join("pyvenv.cfg");
325+ let mut file = fs::File::create(&cfg_path).unwrap();
326+ writeln!(file, "version_info = 3.12.1.final.0").unwrap();
327+
328+ let result = PyVenvCfg::find(dir.path());
329+ assert!(result.is_some());
330+ let cfg = result.unwrap();
331+ assert_eq!(cfg.version, "3.12.1.final.0");
332+ assert_eq!(cfg.version_major, 3);
333+ assert_eq!(cfg.version_minor, 12);
334+ }
335+ }
0 commit comments