@@ -13,6 +13,7 @@ import (
1313
1414 "github.com/charmbracelet/bubbles/viewport"
1515 tea "github.com/charmbracelet/bubbletea"
16+ "github.com/charmbracelet/lipgloss"
1617 "github.com/chojs23/ec/internal/cli"
1718 "github.com/chojs23/ec/internal/engine"
1819 "github.com/chojs23/ec/internal/gitmerge"
@@ -412,6 +413,43 @@ func TestFormatLabel(t *testing.T) {
412413 }
413414}
414415
416+ func TestRenderPaneTitleFitsPaneWidth (t * testing.T ) {
417+ title := "OURS (/var/folders/n5/10r8gvt52mq58dpz62c7_jt00000gn/T/ec-local-766054358)"
418+ paneWidth := 34
419+
420+ got := renderPaneTitle (title , paneWidth , titleStyle )
421+ if lipgloss .Width (got ) > paneWidth {
422+ t .Fatalf ("renderPaneTitle width = %d, want <= %d" , lipgloss .Width (got ), paneWidth )
423+ }
424+ if ! strings .Contains (got , "..." ) {
425+ t .Fatalf ("expected truncated title with ellipsis, got %q" , got )
426+ }
427+ }
428+
429+ func TestRenderPaneTitleHandlesVeryNarrowPane (t * testing.T ) {
430+ got := renderPaneTitle ("OURS (HEAD)" , 1 , titleStyle )
431+ if lipgloss .Width (got ) > 1 {
432+ t .Fatalf ("renderPaneTitle width = %d, want <= 1" , lipgloss .Width (got ))
433+ }
434+ }
435+
436+ func TestRenderResultPaneTitleFitsPaneWidth (t * testing.T ) {
437+ got := renderResultPaneTitle ("Resolved (manual)" , 18 , resultTitleStyle , statusResolvedStyle )
438+ if lipgloss .Width (got ) > 18 {
439+ t .Fatalf ("renderResultPaneTitle width = %d, want <= 18" , lipgloss .Width (got ))
440+ }
441+ if ! strings .Contains (got , "..." ) {
442+ t .Fatalf ("expected truncated title with ellipsis, got %q" , got )
443+ }
444+ }
445+
446+ func TestRenderResultPaneTitleKeepsStatusWhenWide (t * testing.T ) {
447+ got := renderResultPaneTitle ("Unresolved" , 50 , resultTitleStyle , statusUnresolvedStyle )
448+ if ! strings .Contains (got , "RESULT (Unresolved)" ) {
449+ t .Fatalf ("expected full result status title, got %q" , got )
450+ }
451+ }
452+
415453func TestFirstHexRun (t * testing.T ) {
416454 start , end := firstHexRun ("x1234567y" )
417455 if start != 1 || end != 8 {
@@ -530,9 +568,9 @@ func TestModelViewShowsBranchLabels(t *testing.T) {
530568 {OursLabel : "HEAD" , TheirsLabel : "feature/add-auth" },
531569 },
532570 manualResolved : map [int ][]byte {},
533- viewportOurs : viewport .New (10 , 5 ),
534- viewportResult : viewport .New (10 , 5 ),
535- viewportTheirs : viewport .New (10 , 5 ),
571+ viewportOurs : viewport .New (40 , 5 ),
572+ viewportResult : viewport .New (40 , 5 ),
573+ viewportTheirs : viewport .New (40 , 5 ),
536574 width : 120 ,
537575 height : 20 ,
538576 }
@@ -547,6 +585,41 @@ func TestModelViewShowsBranchLabels(t *testing.T) {
547585 }
548586}
549587
588+ func TestModelViewTruncatesLongBranchLabels (t * testing.T ) {
589+ doc := parseSingleConflictDoc (t )
590+ state , err := engine .NewState (doc )
591+ if err != nil {
592+ t .Fatalf ("NewState error = %v" , err )
593+ }
594+ longLabel := "/var/folders/n5/10r8gvt52mq58dpz62c7_jt00000gn/T/ec-local-766054358"
595+ m := model {
596+ ready : true ,
597+ opts : cliOptionsWithMergedPath ("merged.txt" ),
598+ state : state ,
599+ doc : doc ,
600+ currentConflict : 0 ,
601+ selectedSide : selectedOurs ,
602+ mergedLabels : []conflictLabels {
603+ {OursLabel : longLabel , TheirsLabel : longLabel },
604+ },
605+ manualResolved : map [int ][]byte {},
606+ viewportOurs : viewport .New (10 , 5 ),
607+ viewportResult : viewport .New (10 , 5 ),
608+ viewportTheirs : viewport .New (10 , 5 ),
609+ width : 90 ,
610+ height : 20 ,
611+ }
612+ m .updateViewports ()
613+
614+ view := m .View ()
615+ if strings .Contains (view , longLabel ) {
616+ t .Fatalf ("expected long labels to be truncated, got:\n %s" , view )
617+ }
618+ if ! strings .Contains (view , "..." ) {
619+ t .Fatalf ("expected truncated labels with ellipsis, got:\n %s" , view )
620+ }
621+ }
622+
550623func TestModelViewNoLabelsWithoutMergedLabels (t * testing.T ) {
551624 doc := parseSingleConflictDoc (t )
552625 state , err := engine .NewState (doc )
0 commit comments