github.com/wangyougui/gf/v2@v2.6.5/util/gutil/gutil_z_unit_list_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 gutil_test
     8  
     9  import (
    10  	"testing"
    11  
    12  	"github.com/wangyougui/gf/v2/frame/g"
    13  	"github.com/wangyougui/gf/v2/test/gtest"
    14  	"github.com/wangyougui/gf/v2/util/gutil"
    15  )
    16  
    17  func Test_ListItemValues_Map(t *testing.T) {
    18  	gtest.C(t, func(t *gtest.T) {
    19  		listMap := g.List{
    20  			g.Map{"id": 1, "score": 100},
    21  			g.Map{"id": 2, "score": 99},
    22  			g.Map{"id": 3, "score": 99},
    23  		}
    24  		t.Assert(gutil.ListItemValues(listMap, "id"), g.Slice{1, 2, 3})
    25  		t.Assert(gutil.ListItemValues(&listMap, "id"), g.Slice{1, 2, 3})
    26  		t.Assert(gutil.ListItemValues(listMap, "score"), g.Slice{100, 99, 99})
    27  	})
    28  	gtest.C(t, func(t *gtest.T) {
    29  		listMap := g.List{
    30  			g.Map{"id": 1, "score": 100},
    31  			g.Map{"id": 2, "score": nil},
    32  			g.Map{"id": 3, "score": 0},
    33  		}
    34  		t.Assert(gutil.ListItemValues(listMap, "id"), g.Slice{1, 2, 3})
    35  		t.Assert(gutil.ListItemValues(listMap, "score"), g.Slice{100, nil, 0})
    36  	})
    37  	gtest.C(t, func(t *gtest.T) {
    38  		listMap := g.List{}
    39  		t.Assert(len(gutil.ListItemValues(listMap, "id")), 0)
    40  	})
    41  }
    42  
    43  func Test_ListItemValues_Map_SubKey(t *testing.T) {
    44  	type Scores struct {
    45  		Math    int
    46  		English int
    47  	}
    48  	gtest.C(t, func(t *gtest.T) {
    49  		listMap := g.List{
    50  			g.Map{"id": 1, "scores": Scores{100, 60}},
    51  			g.Map{"id": 2, "scores": Scores{0, 100}},
    52  			g.Map{"id": 3, "scores": Scores{59, 99}},
    53  		}
    54  		t.Assert(gutil.ListItemValues(listMap, "scores", "Math"), g.Slice{100, 0, 59})
    55  		t.Assert(gutil.ListItemValues(listMap, "scores", "English"), g.Slice{60, 100, 99})
    56  		t.Assert(gutil.ListItemValues(listMap, "scores", "PE"), g.Slice{})
    57  	})
    58  }
    59  
    60  func Test_ListItemValues_Map_Array_SubKey(t *testing.T) {
    61  	type Scores struct {
    62  		Math    int
    63  		English int
    64  	}
    65  	gtest.C(t, func(t *gtest.T) {
    66  		listMap := g.List{
    67  			g.Map{"id": 1, "scores": []Scores{{1, 2}, {3, 4}}},
    68  			g.Map{"id": 2, "scores": []Scores{{5, 6}, {7, 8}}},
    69  			g.Map{"id": 3, "scores": []Scores{{9, 10}, {11, 12}}},
    70  		}
    71  		t.Assert(gutil.ListItemValues(listMap, "scores", "Math"), g.Slice{1, 3, 5, 7, 9, 11})
    72  		t.Assert(gutil.ListItemValues(listMap, "scores", "English"), g.Slice{2, 4, 6, 8, 10, 12})
    73  		t.Assert(gutil.ListItemValues(listMap, "scores", "PE"), g.Slice{})
    74  	})
    75  }
    76  
    77  func Test_ListItemValues_Struct(t *testing.T) {
    78  	gtest.C(t, func(t *gtest.T) {
    79  		type T struct {
    80  			Id    int
    81  			Score float64
    82  		}
    83  		listStruct := g.Slice{
    84  			T{1, 100},
    85  			T{2, 99},
    86  			T{3, 0},
    87  		}
    88  		t.Assert(gutil.ListItemValues(listStruct, "Id"), g.Slice{1, 2, 3})
    89  		t.Assert(gutil.ListItemValues(listStruct, "Score"), g.Slice{100, 99, 0})
    90  	})
    91  	// Pointer items.
    92  	gtest.C(t, func(t *gtest.T) {
    93  		type T struct {
    94  			Id    int
    95  			Score float64
    96  		}
    97  		listStruct := g.Slice{
    98  			&T{1, 100},
    99  			&T{2, 99},
   100  			&T{3, 0},
   101  		}
   102  		t.Assert(gutil.ListItemValues(listStruct, "Id"), g.Slice{1, 2, 3})
   103  		t.Assert(gutil.ListItemValues(listStruct, "Score"), g.Slice{100, 99, 0})
   104  	})
   105  	// Nil element value.
   106  	gtest.C(t, func(t *gtest.T) {
   107  		type T struct {
   108  			Id    int
   109  			Score interface{}
   110  		}
   111  		listStruct := g.Slice{
   112  			T{1, 100},
   113  			T{2, nil},
   114  			T{3, 0},
   115  		}
   116  		t.Assert(gutil.ListItemValues(listStruct, "Id"), g.Slice{1, 2, 3})
   117  		t.Assert(gutil.ListItemValues(listStruct, "Score"), g.Slice{100, nil, 0})
   118  	})
   119  }
   120  
   121  func Test_ListItemValues_Struct_SubKey(t *testing.T) {
   122  	gtest.C(t, func(t *gtest.T) {
   123  		type Student struct {
   124  			Id    int
   125  			Score float64
   126  		}
   127  		type Class struct {
   128  			Total    int
   129  			Students []Student
   130  		}
   131  		listStruct := g.Slice{
   132  			Class{2, []Student{{1, 1}, {2, 2}}},
   133  			Class{3, []Student{{3, 3}, {4, 4}, {5, 5}}},
   134  			Class{1, []Student{{6, 6}}},
   135  		}
   136  		t.Assert(gutil.ListItemValues(listStruct, "Total"), g.Slice{2, 3, 1})
   137  		t.Assert(gutil.ListItemValues(listStruct, "Students"), `[[{"Id":1,"Score":1},{"Id":2,"Score":2}],[{"Id":3,"Score":3},{"Id":4,"Score":4},{"Id":5,"Score":5}],[{"Id":6,"Score":6}]]`)
   138  		t.Assert(gutil.ListItemValues(listStruct, "Students", "Id"), g.Slice{1, 2, 3, 4, 5, 6})
   139  	})
   140  	gtest.C(t, func(t *gtest.T) {
   141  		type Student struct {
   142  			Id    int
   143  			Score float64
   144  		}
   145  		type Class struct {
   146  			Total    int
   147  			Students []*Student
   148  		}
   149  		listStruct := g.Slice{
   150  			&Class{2, []*Student{{1, 1}, {2, 2}}},
   151  			&Class{3, []*Student{{3, 3}, {4, 4}, {5, 5}}},
   152  			&Class{1, []*Student{{6, 6}}},
   153  		}
   154  		t.Assert(gutil.ListItemValues(listStruct, "Total"), g.Slice{2, 3, 1})
   155  		t.Assert(gutil.ListItemValues(listStruct, "Students"), `[[{"Id":1,"Score":1},{"Id":2,"Score":2}],[{"Id":3,"Score":3},{"Id":4,"Score":4},{"Id":5,"Score":5}],[{"Id":6,"Score":6}]]`)
   156  		t.Assert(gutil.ListItemValues(listStruct, "Students", "Id"), g.Slice{1, 2, 3, 4, 5, 6})
   157  	})
   158  }
   159  
   160  func Test_ListItemValuesUnique(t *testing.T) {
   161  	gtest.C(t, func(t *gtest.T) {
   162  		listMap := g.List{
   163  			g.Map{"id": 1, "score": 100},
   164  			g.Map{"id": 2, "score": 100},
   165  			g.Map{"id": 3, "score": 100},
   166  			g.Map{"id": 4, "score": 100},
   167  			g.Map{"id": 5, "score": 100},
   168  		}
   169  		t.Assert(gutil.ListItemValuesUnique(listMap, "id"), g.Slice{1, 2, 3, 4, 5})
   170  		t.Assert(gutil.ListItemValuesUnique(listMap, "score"), g.Slice{100})
   171  	})
   172  	gtest.C(t, func(t *gtest.T) {
   173  		listMap := g.List{
   174  			g.Map{"id": 1, "score": 100},
   175  			g.Map{"id": 2, "score": 100},
   176  			g.Map{"id": 3, "score": 100},
   177  			g.Map{"id": 4, "score": 100},
   178  			g.Map{"id": 5, "score": 99},
   179  		}
   180  		t.Assert(gutil.ListItemValuesUnique(listMap, "id"), g.Slice{1, 2, 3, 4, 5})
   181  		t.Assert(gutil.ListItemValuesUnique(listMap, "score"), g.Slice{100, 99})
   182  	})
   183  	gtest.C(t, func(t *gtest.T) {
   184  		listMap := g.List{
   185  			g.Map{"id": 1, "score": 100},
   186  			g.Map{"id": 2, "score": 100},
   187  			g.Map{"id": 3, "score": 0},
   188  			g.Map{"id": 4, "score": 100},
   189  			g.Map{"id": 5, "score": 99},
   190  		}
   191  		t.Assert(gutil.ListItemValuesUnique(listMap, "id"), g.Slice{1, 2, 3, 4, 5})
   192  		t.Assert(gutil.ListItemValuesUnique(listMap, "score"), g.Slice{100, 0, 99})
   193  	})
   194  }
   195  
   196  func Test_ListItemValuesUnique_Struct_SubKey(t *testing.T) {
   197  	gtest.C(t, func(t *gtest.T) {
   198  		type Student struct {
   199  			Id    int
   200  			Score float64
   201  		}
   202  		type Class struct {
   203  			Total    int
   204  			Students []Student
   205  		}
   206  		listStruct := g.Slice{
   207  			Class{2, []Student{{1, 1}, {1, 2}}},
   208  			Class{3, []Student{{2, 3}, {2, 4}, {5, 5}}},
   209  			Class{1, []Student{{6, 6}}},
   210  		}
   211  		t.Assert(gutil.ListItemValuesUnique(listStruct, "Total"), g.Slice{2, 3, 1})
   212  		t.Assert(gutil.ListItemValuesUnique(listStruct, "Students", "Id"), g.Slice{1, 2, 5, 6})
   213  	})
   214  	gtest.C(t, func(t *gtest.T) {
   215  		type Student struct {
   216  			Id    int
   217  			Score float64
   218  		}
   219  		type Class struct {
   220  			Total    int
   221  			Students []*Student
   222  		}
   223  		listStruct := g.Slice{
   224  			&Class{2, []*Student{{1, 1}, {1, 2}}},
   225  			&Class{3, []*Student{{2, 3}, {2, 4}, {5, 5}}},
   226  			&Class{1, []*Student{{6, 6}}},
   227  		}
   228  		t.Assert(gutil.ListItemValuesUnique(listStruct, "Total"), g.Slice{2, 3, 1})
   229  		t.Assert(gutil.ListItemValuesUnique(listStruct, "Students", "Id"), g.Slice{1, 2, 5, 6})
   230  	})
   231  }
   232  
   233  func Test_ListItemValuesUnique_Map_Array_SubKey(t *testing.T) {
   234  	type Scores struct {
   235  		Math    int
   236  		English int
   237  	}
   238  	gtest.C(t, func(t *gtest.T) {
   239  		listMap := g.List{
   240  			g.Map{"id": 1, "scores": []Scores{{1, 2}, {1, 2}}},
   241  			g.Map{"id": 2, "scores": []Scores{{5, 8}, {5, 8}}},
   242  			g.Map{"id": 3, "scores": []Scores{{9, 10}, {11, 12}}},
   243  		}
   244  		t.Assert(gutil.ListItemValuesUnique(listMap, "scores", "Math"), g.Slice{1, 5, 9, 11})
   245  		t.Assert(gutil.ListItemValuesUnique(listMap, "scores", "English"), g.Slice{2, 8, 10, 12})
   246  		t.Assert(gutil.ListItemValuesUnique(listMap, "scores", "PE"), g.Slice{})
   247  	})
   248  }
   249  
   250  func Test_ListItemValuesUnique_Binary_ID(t *testing.T) {
   251  	gtest.C(t, func(t *gtest.T) {
   252  		listMap := g.List{
   253  			g.Map{"id": []byte{1}, "score": 100},
   254  			g.Map{"id": []byte{2}, "score": 100},
   255  			g.Map{"id": []byte{3}, "score": 100},
   256  			g.Map{"id": []byte{4}, "score": 100},
   257  			g.Map{"id": []byte{4}, "score": 100},
   258  		}
   259  		t.Assert(gutil.ListItemValuesUnique(listMap, "id"), g.Slice{[]byte{1}, []byte{2}, []byte{3}, []byte{4}})
   260  		t.Assert(gutil.ListItemValuesUnique(listMap, "score"), g.Slice{100})
   261  	})
   262  }