1
2
3
4
5
6
7 package bsoncodec
8
9 import (
10 "reflect"
11 "testing"
12
13 "go.mongodb.org/mongo-driver/bson/bsonrw"
14 "go.mongodb.org/mongo-driver/bson/bsonrw/bsonrwtest"
15 "go.mongodb.org/mongo-driver/internal/assert"
16 )
17
18 func TestCondAddrCodec(t *testing.T) {
19 var inner int
20 canAddrVal := reflect.ValueOf(&inner)
21 addressable := canAddrVal.Elem()
22 unaddressable := reflect.ValueOf(inner)
23 rw := &bsonrwtest.ValueReaderWriter{}
24
25 t.Run("addressEncode", func(t *testing.T) {
26 invoked := 0
27 encode1 := ValueEncoderFunc(func(EncodeContext, bsonrw.ValueWriter, reflect.Value) error {
28 invoked = 1
29 return nil
30 })
31 encode2 := ValueEncoderFunc(func(EncodeContext, bsonrw.ValueWriter, reflect.Value) error {
32 invoked = 2
33 return nil
34 })
35 condEncoder := newCondAddrEncoder(encode1, encode2)
36
37 testCases := []struct {
38 name string
39 val reflect.Value
40 invoked int
41 }{
42 {"canAddr", addressable, 1},
43 {"else", unaddressable, 2},
44 }
45 for _, tc := range testCases {
46 t.Run(tc.name, func(t *testing.T) {
47 err := condEncoder.EncodeValue(EncodeContext{}, rw, tc.val)
48 assert.Nil(t, err, "CondAddrEncoder error: %v", err)
49
50 assert.Equal(t, invoked, tc.invoked, "Expected function %v to be called, called %v", tc.invoked, invoked)
51 })
52 }
53
54 t.Run("error", func(t *testing.T) {
55 errEncoder := newCondAddrEncoder(encode1, nil)
56 err := errEncoder.EncodeValue(EncodeContext{}, rw, unaddressable)
57 want := ErrNoEncoder{Type: unaddressable.Type()}
58 assert.Equal(t, err, want, "expected error %v, got %v", want, err)
59 })
60 })
61 t.Run("addressDecode", func(t *testing.T) {
62 invoked := 0
63 decode1 := ValueDecoderFunc(func(DecodeContext, bsonrw.ValueReader, reflect.Value) error {
64 invoked = 1
65 return nil
66 })
67 decode2 := ValueDecoderFunc(func(DecodeContext, bsonrw.ValueReader, reflect.Value) error {
68 invoked = 2
69 return nil
70 })
71 condDecoder := newCondAddrDecoder(decode1, decode2)
72
73 testCases := []struct {
74 name string
75 val reflect.Value
76 invoked int
77 }{
78 {"canAddr", addressable, 1},
79 {"else", unaddressable, 2},
80 }
81 for _, tc := range testCases {
82 t.Run(tc.name, func(t *testing.T) {
83 err := condDecoder.DecodeValue(DecodeContext{}, rw, tc.val)
84 assert.Nil(t, err, "CondAddrDecoder error: %v", err)
85
86 assert.Equal(t, invoked, tc.invoked, "Expected function %v to be called, called %v", tc.invoked, invoked)
87 })
88 }
89
90 t.Run("error", func(t *testing.T) {
91 errDecoder := newCondAddrDecoder(decode1, nil)
92 err := errDecoder.DecodeValue(DecodeContext{}, rw, unaddressable)
93 want := ErrNoDecoder{Type: unaddressable.Type()}
94 assert.Equal(t, err, want, "expected error %v, got %v", want, err)
95 })
96 })
97 }
98
View as plain text