...

Source file src/github.com/jackc/pgtype/int2_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 TestInt2ArrayTranscode(t *testing.T) {
    12  	testutil.TestSuccessfulTranscode(t, "int2[]", []interface{}{
    13  		&pgtype.Int2Array{
    14  			Elements:   nil,
    15  			Dimensions: nil,
    16  			Status:     pgtype.Present,
    17  		},
    18  		&pgtype.Int2Array{
    19  			Elements: []pgtype.Int2{
    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.Int2Array{Status: pgtype.Null},
    27  		&pgtype.Int2Array{
    28  			Elements: []pgtype.Int2{
    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.Int2Array{
    40  			Elements: []pgtype.Int2{
    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 TestInt2ArraySet(t *testing.T) {
    56  	successfulTests := []struct {
    57  		source interface{}
    58  		result pgtype.Int2Array
    59  	}{
    60  		{
    61  			source: []int64{1},
    62  			result: pgtype.Int2Array{
    63  				Elements:   []pgtype.Int2{{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.Int2Array{
    70  				Elements:   []pgtype.Int2{{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.Int2Array{
    77  				Elements:   []pgtype.Int2{{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.Int2Array{
    84  				Elements:   []pgtype.Int2{{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.Int2Array{
    91  				Elements:   []pgtype.Int2{{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.Int2Array{
    98  				Elements:   []pgtype.Int2{{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.Int2Array{
   105  				Elements:   []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
   106  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   107  				Status:     pgtype.Present},
   108  		},
   109  		{
   110  			source: (([]int16)(nil)),
   111  			result: pgtype.Int2Array{Status: pgtype.Null},
   112  		},
   113  		{
   114  			source: [][]int16{{1}, {2}},
   115  			result: pgtype.Int2Array{
   116  				Elements:   []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   117  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   118  				Status:     pgtype.Present},
   119  		},
   120  		{
   121  			source: [][][][]int16{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   122  			result: pgtype.Int2Array{
   123  				Elements: []pgtype.Int2{
   124  					{Int: 1, Status: pgtype.Present},
   125  					{Int: 2, Status: pgtype.Present},
   126  					{Int: 3, Status: pgtype.Present},
   127  					{Int: 4, Status: pgtype.Present},
   128  					{Int: 5, Status: pgtype.Present},
   129  					{Int: 6, Status: pgtype.Present}},
   130  				Dimensions: []pgtype.ArrayDimension{
   131  					{LowerBound: 1, Length: 2},
   132  					{LowerBound: 1, Length: 1},
   133  					{LowerBound: 1, Length: 1},
   134  					{LowerBound: 1, Length: 3}},
   135  				Status: pgtype.Present},
   136  		},
   137  		{
   138  			source: [2][1]int16{{1}, {2}},
   139  			result: pgtype.Int2Array{
   140  				Elements:   []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   141  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   142  				Status:     pgtype.Present},
   143  		},
   144  		{
   145  			source: [2][1][1][3]int16{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   146  			result: pgtype.Int2Array{
   147  				Elements: []pgtype.Int2{
   148  					{Int: 1, Status: pgtype.Present},
   149  					{Int: 2, Status: pgtype.Present},
   150  					{Int: 3, Status: pgtype.Present},
   151  					{Int: 4, Status: pgtype.Present},
   152  					{Int: 5, Status: pgtype.Present},
   153  					{Int: 6, Status: pgtype.Present}},
   154  				Dimensions: []pgtype.ArrayDimension{
   155  					{LowerBound: 1, Length: 2},
   156  					{LowerBound: 1, Length: 1},
   157  					{LowerBound: 1, Length: 1},
   158  					{LowerBound: 1, Length: 3}},
   159  				Status: pgtype.Present},
   160  		},
   161  	}
   162  
   163  	for i, tt := range successfulTests {
   164  		var r pgtype.Int2Array
   165  		err := r.Set(tt.source)
   166  		if err != nil {
   167  			t.Errorf("%d: %v", i, err)
   168  		}
   169  
   170  		if !reflect.DeepEqual(r, tt.result) {
   171  			t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, r)
   172  		}
   173  	}
   174  }
   175  
   176  func TestInt2ArrayAssignTo(t *testing.T) {
   177  	var int16Slice []int16
   178  	var uint16Slice []uint16
   179  	var namedInt16Slice _int16Slice
   180  	var int16SliceDim2 [][]int16
   181  	var int16SliceDim4 [][][][]int16
   182  	var int16ArrayDim2 [2][1]int16
   183  	var int16ArrayDim4 [2][1][1][3]int16
   184  
   185  	simpleTests := []struct {
   186  		src      pgtype.Int2Array
   187  		dst      interface{}
   188  		expected interface{}
   189  	}{
   190  		{
   191  			src: pgtype.Int2Array{
   192  				Elements:   []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
   193  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   194  				Status:     pgtype.Present,
   195  			},
   196  			dst:      &int16Slice,
   197  			expected: []int16{1},
   198  		},
   199  		{
   200  			src: pgtype.Int2Array{
   201  				Elements:   []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
   202  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   203  				Status:     pgtype.Present,
   204  			},
   205  			dst:      &uint16Slice,
   206  			expected: []uint16{1},
   207  		},
   208  		{
   209  			src: pgtype.Int2Array{
   210  				Elements:   []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
   211  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   212  				Status:     pgtype.Present,
   213  			},
   214  			dst:      &namedInt16Slice,
   215  			expected: _int16Slice{1},
   216  		},
   217  		{
   218  			src:      pgtype.Int2Array{Status: pgtype.Null},
   219  			dst:      &int16Slice,
   220  			expected: (([]int16)(nil)),
   221  		},
   222  		{
   223  			src:      pgtype.Int2Array{Status: pgtype.Present},
   224  			dst:      &int16Slice,
   225  			expected: []int16{},
   226  		},
   227  		{
   228  			src: pgtype.Int2Array{
   229  				Elements:   []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   230  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   231  				Status:     pgtype.Present},
   232  			expected: [][]int16{{1}, {2}},
   233  			dst:      &int16SliceDim2,
   234  		},
   235  		{
   236  			src: pgtype.Int2Array{
   237  				Elements: []pgtype.Int2{
   238  					{Int: 1, Status: pgtype.Present},
   239  					{Int: 2, Status: pgtype.Present},
   240  					{Int: 3, Status: pgtype.Present},
   241  					{Int: 4, Status: pgtype.Present},
   242  					{Int: 5, Status: pgtype.Present},
   243  					{Int: 6, Status: pgtype.Present}},
   244  				Dimensions: []pgtype.ArrayDimension{
   245  					{LowerBound: 1, Length: 2},
   246  					{LowerBound: 1, Length: 1},
   247  					{LowerBound: 1, Length: 1},
   248  					{LowerBound: 1, Length: 3}},
   249  				Status: pgtype.Present},
   250  			expected: [][][][]int16{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   251  			dst:      &int16SliceDim4,
   252  		},
   253  		{
   254  			src: pgtype.Int2Array{
   255  				Elements:   []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   256  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   257  				Status:     pgtype.Present},
   258  			expected: [2][1]int16{{1}, {2}},
   259  			dst:      &int16ArrayDim2,
   260  		},
   261  		{
   262  			src: pgtype.Int2Array{
   263  				Elements: []pgtype.Int2{
   264  					{Int: 1, Status: pgtype.Present},
   265  					{Int: 2, Status: pgtype.Present},
   266  					{Int: 3, Status: pgtype.Present},
   267  					{Int: 4, Status: pgtype.Present},
   268  					{Int: 5, Status: pgtype.Present},
   269  					{Int: 6, Status: pgtype.Present}},
   270  				Dimensions: []pgtype.ArrayDimension{
   271  					{LowerBound: 1, Length: 2},
   272  					{LowerBound: 1, Length: 1},
   273  					{LowerBound: 1, Length: 1},
   274  					{LowerBound: 1, Length: 3}},
   275  				Status: pgtype.Present},
   276  			expected: [2][1][1][3]int16{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   277  			dst:      &int16ArrayDim4,
   278  		},
   279  	}
   280  
   281  	for i, tt := range simpleTests {
   282  		err := tt.src.AssignTo(tt.dst)
   283  		if err != nil {
   284  			t.Errorf("%d: %v", i, err)
   285  		}
   286  
   287  		if dst := reflect.ValueOf(tt.dst).Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) {
   288  			t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
   289  		}
   290  	}
   291  
   292  	errorTests := []struct {
   293  		src pgtype.Int2Array
   294  		dst interface{}
   295  	}{
   296  		{
   297  			src: pgtype.Int2Array{
   298  				Elements:   []pgtype.Int2{{Status: pgtype.Null}},
   299  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   300  				Status:     pgtype.Present,
   301  			},
   302  			dst: &int16Slice,
   303  		},
   304  		{
   305  			src: pgtype.Int2Array{
   306  				Elements:   []pgtype.Int2{{Int: -1, Status: pgtype.Present}},
   307  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   308  				Status:     pgtype.Present,
   309  			},
   310  			dst: &uint16Slice,
   311  		},
   312  		{
   313  			src: pgtype.Int2Array{
   314  				Elements:   []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   315  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
   316  				Status:     pgtype.Present},
   317  			dst: &int16ArrayDim2,
   318  		},
   319  		{
   320  			src: pgtype.Int2Array{
   321  				Elements:   []pgtype.Int2{{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: &int16Slice,
   325  		},
   326  		{
   327  			src: pgtype.Int2Array{
   328  				Elements:   []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
   329  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   330  				Status:     pgtype.Present},
   331  			dst: &int16ArrayDim4,
   332  		},
   333  	}
   334  
   335  	for i, tt := range errorTests {
   336  		err := tt.src.AssignTo(tt.dst)
   337  		if err == nil {
   338  			t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
   339  		}
   340  	}
   341  
   342  }
   343  

View as plain text