(t *testing.T)
| 83 | } |
| 84 | |
| 85 | func TestMarshalDeterministic_Struct(t *testing.T) { |
| 86 | type Inner struct { |
| 87 | Z int `json:"z"` |
| 88 | A int `json:"a"` |
| 89 | } |
| 90 | |
| 91 | type Outer struct { |
| 92 | Name string `json:"name"` |
| 93 | Data map[string]int `json:"data"` |
| 94 | Inner Inner `json:"inner"` |
| 95 | Extra map[string]Inner `json:"extra,omitempty"` |
| 96 | } |
| 97 | |
| 98 | o := Outer{ |
| 99 | Name: "test", |
| 100 | Data: map[string]int{"c": 3, "a": 1, "b": 2}, |
| 101 | Inner: Inner{ |
| 102 | Z: 26, |
| 103 | A: 1, |
| 104 | }, |
| 105 | Extra: map[string]Inner{ |
| 106 | "second": {Z: 2, A: 0}, |
| 107 | "first": {Z: 1, A: 0}, |
| 108 | }, |
| 109 | } |
| 110 | |
| 111 | data, err := MarshalDeterministic(o) |
| 112 | if err != nil { |
| 113 | t.Fatalf("MarshalDeterministic failed: %v", err) |
| 114 | } |
| 115 | |
| 116 | // 验证结果是确定性的 |
| 117 | var results []string |
| 118 | for range 5 { |
| 119 | d, _ := MarshalDeterministic(o) |
| 120 | results = append(results, string(d)) |
| 121 | } |
| 122 | |
| 123 | for i, r := range results { |
| 124 | if r != results[0] { |
| 125 | t.Errorf("Iteration %d differs: %s", i, r) |
| 126 | } |
| 127 | } |
| 128 | |
| 129 | // 解析验证结构正确 |
| 130 | var parsed map[string]any |
| 131 | if err := json.Unmarshal(data, &parsed); err != nil { |
| 132 | t.Fatalf("Failed to parse result: %v", err) |
| 133 | } |
| 134 | |
| 135 | if parsed["name"] != "test" { |
| 136 | t.Errorf("Expected name 'test', got %v", parsed["name"]) |
| 137 | } |
| 138 | } |
| 139 | |
| 140 | func TestMarshalDeterministic_NilValues(t *testing.T) { |
| 141 | var nilMap map[string]int |
nothing calls this directly
no test coverage detected