@@ -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