...

Source file src/github.com/jackc/pgtype/float4_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 TestFloat4ArrayTranscode(t *testing.T) {
    12  	testutil.TestSuccessfulTranscode(t, "float4[]", []interface{}{
    13  		&pgtype.Float4Array{
    14  			Elements:   nil,
    15  			Dimensions: nil,
    16  			Status:     pgtype.Present,
    17  		},
    18  		&pgtype.Float4Array{
    19  			Elements: []pgtype.Float4{
    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.Float4Array{Status: pgtype.Null},
    27  		&pgtype.Float4Array{
    28  			Elements: []pgtype.Float4{
    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.Float4Array{
    40  			Elements: []pgtype.Float4{
    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 TestFloat4ArraySet(t *testing.T) {
    56  	successfulTests := []struct {
    57  		source interface{}
    58  		result pgtype.Float4Array
    59  	}{
    60  		{
    61  			source: []float32{1},
    62  			result: pgtype.Float4Array{
    63  				Elements:   []pgtype.Float4{{Float: 1, Status: pgtype.Present}},
    64  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
    65  				Status:     pgtype.Present},
    66  		},
    67  		{
    68  			source: (([]float32)(nil)),
    69  			result: pgtype.Float4Array{Status: pgtype.Null},
    70  		},
    71  		{
    72  			source: [][]float32{{1}, {2}},
    73  			result: pgtype.Float4Array{
    74  				Elements:   []pgtype.Float4{{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: [][][][]float32{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
    80  			result: pgtype.Float4Array{
    81  				Elements: []pgtype.Float4{
    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  			source: [2][1]float32{{1}, {2}},
    97  			result: pgtype.Float4Array{
    98  				Elements:   []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, 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]float32{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   104  			result: pgtype.Float4Array{
   105  				Elements: []pgtype.Float4{
   106  					{Float: 1, Status: pgtype.Present},
   107  					{Float: 2, Status: pgtype.Present},
   108  					{Float: 3, Status: pgtype.Present},
   109  					{Float: 4, Status: pgtype.Present},
   110  					{Float: 5, Status: pgtype.Present},
   111  					{Float: 6, 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.Float4Array
   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 TestFloat4ArrayAssignTo(t *testing.T) {
   135  	var float32Slice []float32
   136  	var namedFloat32Slice _float32Slice
   137  	var float32SliceDim2 [][]float32
   138  	var float32SliceDim4 [][][][]float32
   139  	var float32ArrayDim2 [2][1]float32
   140  	var float32ArrayDim4 [2][1][1][3]float32
   141  
   142  	simpleTests := []struct {
   143  		src      pgtype.Float4Array
   144  		dst      interface{}
   145  		expected interface{}
   146  	}{
   147  		{
   148  			src: pgtype.Float4Array{
   149  				Elements:   []pgtype.Float4{{Float: 1.23, Status: pgtype.Present}},
   150  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   151  				Status:     pgtype.Present,
   152  			},
   153  			dst:      &float32Slice,
   154  			expected: []float32{1.23},
   155  		},
   156  		{
   157  			src: pgtype.Float4Array{
   158  				Elements:   []pgtype.Float4{{Float: 1.23, Status: pgtype.Present}},
   159  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   160  				Status:     pgtype.Present,
   161  			},
   162  			dst:      &namedFloat32Slice,
   163  			expected: _float32Slice{1.23},
   164  		},
   165  		{
   166  			src:      pgtype.Float4Array{Status: pgtype.Null},
   167  			dst:      &float32Slice,
   168  			expected: (([]float32)(nil)),
   169  		},
   170  		{
   171  			src:      pgtype.Float4Array{Status: pgtype.Present},
   172  			dst:      &float32Slice,
   173  			expected: []float32{},
   174  		},
   175  		{
   176  			src: pgtype.Float4Array{
   177  				Elements:   []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
   178  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   179  				Status:     pgtype.Present},
   180  			expected: [][]float32{{1}, {2}},
   181  			dst:      &float32SliceDim2,
   182  		},
   183  		{
   184  			src: pgtype.Float4Array{
   185  				Elements: []pgtype.Float4{
   186  					{Float: 1, Status: pgtype.Present},
   187  					{Float: 2, Status: pgtype.Present},
   188  					{Float: 3, Status: pgtype.Present},
   189  					{Float: 4, Status: pgtype.Present},
   190  					{Float: 5, Status: pgtype.Present},
   191  					{Float: 6, Status: pgtype.Present}},
   192  				Dimensions: []pgtype.ArrayDimension{
   193  					{LowerBound: 1, Length: 2},
   194  					{LowerBound: 1, Length: 1},
   195  					{LowerBound: 1, Length: 1},
   196  					{LowerBound: 1, Length: 3}},
   197  				Status: pgtype.Present},
   198  			expected: [][][][]float32{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   199  			dst:      &float32SliceDim4,
   200  		},
   201  		{
   202  			src: pgtype.Float4Array{
   203  				Elements:   []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
   204  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   205  				Status:     pgtype.Present},
   206  			expected: [2][1]float32{{1}, {2}},
   207  			dst:      &float32ArrayDim2,
   208  		},
   209  		{
   210  			src: pgtype.Float4Array{
   211  				Elements: []pgtype.Float4{
   212  					{Float: 1, Status: pgtype.Present},
   213  					{Float: 2, Status: pgtype.Present},
   214  					{Float: 3, Status: pgtype.Present},
   215  					{Float: 4, Status: pgtype.Present},
   216  					{Float: 5, Status: pgtype.Present},
   217  					{Float: 6, Status: pgtype.Present}},
   218  				Dimensions: []pgtype.ArrayDimension{
   219  					{LowerBound: 1, Length: 2},
   220  					{LowerBound: 1, Length: 1},
   221  					{LowerBound: 1, Length: 1},
   222  					{LowerBound: 1, Length: 3}},
   223  				Status: pgtype.Present},
   224  			expected: [2][1][1][3]float32{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
   225  			dst:      &float32ArrayDim4,
   226  		},
   227  	}
   228  
   229  	for i, tt := range simpleTests {
   230  		err := tt.src.AssignTo(tt.dst)
   231  		if err != nil {
   232  			t.Errorf("%d: %v", i, err)
   233  		}
   234  
   235  		if dst := reflect.ValueOf(tt.dst).Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) {
   236  			t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
   237  		}
   238  	}
   239  
   240  	errorTests := []struct {
   241  		src pgtype.Float4Array
   242  		dst interface{}
   243  	}{
   244  		{
   245  			src: pgtype.Float4Array{
   246  				Elements:   []pgtype.Float4{{Status: pgtype.Null}},
   247  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
   248  				Status:     pgtype.Present,
   249  			},
   250  			dst: &float32Slice,
   251  		},
   252  		{
   253  			src: pgtype.Float4Array{
   254  				Elements:   []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
   255  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
   256  				Status:     pgtype.Present},
   257  			dst: &float32ArrayDim2,
   258  		},
   259  		{
   260  			src: pgtype.Float4Array{
   261  				Elements:   []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
   262  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
   263  				Status:     pgtype.Present},
   264  			dst: &float32Slice,
   265  		},
   266  		{
   267  			src: pgtype.Float4Array{
   268  				Elements:   []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
   269  				Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
   270  				Status:     pgtype.Present},
   271  			dst: &float32ArrayDim4,
   272  		},
   273  	}
   274  
   275  	for i, tt := range errorTests {
   276  		err := tt.src.AssignTo(tt.dst)
   277  		if err == nil {
   278  			t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
   279  		}
   280  	}
   281  
   282  }
   283  

View as plain text