@@ -2660,7 +2660,7 @@ func TestDefaultValueDecoders(t *testing.T) {
2660
2660
})
2661
2661
})
2662
2662
2663
- t .Run ("EmptyInterfaceDecodeValue " , func (t * testing.T ) {
2663
+ t .Run ("defaultEmptyInterfaceCodec " , func (t * testing.T ) {
2664
2664
t .Run ("DecodeValue" , func (t * testing.T ) {
2665
2665
testCases := []struct {
2666
2666
name string
@@ -2777,7 +2777,7 @@ func TestDefaultValueDecoders(t *testing.T) {
2777
2777
val := reflect .New (tEmpty ).Elem ()
2778
2778
dc := DecodeContext {Registry : NewRegistryBuilder ().Build ()}
2779
2779
want := ErrNoTypeMapEntry {Type : tc .bsontype }
2780
- got := dvd . EmptyInterfaceDecodeValue (dc , llvr , val )
2780
+ got := defaultEmptyInterfaceCodec . DecodeValue (dc , llvr , val )
2781
2781
if ! compareErrors (got , want ) {
2782
2782
t .Errorf ("Errors are not equal. got %v; want %v" , got , want )
2783
2783
}
@@ -2794,7 +2794,7 @@ func TestDefaultValueDecoders(t *testing.T) {
2794
2794
Build (),
2795
2795
}
2796
2796
want := ErrNoDecoder {Type : reflect .TypeOf (tc .val )}
2797
- got := dvd . EmptyInterfaceDecodeValue (dc , llvr , val )
2797
+ got := defaultEmptyInterfaceCodec . DecodeValue (dc , llvr , val )
2798
2798
if ! compareErrors (got , want ) {
2799
2799
t .Errorf ("Errors are not equal. got %v; want %v" , got , want )
2800
2800
}
@@ -2812,7 +2812,7 @@ func TestDefaultValueDecoders(t *testing.T) {
2812
2812
RegisterTypeMapEntry (tc .bsontype , reflect .TypeOf (tc .val )).
2813
2813
Build (),
2814
2814
}
2815
- got := dvd . EmptyInterfaceDecodeValue (dc , llvr , reflect .New (tEmpty ).Elem ())
2815
+ got := defaultEmptyInterfaceCodec . DecodeValue (dc , llvr , reflect .New (tEmpty ).Elem ())
2816
2816
if ! compareErrors (got , want ) {
2817
2817
t .Errorf ("Errors are not equal. got %v; want %v" , got , want )
2818
2818
}
@@ -2828,7 +2828,7 @@ func TestDefaultValueDecoders(t *testing.T) {
2828
2828
Build (),
2829
2829
}
2830
2830
got := reflect .New (tEmpty ).Elem ()
2831
- err := dvd . EmptyInterfaceDecodeValue (dc , llvr , got )
2831
+ err := defaultEmptyInterfaceCodec . DecodeValue (dc , llvr , got )
2832
2832
noerr (t , err )
2833
2833
if ! cmp .Equal (got .Interface (), want , cmp .Comparer (compareDecimal128 )) {
2834
2834
t .Errorf ("Did not receive expected value. got %v; want %v" , got .Interface (), want )
@@ -2841,7 +2841,7 @@ func TestDefaultValueDecoders(t *testing.T) {
2841
2841
t .Run ("non-interface{}" , func (t * testing.T ) {
2842
2842
val := uint64 (1234567890 )
2843
2843
want := ValueDecoderError {Name : "EmptyInterfaceDecodeValue" , Types : []reflect.Type {tEmpty }, Received : reflect .ValueOf (val )}
2844
- got := dvd . EmptyInterfaceDecodeValue (DecodeContext {}, nil , reflect .ValueOf (val ))
2844
+ got := defaultEmptyInterfaceCodec . DecodeValue (DecodeContext {}, nil , reflect .ValueOf (val ))
2845
2845
if ! compareErrors (got , want ) {
2846
2846
t .Errorf ("Errors are not equal. got %v; want %v" , got , want )
2847
2847
}
@@ -2850,7 +2850,7 @@ func TestDefaultValueDecoders(t *testing.T) {
2850
2850
t .Run ("nil *interface{}" , func (t * testing.T ) {
2851
2851
var val interface {}
2852
2852
want := ValueDecoderError {Name : "EmptyInterfaceDecodeValue" , Types : []reflect.Type {tEmpty }, Received : reflect .ValueOf (val )}
2853
- got := dvd . EmptyInterfaceDecodeValue (DecodeContext {}, nil , reflect .ValueOf (val ))
2853
+ got := defaultEmptyInterfaceCodec . DecodeValue (DecodeContext {}, nil , reflect .ValueOf (val ))
2854
2854
if ! compareErrors (got , want ) {
2855
2855
t .Errorf ("Errors are not equal. got %v; want %v" , got , want )
2856
2856
}
@@ -2860,7 +2860,7 @@ func TestDefaultValueDecoders(t *testing.T) {
2860
2860
llvr := & bsonrwtest.ValueReaderWriter {BSONType : bsontype .Double }
2861
2861
want := ErrNoTypeMapEntry {Type : bsontype .Double }
2862
2862
val := reflect .New (tEmpty ).Elem ()
2863
- got := dvd . EmptyInterfaceDecodeValue (DecodeContext {Registry : NewRegistryBuilder ().Build ()}, llvr , val )
2863
+ got := defaultEmptyInterfaceCodec . DecodeValue (DecodeContext {Registry : NewRegistryBuilder ().Build ()}, llvr , val )
2864
2864
if ! compareErrors (got , want ) {
2865
2865
t .Errorf ("Errors are not equal. got %v; want %v" , got , want )
2866
2866
}
@@ -2871,12 +2871,94 @@ func TestDefaultValueDecoders(t *testing.T) {
2871
2871
want := primitive.D {{"pi" , 3.14159 }}
2872
2872
var got interface {}
2873
2873
val := reflect .ValueOf (& got ).Elem ()
2874
- err := dvd . EmptyInterfaceDecodeValue (DecodeContext {Registry : buildDefaultRegistry ()}, vr , val )
2874
+ err := defaultEmptyInterfaceCodec . DecodeValue (DecodeContext {Registry : buildDefaultRegistry ()}, vr , val )
2875
2875
noerr (t , err )
2876
2876
if ! cmp .Equal (got , want ) {
2877
2877
t .Errorf ("Did not get correct result. got %v; want %v" , got , want )
2878
2878
}
2879
2879
})
2880
+ t .Run ("custom type map entry" , func (t * testing.T ) {
2881
+ // registering a custom type map entry for both bsontype.Type(0) anad bsontype.EmbeddedDocument should cause
2882
+ // both top-level and embedded documents to decode to registered type when unmarshalling to interface{}
2883
+
2884
+ topLevelRb := NewRegistryBuilder ()
2885
+ defaultValueEncoders .RegisterDefaultEncoders (topLevelRb )
2886
+ defaultValueDecoders .RegisterDefaultDecoders (topLevelRb )
2887
+ topLevelRb .RegisterTypeMapEntry (bsontype .Type (0 ), reflect .TypeOf (primitive.M {}))
2888
+
2889
+ embeddedRb := NewRegistryBuilder ()
2890
+ defaultValueEncoders .RegisterDefaultEncoders (embeddedRb )
2891
+ defaultValueDecoders .RegisterDefaultDecoders (embeddedRb )
2892
+ embeddedRb .RegisterTypeMapEntry (bsontype .Type (0 ), reflect .TypeOf (primitive.M {}))
2893
+
2894
+ // create doc {"nested": {"foo": 1}}
2895
+ innerDoc := bsoncore .BuildDocument (
2896
+ nil ,
2897
+ bsoncore .AppendInt32Element (nil , "foo" , 1 ),
2898
+ )
2899
+ doc := bsoncore .BuildDocument (
2900
+ nil ,
2901
+ bsoncore .AppendDocumentElement (nil , "nested" , innerDoc ),
2902
+ )
2903
+ want := primitive.M {
2904
+ "nested" : primitive.M {
2905
+ "foo" : int32 (1 ),
2906
+ },
2907
+ }
2908
+
2909
+ testCases := []struct {
2910
+ name string
2911
+ registry * Registry
2912
+ }{
2913
+ {"top level" , topLevelRb .Build ()},
2914
+ {"embedded" , embeddedRb .Build ()},
2915
+ }
2916
+ for _ , tc := range testCases {
2917
+ var got interface {}
2918
+ vr := bsonrw .NewBSONDocumentReader (doc )
2919
+ val := reflect .ValueOf (& got ).Elem ()
2920
+
2921
+ err := defaultEmptyInterfaceCodec .DecodeValue (DecodeContext {Registry : tc .registry }, vr , val )
2922
+ noerr (t , err )
2923
+ if ! cmp .Equal (got , want ) {
2924
+ t .Fatalf ("got %v, want %v" , got , want )
2925
+ }
2926
+ }
2927
+ })
2928
+ t .Run ("ancestor info is used over custom type map entry" , func (t * testing.T ) {
2929
+ // If a type map entry is registered for bsontype.EmbeddedDocument, the decoder should use ancestor
2930
+ // information if available instead of the registered entry.
2931
+
2932
+ rb := NewRegistryBuilder ()
2933
+ defaultValueEncoders .RegisterDefaultEncoders (rb )
2934
+ defaultValueDecoders .RegisterDefaultDecoders (rb )
2935
+ rb .RegisterTypeMapEntry (bsontype .EmbeddedDocument , reflect .TypeOf (primitive.M {}))
2936
+ reg := rb .Build ()
2937
+
2938
+ // build document {"nested": {"foo": 10}}
2939
+ inner := bsoncore .BuildDocument (
2940
+ nil ,
2941
+ bsoncore .AppendInt32Element (nil , "foo" , 10 ),
2942
+ )
2943
+ doc := bsoncore .BuildDocument (
2944
+ nil ,
2945
+ bsoncore .AppendDocumentElement (nil , "nested" , inner ),
2946
+ )
2947
+ want := primitive.D {
2948
+ {"nested" , primitive.D {
2949
+ {"foo" , int32 (10 )},
2950
+ }},
2951
+ }
2952
+
2953
+ var got primitive.D
2954
+ vr := bsonrw .NewBSONDocumentReader (doc )
2955
+ val := reflect .ValueOf (& got ).Elem ()
2956
+ err := defaultSliceCodec .DecodeValue (DecodeContext {Registry : reg }, vr , val )
2957
+ noerr (t , err )
2958
+ if ! cmp .Equal (got , want ) {
2959
+ t .Fatalf ("got %v, want %v" , got , want )
2960
+ }
2961
+ })
2880
2962
})
2881
2963
}
2882
2964
0 commit comments