helpers_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package gocql
  2. import (
  3. "reflect"
  4. "testing"
  5. )
  6. func TestGetCassandraType_Set(t *testing.T) {
  7. typ := getCassandraType("set<text>")
  8. set, ok := typ.(CollectionType)
  9. if !ok {
  10. t.Fatalf("expected CollectionType got %T", typ)
  11. } else if set.typ != TypeSet {
  12. t.Fatalf("expected type %v got %v", TypeSet, set.typ)
  13. }
  14. inner, ok := set.Elem.(NativeType)
  15. if !ok {
  16. t.Fatalf("expected to get NativeType got %T", set.Elem)
  17. } else if inner.typ != TypeText {
  18. t.Fatalf("expected to get %v got %v for set value", TypeText, set.typ)
  19. }
  20. }
  21. func TestGetCassandraType(t *testing.T) {
  22. tests := []struct {
  23. input string
  24. exp TypeInfo
  25. }{
  26. {
  27. "set<text>", CollectionType{
  28. NativeType: NativeType{typ: TypeSet},
  29. Elem: NativeType{typ: TypeText},
  30. },
  31. },
  32. {
  33. "map<text, varchar>", CollectionType{
  34. NativeType: NativeType{typ: TypeMap},
  35. Key: NativeType{typ: TypeText},
  36. Elem: NativeType{typ: TypeVarchar},
  37. },
  38. },
  39. {
  40. "list<int>", CollectionType{
  41. NativeType: NativeType{typ: TypeList},
  42. Elem: NativeType{typ: TypeInt},
  43. },
  44. },
  45. {
  46. "tuple<int, int, text>", TupleTypeInfo{
  47. NativeType: NativeType{typ: TypeTuple},
  48. Elems: []TypeInfo{
  49. NativeType{typ: TypeInt},
  50. NativeType{typ: TypeInt},
  51. NativeType{typ: TypeText},
  52. },
  53. },
  54. },
  55. {
  56. "frozen<map<text, frozen<list<frozen<tuple<int, int>>>>>>", CollectionType{
  57. NativeType: NativeType{typ: TypeMap},
  58. Key: NativeType{typ: TypeText},
  59. Elem: CollectionType{
  60. NativeType: NativeType{typ: TypeList},
  61. Elem: TupleTypeInfo{
  62. NativeType: NativeType{typ: TypeTuple},
  63. Elems: []TypeInfo{
  64. NativeType{typ: TypeInt},
  65. NativeType{typ: TypeInt},
  66. },
  67. },
  68. },
  69. },
  70. },
  71. {
  72. "frozen<tuple<frozen<tuple<text, frozen<list<frozen<tuple<int, int>>>>>>, frozen<tuple<text, frozen<list<frozen<tuple<int, int>>>>>>, frozen<map<text, frozen<list<frozen<tuple<int, int>>>>>>>>",
  73. TupleTypeInfo{
  74. NativeType: NativeType{typ: TypeTuple},
  75. Elems: []TypeInfo{
  76. TupleTypeInfo{
  77. NativeType: NativeType{typ: TypeTuple},
  78. Elems: []TypeInfo{
  79. NativeType{typ: TypeText},
  80. CollectionType{
  81. NativeType: NativeType{typ: TypeList},
  82. Elem: TupleTypeInfo{
  83. NativeType: NativeType{typ: TypeTuple},
  84. Elems: []TypeInfo{
  85. NativeType{typ: TypeInt},
  86. NativeType{typ: TypeInt},
  87. },
  88. },
  89. },
  90. },
  91. },
  92. TupleTypeInfo{
  93. NativeType: NativeType{typ: TypeTuple},
  94. Elems: []TypeInfo{
  95. NativeType{typ: TypeText},
  96. CollectionType{
  97. NativeType: NativeType{typ: TypeList},
  98. Elem: TupleTypeInfo{
  99. NativeType: NativeType{typ: TypeTuple},
  100. Elems: []TypeInfo{
  101. NativeType{typ: TypeInt},
  102. NativeType{typ: TypeInt},
  103. },
  104. },
  105. },
  106. },
  107. },
  108. CollectionType{
  109. NativeType: NativeType{typ: TypeMap},
  110. Key: NativeType{typ: TypeText},
  111. Elem: CollectionType{
  112. NativeType: NativeType{typ: TypeList},
  113. Elem: TupleTypeInfo{
  114. NativeType: NativeType{typ: TypeTuple},
  115. Elems: []TypeInfo{
  116. NativeType{typ: TypeInt},
  117. NativeType{typ: TypeInt},
  118. },
  119. },
  120. },
  121. },
  122. },
  123. },
  124. },
  125. {
  126. "frozen<tuple<frozen<tuple<int, int>>, int, frozen<tuple<int, int>>>>", TupleTypeInfo{
  127. NativeType: NativeType{typ: TypeTuple},
  128. Elems: []TypeInfo{
  129. TupleTypeInfo{
  130. NativeType: NativeType{typ: TypeTuple},
  131. Elems: []TypeInfo{
  132. NativeType{typ: TypeInt},
  133. NativeType{typ: TypeInt},
  134. },
  135. },
  136. NativeType{typ: TypeInt},
  137. TupleTypeInfo{
  138. NativeType: NativeType{typ: TypeTuple},
  139. Elems: []TypeInfo{
  140. NativeType{typ: TypeInt},
  141. NativeType{typ: TypeInt},
  142. },
  143. },
  144. },
  145. },
  146. },
  147. {
  148. "frozen<map<frozen<tuple<int, int>>, int>>", CollectionType{
  149. NativeType: NativeType{typ: TypeMap},
  150. Key: TupleTypeInfo{
  151. NativeType: NativeType{typ: TypeTuple},
  152. Elems: []TypeInfo{
  153. NativeType{typ: TypeInt},
  154. NativeType{typ: TypeInt},
  155. },
  156. },
  157. Elem: NativeType{typ: TypeInt},
  158. },
  159. },
  160. }
  161. for _, test := range tests {
  162. t.Run(test.input, func(t *testing.T) {
  163. got := getCassandraType(test.input)
  164. // TODO(zariel): define an equal method on the types?
  165. if !reflect.DeepEqual(got, test.exp) {
  166. t.Fatalf("expected %v got %v", test.exp, got)
  167. }
  168. })
  169. }
  170. }