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  }