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 }