diff --git a/tmux/formater.go b/tmux/formater.go index 76eea97..ec246f9 100644 --- a/tmux/formater.go +++ b/tmux/formater.go @@ -306,11 +306,11 @@ func (f *Formater) formatFlag(style, symbol string, count int) string { func (f *Formater) flags() string { var flags []string if f.st.IsClean { - if f.st.NumStashed != 0 { + if f.st.NumStashed != 0 && f.Symbols.Stashed != "" { flags = append(flags, f.formatFlag(f.Styles.Stashed, f.Symbols.Stashed, f.st.NumStashed)) } - if !f.Options.HideClean { + if !f.Options.HideClean && f.Symbols.Clean != "" { flags = append(flags, fmt.Sprintf("%s%s", f.Styles.Clean, f.Symbols.Clean)) } @@ -319,23 +319,23 @@ func (f *Formater) flags() string { } } - if f.st.NumStaged != 0 { + if f.st.NumStaged != 0 && f.Symbols.Staged != "" { flags = append(flags, f.formatFlag(f.Styles.Staged, f.Symbols.Staged, f.st.NumStaged)) } - if f.st.NumConflicts != 0 { + if f.st.NumConflicts != 0 && f.Symbols.Conflict != "" { flags = append(flags, f.formatFlag(f.Styles.Conflict, f.Symbols.Conflict, f.st.NumConflicts)) } - if f.st.NumModified != 0 { + if f.st.NumModified != 0 && f.Symbols.Modified != "" { flags = append(flags, f.formatFlag(f.Styles.Modified, f.Symbols.Modified, f.st.NumModified)) } - if f.st.NumStashed != 0 { + if f.st.NumStashed != 0 && f.Symbols.Stashed != "" { flags = append(flags, f.formatFlag(f.Styles.Stashed, f.Symbols.Stashed, f.st.NumStashed)) } - if f.st.NumUntracked != 0 { + if f.st.NumUntracked != 0 && f.Symbols.Untracked != "" { flags = append(flags, f.formatFlag(f.Styles.Untracked, f.Symbols.Untracked, f.st.NumUntracked)) } diff --git a/tmux/formater_test.go b/tmux/formater_test.go index adeb759..6890740 100644 --- a/tmux/formater_test.go +++ b/tmux/formater_test.go @@ -979,6 +979,186 @@ func Test_stats(t *testing.T) { } } +func TestFlagsWithEmptySymbols(t *testing.T) { + tests := []struct { + name string + styles styles + symbols symbols + st *gitstatus.Status + want string + }{ + { + name: "empty stashed symbol hides stash count", + styles: styles{ + Clear: "StyleClear", + Modified: "StyleMod", + Stashed: "StyleStash", + }, + symbols: symbols{ + Modified: "SymbolMod", + Stashed: "", // empty symbol should hide this flag + }, + st: &gitstatus.Status{ + NumStashed: 5, + Porcelain: gitstatus.Porcelain{ + NumModified: 2, + }, + }, + want: "StyleClear" + "StyleModSymbolMod2", + }, + { + name: "empty modified symbol hides modified count", + styles: styles{ + Clear: "StyleClear", + Modified: "StyleMod", + Stashed: "StyleStash", + }, + symbols: symbols{ + Modified: "", // empty symbol should hide this flag + Stashed: "SymbolStash", + }, + st: &gitstatus.Status{ + NumStashed: 1, + Porcelain: gitstatus.Porcelain{ + NumModified: 2, + }, + }, + want: "StyleClear" + "StyleStashSymbolStash1", + }, + { + name: "empty staged symbol hides staged count", + styles: styles{ + Clear: "StyleClear", + Staged: "StyleStaged", + Stashed: "StyleStash", + }, + symbols: symbols{ + Staged: "", // empty symbol should hide this flag + Stashed: "SymbolStash", + }, + st: &gitstatus.Status{ + NumStashed: 1, + Porcelain: gitstatus.Porcelain{ + NumStaged: 3, + }, + }, + want: "StyleClear" + "StyleStashSymbolStash1", + }, + { + name: "empty untracked symbol hides untracked count", + styles: styles{ + Clear: "StyleClear", + Untracked: "StyleUntracked", + Stashed: "StyleStash", + }, + symbols: symbols{ + Untracked: "", // empty symbol should hide this flag + Stashed: "SymbolStash", + }, + st: &gitstatus.Status{ + NumStashed: 1, + Porcelain: gitstatus.Porcelain{ + NumUntracked: 7, + }, + }, + want: "StyleClear" + "StyleStashSymbolStash1", + }, + { + name: "empty conflict symbol hides conflict count", + styles: styles{ + Clear: "StyleClear", + Conflict: "StyleConflict", + Stashed: "StyleStash", + }, + symbols: symbols{ + Conflict: "", // empty symbol should hide this flag + Stashed: "SymbolStash", + }, + st: &gitstatus.Status{ + NumStashed: 1, + Porcelain: gitstatus.Porcelain{ + NumConflicts: 3, + }, + }, + want: "StyleClear" + "StyleStashSymbolStash1", + }, + { + name: "empty clean symbol hides clean flag", + styles: styles{ + Clear: "StyleClear", + Clean: "StyleClean", + Stashed: "StyleStash", + }, + symbols: symbols{ + Clean: "", // empty symbol should hide this flag + Stashed: "SymbolStash", + }, + st: &gitstatus.Status{ + IsClean: true, + NumStashed: 1, + }, + want: "StyleClear" + "StyleStashSymbolStash1", + }, + { + name: "empty stashed symbol in clean state hides stash count", + styles: styles{ + Clear: "StyleClear", + Clean: "StyleClean", + }, + symbols: symbols{ + Clean: "SymbolClean", + Stashed: "", // empty symbol should hide this flag + }, + st: &gitstatus.Status{ + IsClean: true, + NumStashed: 1, + }, + want: "StyleClear" + "StyleCleanSymbolClean", + }, + { + name: "all symbols empty shows nothing", + styles: styles{ + Clear: "StyleClear", + Clean: "StyleClean", + Staged: "StyleStaged", + Modified: "StyleMod", + Conflict: "StyleConflict", + Untracked: "StyleUntracked", + Stashed: "StyleStash", + }, + symbols: symbols{ + Clean: "", + Staged: "", + Modified: "", + Conflict: "", + Untracked: "", + Stashed: "", + }, + st: &gitstatus.Status{ + IsClean: false, + NumStashed: 1, + Porcelain: gitstatus.Porcelain{ + NumStaged: 3, + NumModified: 2, + NumConflicts: 1, + NumUntracked: 4, + }, + }, + want: "", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + f := &Formater{ + Config: Config{Styles: tt.styles, Symbols: tt.symbols}, + st: tt.st, + } + + compareStrings(t, tt.want, f.flags()) + }) + } +} + func compareStrings(t *testing.T, want, got string) { if got != want { t.Errorf(`