github.com/zhongdalu/gf@v1.0.0/g/container/gring/gring_unit_test.go (about)

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