mirror of https://github.com/tidwall/tile38.git
Better coverage BOUNDS
This commit is contained in:
parent
d61f0bc6c8
commit
ef95f04aca
|
@ -17,27 +17,30 @@ import (
|
|||
"github.com/tidwall/tile38/internal/object"
|
||||
)
|
||||
|
||||
func (s *Server) cmdBounds(msg *Message) (resp.Value, error) {
|
||||
// BOUNDS key
|
||||
func (s *Server) cmdBOUNDS(msg *Message) (resp.Value, error) {
|
||||
start := time.Now()
|
||||
vs := msg.Args[1:]
|
||||
|
||||
var ok bool
|
||||
var key string
|
||||
if vs, key, ok = tokenval(vs); !ok || key == "" {
|
||||
return NOMessage, errInvalidNumberOfArguments
|
||||
}
|
||||
if len(vs) != 0 {
|
||||
return NOMessage, errInvalidNumberOfArguments
|
||||
// >> Args
|
||||
|
||||
args := msg.Args
|
||||
if len(args) != 2 {
|
||||
return retrerr(errInvalidNumberOfArguments)
|
||||
}
|
||||
key := args[1]
|
||||
|
||||
// >> Operation
|
||||
|
||||
col, _ := s.cols.Get(key)
|
||||
if col == nil {
|
||||
if msg.OutputType == RESP {
|
||||
return resp.NullValue(), nil
|
||||
}
|
||||
return NOMessage, errKeyNotFound
|
||||
return retrerr(errKeyNotFound)
|
||||
}
|
||||
|
||||
// >> Response
|
||||
|
||||
vals := make([]resp.Value, 0, 2)
|
||||
var buf bytes.Buffer
|
||||
if msg.OutputType == JSON {
|
||||
|
@ -52,26 +55,22 @@ func (s *Server) cmdBounds(msg *Message) (resp.Value, error) {
|
|||
if msg.OutputType == JSON {
|
||||
buf.WriteString(`,"bounds":`)
|
||||
buf.WriteString(string(bbox.AppendJSON(nil)))
|
||||
} else {
|
||||
vals = append(vals, resp.ArrayValue([]resp.Value{
|
||||
resp.ArrayValue([]resp.Value{
|
||||
resp.FloatValue(minX),
|
||||
resp.FloatValue(minY),
|
||||
}),
|
||||
resp.ArrayValue([]resp.Value{
|
||||
resp.FloatValue(maxX),
|
||||
resp.FloatValue(maxY),
|
||||
}),
|
||||
}))
|
||||
}
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(buf.String()), nil
|
||||
case RESP:
|
||||
return vals[0], nil
|
||||
}
|
||||
return NOMessage, nil
|
||||
|
||||
// RESP
|
||||
vals = append(vals, resp.ArrayValue([]resp.Value{
|
||||
resp.ArrayValue([]resp.Value{
|
||||
resp.FloatValue(minX),
|
||||
resp.FloatValue(minY),
|
||||
}),
|
||||
resp.ArrayValue([]resp.Value{
|
||||
resp.FloatValue(maxX),
|
||||
resp.FloatValue(maxY),
|
||||
}),
|
||||
}))
|
||||
return vals[0], nil
|
||||
}
|
||||
|
||||
func (s *Server) cmdType(msg *Message) (resp.Value, error) {
|
||||
|
|
|
@ -624,7 +624,7 @@ func (s *Server) commandInScript(msg *Message) (
|
|||
case "search":
|
||||
res, err = s.cmdSearch(msg)
|
||||
case "bounds":
|
||||
res, err = s.cmdBounds(msg)
|
||||
res, err = s.cmdBOUNDS(msg)
|
||||
case "get":
|
||||
res, err = s.cmdGet(msg)
|
||||
case "jget":
|
||||
|
|
|
@ -1096,7 +1096,7 @@ func (s *Server) command(msg *Message, client *Client) (
|
|||
case "search":
|
||||
res, err = s.cmdSearch(msg)
|
||||
case "bounds":
|
||||
res, err = s.cmdBounds(msg)
|
||||
res, err = s.cmdBOUNDS(msg)
|
||||
case "get":
|
||||
res, err = s.cmdGet(msg)
|
||||
case "jget":
|
||||
|
|
|
@ -6,10 +6,9 @@ cd $(dirname "${BASH_SOURCE[0]}")/..
|
|||
export CGO_ENABLED=0
|
||||
|
||||
cd tests
|
||||
go test -coverpkg=../internal/server -coverprofile=/tmp/coverage.out
|
||||
go test -coverpkg=../internal/server -coverprofile=/tmp/coverage.out $GOTEST
|
||||
go tool cover -html=/tmp/coverage.out -o /tmp/coverage.html
|
||||
echo "details: file:///tmp/coverage.html"
|
||||
cd ..
|
||||
|
||||
# go test -coverpkg=internal/ \
|
||||
# $(go list ./... | grep -v /vendor/ | grep -v /tests)
|
||||
go test $(go list ./... | grep -v /vendor/ | grep -v /tests)
|
||||
|
|
|
@ -34,8 +34,11 @@ func subTestKeys(t *testing.T, mc *mockServer) {
|
|||
|
||||
func keys_BOUNDS_test(mc *mockServer) error {
|
||||
return mc.DoBatch(
|
||||
Do("BOUNDS", "mykey").String("<nil>"),
|
||||
Do("BOUNDS", "mykey").JSON().Error("key not found"),
|
||||
Do("SET", "mykey", "myid1", "POINT", 33, -115).OK(),
|
||||
Do("BOUNDS", "mykey").String("[[-115 33] [-115 33]]"),
|
||||
Do("BOUNDS", "mykey").JSON().String(`{"ok":true,"bounds":{"type":"Point","coordinates":[-115,33]}}`),
|
||||
Do("SET", "mykey", "myid2", "POINT", 34, -112).OK(),
|
||||
Do("BOUNDS", "mykey").String("[[-115 33] [-112 34]]"),
|
||||
Do("DEL", "mykey", "myid2").String("1"),
|
||||
|
@ -43,6 +46,11 @@ func keys_BOUNDS_test(mc *mockServer) error {
|
|||
Do("SET", "mykey", "myid3", "OBJECT", `{"type":"Point","coordinates":[-130,38,10]}`).OK(),
|
||||
Do("SET", "mykey", "myid4", "OBJECT", `{"type":"Point","coordinates":[-110,25,-8]}`).OK(),
|
||||
Do("BOUNDS", "mykey").String("[[-130 25] [-110 38]]"),
|
||||
Do("BOUNDS", "mykey", "hello").Error("wrong number of arguments for 'bounds' command"),
|
||||
Do("BOUNDS", "nada").String("<nil>"),
|
||||
Do("BOUNDS", "nada").JSON().Error("key not found"),
|
||||
Do("BOUNDS", "").String("<nil>"),
|
||||
Do("BOUNDS", "mykey").JSON().String(`{"ok":true,"bounds":{"type":"Polygon","coordinates":[[[-130,25],[-110,25],[-110,38],[-130,38],[-130,25]]]}}`),
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -56,6 +56,26 @@ func (cmd *IO) OK() *IO {
|
|||
})
|
||||
}
|
||||
|
||||
func (cmd *IO) Error(msg string) *IO {
|
||||
return cmd.Custom(func(s string) error {
|
||||
if cmd.json {
|
||||
if gjson.Get(s, "ok").Type != gjson.False {
|
||||
return errors.New("ok=true")
|
||||
}
|
||||
if gjson.Get(s, "err").String() != msg {
|
||||
return fmt.Errorf("expected '%s', got '%s'",
|
||||
msg, gjson.Get(s, "err").String())
|
||||
}
|
||||
} else {
|
||||
s = strings.TrimPrefix(s, "ERR ")
|
||||
if s != msg {
|
||||
return fmt.Errorf("expected '%s', got '%s'", msg, s)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
type ioVisitor struct {
|
||||
fset *token.FileSet
|
||||
ln int
|
||||
|
|
Loading…
Reference in New Issue