240 lines
7.1 KiB
Go
240 lines
7.1 KiB
Go
package selector
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestParse(t *testing.T) {
|
|
t.Run("identity", func(t *testing.T) {
|
|
sel, err := Parse(".")
|
|
require.NoError(t, err)
|
|
require.Equal(t, 1, len(sel))
|
|
require.True(t, sel[0].Identity())
|
|
require.False(t, sel[0].Optional())
|
|
require.False(t, sel[0].Iterator())
|
|
require.Empty(t, sel[0].Slice())
|
|
require.Empty(t, sel[0].Field())
|
|
require.Empty(t, sel[0].Index())
|
|
})
|
|
|
|
t.Run("field", func(t *testing.T) {
|
|
sel, err := Parse(".foo")
|
|
require.NoError(t, err)
|
|
require.Equal(t, 1, len(sel))
|
|
require.False(t, sel[0].Identity())
|
|
require.False(t, sel[0].Optional())
|
|
require.False(t, sel[0].Iterator())
|
|
require.Empty(t, sel[0].Slice())
|
|
require.Equal(t, sel[0].Field(), "foo")
|
|
require.Empty(t, sel[0].Index())
|
|
})
|
|
|
|
t.Run("explicit field", func(t *testing.T) {
|
|
sel, err := Parse(`.["foo"]`)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, len(sel))
|
|
require.True(t, sel[0].Identity())
|
|
require.False(t, sel[0].Optional())
|
|
require.False(t, sel[0].Iterator())
|
|
require.Empty(t, sel[0].Slice())
|
|
require.Empty(t, sel[0].Field())
|
|
require.Empty(t, sel[0].Index())
|
|
require.False(t, sel[1].Identity())
|
|
require.False(t, sel[1].Optional())
|
|
require.False(t, sel[1].Iterator())
|
|
require.Empty(t, sel[1].Slice())
|
|
require.Equal(t, sel[1].Field(), "foo")
|
|
require.Empty(t, sel[1].Index())
|
|
})
|
|
|
|
t.Run("index", func(t *testing.T) {
|
|
sel, err := Parse(".[138]")
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, len(sel))
|
|
require.True(t, sel[0].Identity())
|
|
require.False(t, sel[0].Optional())
|
|
require.False(t, sel[0].Iterator())
|
|
require.Empty(t, sel[0].Slice())
|
|
require.Empty(t, sel[0].Field())
|
|
require.Empty(t, sel[0].Index())
|
|
require.False(t, sel[1].Identity())
|
|
require.False(t, sel[1].Optional())
|
|
require.False(t, sel[1].Iterator())
|
|
require.Empty(t, sel[1].Slice())
|
|
require.Empty(t, sel[1].Field())
|
|
require.Equal(t, sel[1].Index(), 138)
|
|
})
|
|
|
|
t.Run("negative index", func(t *testing.T) {
|
|
sel, err := Parse(".[-138]")
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, len(sel))
|
|
require.True(t, sel[0].Identity())
|
|
require.False(t, sel[0].Optional())
|
|
require.False(t, sel[0].Iterator())
|
|
require.Empty(t, sel[0].Slice())
|
|
require.Empty(t, sel[0].Field())
|
|
require.Empty(t, sel[0].Index())
|
|
require.False(t, sel[1].Identity())
|
|
require.False(t, sel[1].Optional())
|
|
require.False(t, sel[1].Iterator())
|
|
require.Empty(t, sel[1].Slice())
|
|
require.Empty(t, sel[1].Field())
|
|
require.Equal(t, sel[1].Index(), -138)
|
|
})
|
|
|
|
t.Run("iterator", func(t *testing.T) {
|
|
sel, err := Parse(".[]")
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, len(sel))
|
|
require.True(t, sel[0].Identity())
|
|
require.False(t, sel[0].Optional())
|
|
require.False(t, sel[0].Iterator())
|
|
require.Empty(t, sel[0].Slice())
|
|
require.Empty(t, sel[0].Field())
|
|
require.Empty(t, sel[0].Index())
|
|
require.False(t, sel[1].Identity())
|
|
require.False(t, sel[1].Optional())
|
|
require.True(t, sel[1].Iterator())
|
|
require.Empty(t, sel[1].Slice())
|
|
require.Empty(t, sel[1].Field())
|
|
require.Empty(t, sel[1].Index())
|
|
})
|
|
|
|
t.Run("optional field", func(t *testing.T) {
|
|
sel, err := Parse(".foo?")
|
|
require.NoError(t, err)
|
|
require.Equal(t, 1, len(sel))
|
|
require.False(t, sel[0].Identity())
|
|
require.True(t, sel[0].Optional())
|
|
require.False(t, sel[0].Iterator())
|
|
require.Empty(t, sel[0].Slice())
|
|
require.Equal(t, sel[0].Field(), "foo")
|
|
require.Empty(t, sel[0].Index())
|
|
})
|
|
|
|
t.Run("optional explicit field", func(t *testing.T) {
|
|
sel, err := Parse(`.["foo"]?`)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, len(sel))
|
|
require.True(t, sel[0].Identity())
|
|
require.False(t, sel[0].Optional())
|
|
require.False(t, sel[0].Iterator())
|
|
require.Empty(t, sel[0].Slice())
|
|
require.Empty(t, sel[0].Field())
|
|
require.Empty(t, sel[0].Index())
|
|
require.False(t, sel[1].Identity())
|
|
require.True(t, sel[1].Optional())
|
|
require.False(t, sel[1].Iterator())
|
|
require.Empty(t, sel[1].Slice())
|
|
require.Equal(t, sel[1].Field(), "foo")
|
|
require.Empty(t, sel[1].Index())
|
|
})
|
|
|
|
t.Run("optional index", func(t *testing.T) {
|
|
sel, err := Parse(".[138]?")
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, len(sel))
|
|
require.True(t, sel[0].Identity())
|
|
require.False(t, sel[0].Optional())
|
|
require.False(t, sel[0].Iterator())
|
|
require.Empty(t, sel[0].Slice())
|
|
require.Empty(t, sel[0].Field())
|
|
require.Empty(t, sel[0].Index())
|
|
require.False(t, sel[1].Identity())
|
|
require.True(t, sel[1].Optional())
|
|
require.False(t, sel[1].Iterator())
|
|
require.Empty(t, sel[1].Slice())
|
|
require.Empty(t, sel[1].Field())
|
|
require.Equal(t, sel[1].Index(), 138)
|
|
})
|
|
|
|
t.Run("optional iterator", func(t *testing.T) {
|
|
sel, err := Parse(".[]?")
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, len(sel))
|
|
require.True(t, sel[0].Identity())
|
|
require.False(t, sel[0].Optional())
|
|
require.False(t, sel[0].Iterator())
|
|
require.Empty(t, sel[0].Slice())
|
|
require.Empty(t, sel[0].Field())
|
|
require.Empty(t, sel[0].Index())
|
|
require.False(t, sel[1].Identity())
|
|
require.True(t, sel[1].Optional())
|
|
require.True(t, sel[1].Iterator())
|
|
require.Empty(t, sel[1].Slice())
|
|
require.Empty(t, sel[1].Field())
|
|
require.Empty(t, sel[1].Index())
|
|
})
|
|
|
|
t.Run("nesting", func(t *testing.T) {
|
|
sel, err := Parse(`.foo.["bar"].[138]?.baz[1:]`)
|
|
require.NoError(t, err)
|
|
printSegments(sel)
|
|
require.Equal(t, 7, len(sel))
|
|
require.False(t, sel[0].Identity())
|
|
require.False(t, sel[0].Optional())
|
|
require.False(t, sel[0].Iterator())
|
|
require.Empty(t, sel[0].Slice())
|
|
require.Equal(t, sel[0].Field(), "foo")
|
|
require.Empty(t, sel[0].Index())
|
|
require.True(t, sel[1].Identity())
|
|
require.False(t, sel[1].Optional())
|
|
require.False(t, sel[1].Iterator())
|
|
require.Empty(t, sel[1].Slice())
|
|
require.Empty(t, sel[1].Field())
|
|
require.Empty(t, sel[1].Index())
|
|
require.False(t, sel[2].Identity())
|
|
require.False(t, sel[2].Optional())
|
|
require.False(t, sel[2].Iterator())
|
|
require.Empty(t, sel[2].Slice())
|
|
require.Equal(t, sel[2].Field(), "bar")
|
|
require.Empty(t, sel[2].Index())
|
|
require.True(t, sel[3].Identity())
|
|
require.False(t, sel[3].Optional())
|
|
require.False(t, sel[3].Iterator())
|
|
require.Empty(t, sel[3].Slice())
|
|
require.Empty(t, sel[3].Field())
|
|
require.Empty(t, sel[3].Index())
|
|
require.False(t, sel[4].Identity())
|
|
require.True(t, sel[4].Optional())
|
|
require.False(t, sel[4].Iterator())
|
|
require.Empty(t, sel[4].Slice())
|
|
require.Empty(t, sel[4].Field())
|
|
require.Equal(t, sel[4].Index(), 138)
|
|
require.False(t, sel[5].Identity())
|
|
require.False(t, sel[5].Optional())
|
|
require.False(t, sel[5].Iterator())
|
|
require.Empty(t, sel[5].Slice())
|
|
require.Equal(t, sel[5].Field(), "baz")
|
|
require.Empty(t, sel[5].Index())
|
|
require.False(t, sel[6].Identity())
|
|
require.False(t, sel[6].Optional())
|
|
require.False(t, sel[6].Iterator())
|
|
require.Equal(t, sel[6].Slice(), []int{1})
|
|
require.Empty(t, sel[6].Field())
|
|
require.Empty(t, sel[6].Index())
|
|
})
|
|
|
|
t.Run("non dotted", func(t *testing.T) {
|
|
_, err := Parse("foo")
|
|
require.NotNil(t, err)
|
|
fmt.Println(err)
|
|
})
|
|
|
|
t.Run("non quoted", func(t *testing.T) {
|
|
_, err := Parse(".[foo]")
|
|
require.NotNil(t, err)
|
|
fmt.Println(err)
|
|
})
|
|
}
|
|
|
|
func printSegments(s Selector) {
|
|
for i, seg := range s {
|
|
fmt.Printf("%d: %s\n", i, seg.String())
|
|
}
|
|
}
|