tuple_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // +build all integration
  2. package gocql
  3. import (
  4. "reflect"
  5. "testing"
  6. )
  7. func TestTupleSimple(t *testing.T) {
  8. session := createSession(t)
  9. defer session.Close()
  10. if session.cfg.ProtoVersion < protoVersion3 {
  11. t.Skip("tuple types are only available of proto>=3")
  12. }
  13. err := createTable(session, `CREATE TABLE gocql_test.tuple_test(
  14. id int,
  15. coord frozen<tuple<int, int>>,
  16. primary key(id))`)
  17. if err != nil {
  18. t.Fatal(err)
  19. }
  20. err = session.Query("INSERT INTO tuple_test(id, coord) VALUES(?, (?, ?))", 1, 100, -100).Exec()
  21. if err != nil {
  22. t.Fatal(err)
  23. }
  24. var (
  25. id int
  26. coord struct {
  27. x int
  28. y int
  29. }
  30. )
  31. iter := session.Query("SELECT id, coord FROM tuple_test WHERE id=?", 1)
  32. if err := iter.Scan(&id, &coord.x, &coord.y); err != nil {
  33. t.Fatal(err)
  34. }
  35. if id != 1 {
  36. t.Errorf("expected to get id=1 got: %v", id)
  37. }
  38. if coord.x != 100 {
  39. t.Errorf("expected to get coord.x=100 got: %v", coord.x)
  40. }
  41. if coord.y != -100 {
  42. t.Errorf("expected to get coord.y=-100 got: %v", coord.y)
  43. }
  44. }
  45. func TestTupleMapScan(t *testing.T) {
  46. session := createSession(t)
  47. defer session.Close()
  48. if session.cfg.ProtoVersion < protoVersion3 {
  49. t.Skip("tuple types are only available of proto>=3")
  50. }
  51. err := createTable(session, `CREATE TABLE gocql_test.tuple_map_scan(
  52. id int,
  53. val frozen<tuple<int, int>>,
  54. primary key(id))`)
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. if err := session.Query(`INSERT INTO tuple_map_scan (id, val) VALUES (1, (1, 2));`).Exec(); err != nil {
  59. t.Fatal(err)
  60. }
  61. m := make(map[string]interface{})
  62. err = session.Query(`SELECT * FROM tuple_map_scan`).MapScan(m)
  63. if err != nil {
  64. t.Fatal(err)
  65. }
  66. }
  67. func TestTuple_NestedCollection(t *testing.T) {
  68. session := createSession(t)
  69. defer session.Close()
  70. if session.cfg.ProtoVersion < protoVersion3 {
  71. t.Skip("tuple types are only available of proto>=3")
  72. }
  73. err := createTable(session, `CREATE TABLE gocql_test.nested_tuples(
  74. id int,
  75. val list<frozen<tuple<int, text>>>,
  76. primary key(id))`)
  77. if err != nil {
  78. t.Fatal(err)
  79. }
  80. type typ struct {
  81. A int
  82. B string
  83. }
  84. tests := []struct {
  85. name string
  86. val interface{}
  87. }{
  88. {name: "slice", val: [][]interface{}{{1, "2"}, {3, "4"}}},
  89. {name: "array", val: [][2]interface{}{{1, "2"}, {3, "4"}}},
  90. {name: "struct", val: []typ{{1, "2"}, {3, "4"}}},
  91. }
  92. for i, test := range tests {
  93. t.Run(test.name, func(t *testing.T) {
  94. if err := session.Query(`INSERT INTO nested_tuples (id, val) VALUES (?, ?);`, i, test.val).Exec(); err != nil {
  95. t.Fatal(err)
  96. }
  97. rv := reflect.ValueOf(test.val)
  98. res := reflect.New(rv.Type()).Elem().Addr().Interface()
  99. err = session.Query(`SELECT val FROM nested_tuples WHERE id=?`, i).Scan(res)
  100. if err != nil {
  101. t.Fatal(err)
  102. }
  103. })
  104. }
  105. }