...

Source file src/github.com/jackc/pgtype/int8_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 TestInt8ArrayTranscode(t *testing.T) {
    12  	testutil.TestSuccessfulTranscode(t, "int8[]", []interface{}{
    13  		&pgtype.Int8Array{
    14  			Elements:   nil,
    15  			Dimensions: nil,
    16  			Status:     pgtype.Present,
    17  		},
    18  		&pgtype.Int8Array{
    19  			Elements: []pgtype.Int8{
    20  				{Int: 1, Status: pgtype.Present},
    21  				{Status: pgtype.Null},
    22  			},
    23  			Dimensions: []pgtype.ArrayDimension{{Length: 2, LowerBound: 1}},
    24  			Status:     pgtype.Present,
    25  		},
    26  		&pgtype.Int8Array{Status: pgtype.Null},
    27  		&pgtype.Int8Array{
    28  			Elements: []pgtype.Int8{
    29  				{Int: 1, Status: pgtype.Present},
    30  				{Int: 2, Status: pgtype.Present},
    31  				{Int: 3, Status: pgtype.Present},
    32  				{Int: 4, Status: pgtype.Present},
    33  				{Status: pgtype.Null},
    34  				{Int: 6, Status: pgtype.Present},
    35  			},
    36  			Dimensions: []pgtype.ArrayDimension{{Length: 3, LowerBound: 1}, {Length: 2, LowerBound: 1}},
    37  			Status:     pgtype.Present,
    38  		},
    39  		&pgtype.Int8Array{
    40  			Elements: []pgtype.Int8{
    41  				{Int: 1, Status: pgtype.Present},
    42  				{Int: 2, Status: pgtype.Present},
    43  				{Int: 3, Status: pgtype.Present},
    44  				{Int: 4, 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 TestInt8ArraySet(t *testing.T) {
    56  	successfulTests := []struct {
    57  		source interface{}
    58  		result pgtype.Int8Array
    59  	}{
    60  		{
    61  			source: []int64{1},
    62  			result: pgtype.Int8Array{
    63  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
    64  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
    65  				Status:     pgtype.Present},
    66  		},
    67  		{
    68  			source: []int32{1},
    69  			result: pgtype.Int8Array{
    70  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
    71  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
    72  				Status:     pgtype.Present},
    73  		},
    74  		{
    75  			source: []int16{1},
    76  			result: pgtype.Int8Array{
    77  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
    78  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
    79  				Status:     pgtype.Present},
    80  		},
    81  		{
    82  			source: []int{1},
    83  			result: pgtype.Int8Array{
    84  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
    85  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
    86  				Status:     pgtype.Present},
    87  		},
    88  		{
    89  			source: []uint64{1},
    90  			result: pgtype.Int8Array{
    91  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
    92  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
    93  				Status:     pgtype.Present},
    94  		},
    95  		{
    96  			source: []uint32{1},
    97  			result: pgtype.Int8Array{
    98  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
    99  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   100  				Status:     pgtype.Present},
   101  		},
   102  		{
   103  			source: []uint16{1},
   104  			result: pgtype.Int8Array{
   105  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
   106  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   107  				Status:     pgtype.Present},
   108  		},
   109  		{
   110  			source: []uint{1},
   111  			result: pgtype.Int8Array{
   112  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
   113  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   114  				Status:     pgtype.Present},
   115  		},
   116  		{
   117  			source: (([]int64)(nil)),
   118  			result: pgtype.Int8Array{Status: pgtype.Null},
   119  		},
   120  		{
   121  			source: [][]int64{{1}, {2}},
   122  			result: pgtype.Int8Array{
   123  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   124  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   125  				Status:     pgtype.Present},
   126  		},
   127  		{
   128  			source: [][][][]int64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   129  			result: pgtype.Int8Array{
   130  				Elements: []pgtype.Int8{
   131  					{Int: 1, Status: pgtype.Present},
   132  					{Int: 2, Status: pgtype.Present},
   133  					{Int: 3, Status: pgtype.Present},
   134  					{Int: 4, Status: pgtype.Present},
   135  					{Int: 5, Status: pgtype.Present},
   136  					{Int: 6, Status: pgtype.Present}},
   137  				Dimensions: []pgtype.ArrayDimension{
   138  					{LowerBound: 1, Length: 2},
   139  					{LowerBound: 1, Length: 1},
   140  					{LowerBound: 1, Length: 1},
   141  					{LowerBound: 1, Length: 3}},
   142  				Status: pgtype.Present},
   143  		},
   144  		{
   145  			source: [2][1]int64{{1}, {2}},
   146  			result: pgtype.Int8Array{
   147  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   148  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   149  				Status:     pgtype.Present},
   150  		},
   151  		{
   152  			source: [2][1][1][3]int64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   153  			result: pgtype.Int8Array{
   154  				Elements: []pgtype.Int8{
   155  					{Int: 1, Status: pgtype.Present},
   156  					{Int: 2, Status: pgtype.Present},
   157  					{Int: 3, Status: pgtype.Present},
   158  					{Int: 4, Status: pgtype.Present},
   159  					{Int: 5, Status: pgtype.Present},
   160  					{Int: 6, Status: pgtype.Present}},
   161  				Dimensions: []pgtype.ArrayDimension{
   162  					{LowerBound: 1, Length: 2},
   163  					{LowerBound: 1, Length: 1},
   164  					{LowerBound: 1, Length: 1},
   165  					{LowerBound: 1, Length: 3}},
   166  				Status: pgtype.Present},
   167  		},
   168  	}
   169  
   170  	for i, tt := range successfulTests {
   171  		var r pgtype.Int8Array
   172  		err := r.Set(tt.source)
   173  		if err != nil {
   174  			t.Errorf("%d: %v", i, err)
   175  		}
   176  
   177  		if !reflect.DeepEqual(r, tt.result) {
   178  			t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, r)
   179  		}
   180  	}
   181  }
   182  
   183  func TestInt8ArrayAssignTo(t *testing.T) {
   184  	var int64Slice []int64
   185  	var uint64Slice []uint64
   186  	var namedInt64Slice _int64Slice
   187  	var int64SliceDim2 [][]int64
   188  	var int64SliceDim4 [][][][]int64
   189  	var int64ArrayDim2 [2][1]int64
   190  	var int64ArrayDim4 [2][1][1][3]int64
   191  
   192  	simpleTests := []struct {
   193  		src      pgtype.Int8Array
   194  		dst      interface{}
   195  		expected interface{}
   196  	}{
   197  		{
   198  			src: pgtype.Int8Array{
   199  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
   200  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   201  				Status:     pgtype.Present,
   202  			},
   203  			dst:      &int64Slice,
   204  			expected: []int64{1},
   205  		},
   206  		{
   207  			src: pgtype.Int8Array{
   208  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
   209  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   210  				Status:     pgtype.Present,
   211  			},
   212  			dst:      &uint64Slice,
   213  			expected: []uint64{1},
   214  		},
   215  		{
   216  			src: pgtype.Int8Array{
   217  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
   218  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   219  				Status:     pgtype.Present,
   220  			},
   221  			dst:      &namedInt64Slice,
   222  			expected: _int64Slice{1},
   223  		},
   224  		{
   225  			src:      pgtype.Int8Array{Status: pgtype.Null},
   226  			dst:      &int64Slice,
   227  			expected: (([]int64)(nil)),
   228  		},
   229  		{
   230  			src:      pgtype.Int8Array{Status: pgtype.Present},
   231  			dst:      &int64Slice,
   232  			expected: []int64{},
   233  		},
   234  		{
   235  			src: pgtype.Int8Array{
   236  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   237  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   238  				Status:     pgtype.Present},
   239  			expected: [][]int64{{1}, {2}},
   240  			dst:      &int64SliceDim2,
   241  		},
   242  		{
   243  			src: pgtype.Int8Array{
   244  				Elements: []pgtype.Int8{
   245  					{Int: 1, Status: pgtype.Present},
   246  					{Int: 2, Status: pgtype.Present},
   247  					{Int: 3, Status: pgtype.Present},
   248  					{Int: 4, Status: pgtype.Present},
   249  					{Int: 5, Status: pgtype.Present},
   250  					{Int: 6, Status: pgtype.Present}},
   251  				Dimensions: []pgtype.ArrayDimension{
   252  					{LowerBound: 1, Length: 2},
   253  					{LowerBound: 1, Length: 1},
   254  					{LowerBound: 1, Length: 1},
   255  					{LowerBound: 1, Length: 3}},
   256  				Status: pgtype.Present},
   257  			expected: [][][][]int64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   258  			dst:      &int64SliceDim4,
   259  		},
   260  		{
   261  			src: pgtype.Int8Array{
   262  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   263  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   264  				Status:     pgtype.Present},
   265  			expected: [2][1]int64{{1}, {2}},
   266  			dst:      &int64ArrayDim2,
   267  		},
   268  		{
   269  			src: pgtype.Int8Array{
   270  				Elements: []pgtype.Int8{
   271  					{Int: 1, Status: pgtype.Present},
   272  					{Int: 2, Status: pgtype.Present},
   273  					{Int: 3, Status: pgtype.Present},
   274  					{Int: 4, Status: pgtype.Present},
   275  					{Int: 5, Status: pgtype.Present},
   276  					{Int: 6, Status: pgtype.Present}},
   277  				Dimensions: []pgtype.ArrayDimension{
   278  					{LowerBound: 1, Length: 2},
   279  					{LowerBound: 1, Length: 1},
   280  					{LowerBound: 1, Length: 1},
   281  					{LowerBound: 1, Length: 3}},
   282  				Status: pgtype.Present},
   283  			expected: [2][1][1][3]int64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   284  			dst:      &int64ArrayDim4,
   285  		},
   286  	}
   287  
   288  	for i, tt := range simpleTests {
   289  		err := tt.src.AssignTo(tt.dst)
   290  		if err != nil {
   291  			t.Errorf("%d: %v", i, err)
   292  		}
   293  
   294  		if dst := reflect.ValueOf(tt.dst).Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) {
   295  			t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
   296  		}
   297  	}
   298  
   299  	errorTests := []struct {
   300  		src pgtype.Int8Array
   301  		dst interface{}
   302  	}{
   303  		{
   304  			src: pgtype.Int8Array{
   305  				Elements:   []pgtype.Int8{{Status: pgtype.Null}},
   306  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   307  				Status:     pgtype.Present,
   308  			},
   309  			dst: &int64Slice,
   310  		},
   311  		{
   312  			src: pgtype.Int8Array{
   313  				Elements:   []pgtype.Int8{{Int: -1, Status: pgtype.Present}},
   314  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   315  				Status:     pgtype.Present,
   316  			},
   317  			dst: &uint64Slice,
   318  		},
   319  		{
   320  			src: pgtype.Int8Array{
   321  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   322  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
   323  				Status:     pgtype.Present},
   324  			dst: &int64ArrayDim2,
   325  		},
   326  		{
   327  			src: pgtype.Int8Array{
   328  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   329  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
   330  				Status:     pgtype.Present},
   331  			dst: &int64Slice,
   332  		},
   333  		{
   334  			src: pgtype.Int8Array{
   335  				Elements:   []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   336  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   337  				Status:     pgtype.Present},
   338  			dst: &int64ArrayDim4,
   339  		},
   340  	}
   341  
   342  	for i, tt := range errorTests {
   343  		err := tt.src.AssignTo(tt.dst)
   344  		if err == nil {
   345  			t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
   346  		}
   347  	}
   348  
   349  }
   350  

View as plain text