commit aab03a3774f2ca1b9b038e557fe8c660a6a0ae5c Author: David Fifield david@bamsoftware.com Date: Sat Dec 7 01:40:12 2013 -0800
Args interface. --- args.go | 25 +++++++++++++++++++++++++ args_test.go | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+)
diff --git a/args.go b/args.go new file mode 100644 index 0000000..6c8fb86 --- /dev/null +++ b/args.go @@ -0,0 +1,25 @@ +package pt + +// Key–value mappings for the representation of client and server options. + +// Args maps a string key to a list of values. It is similar to url.Values. +type Args map[string][]string + +// Get the first value associated with the given key. If there are any value +// associated with the key, the ok return value is true; otherwise it is false. +// If you need access to multiple values, use the map directly. +func (args Args) Get(key string) (value string, ok bool) { + if args == nil { + return "", false + } + vals, ok := args[key] + if !ok || len(vals) == 0 { + return "", false + } + return vals[0], true +} + +// Append value to the list of values for key. +func (args Args) Add(key, value string) { + args[key] = append(args[key], value) +} diff --git a/args_test.go b/args_test.go new file mode 100644 index 0000000..c89cef3 --- /dev/null +++ b/args_test.go @@ -0,0 +1,57 @@ +package pt + +import ( + "testing" +) + +func TestArgsGet(t *testing.T) { + args := Args{ + "a": []string{}, + "b": []string{"value"}, + "c": []string{"v1", "v2", "v3"}, + } + + var v string + var ok bool + v, ok = args.Get("a") + if ok { + t.Errorf("Unexpected Get success for %q", "a") + } + v, ok = args.Get("b") + if !ok { + t.Errorf("Unexpected Get failure for %q", "b") + } + if v != "value" { + t.Errorf("Get(%q) → %q (expected %q)", "b", v, "value") + } + v, ok = args.Get("c") + if !ok { + t.Errorf("Unexpected Get failure for %q", "c") + } + if v != "v1" { + t.Errorf("Get(%q) → %q (expected %q)", "c", v, "v1") + } + v, ok = args.Get("d") + if ok { + t.Errorf("Unexpected Get success for %q", "d") + } +} + +func TestArgsAdd(t *testing.T) { + args := make(Args) + if !argsEqual(args, Args{}) { + t.Error() + } + args.Add("k1", "v1") + if !argsEqual(args, Args{"k1": []string{"v1"}}) { + t.Error() + } + args.Add("k2", "v2") + if !argsEqual(args, Args{"k1": []string{"v1"}, "k2": []string{"v2"}}) { + t.Error() + } + args.Add("k1", "v3") + if !argsEqual(args, Args{"k1": []string{"v1", "v3"}, "k2": []string{"v2"}}) { + t.Error() + } +}
tor-commits@lists.torproject.org