...

Source file src/github.com/jackc/pgtype/varchar_array_test.go

Documentation: github.com/jackc/pgtype

     1  package pgtype_test
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  
     7  	"github.com/jackc/pgtype"
     8  	"github.com/jackc/pgtype/testutil"
     9  )
    10  
    11  func TestVarcharArrayTranscode(t *testing.T) {
    12  	testutil.TestSuccessfulTranscode(t, "varchar[]", []interface{}{
    13  		&pgtype.VarcharArray{
    14  			Elements:   nil,
    15  			Dimensions: nil,
    16  			Status:     pgtype.Present,
    17  		},
    18  		&pgtype.VarcharArray{
    19  			Elements: []pgtype.Varchar{
    20  				{String: "foo", Status: pgtype.Present},
    21  				{Status: pgtype.Null},
    22  			},
    23  			Dimensions: []pgtype.ArrayDimension{{Length: 2, LowerBound: 1}},
    24  			Status:     pgtype.Present,
    25  		},
    26  		&pgtype.VarcharArray{Status: pgtype.Null},
    27  		&pgtype.VarcharArray{
    28  			Elements: []pgtype.Varchar{
    29  				{String: "bar ", Status: pgtype.Present},
    30  				{String: "NuLL", Status: pgtype.Present},
    31  				{String: `wow"quz\`, Status: pgtype.Present},
    32  				{String: "", Status: pgtype.Present},
    33  				{Status: pgtype.Null},
    34  				{String: "null", Status: pgtype.Present},
    35  			},
    36  			Dimensions: []pgtype.ArrayDimension{{Length: 3, LowerBound: 1}, {Length: 2, LowerBound: 1}},
    37  			Status:     pgtype.Present,
    38  		},
    39  		&pgtype.VarcharArray{
    40  			Elements: []pgtype.Varchar{
    41  				{String: "bar", Status: pgtype.Present},
    42  				{String: "baz", Status: pgtype.Present},
    43  				{String: "quz", Status: pgtype.Present},
    44  				{String: "foo", Status: pgtype.Present},
    45  			},
    46  			Dimensions: []pgtype.ArrayDimension{
    47  				{Length: 2, LowerBound: 4},
    48  				{Length: 2, LowerBound: 2},
    49  			},
    50  			Status: pgtype.Present,
    51  		},
    52  	})
    53  }
    54  
    55  func TestVarcharArraySet(t *testing.T) {
    56  	successfulTests := []struct {
    57  		source interface{}
    58  		result pgtype.VarcharArray
    59  	}{
    60  		{
    61  			source: []string{"foo"},
    62  			result: pgtype.VarcharArray{
    63  				Elements:   []pgtype.Varchar{{String: "foo", Status: pgtype.Present}},
    64  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
    65  				Status:     pgtype.Present},
    66  		},
    67  		{
    68  			source: (([]string)(nil)),
    69  			result: pgtype.VarcharArray{Status: pgtype.Null},
    70  		},
    71  		{
    72  			source: [][]string{{"foo"}, {"bar"}},
    73  			result: pgtype.VarcharArray{
    74  				Elements:   []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
    75  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
    76  				Status:     pgtype.Present},
    77  		},
    78  		{
    79  			source: [][][][]string{{{{"foo", "bar", "baz"}}}, {{{"wibble", "wobble", "wubble"}}}},
    80  			result: pgtype.VarcharArray{
    81  				Elements: []pgtype.Varchar{
    82  					{String: "foo", Status: pgtype.Present},
    83  					{String: "bar", Status: pgtype.Present},
    84  					{String: "baz", Status: pgtype.Present},
    85  					{String: "wibble", Status: pgtype.Present},
    86  					{String: "wobble", Status: pgtype.Present},
    87  					{String: "wubble", Status: pgtype.Present}},
    88  				Dimensions: []pgtype.ArrayDimension{
    89  					{LowerBound: 1, Length: 2},
    90  					{LowerBound: 1, Length: 1},
    91  					{LowerBound: 1, Length: 1},
    92  					{LowerBound: 1, Length: 3}},
    93  				Status: pgtype.Present},
    94  		},
    95  		{
    96  			source: [2][1]string{{"foo"}, {"bar"}},
    97  			result: pgtype.VarcharArray{
    98  				Elements:   []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
    99  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   100  				Status:     pgtype.Present},
   101  		},
   102  		{
   103  			source: [2][1][1][3]string{{{{"foo", "bar", "baz"}}}, {{{"wibble", "wobble", "wubble"}}}},
   104  			result: pgtype.VarcharArray{
   105  				Elements: []pgtype.Varchar{
   106  					{String: "foo", Status: pgtype.Present},
   107  					{String: "bar", Status: pgtype.Present},
   108  					{String: "baz", Status: pgtype.Present},
   109  					{String: "wibble", Status: pgtype.Present},
   110  					{String: "wobble", Status: pgtype.Present},
   111  					{String: "wubble", Status: pgtype.Present}},
   112  				Dimensions: []pgtype.ArrayDimension{
   113  					{LowerBound: 1, Length: 2},
   114  					{LowerBound: 1, Length: 1},
   115  					{LowerBound: 1, Length: 1},
   116  					{LowerBound: 1, Length: 3}},
   117  				Status: pgtype.Present},
   118  		},
   119  	}
   120  
   121  	for i, tt := range successfulTests {
   122  		var r pgtype.VarcharArray
   123  		err := r.Set(tt.source)
   124  		if err != nil {
   125  			t.Errorf("%d: %v", i, err)
   126  		}
   127  
   128  		if !reflect.DeepEqual(r, tt.result) {
   129  			t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, r)
   130  		}
   131  	}
   132  }
   133  
   134  func TestVarcharArrayAssignTo(t *testing.T) {
   135  	var stringSlice []string
   136  	type _stringSlice []string
   137  	var namedStringSlice _stringSlice
   138  	var stringSliceDim2 [][]string
   139  	var stringSliceDim4 [][][][]string
   140  	var stringArrayDim2 [2][1]string
   141  	var stringArrayDim4 [2][1][1][3]string
   142  
   143  	simpleTests := []struct {
   144  		src      pgtype.VarcharArray
   145  		dst      interface{}
   146  		expected interface{}
   147  	}{
   148  		{
   149  			src: pgtype.VarcharArray{
   150  				Elements:   []pgtype.Varchar{{String: "foo", Status: pgtype.Present}},
   151  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   152  				Status:     pgtype.Present,
   153  			},
   154  			dst:      &stringSlice,
   155  			expected: []string{"foo"},
   156  		},
   157  		{
   158  			src: pgtype.VarcharArray{
   159  				Elements:   []pgtype.Varchar{{String: "bar", Status: pgtype.Present}},
   160  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   161  				Status:     pgtype.Present,
   162  			},
   163  			dst:      &namedStringSlice,
   164  			expected: _stringSlice{"bar"},
   165  		},
   166  		{
   167  			src:      pgtype.VarcharArray{Status: pgtype.Null},
   168  			dst:      &stringSlice,
   169  			expected: (([]string)(nil)),
   170  		},
   171  		{
   172  			src:      pgtype.VarcharArray{Status: pgtype.Present},
   173  			dst:      &stringSlice,
   174  			expected: []string{},
   175  		},
   176  		{
   177  			src: pgtype.VarcharArray{
   178  				Elements:   []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
   179  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   180  				Status:     pgtype.Present},
   181  			dst:      &stringSliceDim2,
   182  			expected: [][]string{{"foo"}, {"bar"}},
   183  		},
   184  		{
   185  			src: pgtype.VarcharArray{
   186  				Elements: []pgtype.Varchar{
   187  					{String: "foo", Status: pgtype.Present},
   188  					{String: "bar", Status: pgtype.Present},
   189  					{String: "baz", Status: pgtype.Present},
   190  					{String: "wibble", Status: pgtype.Present},
   191  					{String: "wobble", Status: pgtype.Present},
   192  					{String: "wubble", Status: pgtype.Present}},
   193  				Dimensions: []pgtype.ArrayDimension{
   194  					{LowerBound: 1, Length: 2},
   195  					{LowerBound: 1, Length: 1},
   196  					{LowerBound: 1, Length: 1},
   197  					{LowerBound: 1, Length: 3}},
   198  				Status: pgtype.Present},
   199  			dst:      &stringSliceDim4,
   200  			expected: [][][][]string{{{{"foo", "bar", "baz"}}}, {{{"wibble", "wobble", "wubble"}}}},
   201  		},
   202  		{
   203  			src: pgtype.VarcharArray{
   204  				Elements:   []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
   205  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   206  				Status:     pgtype.Present},
   207  			dst:      &stringArrayDim2,
   208  			expected: [2][1]string{{"foo"}, {"bar"}},
   209  		},
   210  		{
   211  			src: pgtype.VarcharArray{
   212  				Elements: []pgtype.Varchar{
   213  					{String: "foo", Status: pgtype.Present},
   214  					{String: "bar", Status: pgtype.Present},
   215  					{String: "baz", Status: pgtype.Present},
   216  					{String: "wibble", Status: pgtype.Present},
   217  					{String: "wobble", Status: pgtype.Present},
   218  					{String: "wubble", Status: pgtype.Present}},
   219  				Dimensions: []pgtype.ArrayDimension{
   220  					{LowerBound: 1, Length: 2},
   221  					{LowerBound: 1, Length: 1},
   222  					{LowerBound: 1, Length: 1},
   223  					{LowerBound: 1, Length: 3}},
   224  				Status: pgtype.Present},
   225  			dst:      &stringArrayDim4,
   226  			expected: [2][1][1][3]string{{{{"foo", "bar", "baz"}}}, {{{"wibble", "wobble", "wubble"}}}},
   227  		},
   228  	}
   229  
   230  	for i, tt := range simpleTests {
   231  		err := tt.src.AssignTo(tt.dst)
   232  		if err != nil {
   233  			t.Errorf("%d: %v", i, err)
   234  		}
   235  
   236  		if dst := reflect.ValueOf(tt.dst).Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) {
   237  			t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
   238  		}
   239  	}
   240  
   241  	errorTests := []struct {
   242  		src pgtype.VarcharArray
   243  		dst interface{}
   244  	}{
   245  		{
   246  			src: pgtype.VarcharArray{
   247  				Elements:   []pgtype.Varchar{{Status: pgtype.Null}},
   248  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   249  				Status:     pgtype.Present,
   250  			},
   251  			dst: &stringSlice,
   252  		},
   253  		{
   254  			src: pgtype.VarcharArray{
   255  				Elements:   []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
   256  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
   257  				Status:     pgtype.Present},
   258  			dst: &stringArrayDim2,
   259  		},
   260  		{
   261  			src: pgtype.VarcharArray{
   262  				Elements:   []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
   263  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
   264  				Status:     pgtype.Present},
   265  			dst: &stringSlice,
   266  		},
   267  		{
   268  			src: pgtype.VarcharArray{
   269  				Elements:   []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
   270  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   271  				Status:     pgtype.Present},
   272  			dst: &stringArrayDim4,
   273  		},
   274  	}
   275  
   276  	for i, tt := range errorTests {
   277  		err := tt.src.AssignTo(tt.dst)
   278  		if err == nil {
   279  			t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
   280  		}
   281  	}
   282  }
   283  

View as plain text