github.com/gogf/gf@v1.16.9/container/gring/gring_unit_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/gogf/gf.
     6  
     7  package gring_test
     8  
     9  import (
    10  	"container/ring"
    11  	"testing"
    12  
    13  	"github.com/gogf/gf/container/gring"
    14  	"github.com/gogf/gf/frame/g"
    15  	"github.com/gogf/gf/test/gtest"
    16  )
    17  
    18  type Student struct {
    19  	position int
    20  	name     string
    21  	upgrade  bool
    22  }
    23  
    24  func TestRing_Val(t *testing.T) {
    25  	gtest.C(t, func(t *gtest.T) {
    26  		//定义cap 为3的ring类型数据
    27  		r := gring.New(3, true)
    28  		//分别给3个元素初始化赋值
    29  		r.Put(&Student{1, "jimmy", true})
    30  		r.Put(&Student{2, "tom", true})
    31  		r.Put(&Student{3, "alon", false})
    32  
    33  		//元素取值并判断和预设值是否相等
    34  		t.Assert(r.Val().(*Student).name, "jimmy")
    35  		//从当前位置往后移两个元素
    36  		r.Move(2)
    37  		t.Assert(r.Val().(*Student).name, "alon")
    38  		//更新元素值
    39  		//测试 value == nil
    40  		r.Set(nil)
    41  		t.Assert(r.Val(), nil)
    42  		//测试value != nil
    43  		r.Set(&Student{3, "jack", true})
    44  	})
    45  }
    46  func TestRing_CapLen(t *testing.T) {
    47  	gtest.C(t, func(t *gtest.T) {
    48  		r := gring.New(10)
    49  		r.Put("goframe")
    50  		//cap长度 10
    51  		t.Assert(r.Cap(), 10)
    52  		//已有数据项 1
    53  		t.Assert(r.Len(), 1)
    54  	})
    55  }
    56  
    57  func TestRing_Position(t *testing.T) {
    58  	gtest.C(t, func(t *gtest.T) {
    59  		r := gring.New(2)
    60  		r.Put(1)
    61  		r.Put(2)
    62  		//往后移动1个元素
    63  		r.Next()
    64  		t.Assert(r.Val(), 2)
    65  		//往前移动1个元素
    66  		r.Prev()
    67  		t.Assert(r.Val(), 1)
    68  
    69  	})
    70  }
    71  
    72  func TestRing_Link(t *testing.T) {
    73  	gtest.C(t, func(t *gtest.T) {
    74  		r := gring.New(3)
    75  		r.Put(1)
    76  		r.Put(2)
    77  		r.Put(3)
    78  		s := gring.New(2)
    79  		s.Put("a")
    80  		s.Put("b")
    81  
    82  		rs := r.Link(s)
    83  		t.Assert(rs.Move(2).Val(), "b")
    84  
    85  	})
    86  }
    87  
    88  func TestRing_Unlink(t *testing.T) {
    89  	gtest.C(t, func(t *gtest.T) {
    90  		r := gring.New(5)
    91  		for i := 0; i < 5; i++ {
    92  			r.Put(i + 1)
    93  		}
    94  		// 1 2 3 4
    95  		// 删除当前位置往后的2个数据,返回被删除的数据
    96  		// 重新计算s len
    97  		s := r.Unlink(2) // 2 3
    98  		t.Assert(s.Val(), 2)
    99  		t.Assert(s.Len(), 1)
   100  	})
   101  }
   102  
   103  func TestRing_Slice(t *testing.T) {
   104  	gtest.C(t, func(t *gtest.T) {
   105  		ringLen := 5
   106  		r := gring.New(ringLen)
   107  		for i := 0; i < ringLen; i++ {
   108  			r.Put(i + 1)
   109  		}
   110  		r.Move(2)              // 3
   111  		array := r.SliceNext() // [3 4 5 1 2]
   112  		t.Assert(array[0], 3)
   113  		t.Assert(len(array), 5)
   114  
   115  		//判断array是否等于[3 4 5 1 2]
   116  		ra := []int{3, 4, 5, 1, 2}
   117  		t.Assert(ra, array)
   118  
   119  		//第3个元素设为nil
   120  		r.Set(nil)
   121  		array2 := r.SliceNext() //[4 5 1 2]
   122  		//返回当前位置往后不为空的元素数组,长度为4
   123  		t.Assert(array2, g.Slice{4, 5, 1, 2})
   124  
   125  		array3 := r.SlicePrev() //[2 1 5 4]
   126  		t.Assert(array3, g.Slice{2, 1, 5, 4})
   127  
   128  		s := gring.New(ringLen)
   129  		for i := 0; i < ringLen; i++ {
   130  			s.Put(i + 1)
   131  		}
   132  		array4 := s.SlicePrev() // []
   133  		t.Assert(array4, g.Slice{1, 5, 4, 3, 2})
   134  
   135  	})
   136  }
   137  
   138  func TestRing_RLockIterator(t *testing.T) {
   139  	gtest.C(t, func(t *gtest.T) {
   140  		ringLen := 5
   141  		r := gring.New(ringLen)
   142  
   143  		//ring不存在有值元素
   144  		r.RLockIteratorNext(func(v interface{}) bool {
   145  			t.Assert(v, nil)
   146  			return false
   147  		})
   148  		r.RLockIteratorNext(func(v interface{}) bool {
   149  			t.Assert(v, nil)
   150  			return true
   151  		})
   152  
   153  		r.RLockIteratorPrev(func(v interface{}) bool {
   154  			t.Assert(v, nil)
   155  			return true
   156  		})
   157  
   158  		for i := 0; i < ringLen; i++ {
   159  			r.Put(i + 1)
   160  		}
   161  
   162  		//回调函数返回true,RLockIteratorNext遍历5次,期望值分别是1、2、3、4、5
   163  		i := 0
   164  		r.RLockIteratorNext(func(v interface{}) bool {
   165  			t.Assert(v, i+1)
   166  			i++
   167  			return true
   168  		})
   169  
   170  		//RLockIteratorPrev遍历1次返回 false,退出遍历
   171  		r.RLockIteratorPrev(func(v interface{}) bool {
   172  			t.Assert(v, 1)
   173  			return false
   174  		})
   175  
   176  	})
   177  }
   178  
   179  func TestRing_LockIterator(t *testing.T) {
   180  	gtest.C(t, func(t *gtest.T) {
   181  		ringLen := 5
   182  		r := gring.New(ringLen)
   183  
   184  		//不存在有值元素
   185  		r.LockIteratorNext(func(item *ring.Ring) bool {
   186  			t.Assert(item.Value, nil)
   187  			return false
   188  		})
   189  		r.LockIteratorNext(func(item *ring.Ring) bool {
   190  			t.Assert(item.Value, nil)
   191  			return false
   192  		})
   193  		r.LockIteratorNext(func(item *ring.Ring) bool {
   194  			t.Assert(item.Value, nil)
   195  			return true
   196  		})
   197  
   198  		r.LockIteratorPrev(func(item *ring.Ring) bool {
   199  			t.Assert(item.Value, nil)
   200  			return false
   201  		})
   202  		r.LockIteratorPrev(func(item *ring.Ring) bool {
   203  			t.Assert(item.Value, nil)
   204  			return true
   205  		})
   206  
   207  		//ring初始化元素值
   208  		for i := 0; i < ringLen; i++ {
   209  			r.Put(i + 1)
   210  		}
   211  
   212  		//往后遍历组成数据 [1,2,3,4,5]
   213  		array1 := g.Slice{1, 2, 3, 4, 5}
   214  		ii := 0
   215  		r.LockIteratorNext(func(item *ring.Ring) bool {
   216  			//校验每一次遍历取值是否是期望值
   217  			t.Assert(item.Value, array1[ii])
   218  			ii++
   219  			return true
   220  		})
   221  
   222  		//往后取3个元素组成数组
   223  		//获得 [1,5,4]
   224  		i := 0
   225  		a := g.Slice{1, 5, 4}
   226  		r.LockIteratorPrev(func(item *ring.Ring) bool {
   227  			if i > 2 {
   228  				return false
   229  			}
   230  			t.Assert(item.Value, a[i])
   231  			i++
   232  			return true
   233  		})
   234  
   235  	})
   236  }