| 351 | } |
| 352 | |
| 353 | func TestStruct(t *testing.T) { |
| 354 | t.Parallel() |
| 355 | |
| 356 | t.Run("with untagged struct field", func(t *testing.T) { |
| 357 | type Embedded struct { |
| 358 | D int `json:"d"` |
| 359 | } |
| 360 | |
| 361 | s := struct { |
| 362 | Embedded |
| 363 | |
| 364 | A int `json:"a"` |
| 365 | B int |
| 366 | Anonymous struct { |
| 367 | C int `json:"c"` |
| 368 | } |
| 369 | }{} |
| 370 | |
| 371 | { |
| 372 | s.A = 1 |
| 373 | s.B = 2 |
| 374 | s.Anonymous.C = 3 |
| 375 | s.D = 4 |
| 376 | } |
| 377 | |
| 378 | t.Run(`should resolve field A tagged "a"`, func(t *testing.T) { |
| 379 | pointerA, err := New("/a") |
| 380 | require.NoError(t, err) |
| 381 | |
| 382 | value, kind, err := pointerA.Get(s) |
| 383 | require.NoError(t, err) |
| 384 | require.EqualT(t, reflect.Int, kind) |
| 385 | require.Equal(t, 1, value) |
| 386 | |
| 387 | _, err = pointerA.Set(&s, 9) |
| 388 | require.NoError(t, err) |
| 389 | |
| 390 | value, _, err = pointerA.Get(s) |
| 391 | require.NoError(t, err) |
| 392 | require.Equal(t, 9, value) |
| 393 | }) |
| 394 | |
| 395 | t.Run(`should resolve embedded field D with tag`, func(t *testing.T) { |
| 396 | pointerD, err := New("/d") |
| 397 | require.NoError(t, err) |
| 398 | |
| 399 | value, kind, err := pointerD.Get(s) |
| 400 | require.NoError(t, err) |
| 401 | require.EqualT(t, reflect.Int, kind) |
| 402 | require.Equal(t, 4, value) |
| 403 | |
| 404 | _, err = pointerD.Set(&s, 6) |
| 405 | require.NoError(t, err) |
| 406 | |
| 407 | value, _, err = pointerD.Get(s) |
| 408 | require.NoError(t, err) |
| 409 | require.Equal(t, 6, value) |
| 410 | }) |