github.com/nats-io/nsc@v0.0.0-20221206222106-35db9400b257/cmd/store/node_test.go (about) 1 /* 2 * Copyright 2018 The NATS Authors 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 package store 17 18 import ( 19 "testing" 20 21 "github.com/stretchr/testify/require" 22 ) 23 24 func TestNode_Walk(t *testing.T) { 25 root := NewNode("/") 26 a := root.Add(NewNode("A")) 27 a.Add(NewNode("AA")) 28 a.Add(NewNode("BB")) 29 30 var visited []interface{} 31 Walk(root, func(n *Node) error { 32 visited = append(visited, n.Data) 33 return nil 34 }) 35 36 require.Len(t, visited, 4) 37 require.ElementsMatch(t, visited, []string{"/", "A", "AA", "BB"}) 38 } 39 40 func TestNode_WalkFind(t *testing.T) { 41 root := NewNode("/") 42 a := root.Add(NewNode("A")) 43 a.Add(NewNode("AA")) 44 a.Add(NewNode("BB")) 45 46 var visited []interface{} 47 Walk(root, func(n *Node) error { 48 visited = append(visited, n.Data) 49 if n.Data == "A" { 50 return ErrStopWalking 51 } 52 return nil 53 }) 54 55 require.Len(t, visited, 2) 56 require.ElementsMatch(t, visited, []string{"/", "A"}) 57 } 58 59 func TestNode_WalkSkipChildren(t *testing.T) { 60 root := NewNode("/") 61 a := root.Add(NewNode("A")) 62 a.Add(NewNode("AA")) 63 a.Add(NewNode("aa")) 64 65 b := root.Add(NewNode("B")) 66 b.Add(NewNode("BB")) 67 68 var visited []interface{} 69 Walk(root, func(n *Node) error { 70 visited = append(visited, n.Data) 71 if n.Data == "A" { 72 return ErrSkipChildren 73 } 74 return nil 75 }) 76 77 require.Len(t, visited, 4) 78 require.ElementsMatch(t, visited, []string{"/", "A", "B", "BB"}) 79 } 80 81 func TestNode_Parents(t *testing.T) { 82 root := NewNode("/") 83 a := root.Add(NewNode("A")) 84 a.Add(NewNode("AA")) 85 a.Add(NewNode("aa")) 86 87 b := root.Add(NewNode("B")) 88 b.Add(NewNode("BB")) 89 90 var visited []interface{} 91 var found *Node 92 Walk(root, func(n *Node) error { 93 visited = append(visited, n.Data) 94 if n.Data == "A" { 95 found = n 96 return ErrStopWalking 97 } 98 return nil 99 }) 100 101 require.Len(t, visited, 2) 102 require.ElementsMatch(t, visited, []string{"/", "A"}) 103 104 require.NotNil(t, found) 105 require.Equal(t, found.Parent, root) 106 } 107 108 func TestNode_Delete(t *testing.T) { 109 root := NewNode("/") 110 a := root.Add(NewNode("A")) 111 a.Add(NewNode("AA")) 112 a.Add(NewNode("aa")) 113 b := root.Add(NewNode("B")) 114 b.Add(NewNode("BB")) 115 116 a.Delete() 117 118 var visited []interface{} 119 Walk(root, func(n *Node) error { 120 visited = append(visited, n.Data) 121 return nil 122 }) 123 124 require.Len(t, visited, 3) 125 require.ElementsMatch(t, visited, []string{"/", "B", "BB"}) 126 } 127 128 func TestNode_DeleteLast(t *testing.T) { 129 root := NewNode("/") 130 a := root.Add(NewNode("A")) 131 a.Add(NewNode("AA")) 132 aa := a.Add(NewNode("aa")) 133 b := root.Add(NewNode("B")) 134 b.Add(NewNode("BB")) 135 136 aa.Delete() 137 138 var visited []interface{} 139 Walk(root, func(n *Node) error { 140 visited = append(visited, n.Data) 141 return nil 142 }) 143 144 require.Len(t, visited, 5) 145 require.ElementsMatch(t, visited, []string{"/", "A", "AA", "B", "BB"}) 146 }