diff --git a/session/command_handler_test.go b/session/command_handler_test.go new file mode 100644 index 00000000..be546800 --- /dev/null +++ b/session/command_handler_test.go @@ -0,0 +1,57 @@ +package session + +import ( + "testing" +) + +func sameStrings(a []string, b []string) bool { + if len(a) != len(b) { + return false + } + for i, v := range a { + if v != b[i] { + return false + } + } + return true +} + +func assertPanic(t *testing.T, msg string, f func()) { + defer func() { + if r := recover(); r == nil { + t.Fatal(msg) + } + }() + f() +} + +func TestSessionCommandHandler(t *testing.T) { + var units = []struct { + expr string + panic bool + parsed []string + }{ + {"notvali(d", true, nil}, + {`simple\s+(\d+)`, false, []string{"123"}}, + } + + for _, u := range units { + if u.panic { + assertPanic(t, "", func() { + _ = NewCommandHandler("", u.expr, "", nil) + }) + } else { + c := NewCommandHandler("", u.expr, "", nil) + shouldNotParse := "simple123" + shouldParse := "simple 123" + + if parsed, parts := c.Parse(shouldNotParse); parsed { + t.Fatalf("should not parse '%s'", shouldNotParse) + } else if parsed, parts = c.Parse(shouldParse); !parsed { + t.Fatalf("should parse '%s'", shouldParse) + } else if !sameStrings(parts, u.parsed) { + t.Fatalf("expected '%v', got '%v'", u.parsed, parts) + } + } + } +} diff --git a/session/environment.go b/session/environment.go index e50dcc54..ea3a7e1d 100644 --- a/session/environment.go +++ b/session/environment.go @@ -15,20 +15,16 @@ type SetCallback func(newValue string) type Environment struct { sync.Mutex - - Padding int `json:"-"` - Data map[string]string `json:"data"` - + Data map[string]string `json:"data"` cbs map[string]SetCallback sess *Session } func NewEnvironment(s *Session, envFile string) *Environment { env := &Environment{ - Padding: 0, - Data: make(map[string]string), - sess: s, - cbs: make(map[string]SetCallback), + Data: make(map[string]string), + sess: s, + cbs: make(map[string]SetCallback), } if envFile != "" { @@ -101,11 +97,6 @@ func (env *Environment) Set(name, value string) string { env.sess.Events.Log(core.DEBUG, "env.change: %s -> '%s'", name, value) - width := len(name) - if width > env.Padding { - env.Padding = width - } - return old } diff --git a/session/session_core_handlers.go b/session/session_core_handlers.go index de2b2d67..05c281a8 100644 --- a/session/session_core_handlers.go +++ b/session/session_core_handlers.go @@ -161,7 +161,17 @@ func (s *Session) getHandler(args []string, sess *Session) error { fmt.Println() last := len(key) - 1 prefix := key[:last] - for _, k := range s.Env.Sorted() { + sortedKeys := s.Env.Sorted() + padding := 0 + + for _, k := range sortedKeys { + l := len(k) + if l > padding { + padding = l + } + } + + for _, k := range sortedKeys { if strings.HasPrefix(k, prefix) { ns := "" toks := strings.Split(k, ".") @@ -174,7 +184,7 @@ func (s *Session) getHandler(args []string, sess *Session) error { prev_ns = ns } - fmt.Printf(" %"+strconv.Itoa(s.Env.Padding)+"s: '%s'\n", k, s.Env.Data[k]) + fmt.Printf(" %"+strconv.Itoa(padding)+"s: '%s'\n", k, s.Env.Data[k]) } } fmt.Println()