trpc.group/trpc-go/trpc-cmdline@v1.0.9/util/apidocs/ordered_map_test.go (about) 1 // Tencent is pleased to support the open source community by making tRPC available. 2 // 3 // Copyright (C) 2023 THL A29 Limited, a Tencent company. 4 // All rights reserved. 5 // 6 // If you have downloaded a copy of the tRPC source code from Tencent, 7 // please note that tRPC source code is licensed under the Apache 2.0 License, 8 // A copy of the Apache 2.0 License is included in this file. 9 10 package apidocs 11 12 import ( 13 "fmt" 14 "testing" 15 16 "github.com/stretchr/testify/require" 17 ) 18 19 func TestOrderedMarshalJSON(t *testing.T) { 20 type args struct { 21 element interface{} 22 rank map[string]int 23 } 24 tests := []struct { 25 name string 26 args args 27 want []byte 28 wantErr require.ErrorAssertionFunc 29 }{ 30 { 31 name: "marshal", 32 args: args{ 33 element: map[string]string{ 34 "1": "value-1", 35 "2": "value-2", 36 "3": "value-3", 37 }, 38 rank: map[string]int{ 39 "1": 1, 40 "2": 2, 41 "3": 3, 42 }, 43 }, 44 want: []byte(`{"1":"value-1","2":"value-2","3":"value-3"}`), 45 wantErr: func(t require.TestingT, err error, i ...interface{}) { 46 require.NoError(t, err) 47 }, 48 }, 49 { 50 name: "marshal in another order", 51 args: args{ 52 element: map[string]string{ 53 "1": "value-1", 54 "2": "value-2", 55 "3": "value-3", 56 }, 57 rank: map[string]int{ 58 "2": 1, 59 "1": 2, 60 "3": 3, 61 }, 62 }, 63 want: []byte(`{"2":"value-2","1":"value-1","3":"value-3"}`), 64 wantErr: func(t require.TestingT, err error, i ...interface{}) { 65 require.NoError(t, err) 66 }, 67 }, 68 { 69 name: "marshal in standard order", 70 args: args{ 71 element: map[string]string{ 72 "2": "value-2", 73 "1": "value-1", 74 "3": "value-3", 75 }, 76 rank: make(map[string]int), 77 }, 78 want: []byte(`{"1":"value-1","2":"value-2","3":"value-3"}`), 79 wantErr: func(t require.TestingT, err error, i ...interface{}) { 80 require.NoError(t, err) 81 }, 82 }, 83 } 84 for _, tt := range tests { 85 t.Run(tt.name, func(t *testing.T) { 86 got, err := OrderedMarshalJSON(tt.args.element, tt.args.rank) 87 tt.wantErr(t, err, fmt.Sprintf("OrderedMarshalJSON(%v, %v)", tt.args.element, tt.args.rank)) 88 require.Equalf(t, tt.want, got, "OrderedMarshalJSON(%v, %v)", tt.args.element, tt.args.rank) 89 }) 90 } 91 } 92 93 func TestOrderedUnmarshalJSON(t *testing.T) { 94 type args struct { 95 b []byte 96 element interface{} 97 rank interface{} 98 } 99 var emptyRank map[string]int 100 tests := []struct { 101 name string 102 args args 103 wantErr require.ErrorAssertionFunc 104 }{ 105 { 106 name: "unmarshal", 107 args: args{ 108 b: []byte(`{"2":"value-2","1":"value-1","3":"value-3"}`), 109 element: &map[string]string{}, 110 rank: &map[string]int{}, 111 }, 112 wantErr: func(t require.TestingT, err error, i ...interface{}) { 113 require.NoError(t, err) 114 }, 115 }, 116 { 117 name: "unmarshal_with_nil", 118 args: args{ 119 b: []byte(`{"2":"value-2","1":"value-1","3":"value-3"}`), 120 element: &map[string]string{}, 121 rank: &emptyRank, 122 }, 123 wantErr: func(t require.TestingT, err error, i ...interface{}) { 124 require.NoError(t, err) 125 }, 126 }, 127 { 128 name: "unmarshal_rank", 129 args: args{ 130 b: []byte(`{ 131 "domain": { 132 "title": "domain", 133 "$ref": "#/components/schemas/helloworld.Domain.aa6718f0a7c001e99386d62d6a0da155" 134 }, 135 "url": { 136 "title": "url", 137 "type": "string" 138 } 139 }`), 140 element: &map[string]interface{}{}, 141 rank: &emptyRank, 142 }, 143 wantErr: func(t require.TestingT, err error, i ...interface{}) { 144 require.NoError(t, err) 145 }, 146 }, 147 } 148 for _, tt := range tests { 149 t.Run(tt.name, func(t *testing.T) { 150 tt.wantErr(t, OrderedUnmarshalJSON(tt.args.b, tt.args.element, tt.args.rank), 151 fmt.Sprintf("OrderedUnmarshalJSON(%v, %v, %v)", tt.args.b, tt.args.element, tt.args.rank)) 152 }) 153 } 154 }