go-ml.dev/pkg/base@v0.0.0-20200610162856-60c38abac71b/tests/tables_test.go (about)

     1  package tests
     2  
     3  import (
     4  	"fmt"
     5  	"go-ml.dev/pkg/base/fu"
     6  	"go-ml.dev/pkg/base/tables"
     7  	"gotest.tools/assert"
     8  	"gotest.tools/assert/cmp"
     9  	"math/rand"
    10  	"reflect"
    11  	"testing"
    12  	"time"
    13  )
    14  
    15  func Test_New0(t *testing.T) {
    16  	q := tables.New([]struct {
    17  		Name string
    18  		Age  int
    19  		Rate float32
    20  	}{})
    21  	assert.DeepEqual(t, q.Names(), []string{"Name", "Age", "Rate"})
    22  	assert.Assert(t, q.Len() == 0)
    23  }
    24  
    25  func Test_New1(t *testing.T) {
    26  	q := tables.New([]struct {
    27  		Name string
    28  		Age  int
    29  		Rate float32
    30  	}{{"Ivanov", 32, 1.2}})
    31  	assert.DeepEqual(t, q.Names(), []string{"Name", "Age", "Rate"})
    32  	assert.Assert(t, q.Len() == 1)
    33  	assert.DeepEqual(t, fu.MapInterface(q.Row(0)),
    34  		map[string]interface{}{
    35  			"Name": "Ivanov",
    36  			"Age":  32,
    37  			"Rate": float32(1.2),
    38  		})
    39  }
    40  
    41  func Test_New2(t *testing.T) {
    42  	q := tables.New([]struct {
    43  		Name string
    44  		Age  int
    45  		Rate float32
    46  	}{
    47  		{"Ivanov", 32, 1.2},
    48  		{"Petrov", 44, 1.5}})
    49  	assert.DeepEqual(t, q.Names(), []string{"Name", "Age", "Rate"})
    50  	assert.Assert(t, q.Len() == 2)
    51  	assert.DeepEqual(t, fu.MapInterface(q.Row(0)),
    52  		map[string]interface{}{
    53  			"Name": "Ivanov",
    54  			"Age":  32,
    55  			"Rate": float32(1.2),
    56  		})
    57  	assert.DeepEqual(t, fu.MapInterface(q.Row(1)),
    58  		map[string]interface{}{
    59  			"Name": "Petrov",
    60  			"Age":  44,
    61  			"Rate": float32(1.5),
    62  		})
    63  }
    64  
    65  func Test_New3(t *testing.T) {
    66  	q := tables.New(map[string]interface{}{
    67  		"Name": []string{"Ivanov", "Petrov"},
    68  		"Age":  []int{32, 44},
    69  		"Rate": []float32{1.2, 1.5}})
    70  	assert.DeepEqual(t, q.Names(), []string{"Age", "Name", "Rate"})
    71  	assert.Assert(t, q.Len() == 2)
    72  	assert.DeepEqual(t, fu.MapInterface(q.Row(0)),
    73  		map[string]interface{}{
    74  			"Name": "Ivanov",
    75  			"Age":  32,
    76  			"Rate": float32(1.2),
    77  		})
    78  	assert.DeepEqual(t, fu.MapInterface(q.Row(1)),
    79  		map[string]interface{}{
    80  			"Name": "Petrov",
    81  			"Age":  44,
    82  			"Rate": float32(1.5),
    83  		})
    84  }
    85  
    86  func Test_New4(t *testing.T) {
    87  	type R struct {
    88  		Name string
    89  		Age  int
    90  		Rate float32
    91  	}
    92  	c := make(chan R)
    93  	go func() {
    94  		c <- R{"Ivanov", 32, 1.2}
    95  		c <- R{"Petrov", 44, 1.5}
    96  		close(c)
    97  	}()
    98  	q := tables.New(c)
    99  	assert.DeepEqual(t, q.Names(), []string{"Name", "Age", "Rate"})
   100  	assert.Assert(t, q.Len() == 2)
   101  	assert.DeepEqual(t, fu.MapInterface(q.Row(0)),
   102  		map[string]interface{}{
   103  			"Name": "Ivanov",
   104  			"Age":  32,
   105  			"Rate": float32(1.2),
   106  		})
   107  	assert.DeepEqual(t, fu.MapInterface(q.Row(1)),
   108  		map[string]interface{}{
   109  			"Name": "Petrov",
   110  			"Age":  44,
   111  			"Rate": float32(1.5),
   112  		})
   113  }
   114  
   115  func Test_Row1(t *testing.T) {
   116  	q := TrTable()
   117  	r := TR{}
   118  	for i, v := range trList {
   119  		q.Fetch(i, &r)
   120  		assert.DeepEqual(t, r, v)
   121  	}
   122  }
   123  
   124  func Test_Row2(t *testing.T) {
   125  	q := TrTable()
   126  	r := struct{ A int }{}
   127  	assert.Assert(t, cmp.Panics(func() {
   128  		q.Fetch(0, &r)
   129  	}))
   130  	x := map[int]interface{}{}
   131  	assert.Assert(t, cmp.Panics(func() {
   132  		q.Fetch(0, &x)
   133  	}))
   134  }
   135  
   136  func Test_Append0(t *testing.T) {
   137  	q := tables.Empty()
   138  	assert.Assert(t, cmp.Panics(func() { q.Append([]int{0}) }))
   139  	assert.Assert(t, cmp.Panics(func() { q.Append(0) }))
   140  	assert.Assert(t, cmp.Panics(func() {
   141  		q.Append(map[string]interface{}{
   142  			"Name": []string{"a", "b"},
   143  			"Age":  []int{0},
   144  		})
   145  	}))
   146  	q2 := q.Append([]struct{ Name string }{})
   147  	assert.Assert(t, q.Len() == q2.Len())
   148  	assert.Assert(t, cmp.Panics(func() { q2.Append(struct{ Name int }{0}) }))
   149  	assert.Assert(t, q.Append([]struct{ Age int }{{0}}).Len() == q.Len()+1)
   150  	assert.Assert(t, q.Append([]struct{ Tall int }{{0}}).Len() == q.Len()+1)
   151  }
   152  
   153  func Test_ColumnString(t *testing.T) {
   154  	q := PrepareTable(t)
   155  
   156  	assert.DeepEqual(t, q.Col("Name").Text(0), "Ivanov")
   157  	assert.DeepEqual(t, q.Col("Name").Text(1), "Petrov")
   158  	assert.DeepEqual(t, q.Col("Age").Text(0), "32")
   159  	assert.DeepEqual(t, q.Col("Age").Text(1), "44")
   160  	assert.DeepEqual(t, q.Col("Rate").Text(0), "1.2")
   161  	assert.DeepEqual(t, q.Col("Rate").Text(1), "1.5")
   162  
   163  	assert.Assert(t, cmp.Panics(func() { q.Col("name") }))
   164  }
   165  
   166  func Test_ColumnStrings(t *testing.T) {
   167  	q := PrepareTable(t)
   168  
   169  	assert.DeepEqual(t, q.Col("Name").Strings(), []string{"Ivanov", "Petrov"})
   170  	assert.DeepEqual(t, q.Col("Age").Strings(), []string{"32", "44"})
   171  	assert.DeepEqual(t, q.Col("Rate").Strings(), []string{"1.2", "1.5"})
   172  }
   173  
   174  func Test_ColumnInt(t *testing.T) {
   175  	q := PrepareTable(t)
   176  
   177  	assert.DeepEqual(t, q.Col("Age").Int(0), 32)
   178  	assert.DeepEqual(t, q.Col("Age").Int(1), 44)
   179  	assert.DeepEqual(t, q.Col("Rate").Int(0), 1)
   180  	assert.DeepEqual(t, q.Col("Rate").Int(1), 1)
   181  
   182  	assert.DeepEqual(t, q.Col("Age").Int8(0), int8(32))
   183  	assert.DeepEqual(t, q.Col("Rate").Int8(0), int8(1))
   184  
   185  	assert.DeepEqual(t, q.Col("Age").Int16(0), int16(32))
   186  	assert.DeepEqual(t, q.Col("Rate").Int16(0), int16(1))
   187  
   188  	assert.DeepEqual(t, q.Col("Age").Int32(0), int32(32))
   189  	assert.DeepEqual(t, q.Col("Rate").Int32(0), int32(1))
   190  
   191  	assert.DeepEqual(t, q.Col("Age").Int64(0), int64(32))
   192  	assert.DeepEqual(t, q.Col("Rate").Int64(0), int64(1))
   193  
   194  	assert.DeepEqual(t, q.Col("Age").Uint(0), uint(32))
   195  	assert.DeepEqual(t, q.Col("Rate").Uint(0), uint(1))
   196  
   197  	assert.DeepEqual(t, q.Col("Age").Uint8(0), uint8(32))
   198  	assert.DeepEqual(t, q.Col("Rate").Uint8(0), uint8(1))
   199  
   200  	assert.DeepEqual(t, q.Col("Age").Uint16(0), uint16(32))
   201  	assert.DeepEqual(t, q.Col("Rate").Uint16(0), uint16(1))
   202  
   203  	assert.DeepEqual(t, q.Col("Age").Uint32(0), uint32(32))
   204  	assert.DeepEqual(t, q.Col("Rate").Uint32(0), uint32(1))
   205  
   206  	assert.DeepEqual(t, q.Col("Age").Uint64(0), uint64(32))
   207  	assert.DeepEqual(t, q.Col("Rate").Uint64(0), uint64(1))
   208  
   209  	assert.Assert(t, cmp.Panics(func() { q.Col("age") }))
   210  }
   211  
   212  func Test_ColumnInts(t *testing.T) {
   213  	q := PrepareTable(t)
   214  
   215  	assert.DeepEqual(t, q.Col("Age").Ints(), []int{32, 44})
   216  	assert.DeepEqual(t, q.Col("Age").Ints8(), []int8{32, 44})
   217  	assert.DeepEqual(t, q.Col("Age").Ints16(), []int16{32, 44})
   218  	assert.DeepEqual(t, q.Col("Age").Ints32(), []int32{32, 44})
   219  	assert.DeepEqual(t, q.Col("Age").Ints64(), []int64{32, 44})
   220  	assert.DeepEqual(t, q.Col("Age").Uints(), []uint{32, 44})
   221  	assert.DeepEqual(t, q.Col("Age").Uints8(), []uint8{32, 44})
   222  	assert.DeepEqual(t, q.Col("Age").Uints16(), []uint16{32, 44})
   223  	assert.DeepEqual(t, q.Col("Age").Uints32(), []uint32{32, 44})
   224  	assert.DeepEqual(t, q.Col("Age").Uints64(), []uint64{32, 44})
   225  }
   226  
   227  func Test_ColumnInt2(t *testing.T) {
   228  	q := PrepareTable(t)
   229  
   230  	c := q.Col("Age")
   231  	assert.Assert(t, c.Index(0).Int() == 32)
   232  	assert.Assert(t, c.Index(0).Int8() == 32)
   233  	assert.Assert(t, c.Index(0).Int16() == 32)
   234  	assert.Assert(t, c.Index(0).Int32() == 32)
   235  	assert.Assert(t, c.Index(0).Int64() == 32)
   236  	assert.Assert(t, c.Index(0).Uint() == 32)
   237  	assert.Assert(t, c.Index(0).Uint8() == 32)
   238  	assert.Assert(t, c.Index(0).Uint16() == 32)
   239  	assert.Assert(t, c.Index(0).Uint32() == 32)
   240  	assert.Assert(t, c.Index(0).Uint64() == 32)
   241  }
   242  
   243  func Test_ColumnFloat(t *testing.T) {
   244  	q := PrepareTable(t)
   245  
   246  	assert.DeepEqual(t, q.Col("Rate").Real(0), float32(1.2))
   247  	assert.DeepEqual(t, q.Col("Rate").Real(1), float32(1.5))
   248  	assert.DeepEqual(t, q.Col("Rate").Float(0), float64(float32(1.2)))
   249  	assert.DeepEqual(t, q.Col("Rate").Float(1), float64(float32(1.5)))
   250  
   251  	assert.DeepEqual(t, q.Col("Age").Real(0), float32(32))
   252  	assert.DeepEqual(t, q.Col("Age").Float(0), float64(32))
   253  
   254  	assert.Assert(t, cmp.Panics(func() { q.Col("rate") }))
   255  }
   256  
   257  func Test_ColumnFloats(t *testing.T) {
   258  	q := PrepareTable(t)
   259  
   260  	assert.DeepEqual(t, q.Col("Age").Reals(), []float32{32, 44})
   261  	assert.DeepEqual(t, q.Col("Rate").Reals(), []float32{1.2, 1.5})
   262  	assert.DeepEqual(t, q.Col("Age").Floats(), []float64{32, 44})
   263  	assert.DeepEqual(t, q.Col("Rate").Floats(), []float64{float64(float32(1.2)), float64(float32(1.5))})
   264  }
   265  
   266  func Test_ColumnLen(t *testing.T) {
   267  	q := PrepareTable(t)
   268  
   269  	assert.Assert(t, q.Len() == 2)
   270  
   271  	q2 := q.Append([]struct {
   272  		Name string
   273  		Age  int
   274  	}{{"Sidorov", 55}})
   275  
   276  	assert.Assert(t, q.Len() == 2)
   277  	assert.Assert(t, q2.Len() == 3)
   278  }
   279  
   280  func Test_ColumnUnique(t *testing.T) {
   281  	q := PrepareTable(t)
   282  	assert.DeepEqual(t, q.Col("Name").Unique().Strings(), []string{"Ivanov", "Petrov"})
   283  
   284  	q2 := q.Append([]struct {
   285  		Name string
   286  		Age  int
   287  	}{{"Sidorov", 55}, {"Ivanov", 55}})
   288  
   289  	assert.Assert(t, q2.Len() == 4)
   290  	assert.DeepEqual(t, q2.Col("Name").Unique().Strings(), []string{"Ivanov", "Petrov", "Sidorov"})
   291  	assert.DeepEqual(t, q2.Col("Age").Unique().Ints(), []int{32, 44, 55})
   292  	assert.DeepEqual(t, q2.Col("Rate").Unique().Reals(), []float32{1.2, 1.5, 0})
   293  
   294  	q3 := q.Append([]struct {
   295  		Name string
   296  		Tall int
   297  	}{{"Sidorov", 55}, {"Ivanov", 55}})
   298  
   299  	assert.DeepEqual(t, q3.Col("Tall").Unique().Strings(), []string{"0", "55"})
   300  }
   301  
   302  func Test_Col0(t *testing.T) {
   303  	r := map[int]interface{}{}
   304  	assert.Assert(t, cmp.Panics(func() {
   305  		tables.Col(r)
   306  	}))
   307  }
   308  
   309  func Test_Col1(t *testing.T) {
   310  	r := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
   311  	c := tables.Col(r)
   312  	assert.Assert(t, c.Len() == len(r))
   313  	assert.Assert(t, c.Type() == reflect.TypeOf(r[0]))
   314  	for i, v := range r {
   315  		assert.Assert(t, c.Int(i) == v)
   316  		assert.Assert(t, c.Interface(i).(int) == v)
   317  		assert.Assert(t, c.Inspect().([]int)[i] == v)
   318  	}
   319  }
   320  
   321  func Test_Col2(t *testing.T) {
   322  	r := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
   323  	rand.Seed(time.Now().UnixNano())
   324  	rand.Shuffle(len(r), func(i, j int) { r[i], r[j] = r[j], r[i] })
   325  	c := tables.Col(r)
   326  	assert.Assert(t, c.Max().Int() == 9)
   327  	assert.Assert(t, c.Min().Int() == 0)
   328  	assert.Assert(t, r[c.MaxIndex()] == 9)
   329  	assert.Assert(t, c.Index(c.MaxIndex()).Int() == 9)
   330  	assert.Assert(t, c.Index(c.MinIndex()).Int() == 0)
   331  }
   332  
   333  type ColR3 int
   334  
   335  func (a ColR3) Less(b ColR3) bool {
   336  	return b < a
   337  }
   338  
   339  func Test_Col3(t *testing.T) {
   340  	r := []ColR3{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
   341  	rand.Seed(time.Now().UnixNano())
   342  	rand.Shuffle(len(r), func(i, j int) { r[i], r[j] = r[j], r[i] })
   343  	c := tables.Col(r)
   344  	assert.Assert(t, c.Max().Int() == 0)
   345  	assert.Assert(t, c.Min().Int() == 9)
   346  	assert.Assert(t, c.Index(c.MaxIndex()).Int() == 0)
   347  	assert.Assert(t, c.Index(c.MinIndex()).Int() == 9)
   348  }
   349  
   350  type ColR4 struct {
   351  	a int
   352  	b uint
   353  	c float64
   354  	e [2]byte
   355  	d string
   356  }
   357  
   358  func MkColR4(i int) *ColR4 {
   359  	return &ColR4{
   360  		0,
   361  		uint(1),
   362  		float64(2) * 0.1,
   363  		[2]byte{0, byte(i)},
   364  		fmt.Sprintf("col4:%d", i),
   365  	}
   366  }
   367  
   368  func Test_Col4(t *testing.T) {
   369  	r := []*ColR4{MkColR4(0), MkColR4(1), MkColR4(1), MkColR4(2), MkColR4(3), MkColR4(4), MkColR4(5)}
   370  	rand.Seed(time.Now().UnixNano())
   371  	rand.Shuffle(len(r), func(i, j int) { r[i], r[j] = r[j], r[i] })
   372  	c := tables.Col(r)
   373  	assert.Assert(t, c.Max().Interface().(*ColR4).d == "col4:5")
   374  	assert.Assert(t, c.Min().Interface().(*ColR4).d == "col4:0")
   375  }
   376  
   377  func Test_Col5(t *testing.T) {
   378  	r := []*ColR4{MkColR4(0), MkColR4(1), MkColR4(1), nil, MkColR4(4), MkColR4(5)}
   379  	rand.Seed(time.Now().UnixNano())
   380  	rand.Shuffle(len(r), func(i, j int) { r[i], r[j] = r[j], r[i] })
   381  	c := tables.Col(r)
   382  	assert.Assert(t, c.Max().Interface().(*ColR4).d == "col4:5")
   383  	assert.Assert(t, c.Min().Interface().(*ColR4) == nil)
   384  }
   385  
   386  func Test_Col6(t *testing.T) {
   387  	r := []*ColR4{MkColR4(0), MkColR4(0), MkColR4(0), MkColR4(1)}
   388  	c := tables.Col(r)
   389  	assert.Assert(t, c.Max().Interface().(*ColR4).d == "col4:1")
   390  	assert.Assert(t, c.Min().Interface().(*ColR4).d == "col4:0")
   391  }
   392  
   393  func Test_NA1(t *testing.T) {
   394  	q := tables.Empty()
   395  	q2 := q.Append([]struct{ Name string }{{"Hello"}})
   396  	q3 := q2.Append([]struct{ Age int }{})
   397  	assert.Assert(t, q3.Col("Name").Len() == 1)
   398  	assert.Assert(t, q3.Col("Age").Len() == 1)
   399  	assert.Assert(t, !q3.Col("Name").Na(0))
   400  	assert.Assert(t, q3.Col("Age").Na(0))
   401  }
   402  
   403  func Test_NA2(t *testing.T) {
   404  	q := tables.Empty()
   405  	q2 := q.Append([]struct {
   406  		Name string
   407  		Rate float32
   408  	}{{"Hello", 1.2}})
   409  	q3 := q2.Append([]struct {
   410  		Age  int
   411  		Rate float32
   412  	}{{0, 0}})
   413  
   414  	q4 := q3.Append([]struct {
   415  		Name string
   416  		Age  int
   417  		Rate float32
   418  	}{{"Hello", 0, 0}})
   419  
   420  	q5 := q4.FillNa(struct {
   421  		Name string
   422  		Age  int
   423  	}{"Empty", -1})
   424  	q6 := q4.FillNa(map[string]interface{}{"Name": "Empty", "Age": -1})
   425  	q7 := q4.FillNa(map[string]interface{}{"Rate": 0})
   426  	q8 := q4.FillNa(map[string]interface{}{"Name": 0, "Age": -1.0})
   427  
   428  	assert.Assert(t, q4.Col("Name").Len() == 3)
   429  	assert.Assert(t, q4.Col("Age").Len() == 3)
   430  
   431  	assert.Assert(t, !q4.Col("Name").Na(0))
   432  	assert.Assert(t, q4.Col("Age").Na(0))
   433  	assert.Assert(t, q4.Col("Name").Na(1))
   434  	assert.Assert(t, !q4.Col("Age").Na(1))
   435  	assert.Assert(t, !q4.Col("Name").Na(2))
   436  	assert.Assert(t, !q4.Col("Age").Na(2))
   437  
   438  	assert.Assert(t, q4.DropNa().Len() == 1)
   439  	assert.Assert(t, q4.DropNa("Name").Len() == 2)
   440  	assert.Assert(t, q4.DropNa("Age").Len() == 2)
   441  	assert.Assert(t, q2.DropNa().Len() == 1)
   442  
   443  	assert.Assert(t, cmp.Panics(func() {
   444  		q2.DropNa("pigs")
   445  	}))
   446  
   447  	assert.Assert(t, cmp.Panics(func() {
   448  		q4.FillNa("pigs")
   449  	}))
   450  
   451  	assert.Assert(t, cmp.Panics(func() {
   452  		q4.FillNa(struct{ Name1 string }{})
   453  	}))
   454  
   455  	assert.Assert(t, q5.DropNa().Len() == 3)
   456  	assert.Assert(t, !q5.Col("Name").Na(0))
   457  	assert.Assert(t, !q5.Col("Age").Na(0))
   458  	assert.Assert(t, !q5.Col("Name").Na(1))
   459  	assert.Assert(t, !q5.Col("Age").Na(1))
   460  	assert.Assert(t, !q5.Col("Name").Na(2))
   461  	assert.Assert(t, !q5.Col("Age").Na(2))
   462  	assert.Assert(t, q5.Col("Age").Int(0) == -1)
   463  	assert.Assert(t, q5.Col("Name").Text(1) == "Empty")
   464  
   465  	assert.Assert(t, q6.DropNa().Len() == 3)
   466  	assert.Assert(t, !q6.Col("Name").Na(0))
   467  	assert.Assert(t, !q6.Col("Age").Na(0))
   468  	assert.Assert(t, !q6.Col("Name").Na(1))
   469  	assert.Assert(t, !q6.Col("Age").Na(1))
   470  	assert.Assert(t, !q6.Col("Name").Na(2))
   471  	assert.Assert(t, !q6.Col("Age").Na(2))
   472  	assert.Assert(t, q6.Col("Age").Int(0) == -1)
   473  	assert.Assert(t, q6.Col("Name").Text(1) == "Empty")
   474  
   475  	assert.Assert(t, q7.DropNa().Len() == 1)
   476  	assert.Assert(t, q8.DropNa().Len() == 3)
   477  	assert.Assert(t, q8.Col("Age").Int(0) == -1)
   478  	assert.Assert(t, q8.Col("Name").Text(1) == "0")
   479  }