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  }