| 121 | } |
| 122 | |
| 123 | func TestEncoding(t *testing.T) { |
| 124 | t.Parallel() |
| 125 | |
| 126 | m := orderedmap.New[A, I]() |
| 127 | m.Store(A{Number: 1}, &A{}) |
| 128 | m.Store(A{Number: 2}, &B{}) |
| 129 | |
| 130 | var buf bytes.Buffer |
| 131 | err := gob.NewEncoder(&buf).Encode(m) |
| 132 | require.NoError(t, err) |
| 133 | require.NotEmpty(t, buf.Bytes()) |
| 134 | |
| 135 | // Now, we decode the map. Note that the decoding logic is usually invoked by library or |
| 136 | // frameworks, meaning the map will be constructed via plain Go composite literals instead of |
| 137 | // via our manually-defined constructor (i.e., orderedmap.New). Here, we mimic this behavior |
| 138 | // and test our decoding logic for graceful handling of such cases. |
| 139 | decodedMap := &orderedmap.OrderedMap[A, I]{} |
| 140 | err = gob.NewDecoder(&buf).Decode(&decodedMap) |
| 141 | require.NoError(t, err) |
| 142 | |
| 143 | // Ensure our decoded map is equal to the encoded one. |
| 144 | v, ok := decodedMap.Load(A{Number: 1}) |
| 145 | require.True(t, ok) |
| 146 | require.NotNil(t, v) |
| 147 | require.IsType(t, &A{}, v) |
| 148 | v, ok = decodedMap.Load(A{Number: 2}) |
| 149 | require.True(t, ok) |
| 150 | require.NotNil(t, v) |
| 151 | require.IsType(t, &B{}, v) |
| 152 | |
| 153 | // Use the decoded map as a regular ordered map. |
| 154 | decodedMap.Store(A{Number: 3}, &A{Number: 4}) |
| 155 | v = decodedMap.Value(A{Number: 3}) |
| 156 | require.NotNil(t, v) |
| 157 | require.IsType(t, &A{}, v) |
| 158 | require.Equal(t, 4, v.(*A).Number) |
| 159 | } |
| 160 | |
| 161 | func TestEncoding_Deterministic(t *testing.T) { |
| 162 | t.Parallel() |