Verifies: SYS-REQ-093 MCDC SYS-REQ-093: getstring_input_has_unicode_edge_cases=T, getstring_handles_unicode_edges_safely=T => TRUE
(t *testing.T)
| 588 | // Verifies: SYS-REQ-093 |
| 589 | // MCDC SYS-REQ-093: getstring_input_has_unicode_edge_cases=T, getstring_handles_unicode_edges_safely=T => TRUE |
| 590 | func TestGetStringUnicodeEdgeCases(t *testing.T) { |
| 591 | cases := []struct { |
| 592 | name string |
| 593 | jsonData string |
| 594 | key string |
| 595 | wantErr bool |
| 596 | }{ |
| 597 | { |
| 598 | name: "BOM character", |
| 599 | jsonData: `{"s":"\uFEFF"}`, |
| 600 | key: "s", |
| 601 | }, |
| 602 | { |
| 603 | name: "zero-width joiner", |
| 604 | jsonData: `{"s":"\u200D"}`, |
| 605 | key: "s", |
| 606 | }, |
| 607 | { |
| 608 | name: "replacement character", |
| 609 | jsonData: `{"s":"\uFFFD"}`, |
| 610 | key: "s", |
| 611 | }, |
| 612 | { |
| 613 | name: "null character escape", |
| 614 | jsonData: `{"s":"\u0000"}`, |
| 615 | key: "s", |
| 616 | }, |
| 617 | { |
| 618 | name: "max BMP codepoint", |
| 619 | jsonData: `{"s":"\uFFFF"}`, |
| 620 | key: "s", |
| 621 | }, |
| 622 | { |
| 623 | name: "multi-byte UTF-8 literal in value", |
| 624 | jsonData: "{\"s\":\"\xe2\x80\x8b\"}", // zero-width space (U+200B) as raw UTF-8 |
| 625 | key: "s", |
| 626 | }, |
| 627 | } |
| 628 | for _, tc := range cases { |
| 629 | t.Run(tc.name, func(t *testing.T) { |
| 630 | defer func() { |
| 631 | if r := recover(); r != nil { |
| 632 | t.Fatalf("GetString panicked on %s: %v", tc.name, r) |
| 633 | } |
| 634 | }() |
| 635 | |
| 636 | val, err := GetString([]byte(tc.jsonData), tc.key) |
| 637 | if tc.wantErr && err == nil { |
| 638 | t.Fatalf("Expected error for %s", tc.name) |
| 639 | } |
| 640 | if !tc.wantErr && err != nil { |
| 641 | t.Fatalf("GetString(%s) returned error: %v", tc.name, err) |
| 642 | } |
| 643 | _ = val |
| 644 | }) |
| 645 | } |
| 646 | } |
| 647 |
nothing calls this directly
no test coverage detected
searching dependent graphs…