command_test.go 3.21 KB
Newer Older
1 2 3 4 5
package commands

import "testing"

func TestOptionValidation(t *testing.T) {
Matt Bell's avatar
Matt Bell committed
6 7 8 9 10 11 12 13
	cmd := Command{
		Options: []Option{
			Option{[]string{"b", "beep"}, Int},
			Option{[]string{"B", "boop"}, String},
		},
		f: func(req *Request, res *Response) {},
	}

Matt Bell's avatar
Matt Bell committed
14
	req := NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
15
	req.options["foo"] = 5
16
	res := cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
17
	if res.Error == nil {
Matt Bell's avatar
Matt Bell committed
18
		t.Error("Should have failed (unrecognized option)")
Matt Bell's avatar
Matt Bell committed
19 20
	}

Matt Bell's avatar
Matt Bell committed
21
	req = NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
22 23
	req.options["beep"] = 5
	req.options["b"] = 10
24
	res = cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
25 26 27 28
	if res.Error == nil {
		t.Error("Should have failed (duplicate options)")
	}

Matt Bell's avatar
Matt Bell committed
29
	req = NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
30
	req.options["beep"] = "foo"
31
	res = cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
32 33 34 35
	if res.Error == nil {
		t.Error("Should have failed (incorrect type)")
	}

Matt Bell's avatar
Matt Bell committed
36
	req = NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
37
	req.options["beep"] = 5
38
	res = cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
39
	if res.Error != nil {
Matt Bell's avatar
Matt Bell committed
40
		t.Error(res.Error, "Should have passed")
Matt Bell's avatar
Matt Bell committed
41 42
	}

Matt Bell's avatar
Matt Bell committed
43
	req = NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
44 45
	req.options["beep"] = 5
	req.options["boop"] = "test"
46
	res = cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
47 48 49 50
	if res.Error != nil {
		t.Error("Should have passed")
	}

Matt Bell's avatar
Matt Bell committed
51
	req = NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
52 53
	req.options["b"] = 5
	req.options["B"] = "test"
54
	res = cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
55 56 57 58
	if res.Error != nil {
		t.Error("Should have passed")
	}

Matt Bell's avatar
Matt Bell committed
59
	req = NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
60
	req.options["enc"] = "json"
61
	res = cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
62 63 64
	if res.Error != nil {
		t.Error("Should have passed")
	}
65

Matt Bell's avatar
Matt Bell committed
66
	req = NewEmptyRequest()
67 68 69 70 71 72
	req.options["b"] = "100"
	res = cmd.Call(req)
	if res.Error != nil {
		t.Error("Should have passed")
	}

Matt Bell's avatar
Matt Bell committed
73
	req = NewEmptyRequest()
74 75 76 77 78
	req.options["b"] = ":)"
	res = cmd.Call(req)
	if res.Error == nil {
		t.Error(res.Error, "Should have failed (string value not convertible to int)")
	}
79
}
80 81

func TestRegistration(t *testing.T) {
Matt Bell's avatar
Matt Bell committed
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
	cmds := []*Command{
		&Command{
			Options: []Option{
				Option{[]string{"beep"}, Int},
			},
			f: func(req *Request, res *Response) {},
		},

		&Command{
			Options: []Option{
				Option{[]string{"boop"}, Int},
			},
			f: func(req *Request, res *Response) {},
		},

		&Command{
			Options: []Option{
				Option{[]string{"boop"}, String},
			},
			f: func(req *Request, res *Response) {},
		},

		&Command{
			Options: []Option{
				Option{[]string{"bop"}, String},
			},
			f: func(req *Request, res *Response) {},
		},

		&Command{
			Options: []Option{
				Option{[]string{"enc"}, String},
			},
			f: func(req *Request, res *Response) {},
		},
	}

	err := cmds[0].Register("foo", cmds[1])
	if err != nil {
		t.Error("Should have passed")
	}

	err = cmds[0].Register("bar", cmds[2])
	if err == nil {
		t.Error("Should have failed (option name collision)")
	}

	err = cmds[0].Register("foo", cmds[3])
	if err == nil {
		t.Error("Should have failed (subcommand name collision)")
	}

	err = cmds[0].Register("baz", cmds[4])
	if err == nil {
		t.Error("Should have failed (option name collision with global options)")
	}
138
}
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159

func TestResolving(t *testing.T) {
	cmd := &Command{}
	cmdA := &Command{}
	cmdB := &Command{}
	cmdB2 := &Command{}
	cmdC := &Command{}

	cmd.Register("a", cmdA)
	cmdA.Register("B", cmdB2)
	cmdA.Register("b", cmdB)
	cmdB.Register("c", cmdC)

	cmds, err := cmd.Resolve([]string{"a","b","c"})
	if err != nil {
		t.Error(err)
	}
	if len(cmds) != 4 || cmds[0] != cmd || cmds[1] != cmdA || cmds[2] != cmdB || cmds[3] != cmdC {
		t.Error("Returned command path is different than expected", cmds)
	}
}