diff --git a/ast/iterator_test.go b/ast/iterator_test.go index 34eee3c8c..437f56fa2 100644 --- a/ast/iterator_test.go +++ b/ast/iterator_test.go @@ -231,7 +231,7 @@ func TestExist(t *testing.T) { if path.Key != nil && *path.Key == "a" { t.Fatal() } - if path.Index == 1 { + if path.Index == 0 { if *path.Key != "b" { t.Fatal() } @@ -247,7 +247,7 @@ func TestExist(t *testing.T) { }) } - if path.Index == 2 { + if path.Index == 1 { if *path.Key != "c" { t.Fatal() } diff --git a/ast/node.go b/ast/node.go index 7818ef4da..a3273d396 100644 --- a/ast/node.go +++ b/ast/node.go @@ -573,13 +573,16 @@ func (self *Node) Unset(key string) (bool, error) { if err := self.should(types.V_OBJECT, "an object"); err != nil { return false, err } + // NOTICE: must get acurate length before deduct + if err := self.skipAllKey(); err != nil { + return false, err + } p, i := self.skipKey(key) if !p.Exists() { return false, nil } else if err := p.Check(); err != nil { return false, err } - self.removePair(i) return true, nil } @@ -619,16 +622,21 @@ func (self *Node) SetAnyByIndex(index int, val interface{}) (bool, error) { // UnsetByIndex remove the node of given index // WARN: After conducting `UnsetXX()`, the node's length WON'T change func (self *Node) UnsetByIndex(index int) (bool, error) { - if err := self.Check(); err != nil { + if err := self.checkRaw(); err != nil { return false, err } var p *Node it := self.itype() + if it == types.V_ARRAY { - p = self.Index(index) + if err := self.skipAllIndex(); err != nil { + return false, err + } + p = self.skipIndex(index) + } else if it == types.V_OBJECT { - if err := self.checkRaw(); err != nil { + if err := self.skipAllKey(); err != nil { return false, err } pr := self.skipIndexPair(index) @@ -636,6 +644,7 @@ func (self *Node) UnsetByIndex(index int) (bool, error) { return false, ErrNotExist } p = &pr.Value + } else { return false, ErrUnsupportType } diff --git a/ast/node_test.go b/ast/node_test.go index c4624d71c..b330a6798 100644 --- a/ast/node_test.go +++ b/ast/node_test.go @@ -780,7 +780,7 @@ func TestUnset(t *testing.T) { if !entities.Exists() || entities.Check() != nil { t.Fatal(entities.Check().Error()) } - exist, err := entities.Unset("urls") // NOTICE: Unset() won't change node.Len() here + exist, err := entities.Unset("urls") if !exist || err != nil { t.Fatal() } @@ -788,7 +788,7 @@ func TestUnset(t *testing.T) { if e.Exists() { t.Fatal() } - if entities.len() != 3 { + if entities.len() != 2 { t.Fatal(entities.len()) } @@ -828,14 +828,8 @@ func TestUnset(t *testing.T) { require.Equal(t, `{"hashtags":[{"text":"freebandnames","indices":[20,34]}],"user_mentions":[],"urls":"a"}`, buf.String()) - exist, err = entities.UnsetByIndex(entities.len()-1) - if !exist || err != nil { - t.Fatal() - } - e = entities.Get("urls") - if e.Exists() { - t.Fatal() - } + // reload entities + *entities = NewRaw(string(out)) hashtags := entities.Get("hashtags").Index(0) hashtags.Set("text2", newRawNode(`{}`, types.V_OBJECT)) @@ -851,21 +845,35 @@ func TestUnset(t *testing.T) { t.Fatal() } + entities.Load() + exist, err = entities.UnsetByIndex(entities.len()-1) + if !exist || err != nil { + t.Fatal() + } + if entities.len() != 2 { + t.Fatal(entities.len()) + } + e = entities.Index(entities.len()) + if e.Exists() { + t.Fatal() + } + + ums := entities.Get("user_mentions") ums.Add(NewNull()) - ums.Add(NewBool(true)) ums.Add(NewBool(false)) + ums.Add(NewBool(true)) if ums.len() != 3 { t.Fatal() } - exist, err = ums.UnsetByIndex(2) + exist, err = ums.UnsetByIndex(1) if !exist || err != nil { t.Fatal() } - + require.Equal(t, 2, ums.len()) umses, err := ums.Interface() require.NoError(t, err) - require.Equal(t, []interface{}{interface{}(nil), true},umses) + require.Equal(t, []interface{}{interface{}(nil), true}, umses) v1, _ := ums.Index(0).Interface() v2, _ := ums.Index(1).Interface() // NOTICE: unseted index 1 still can be find here