tuple_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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. } else if coord.x != 100 {
  38. t.Errorf("expected to get coord.x=100 got: %v", coord.x)
  39. } else if coord.y != -100 {
  40. t.Errorf("expected to get coord.y=-100 got: %v", coord.y)
  41. }
  42. }
  43. func TestTuple_NullTuple(t *testing.T) {
  44. session := createSession(t)
  45. defer session.Close()
  46. if session.cfg.ProtoVersion < protoVersion3 {
  47. t.Skip("tuple types are only available of proto>=3")
  48. }
  49. err := createTable(session, `CREATE TABLE gocql_test.tuple_nil_test(
  50. id int,
  51. coord frozen<tuple<int, int>>,
  52. primary key(id))`)
  53. if err != nil {
  54. t.Fatal(err)
  55. }
  56. const id = 1
  57. err = session.Query("INSERT INTO tuple_nil_test(id, coord) VALUES(?, (?, ?))", id, nil, nil).Exec()
  58. if err != nil {
  59. t.Fatal(err)
  60. }
  61. x := new(int)
  62. y := new(int)
  63. iter := session.Query("SELECT coord FROM tuple_nil_test WHERE id=?", id)
  64. if err := iter.Scan(&x, &y); err != nil {
  65. t.Fatal(err)
  66. }
  67. if x != nil {
  68. t.Fatalf("should be nil got %+#v", x)
  69. } else if y != nil {
  70. t.Fatalf("should be nil got %+#v", y)
  71. }
  72. }
  73. func TestTupleMapScan(t *testing.T) {
  74. session := createSession(t)
  75. defer session.Close()
  76. if session.cfg.ProtoVersion < protoVersion3 {
  77. t.Skip("tuple types are only available of proto>=3")
  78. }
  79. err := createTable(session, `CREATE TABLE gocql_test.tuple_map_scan(
  80. id int,
  81. val frozen<tuple<int, int>>,
  82. primary key(id))`)
  83. if err != nil {
  84. t.Fatal(err)
  85. }
  86. if err := session.Query(`INSERT INTO tuple_map_scan (id, val) VALUES (1, (1, 2));`).Exec(); err != nil {
  87. t.Fatal(err)
  88. }
  89. m := make(map[string]interface{})
  90. err = session.Query(`SELECT * FROM tuple_map_scan`).MapScan(m)
  91. if err != nil {
  92. t.Fatal(err)
  93. }
  94. }
  95. func TestTuple_NestedCollection(t *testing.T) {
  96. session := createSession(t)
  97. defer session.Close()
  98. if session.cfg.ProtoVersion < protoVersion3 {
  99. t.Skip("tuple types are only available of proto>=3")
  100. }
  101. err := createTable(session, `CREATE TABLE gocql_test.nested_tuples(
  102. id int,
  103. val list<frozen<tuple<int, text>>>,
  104. primary key(id))`)
  105. if err != nil {
  106. t.Fatal(err)
  107. }
  108. type typ struct {
  109. A int
  110. B string
  111. }
  112. tests := []struct {
  113. name string
  114. val interface{}
  115. }{
  116. {name: "slice", val: [][]interface{}{{1, "2"}, {3, "4"}}},
  117. {name: "array", val: [][2]interface{}{{1, "2"}, {3, "4"}}},
  118. {name: "struct", val: []typ{{1, "2"}, {3, "4"}}},
  119. }
  120. for i, test := range tests {
  121. t.Run(test.name, func(t *testing.T) {
  122. if err := session.Query(`INSERT INTO nested_tuples (id, val) VALUES (?, ?);`, i, test.val).Exec(); err != nil {
  123. t.Fatal(err)
  124. }
  125. rv := reflect.ValueOf(test.val)
  126. res := reflect.New(rv.Type()).Elem().Addr().Interface()
  127. err = session.Query(`SELECT val FROM nested_tuples WHERE id=?`, i).Scan(res)
  128. if err != nil {
  129. t.Fatal(err)
  130. }
  131. })
  132. }
  133. }