@@ -262,3 +262,254 @@ impl Display for EditableConfig {
262262 }
263263 }
264264}
265+ #[ cfg( test) ]
266+ mod tests {
267+ use super :: * ;
268+ use std:: { collections:: HashMap } ;
269+
270+ fn config_buffer_instance ( ) -> HashMap < EditableConfig , String > {
271+ let mut config_buffer = HashMap :: new ( ) ;
272+ config_buffer. insert ( EditableConfig :: PageSize , "20" . into ( ) ) ;
273+ config_buffer. insert (
274+ EditableConfig :: CacheDir ,
275+ std:: env:: temp_dir ( ) . to_string_lossy ( ) . into ( ) ,
276+ ) ;
277+ config_buffer. insert (
278+ EditableConfig :: DataDir ,
279+ std:: env:: temp_dir ( ) . to_string_lossy ( ) . into ( ) ,
280+ ) ;
281+ config_buffer. insert ( EditableConfig :: GitSendEmailOpt , "--x" . into ( ) ) ;
282+ config_buffer. insert ( EditableConfig :: GitAmOpt , "--y" . into ( ) ) ;
283+ config_buffer. insert ( EditableConfig :: PatchRenderer , "bat" . into ( ) ) ;
284+ config_buffer. insert ( EditableConfig :: CoverRenderer , "bat" . into ( ) ) ;
285+ config_buffer. insert ( EditableConfig :: MaxLogAge , "7" . into ( ) ) ;
286+ config_buffer
287+ }
288+
289+ fn instance_from_config_buffer ( config_buffer : HashMap < EditableConfig , String > ) -> EditConfig {
290+ EditConfig {
291+ config_buffer,
292+ highlighted : 0 ,
293+ is_editing : false ,
294+ curr_edit : String :: new ( ) ,
295+ }
296+ }
297+
298+ #[ test]
299+ fn test_initial_values_loaded_correctly ( ) {
300+ let config = config_buffer_instance ( ) ;
301+ let config_len = config. len ( ) ;
302+ let edit = instance_from_config_buffer ( config) ;
303+
304+ assert_eq ! ( edit. config_count( ) , config_len) ;
305+
306+ let ( name, value) = edit
307+ . config ( 0 )
308+ . expect ( "Deve haver uma configuração no índice 0" ) ;
309+
310+ assert_eq ! ( name, "Page Size" ) ;
311+ assert_eq ! ( value, "20" ) ;
312+ }
313+
314+ #[ test]
315+ fn test_highlight_next_within_bounds ( ) {
316+ let config = config_buffer_instance ( ) ;
317+ let mut edit = instance_from_config_buffer ( config) ;
318+
319+ assert_eq ! ( edit. highlighted( ) , 0 ) ;
320+
321+ edit. highlight_next ( ) ;
322+ assert_eq ! ( edit. highlighted( ) , 1 ) ;
323+
324+ edit. highlight_next ( ) ;
325+ assert_eq ! ( edit. highlighted( ) , 2 ) ;
326+ }
327+
328+ #[ test]
329+ fn test_highlight_next_stops_at_last ( ) {
330+ let config = config_buffer_instance ( ) ;
331+ let mut edit = instance_from_config_buffer ( config) ;
332+
333+ let last_index = edit. config_count ( ) - 1 ;
334+
335+ edit. highlighted = last_index;
336+
337+ edit. highlight_next ( ) ;
338+
339+ assert_eq ! ( edit. highlighted( ) , last_index) ;
340+ }
341+
342+ #[ test]
343+ fn test_highlight_prev_within_bounds ( ) {
344+ let config = config_buffer_instance ( ) ;
345+ let mut edit = instance_from_config_buffer ( config) ;
346+
347+ edit. highlight_next ( ) ;
348+ edit. highlight_next ( ) ;
349+
350+ assert_eq ! ( edit. highlighted( ) , 2 ) ;
351+
352+ edit. highlight_prev ( ) ;
353+ assert_eq ! ( edit. highlighted( ) , 1 ) ;
354+
355+ edit. highlight_prev ( ) ;
356+ assert_eq ! ( edit. highlighted( ) , 0 ) ;
357+ }
358+
359+ #[ test]
360+ fn test_highlight_prev_stops_at_zero ( ) {
361+ let config = config_buffer_instance ( ) ;
362+ let mut edit = instance_from_config_buffer ( config) ;
363+
364+ edit. highlighted = 0 ;
365+
366+ assert_eq ! ( edit. highlighted( ) , 0 ) ;
367+
368+ edit. highlight_prev ( ) ;
369+
370+ assert_eq ! ( edit. highlighted( ) , 0 ) ;
371+ }
372+
373+ #[ test]
374+ fn test_append_edit ( ) {
375+ let config = config_buffer_instance ( ) ;
376+ let mut edit = instance_from_config_buffer ( config) ;
377+
378+ edit. is_editing = true ;
379+ edit. curr_edit . clear ( ) ;
380+
381+ edit. append_edit ( 'a' ) ;
382+ edit. append_edit ( 'b' ) ;
383+ edit. append_edit ( 'c' ) ;
384+ assert_eq ! ( edit. curr_edit, "abc" ) ;
385+ edit. append_edit ( 'ç' ) ;
386+ assert_eq ! ( edit. curr_edit, "abcç" ) ;
387+ }
388+
389+ #[ test]
390+ fn test_backspace_edit ( ) {
391+ let config = config_buffer_instance ( ) ;
392+ let mut edit = instance_from_config_buffer ( config) ;
393+
394+ edit. is_editing = true ;
395+
396+ edit. curr_edit . clear ( ) ;
397+
398+ edit. curr_edit = "abc" . into ( ) ;
399+ edit. backspace_edit ( ) ;
400+ assert_eq ! ( edit. curr_edit, "ab" ) ;
401+ edit. backspace_edit ( ) ;
402+ assert_eq ! ( edit. curr_edit, "a" ) ;
403+ edit. backspace_edit ( ) ;
404+ assert_eq ! ( edit. curr_edit, "" ) ;
405+ edit. backspace_edit ( ) ;
406+ assert_eq ! ( edit. curr_edit, "" ) ;
407+ }
408+
409+ #[ test]
410+ fn test_clear_edit ( ) {
411+ let mut edit = instance_from_config_buffer ( config_buffer_instance ( ) ) ;
412+
413+ edit. is_editing = true ;
414+
415+ assert ! ( edit. curr_edit( ) . is_empty( ) ) ;
416+ edit. clear_edit ( ) ;
417+ assert ! ( edit. curr_edit( ) . is_empty( ) ) ;
418+
419+ edit. curr_edit = "abc" . to_string ( ) ;
420+ assert_eq ! ( edit. curr_edit( ) , "abc" ) ;
421+
422+ edit. clear_edit ( ) ;
423+ assert ! ( edit. curr_edit( ) . is_empty( ) ) ;
424+ }
425+
426+ #[ test]
427+ fn test_toggle_editing_twice ( ) {
428+ let config = config_buffer_instance ( ) ;
429+ let mut edit = instance_from_config_buffer ( config) ;
430+
431+ assert ! ( !edit. is_editing) ;
432+
433+ let ( _, initial_val) = edit. config ( edit. highlighted ( ) ) . unwrap ( ) ;
434+
435+ edit. toggle_editing ( ) ;
436+ assert ! ( edit. is_editing) ;
437+ assert_eq ! ( * edit. curr_edit( ) , initial_val) ;
438+
439+ edit. toggle_editing ( ) ;
440+ assert ! ( !edit. is_editing) ;
441+ assert_eq ! ( * edit. curr_edit( ) , initial_val) ;
442+ }
443+
444+ #[ test]
445+ fn test_stage_edit_updates_value ( ) {
446+ let mut edit = instance_from_config_buffer ( config_buffer_instance ( ) ) ;
447+
448+ edit. is_editing = true ;
449+
450+ edit. clear_edit ( ) ;
451+ edit. append_edit ( '4' ) ;
452+ edit. append_edit ( '2' ) ;
453+ assert_eq ! ( edit. curr_edit( ) , "42" ) ;
454+
455+ edit. stage_edit ( ) ;
456+
457+ let ( _, value) = edit. config ( 0 ) . unwrap ( ) ;
458+ assert_eq ! ( value, "42" ) ;
459+ }
460+
461+ #[ test]
462+ fn test_page_size_parsing ( ) {
463+ let mut edit = instance_from_config_buffer ( config_buffer_instance ( ) ) ;
464+
465+ edit. config_buffer . insert ( EditableConfig :: PageSize , "50" . to_string ( ) ) ;
466+
467+ assert_eq ! ( edit. page_size( ) . unwrap( ) , 50 ) ;
468+ }
469+
470+ #[ test]
471+ fn test_page_size_invalid ( ) {
472+ let mut edit = instance_from_config_buffer ( config_buffer_instance ( ) ) ;
473+
474+ edit. config_buffer . insert ( EditableConfig :: PageSize , "x" . to_string ( ) ) ;
475+
476+ assert ! ( edit. page_size( ) . is_err( ) ) ;
477+ }
478+
479+ #[ test]
480+ fn test_cache_dir_valid ( ) {
481+ let mut edit = instance_from_config_buffer ( config_buffer_instance ( ) ) ;
482+
483+ edit. config_buffer . insert ( EditableConfig :: CacheDir , "/tmp/cache" . into ( ) ) ;
484+
485+ assert ! ( edit. cache_dir( ) . is_ok( ) ) ;
486+ }
487+
488+ #[ test]
489+ fn test_data_dir_valid ( ) {
490+ let mut edit = instance_from_config_buffer ( config_buffer_instance ( ) ) ;
491+
492+ edit. config_buffer . insert ( EditableConfig :: DataDir , "/tmp/data" . into ( ) ) ;
493+
494+ assert ! ( edit. data_dir( ) . is_ok( ) ) ;
495+ }
496+
497+ #[ test]
498+ fn test_max_log_age_parsing ( ) {
499+ let mut edit = instance_from_config_buffer ( config_buffer_instance ( ) ) ;
500+
501+ edit. config_buffer . insert ( EditableConfig :: MaxLogAge , "99" . to_string ( ) ) ;
502+
503+ assert_eq ! ( edit. max_log_age( ) . unwrap( ) , 99 ) ;
504+ }
505+
506+
507+ #[ test]
508+ fn test_try_from_valid_index ( ) {
509+ for i in 0 ..=7 {
510+ assert ! ( EditableConfig :: try_from( i) . is_ok( ) ) ;
511+ }
512+
513+ assert ! ( EditableConfig :: try_from( 8 ) . is_err( ) ) ;
514+ }
515+ }
0 commit comments