github.com/wangyougui/gf/v2@v2.6.5/container/glist/glist_z_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/wangyougui/gf.
     6  
     7  package glist
     8  
     9  import (
    10  	"container/list"
    11  	"testing"
    12  
    13  	"github.com/wangyougui/gf/v2/internal/json"
    14  	"github.com/wangyougui/gf/v2/test/gtest"
    15  	"github.com/wangyougui/gf/v2/util/gconv"
    16  )
    17  
    18  func checkListLen(t *gtest.T, l *List, len int) bool {
    19  	if n := l.Len(); n != len {
    20  		t.Errorf("l.Len() = %d, want %d", n, len)
    21  		return false
    22  	}
    23  	return true
    24  }
    25  
    26  func checkListPointers(t *gtest.T, l *List, es []*Element) {
    27  	if !checkListLen(t, l, len(es)) {
    28  		return
    29  	}
    30  	l.RLockFunc(func(list *list.List) {
    31  		for i, e := 0, l.list.Front(); i < list.Len(); i, e = i+1, e.Next() {
    32  			if e.Prev() != es[i].Prev() {
    33  				t.Errorf("list[%d].Prev = %p, want %p", i, e.Prev(), es[i].Prev())
    34  			}
    35  			if e.Next() != es[i].Next() {
    36  				t.Errorf("list[%d].Next = %p, want %p", i, e.Next(), es[i].Next())
    37  			}
    38  		}
    39  	})
    40  }
    41  
    42  func TestVar(t *testing.T) {
    43  	var l List
    44  	l.PushFront(1)
    45  	l.PushFront(2)
    46  	if v := l.PopBack(); v != 1 {
    47  		t.Errorf("EXPECT %v, GOT %v", 1, v)
    48  	} else {
    49  		// fmt.Println(v)
    50  	}
    51  	if v := l.PopBack(); v != 2 {
    52  		t.Errorf("EXPECT %v, GOT %v", 2, v)
    53  	} else {
    54  		// fmt.Println(v)
    55  	}
    56  	if v := l.PopBack(); v != nil {
    57  		t.Errorf("EXPECT %v, GOT %v", nil, v)
    58  	} else {
    59  		// fmt.Println(v)
    60  	}
    61  	l.PushBack(1)
    62  	l.PushBack(2)
    63  	if v := l.PopFront(); v != 1 {
    64  		t.Errorf("EXPECT %v, GOT %v", 1, v)
    65  	} else {
    66  		// fmt.Println(v)
    67  	}
    68  	if v := l.PopFront(); v != 2 {
    69  		t.Errorf("EXPECT %v, GOT %v", 2, v)
    70  	} else {
    71  		// fmt.Println(v)
    72  	}
    73  	if v := l.PopFront(); v != nil {
    74  		t.Errorf("EXPECT %v, GOT %v", nil, v)
    75  	} else {
    76  		// fmt.Println(v)
    77  	}
    78  }
    79  
    80  func TestBasic(t *testing.T) {
    81  	l := New()
    82  	l.PushFront(1)
    83  	l.PushFront(2)
    84  	if v := l.PopBack(); v != 1 {
    85  		t.Errorf("EXPECT %v, GOT %v", 1, v)
    86  	} else {
    87  		// fmt.Println(v)
    88  	}
    89  	if v := l.PopBack(); v != 2 {
    90  		t.Errorf("EXPECT %v, GOT %v", 2, v)
    91  	} else {
    92  		// fmt.Println(v)
    93  	}
    94  	if v := l.PopBack(); v != nil {
    95  		t.Errorf("EXPECT %v, GOT %v", nil, v)
    96  	} else {
    97  		// fmt.Println(v)
    98  	}
    99  	l.PushBack(1)
   100  	l.PushBack(2)
   101  	if v := l.PopFront(); v != 1 {
   102  		t.Errorf("EXPECT %v, GOT %v", 1, v)
   103  	} else {
   104  		// fmt.Println(v)
   105  	}
   106  	if v := l.PopFront(); v != 2 {
   107  		t.Errorf("EXPECT %v, GOT %v", 2, v)
   108  	} else {
   109  		// fmt.Println(v)
   110  	}
   111  	if v := l.PopFront(); v != nil {
   112  		t.Errorf("EXPECT %v, GOT %v", nil, v)
   113  	} else {
   114  		// fmt.Println(v)
   115  	}
   116  }
   117  
   118  func TestList(t *testing.T) {
   119  	gtest.C(t, func(t *gtest.T) {
   120  		l := New()
   121  		checkListPointers(t, l, []*Element{})
   122  
   123  		// Single element list
   124  		e := l.PushFront("a")
   125  		checkListPointers(t, l, []*Element{e})
   126  		l.MoveToFront(e)
   127  		checkListPointers(t, l, []*Element{e})
   128  		l.MoveToBack(e)
   129  		checkListPointers(t, l, []*Element{e})
   130  		l.Remove(e)
   131  		checkListPointers(t, l, []*Element{})
   132  
   133  		// Bigger list
   134  		e2 := l.PushFront(2)
   135  		e1 := l.PushFront(1)
   136  		e3 := l.PushBack(3)
   137  		e4 := l.PushBack("banana")
   138  		checkListPointers(t, l, []*Element{e1, e2, e3, e4})
   139  
   140  		l.Remove(e2)
   141  		checkListPointers(t, l, []*Element{e1, e3, e4})
   142  
   143  		l.MoveToFront(e3) // move from middle
   144  		checkListPointers(t, l, []*Element{e3, e1, e4})
   145  
   146  		l.MoveToFront(e1)
   147  		l.MoveToBack(e3) // move from middle
   148  		checkListPointers(t, l, []*Element{e1, e4, e3})
   149  
   150  		l.MoveToFront(e3) // move from back
   151  		checkListPointers(t, l, []*Element{e3, e1, e4})
   152  		l.MoveToFront(e3) // should be no-op
   153  		checkListPointers(t, l, []*Element{e3, e1, e4})
   154  
   155  		l.MoveToBack(e3) // move from front
   156  		checkListPointers(t, l, []*Element{e1, e4, e3})
   157  		l.MoveToBack(e3) // should be no-op
   158  		checkListPointers(t, l, []*Element{e1, e4, e3})
   159  
   160  		e2 = l.InsertBefore(e1, 2) // insert before front
   161  		checkListPointers(t, l, []*Element{e2, e1, e4, e3})
   162  		l.Remove(e2)
   163  		e2 = l.InsertBefore(e4, 2) // insert before middle
   164  		checkListPointers(t, l, []*Element{e1, e2, e4, e3})
   165  		l.Remove(e2)
   166  		e2 = l.InsertBefore(e3, 2) // insert before back
   167  		checkListPointers(t, l, []*Element{e1, e4, e2, e3})
   168  		l.Remove(e2)
   169  
   170  		e2 = l.InsertAfter(e1, 2) // insert after front
   171  		checkListPointers(t, l, []*Element{e1, e2, e4, e3})
   172  		l.Remove(e2)
   173  		e2 = l.InsertAfter(e4, 2) // insert after middle
   174  		checkListPointers(t, l, []*Element{e1, e4, e2, e3})
   175  		l.Remove(e2)
   176  		e2 = l.InsertAfter(e3, 2) // insert after back
   177  		checkListPointers(t, l, []*Element{e1, e4, e3, e2})
   178  		l.Remove(e2)
   179  
   180  		// Check standard iteration.
   181  		sum := 0
   182  		for e := l.Front(); e != nil; e = e.Next() {
   183  			if i, ok := e.Value.(int); ok {
   184  				sum += i
   185  			}
   186  		}
   187  		if sum != 4 {
   188  			t.Errorf("sum over l = %d, want 4", sum)
   189  		}
   190  
   191  		// Clear all elements by iterating
   192  		var next *Element
   193  		for e := l.Front(); e != nil; e = next {
   194  			next = e.Next()
   195  			l.Remove(e)
   196  		}
   197  		checkListPointers(t, l, []*Element{})
   198  	})
   199  }
   200  
   201  func checkList(t *gtest.T, l *List, es []interface{}) {
   202  	if !checkListLen(t, l, len(es)) {
   203  		return
   204  	}
   205  
   206  	i := 0
   207  	for e := l.Front(); e != nil; e = e.Next() {
   208  
   209  		switch e.Value.(type) {
   210  		case int:
   211  			if le := e.Value.(int); le != es[i] {
   212  				t.Errorf("elt[%d].Value() = %v, want %v", i, le, es[i])
   213  			}
   214  			// default string
   215  		default:
   216  			if le := e.Value.(string); le != es[i] {
   217  				t.Errorf("elt[%v].Value() = %v, want %v", i, le, es[i])
   218  			}
   219  		}
   220  
   221  		i++
   222  	}
   223  
   224  	// for e := l.Front(); e != nil; e = e.Next() {
   225  	//	le := e.Value.(int)
   226  	//	if le != es[i] {
   227  	//		t.Errorf("elt[%d].Value() = %v, want %v", i, le, es[i])
   228  	//	}
   229  	//	i++
   230  	// }
   231  }
   232  
   233  func TestExtending(t *testing.T) {
   234  	gtest.C(t, func(t *gtest.T) {
   235  		l1 := New()
   236  		l2 := New()
   237  
   238  		l1.PushBack(1)
   239  		l1.PushBack(2)
   240  		l1.PushBack(3)
   241  
   242  		l2.PushBack(4)
   243  		l2.PushBack(5)
   244  
   245  		l3 := New()
   246  		l3.PushBackList(l1)
   247  		checkList(t, l3, []interface{}{1, 2, 3})
   248  		l3.PushBackList(l2)
   249  		checkList(t, l3, []interface{}{1, 2, 3, 4, 5})
   250  
   251  		l3 = New()
   252  		l3.PushFrontList(l2)
   253  		checkList(t, l3, []interface{}{4, 5})
   254  		l3.PushFrontList(l1)
   255  		checkList(t, l3, []interface{}{1, 2, 3, 4, 5})
   256  
   257  		checkList(t, l1, []interface{}{1, 2, 3})
   258  		checkList(t, l2, []interface{}{4, 5})
   259  
   260  		l3 = New()
   261  		l3.PushBackList(l1)
   262  		checkList(t, l3, []interface{}{1, 2, 3})
   263  		l3.PushBackList(l3)
   264  		checkList(t, l3, []interface{}{1, 2, 3, 1, 2, 3})
   265  
   266  		l3 = New()
   267  		l3.PushFrontList(l1)
   268  		checkList(t, l3, []interface{}{1, 2, 3})
   269  		l3.PushFrontList(l3)
   270  		checkList(t, l3, []interface{}{1, 2, 3, 1, 2, 3})
   271  
   272  		l3 = New()
   273  		l1.PushBackList(l3)
   274  		checkList(t, l1, []interface{}{1, 2, 3})
   275  		l1.PushFrontList(l3)
   276  		checkList(t, l1, []interface{}{1, 2, 3})
   277  	})
   278  }
   279  
   280  func TestRemove(t *testing.T) {
   281  	gtest.C(t, func(t *gtest.T) {
   282  		l := New()
   283  		e1 := l.PushBack(1)
   284  		e2 := l.PushBack(2)
   285  		checkListPointers(t, l, []*Element{e1, e2})
   286  		// e := l.Front()
   287  		// l.Remove(e)
   288  		// checkListPointers(t, l, []*Element{e2})
   289  		// l.Remove(e)
   290  		// checkListPointers(t, l, []*Element{e2})
   291  	})
   292  }
   293  
   294  func TestIssue4103(t *testing.T) {
   295  	l1 := New()
   296  	l1.PushBack(1)
   297  	l1.PushBack(2)
   298  
   299  	l2 := New()
   300  	l2.PushBack(3)
   301  	l2.PushBack(4)
   302  
   303  	e := l1.Front()
   304  	l2.Remove(e) // l2 should not change because e is not an element of l2
   305  	if n := l2.Len(); n != 2 {
   306  		t.Errorf("l2.Len() = %d, want 2", n)
   307  	}
   308  
   309  	l1.InsertBefore(e, 8)
   310  	if n := l1.Len(); n != 3 {
   311  		t.Errorf("l1.Len() = %d, want 3", n)
   312  	}
   313  }
   314  
   315  func TestIssue6349(t *testing.T) {
   316  	l := New()
   317  	l.PushBack(1)
   318  	l.PushBack(2)
   319  
   320  	e := l.Front()
   321  	l.Remove(e)
   322  	if e.Value != 1 {
   323  		t.Errorf("e.value = %d, want 1", e.Value)
   324  	}
   325  	// if e.Next() != nil {
   326  	//    t.Errorf("e.Next() != nil")
   327  	// }
   328  	// if e.Prev() != nil {
   329  	//    t.Errorf("e.Prev() != nil")
   330  	// }
   331  }
   332  
   333  func TestMove(t *testing.T) {
   334  	gtest.C(t, func(t *gtest.T) {
   335  		l := New()
   336  		e1 := l.PushBack(1)
   337  		e2 := l.PushBack(2)
   338  		e3 := l.PushBack(3)
   339  		e4 := l.PushBack(4)
   340  
   341  		l.MoveAfter(e3, e3)
   342  		checkListPointers(t, l, []*Element{e1, e2, e3, e4})
   343  		l.MoveBefore(e2, e2)
   344  		checkListPointers(t, l, []*Element{e1, e2, e3, e4})
   345  
   346  		l.MoveAfter(e3, e2)
   347  		checkListPointers(t, l, []*Element{e1, e2, e3, e4})
   348  		l.MoveBefore(e2, e3)
   349  		checkListPointers(t, l, []*Element{e1, e2, e3, e4})
   350  
   351  		l.MoveBefore(e2, e4)
   352  		checkListPointers(t, l, []*Element{e1, e3, e2, e4})
   353  		e2, e3 = e3, e2
   354  
   355  		l.MoveBefore(e4, e1)
   356  		checkListPointers(t, l, []*Element{e4, e1, e2, e3})
   357  		e1, e2, e3, e4 = e4, e1, e2, e3
   358  
   359  		l.MoveAfter(e4, e1)
   360  		checkListPointers(t, l, []*Element{e1, e4, e2, e3})
   361  		e2, e3, e4 = e4, e2, e3
   362  
   363  		l.MoveAfter(e2, e3)
   364  		checkListPointers(t, l, []*Element{e1, e3, e2, e4})
   365  		e2, e3 = e3, e2
   366  	})
   367  }
   368  
   369  // Test PushFront, PushBack, PushFrontList, PushBackList with uninitialized List
   370  func TestZeroList(t *testing.T) {
   371  	gtest.C(t, func(t *gtest.T) {
   372  		var l1 = New()
   373  		l1.PushFront(1)
   374  		checkList(t, l1, []interface{}{1})
   375  
   376  		var l2 = New()
   377  		l2.PushBack(1)
   378  		checkList(t, l2, []interface{}{1})
   379  
   380  		var l3 = New()
   381  		l3.PushFrontList(l1)
   382  		checkList(t, l3, []interface{}{1})
   383  
   384  		var l4 = New()
   385  		l4.PushBackList(l2)
   386  		checkList(t, l4, []interface{}{1})
   387  	})
   388  }
   389  
   390  // Test that a list l is not modified when calling InsertBefore with a mark that is not an element of l.
   391  func TestInsertBeforeUnknownMark(t *testing.T) {
   392  	gtest.C(t, func(t *gtest.T) {
   393  		l := New()
   394  		l.PushBack(1)
   395  		l.PushBack(2)
   396  		l.PushBack(3)
   397  		l.InsertBefore(new(Element), 1)
   398  		checkList(t, l, []interface{}{1, 2, 3})
   399  	})
   400  }
   401  
   402  // Test that a list l is not modified when calling InsertAfter with a mark that is not an element of l.
   403  func TestInsertAfterUnknownMark(t *testing.T) {
   404  	gtest.C(t, func(t *gtest.T) {
   405  		l := New()
   406  		l.PushBack(1)
   407  		l.PushBack(2)
   408  		l.PushBack(3)
   409  		l.InsertAfter(new(Element), 1)
   410  		checkList(t, l, []interface{}{1, 2, 3})
   411  	})
   412  }
   413  
   414  // Test that a list l is not modified when calling MoveAfter or MoveBefore with a mark that is not an element of l.
   415  func TestMoveUnknownMark(t *testing.T) {
   416  	gtest.C(t, func(t *gtest.T) {
   417  		l1 := New()
   418  		e1 := l1.PushBack(1)
   419  
   420  		l2 := New()
   421  		e2 := l2.PushBack(2)
   422  
   423  		l1.MoveAfter(e1, e2)
   424  		checkList(t, l1, []interface{}{1})
   425  		checkList(t, l2, []interface{}{2})
   426  
   427  		l1.MoveBefore(e1, e2)
   428  		checkList(t, l1, []interface{}{1})
   429  		checkList(t, l2, []interface{}{2})
   430  	})
   431  }
   432  
   433  func TestList_RemoveAll(t *testing.T) {
   434  	gtest.C(t, func(t *gtest.T) {
   435  		l := New()
   436  		l.PushBack(1)
   437  		l.RemoveAll()
   438  		checkList(t, l, []interface{}{})
   439  		l.PushBack(2)
   440  		checkList(t, l, []interface{}{2})
   441  	})
   442  }
   443  
   444  func TestList_PushFronts(t *testing.T) {
   445  	gtest.C(t, func(t *gtest.T) {
   446  		l := New()
   447  		a1 := []interface{}{1, 2}
   448  		l.PushFronts(a1)
   449  		checkList(t, l, []interface{}{2, 1})
   450  		a1 = []interface{}{3, 4, 5}
   451  		l.PushFronts(a1)
   452  		checkList(t, l, []interface{}{5, 4, 3, 2, 1})
   453  	})
   454  }
   455  
   456  func TestList_PushBacks(t *testing.T) {
   457  	gtest.C(t, func(t *gtest.T) {
   458  		l := New()
   459  		a1 := []interface{}{1, 2}
   460  		l.PushBacks(a1)
   461  		checkList(t, l, []interface{}{1, 2})
   462  		a1 = []interface{}{3, 4, 5}
   463  		l.PushBacks(a1)
   464  		checkList(t, l, []interface{}{1, 2, 3, 4, 5})
   465  	})
   466  }
   467  
   468  func TestList_PopBacks(t *testing.T) {
   469  	gtest.C(t, func(t *gtest.T) {
   470  		l := New()
   471  		a1 := []interface{}{1, 2, 3, 4}
   472  		a2 := []interface{}{"a", "c", "b", "e"}
   473  		l.PushFronts(a1)
   474  		i1 := l.PopBacks(2)
   475  		t.Assert(i1, []interface{}{1, 2})
   476  
   477  		l.PushBacks(a2) // 4.3,a,c,b,e
   478  		i1 = l.PopBacks(3)
   479  		t.Assert(i1, []interface{}{"e", "b", "c"})
   480  	})
   481  }
   482  
   483  func TestList_PopFronts(t *testing.T) {
   484  	gtest.C(t, func(t *gtest.T) {
   485  		l := New()
   486  		a1 := []interface{}{1, 2, 3, 4}
   487  		l.PushFronts(a1)
   488  		i1 := l.PopFronts(2)
   489  		t.Assert(i1, []interface{}{4, 3})
   490  		t.Assert(l.Len(), 2)
   491  	})
   492  }
   493  
   494  func TestList_PopBackAll(t *testing.T) {
   495  	gtest.C(t, func(t *gtest.T) {
   496  		l := New()
   497  		a1 := []interface{}{1, 2, 3, 4}
   498  		l.PushFronts(a1)
   499  		i1 := l.PopBackAll()
   500  		t.Assert(i1, []interface{}{1, 2, 3, 4})
   501  		t.Assert(l.Len(), 0)
   502  	})
   503  }
   504  
   505  func TestList_PopFrontAll(t *testing.T) {
   506  	gtest.C(t, func(t *gtest.T) {
   507  		l := New()
   508  		a1 := []interface{}{1, 2, 3, 4}
   509  		l.PushFronts(a1)
   510  		i1 := l.PopFrontAll()
   511  		t.Assert(i1, []interface{}{4, 3, 2, 1})
   512  		t.Assert(l.Len(), 0)
   513  	})
   514  }
   515  
   516  func TestList_FrontAll(t *testing.T) {
   517  	gtest.C(t, func(t *gtest.T) {
   518  		l := New()
   519  		a1 := []interface{}{1, 2, 3, 4}
   520  		l.PushFronts(a1)
   521  		i1 := l.FrontAll()
   522  		t.Assert(i1, []interface{}{4, 3, 2, 1})
   523  		t.Assert(l.Len(), 4)
   524  	})
   525  }
   526  
   527  func TestList_BackAll(t *testing.T) {
   528  	gtest.C(t, func(t *gtest.T) {
   529  		l := New()
   530  		a1 := []interface{}{1, 2, 3, 4}
   531  		l.PushFronts(a1)
   532  		i1 := l.BackAll()
   533  		t.Assert(i1, []interface{}{1, 2, 3, 4})
   534  		t.Assert(l.Len(), 4)
   535  	})
   536  }
   537  
   538  func TestList_FrontValue(t *testing.T) {
   539  	gtest.C(t, func(t *gtest.T) {
   540  		l := New()
   541  		l2 := New()
   542  		a1 := []interface{}{1, 2, 3, 4}
   543  		l.PushFronts(a1)
   544  		i1 := l.FrontValue()
   545  		t.Assert(gconv.Int(i1), 4)
   546  		t.Assert(l.Len(), 4)
   547  
   548  		i1 = l2.FrontValue()
   549  		t.Assert(i1, nil)
   550  	})
   551  }
   552  
   553  func TestList_BackValue(t *testing.T) {
   554  	gtest.C(t, func(t *gtest.T) {
   555  		l := New()
   556  		l2 := New()
   557  		a1 := []interface{}{1, 2, 3, 4}
   558  		l.PushFronts(a1)
   559  		i1 := l.BackValue()
   560  		t.Assert(gconv.Int(i1), 1)
   561  		t.Assert(l.Len(), 4)
   562  
   563  		i1 = l2.FrontValue()
   564  		t.Assert(i1, nil)
   565  	})
   566  }
   567  
   568  func TestList_Back(t *testing.T) {
   569  	gtest.C(t, func(t *gtest.T) {
   570  		l := New()
   571  		a1 := []interface{}{1, 2, 3, 4}
   572  		l.PushFronts(a1)
   573  		e1 := l.Back()
   574  		t.Assert(e1.Value, 1)
   575  		t.Assert(l.Len(), 4)
   576  	})
   577  }
   578  
   579  func TestList_Size(t *testing.T) {
   580  	gtest.C(t, func(t *gtest.T) {
   581  		l := New()
   582  		a1 := []interface{}{1, 2, 3, 4}
   583  		l.PushFronts(a1)
   584  		t.Assert(l.Size(), 4)
   585  		l.PopFront()
   586  		t.Assert(l.Size(), 3)
   587  	})
   588  }
   589  
   590  func TestList_Removes(t *testing.T) {
   591  	gtest.C(t, func(t *gtest.T) {
   592  		l := New()
   593  		a1 := []interface{}{1, 2, 3, 4}
   594  		l.PushFronts(a1)
   595  		e1 := l.Back()
   596  		l.Removes([]*Element{e1})
   597  		t.Assert(l.Len(), 3)
   598  
   599  		e2 := l.Back()
   600  		l.Removes([]*Element{e2})
   601  		t.Assert(l.Len(), 2)
   602  		checkList(t, l, []interface{}{4, 3})
   603  	})
   604  }
   605  
   606  func TestList_Pop(t *testing.T) {
   607  	gtest.C(t, func(t *gtest.T) {
   608  		l := NewFrom([]interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9})
   609  
   610  		t.Assert(l.PopBack(), 9)
   611  		t.Assert(l.PopBacks(2), []interface{}{8, 7})
   612  		t.Assert(l.PopFront(), 1)
   613  		t.Assert(l.PopFronts(2), []interface{}{2, 3})
   614  	})
   615  }
   616  
   617  func TestList_Clear(t *testing.T) {
   618  	gtest.C(t, func(t *gtest.T) {
   619  		l := New()
   620  		a1 := []interface{}{1, 2, 3, 4}
   621  		l.PushFronts(a1)
   622  		l.Clear()
   623  		t.Assert(l.Len(), 0)
   624  	})
   625  }
   626  
   627  func TestList_IteratorAsc(t *testing.T) {
   628  	gtest.C(t, func(t *gtest.T) {
   629  		l := New()
   630  		a1 := []interface{}{1, 2, 5, 6, 3, 4}
   631  		l.PushFronts(a1)
   632  		e1 := l.Back()
   633  		fun1 := func(e *Element) bool {
   634  			return gconv.Int(e1.Value) > 2
   635  		}
   636  		checkList(t, l, []interface{}{4, 3, 6, 5, 2, 1})
   637  		l.IteratorAsc(fun1)
   638  		checkList(t, l, []interface{}{4, 3, 6, 5, 2, 1})
   639  	})
   640  }
   641  
   642  func TestList_IteratorDesc(t *testing.T) {
   643  	gtest.C(t, func(t *gtest.T) {
   644  		l := New()
   645  		a1 := []interface{}{1, 2, 3, 4}
   646  		l.PushFronts(a1)
   647  		e1 := l.Back()
   648  		fun1 := func(e *Element) bool {
   649  			return gconv.Int(e1.Value) > 6
   650  		}
   651  		l.IteratorDesc(fun1)
   652  		t.Assert(l.Len(), 4)
   653  		checkList(t, l, []interface{}{4, 3, 2, 1})
   654  	})
   655  }
   656  
   657  func TestList_Iterator(t *testing.T) {
   658  	gtest.C(t, func(t *gtest.T) {
   659  		l := New()
   660  		a1 := []interface{}{"a", "b", "c", "d", "e"}
   661  		l.PushFronts(a1)
   662  		e1 := l.Back()
   663  		fun1 := func(e *Element) bool {
   664  			return gconv.String(e1.Value) > "c"
   665  		}
   666  		checkList(t, l, []interface{}{"e", "d", "c", "b", "a"})
   667  		l.Iterator(fun1)
   668  		checkList(t, l, []interface{}{"e", "d", "c", "b", "a"})
   669  	})
   670  }
   671  
   672  func TestList_Join(t *testing.T) {
   673  	gtest.C(t, func(t *gtest.T) {
   674  		l := NewFrom([]interface{}{1, 2, "a", `"b"`, `\c`})
   675  		t.Assert(l.Join(","), `1,2,a,"b",\c`)
   676  		t.Assert(l.Join("."), `1.2.a."b".\c`)
   677  	})
   678  }
   679  
   680  func TestList_String(t *testing.T) {
   681  	gtest.C(t, func(t *gtest.T) {
   682  		l := NewFrom([]interface{}{1, 2, "a", `"b"`, `\c`})
   683  		t.Assert(l.String(), `[1,2,a,"b",\c]`)
   684  	})
   685  }
   686  
   687  func TestList_Json(t *testing.T) {
   688  	// Marshal
   689  	gtest.C(t, func(t *gtest.T) {
   690  		a := []interface{}{"a", "b", "c"}
   691  		l := New()
   692  		l.PushBacks(a)
   693  		b1, err1 := json.Marshal(l)
   694  		b2, err2 := json.Marshal(a)
   695  		t.Assert(err1, err2)
   696  		t.Assert(b1, b2)
   697  	})
   698  	// Unmarshal
   699  	gtest.C(t, func(t *gtest.T) {
   700  		a := []interface{}{"a", "b", "c"}
   701  		l := New()
   702  		b, err := json.Marshal(a)
   703  		t.AssertNil(err)
   704  
   705  		err = json.UnmarshalUseNumber(b, l)
   706  		t.AssertNil(err)
   707  		t.Assert(l.FrontAll(), a)
   708  	})
   709  	gtest.C(t, func(t *gtest.T) {
   710  		var l List
   711  		a := []interface{}{"a", "b", "c"}
   712  		b, err := json.Marshal(a)
   713  		t.AssertNil(err)
   714  
   715  		err = json.UnmarshalUseNumber(b, &l)
   716  		t.AssertNil(err)
   717  		t.Assert(l.FrontAll(), a)
   718  	})
   719  }
   720  
   721  func TestList_UnmarshalValue(t *testing.T) {
   722  	type TList struct {
   723  		Name string
   724  		List *List
   725  	}
   726  	// JSON
   727  	gtest.C(t, func(t *gtest.T) {
   728  		var tlist *TList
   729  		err := gconv.Struct(map[string]interface{}{
   730  			"name": "john",
   731  			"list": []byte(`[1,2,3]`),
   732  		}, &tlist)
   733  		t.AssertNil(err)
   734  		t.Assert(tlist.Name, "john")
   735  		t.Assert(tlist.List.FrontAll(), []interface{}{1, 2, 3})
   736  	})
   737  	// Map
   738  	gtest.C(t, func(t *gtest.T) {
   739  		var tlist *TList
   740  		err := gconv.Struct(map[string]interface{}{
   741  			"name": "john",
   742  			"list": []interface{}{1, 2, 3},
   743  		}, &tlist)
   744  		t.AssertNil(err)
   745  		t.Assert(tlist.Name, "john")
   746  		t.Assert(tlist.List.FrontAll(), []interface{}{1, 2, 3})
   747  	})
   748  }
   749  
   750  func TestList_DeepCopy(t *testing.T) {
   751  	gtest.C(t, func(t *gtest.T) {
   752  		l := NewFrom([]interface{}{1, 2, "a", `"b"`, `\c`})
   753  		copyList := l.DeepCopy()
   754  		cl := copyList.(*List)
   755  		cl.PopBack()
   756  		t.AssertNE(l.Size(), cl.Size())
   757  	})
   758  }