...

Source file src/github.com/jackc/pgtype/float8_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 TestFloat8ArrayTranscode(t *testing.T) {
    12  	testutil.TestSuccessfulTranscode(t, "float8[]", []interface{}{
    13  		&pgtype.Float8Array{
    14  			Elements:   nil,
    15  			Dimensions: nil,
    16  			Status:     pgtype.Present,
    17  		},
    18  		&pgtype.Float8Array{
    19  			Elements: []pgtype.Float8{
    20  				{Float: 1, Status: pgtype.Present},
    21  				{Status: pgtype.Null},
    22  			},
    23  			Dimensions: []pgtype.ArrayDimension{{Length: 2, LowerBound: 1}},
    24  			Status:     pgtype.Present,
    25  		},
    26  		&pgtype.Float8Array{Status: pgtype.Null},
    27  		&pgtype.Float8Array{
    28  			Elements: []pgtype.Float8{
    29  				{Float: 1, Status: pgtype.Present},
    30  				{Float: 2, Status: pgtype.Present},
    31  				{Float: 3, Status: pgtype.Present},
    32  				{Float: 4, Status: pgtype.Present},
    33  				{Status: pgtype.Null},
    34  				{Float: 6, Status: pgtype.Present},
    35  			},
    36  			Dimensions: []pgtype.ArrayDimension{{Length: 3, LowerBound: 1}, {Length: 2, LowerBound: 1}},
    37  			Status:     pgtype.Present,
    38  		},
    39  		&pgtype.Float8Array{
    40  			Elements: []pgtype.Float8{
    41  				{Float: 1, Status: pgtype.Present},
    42  				{Float: 2, Status: pgtype.Present},
    43  				{Float: 3, Status: pgtype.Present},
    44  				{Float: 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 TestFloat8ArraySet(t *testing.T) {
    56  	successfulTests := []struct {
    57  		source interface{}
    58  		result pgtype.Float8Array
    59  	}{
    60  		{
    61  			source: []float64{1},
    62  			result: pgtype.Float8Array{
    63  				Elements:   []pgtype.Float8{{Float: 1, Status: pgtype.Present}},
    64  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
    65  				Status:     pgtype.Present},
    66  		},
    67  		{
    68  			source: (([]float64)(nil)),
    69  			result: pgtype.Float8Array{Status: pgtype.Null},
    70  		},
    71  		{
    72  			source: [][]float64{{1}, {2}},
    73  			result: pgtype.Float8Array{
    74  				Elements:   []pgtype.Float8{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
    75  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
    76  				Status:     pgtype.Present},
    77  		},
    78  		{
    79  			source: [][][][]float64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
    80  			result: pgtype.Float8Array{
    81  				Elements: []pgtype.Float8{
    82  					{Float: 1, Status: pgtype.Present},
    83  					{Float: 2, Status: pgtype.Present},
    84  					{Float: 3, Status: pgtype.Present},
    85  					{Float: 4, Status: pgtype.Present},
    86  					{Float: 5, Status: pgtype.Present},
    87  					{Float: 6, 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  
    97  	for i, tt := range successfulTests {
    98  		var r pgtype.Float8Array
    99  		err := r.Set(tt.source)
   100  		if err != nil {
   101  			t.Errorf("%d: %v", i, err)
   102  		}
   103  
   104  		if !reflect.DeepEqual(r, tt.result) {
   105  			t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, r)
   106  		}
   107  	}
   108  }
   109  
   110  func TestFloat8ArrayAssignTo(t *testing.T) {
   111  	var float64Slice []float64
   112  	var namedFloat64Slice _float64Slice
   113  	var float64SliceDim2 [][]float64
   114  	var float64SliceDim4 [][][][]float64
   115  	var float64ArrayDim2 [2][1]float64
   116  	var float64ArrayDim4 [2][1][1][3]float64
   117  
   118  	simpleTests := []struct {
   119  		src      pgtype.Float8Array
   120  		dst      interface{}
   121  		expected interface{}
   122  	}{
   123  		{
   124  			src: pgtype.Float8Array{
   125  				Elements:   []pgtype.Float8{{Float: 1.23, Status: pgtype.Present}},
   126  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   127  				Status:     pgtype.Present,
   128  			},
   129  			dst:      &float64Slice,
   130  			expected: []float64{1.23},
   131  		},
   132  		{
   133  			src: pgtype.Float8Array{
   134  				Elements:   []pgtype.Float8{{Float: 1.23, Status: pgtype.Present}},
   135  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   136  				Status:     pgtype.Present,
   137  			},
   138  			dst:      &namedFloat64Slice,
   139  			expected: _float64Slice{1.23},
   140  		},
   141  		{
   142  			src:      pgtype.Float8Array{Status: pgtype.Null},
   143  			dst:      &float64Slice,
   144  			expected: (([]float64)(nil)),
   145  		},
   146  		{
   147  			src:      pgtype.Float8Array{Status: pgtype.Present},
   148  			dst:      &float64Slice,
   149  			expected: []float64{},
   150  		},
   151  		{
   152  			src: pgtype.Float8Array{
   153  				Elements:   []pgtype.Float8{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
   154  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   155  				Status:     pgtype.Present},
   156  			expected: [][]float64{{1}, {2}},
   157  			dst:      &float64SliceDim2,
   158  		},
   159  		{
   160  			src: pgtype.Float8Array{
   161  				Elements: []pgtype.Float8{
   162  					{Float: 1, Status: pgtype.Present},
   163  					{Float: 2, Status: pgtype.Present},
   164  					{Float: 3, Status: pgtype.Present},
   165  					{Float: 4, Status: pgtype.Present},
   166  					{Float: 5, Status: pgtype.Present},
   167  					{Float: 6, Status: pgtype.Present}},
   168  				Dimensions: []pgtype.ArrayDimension{
   169  					{LowerBound: 1, Length: 2},
   170  					{LowerBound: 1, Length: 1},
   171  					{LowerBound: 1, Length: 1},
   172  					{LowerBound: 1, Length: 3}},
   173  				Status: pgtype.Present},
   174  			expected: [][][][]float64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   175  			dst:      &float64SliceDim4,
   176  		},
   177  		{
   178  			src: pgtype.Float8Array{
   179  				Elements:   []pgtype.Float8{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
   180  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   181  				Status:     pgtype.Present},
   182  			expected: [2][1]float64{{1}, {2}},
   183  			dst:      &float64ArrayDim2,
   184  		},
   185  		{
   186  			src: pgtype.Float8Array{
   187  				Elements: []pgtype.Float8{
   188  					{Float: 1, Status: pgtype.Present},
   189  					{Float: 2, Status: pgtype.Present},
   190  					{Float: 3, Status: pgtype.Present},
   191  					{Float: 4, Status: pgtype.Present},
   192  					{Float: 5, Status: pgtype.Present},
   193  					{Float: 6, Status: pgtype.Present}},
   194  				Dimensions: []pgtype.ArrayDimension{
   195  					{LowerBound: 1, Length: 2},
   196  					{LowerBound: 1, Length: 1},
   197  					{LowerBound: 1, Length: 1},
   198  					{LowerBound: 1, Length: 3}},
   199  				Status: pgtype.Present},
   200  			expected: [2][1][1][3]float64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   201  			dst:      &float64ArrayDim4,
   202  		},
   203  	}
   204  
   205  	for i, tt := range simpleTests {
   206  		err := tt.src.AssignTo(tt.dst)
   207  		if err != nil {
   208  			t.Errorf("%d: %v", i, err)
   209  		}
   210  
   211  		if dst := reflect.ValueOf(tt.dst).Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) {
   212  			t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
   213  		}
   214  	}
   215  
   216  	errorTests := []struct {
   217  		src pgtype.Float8Array
   218  		dst interface{}
   219  	}{
   220  		{
   221  			src: pgtype.Float8Array{
   222  				Elements:   []pgtype.Float8{{Status: pgtype.Null}},
   223  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   224  				Status:     pgtype.Present,
   225  			},
   226  			dst: &float64Slice,
   227  		},
   228  		{
   229  			src: pgtype.Float8Array{
   230  				Elements:   []pgtype.Float8{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
   231  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
   232  				Status:     pgtype.Present},
   233  			dst: &float64ArrayDim2,
   234  		},
   235  		{
   236  			src: pgtype.Float8Array{
   237  				Elements:   []pgtype.Float8{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
   238  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
   239  				Status:     pgtype.Present},
   240  			dst: &float64Slice,
   241  		},
   242  		{
   243  			src: pgtype.Float8Array{
   244  				Elements:   []pgtype.Float8{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
   245  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   246  				Status:     pgtype.Present},
   247  			dst: &float64ArrayDim4,
   248  		},
   249  	}
   250  
   251  	for i, tt := range errorTests {
   252  		err := tt.src.AssignTo(tt.dst)
   253  		if err == nil {
   254  			t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
   255  		}
   256  	}
   257  
   258  }
   259  

View as plain text