github.com/anthropics/anthropic-sdk-go@v1.70.1/internal/apijson/port_test.go (about) 1 package apijson 2 3 import ( 4 "reflect" 5 "testing" 6 ) 7 8 type Metadata struct { 9 CreatedAt string `json:"created_at"` 10 } 11 12 // Card is the "combined" type of CardVisa and CardMastercard 13 type Card struct { 14 Processor CardProcessor `json:"processor"` 15 Data any `json:"data"` 16 IsFoo bool `json:"is_foo"` 17 IsBar bool `json:"is_bar"` 18 Metadata Metadata `json:"metadata"` 19 Value any `json:"value"` 20 21 JSON cardJSON 22 } 23 24 type cardJSON struct { 25 Processor Field 26 Data Field 27 IsFoo Field 28 IsBar Field 29 Metadata Field 30 Value Field 31 ExtraFields map[string]Field 32 raw string 33 } 34 35 func (r cardJSON) RawJSON() string { return r.raw } 36 37 type CardProcessor string 38 39 // CardVisa 40 type CardVisa struct { 41 Processor CardVisaProcessor `json:"processor"` 42 Data CardVisaData `json:"data"` 43 IsFoo bool `json:"is_foo"` 44 Metadata Metadata `json:"metadata"` 45 Value string `json:"value"` 46 47 JSON cardVisaJSON 48 } 49 50 type cardVisaJSON struct { 51 Processor Field 52 Data Field 53 IsFoo Field 54 Metadata Field 55 Value Field 56 ExtraFields map[string]Field 57 raw string 58 } 59 60 func (r cardVisaJSON) RawJSON() string { return r.raw } 61 62 type CardVisaProcessor string 63 64 type CardVisaData struct { 65 Foo string `json:"foo"` 66 } 67 68 // CardMastercard 69 type CardMastercard struct { 70 Processor CardMastercardProcessor `json:"processor"` 71 Data CardMastercardData `json:"data"` 72 IsBar bool `json:"is_bar"` 73 Metadata Metadata `json:"metadata"` 74 Value bool `json:"value"` 75 76 JSON cardMastercardJSON 77 } 78 79 type cardMastercardJSON struct { 80 Processor Field 81 Data Field 82 IsBar Field 83 Metadata Field 84 Value Field 85 ExtraFields map[string]Field 86 raw string 87 } 88 89 func (r cardMastercardJSON) RawJSON() string { return r.raw } 90 91 type CardMastercardProcessor string 92 93 type CardMastercardData struct { 94 Bar int64 `json:"bar"` 95 } 96 97 type CommonFields struct { 98 Metadata Metadata `json:"metadata"` 99 Value string `json:"value"` 100 101 JSON commonFieldsJSON 102 } 103 104 type commonFieldsJSON struct { 105 Metadata Field 106 Value Field 107 ExtraFields map[string]Field 108 raw string 109 } 110 111 type CardEmbedded struct { 112 CommonFields 113 Processor CardVisaProcessor `json:"processor"` 114 Data CardVisaData `json:"data"` 115 IsFoo bool `json:"is_foo"` 116 117 JSON cardEmbeddedJSON 118 } 119 120 type cardEmbeddedJSON struct { 121 Processor Field 122 Data Field 123 IsFoo Field 124 ExtraFields map[string]Field 125 raw string 126 } 127 128 func (r cardEmbeddedJSON) RawJSON() string { return r.raw } 129 130 var portTests = map[string]struct { 131 from any 132 to any 133 }{ 134 "visa to card": { 135 CardVisa{ 136 Processor: "visa", 137 IsFoo: true, 138 Data: CardVisaData{ 139 Foo: "foo", 140 }, 141 Metadata: Metadata{ 142 CreatedAt: "Mar 29 2024", 143 }, 144 Value: "value", 145 JSON: cardVisaJSON{ 146 raw: `{"processor":"visa","is_foo":true,"data":{"foo":"foo"}}`, 147 Processor: Field{raw: `"visa"`, status: valid}, 148 IsFoo: Field{raw: `true`, status: valid}, 149 Data: Field{raw: `{"foo":"foo"}`, status: valid}, 150 Value: Field{raw: `"value"`, status: valid}, 151 ExtraFields: map[string]Field{"extra": {raw: `"yo"`, status: valid}}, 152 }, 153 }, 154 Card{ 155 Processor: "visa", 156 IsFoo: true, 157 IsBar: false, 158 Data: CardVisaData{ 159 Foo: "foo", 160 }, 161 Metadata: Metadata{ 162 CreatedAt: "Mar 29 2024", 163 }, 164 Value: "value", 165 JSON: cardJSON{ 166 raw: `{"processor":"visa","is_foo":true,"data":{"foo":"foo"}}`, 167 Processor: Field{raw: `"visa"`, status: valid}, 168 IsFoo: Field{raw: `true`, status: valid}, 169 Data: Field{raw: `{"foo":"foo"}`, status: valid}, 170 Value: Field{raw: `"value"`, status: valid}, 171 ExtraFields: map[string]Field{"extra": {raw: `"yo"`, status: valid}}, 172 }, 173 }, 174 }, 175 "mastercard to card": { 176 CardMastercard{ 177 Processor: "mastercard", 178 IsBar: true, 179 Data: CardMastercardData{ 180 Bar: 13, 181 }, 182 Value: false, 183 }, 184 Card{ 185 Processor: "mastercard", 186 IsFoo: false, 187 IsBar: true, 188 Data: CardMastercardData{ 189 Bar: 13, 190 }, 191 Value: false, 192 }, 193 }, 194 "embedded to card": { 195 CardEmbedded{ 196 CommonFields: CommonFields{ 197 Metadata: Metadata{ 198 CreatedAt: "Mar 29 2024", 199 }, 200 Value: "embedded_value", 201 JSON: commonFieldsJSON{ 202 Metadata: Field{raw: `{"created_at":"Mar 29 2024"}`, status: valid}, 203 Value: Field{raw: `"embedded_value"`, status: valid}, 204 raw: `should not matter`, 205 }, 206 }, 207 Processor: "visa", 208 IsFoo: true, 209 Data: CardVisaData{ 210 Foo: "embedded_foo", 211 }, 212 JSON: cardEmbeddedJSON{ 213 raw: `{"processor":"visa","is_foo":true,"data":{"foo":"embedded_foo"},"metadata":{"created_at":"Mar 29 2024"},"value":"embedded_value"}`, 214 Processor: Field{raw: `"visa"`, status: valid}, 215 IsFoo: Field{raw: `true`, status: valid}, 216 Data: Field{raw: `{"foo":"embedded_foo"}`, status: valid}, 217 }, 218 }, 219 Card{ 220 Processor: "visa", 221 IsFoo: true, 222 IsBar: false, 223 Data: CardVisaData{ 224 Foo: "embedded_foo", 225 }, 226 Metadata: Metadata{ 227 CreatedAt: "Mar 29 2024", 228 }, 229 Value: "embedded_value", 230 JSON: cardJSON{ 231 raw: `{"processor":"visa","is_foo":true,"data":{"foo":"embedded_foo"},"metadata":{"created_at":"Mar 29 2024"},"value":"embedded_value"}`, 232 Processor: Field{raw: `"visa"`, status: 0x3}, 233 IsFoo: Field{raw: "true", status: 0x3}, 234 Data: Field{raw: `{"foo":"embedded_foo"}`, status: 0x3}, 235 Metadata: Field{raw: `{"created_at":"Mar 29 2024"}`, status: 0x3}, 236 Value: Field{raw: `"embedded_value"`, status: 0x3}, 237 }, 238 }, 239 }, 240 } 241 242 func TestPort(t *testing.T) { 243 for name, test := range portTests { 244 t.Run(name, func(t *testing.T) { 245 toVal := reflect.New(reflect.TypeOf(test.to)) 246 247 err := Port(test.from, toVal.Interface()) 248 if err != nil { 249 t.Fatalf("port of %v failed with error %v", test.from, err) 250 } 251 252 if !reflect.DeepEqual(toVal.Elem().Interface(), test.to) { 253 t.Fatalf("expected:\n%+#v\n\nto port to:\n%+#v\n\nbut got:\n%+#v", test.from, test.to, toVal.Elem().Interface()) 254 } 255 }) 256 } 257 }