[
{
"name": "keep first: the earliest record of each key survives, in its own place",
"args": [[{ "id": "a", "v": 1 }, { "id": "b", "v": 1 }, { "id": "a", "v": 2 }], "id", "first"],
"expect": [{ "id": "a", "v": 1 }, { "id": "b", "v": 1 }]
},
{
"name": "keep last: the latest record survives, at the latest record's position",
"args": [[{ "id": "a", "v": 1 }, { "id": "b", "v": 1 }, { "id": "a", "v": 2 }], "id", "last"],
"expect": [{ "id": "b", "v": 1 }, { "id": "a", "v": 2 }]
},
{
"name": "three copies, keep last, interleaved with others",
"args": [[{ "id": 1, "n": "x" }, { "id": 2, "n": "y" }, { "id": 1, "n": "z" }, { "id": 3, "n": "w" }, { "id": 1, "n": "q" }], "id", "last"],
"expect": [{ "id": 2, "n": "y" }, { "id": 3, "n": "w" }, { "id": 1, "n": "q" }]
},
{
"name": "three copies, keep first",
"args": [[{ "id": 1, "n": "x" }, { "id": 2, "n": "y" }, { "id": 1, "n": "z" }, { "id": 3, "n": "w" }, { "id": 1, "n": "q" }], "id", "first"],
"expect": [{ "id": 1, "n": "x" }, { "id": 2, "n": "y" }, { "id": 3, "n": "w" }]
},
{
"name": "no duplicates leaves the list as it was",
"args": [[{ "id": "c" }, { "id": "a" }, { "id": "b" }], "id", "first"],
"expect": [{ "id": "c" }, { "id": "a" }, { "id": "b" }]
},
{
"name": "an empty list stays empty",
"args": [[], "id", "last"],
"expect": []
},
{
"name": "records without the key are always kept, never collapsed into one",
"args": [[{ "n": 1 }, { "id": "a", "n": 2 }, { "n": 3 }, { "id": null, "n": 4 }, { "id": "a", "n": 5 }], "id", "first"],
"expect": [{ "n": 1 }, { "id": "a", "n": 2 }, { "n": 3 }, { "id": null, "n": 4 }]
},
{
"name": "the number 1 and the string \"1\" are the same key, as in group-by-key",
"args": [[{ "id": 1, "src": "api" }, { "id": "1", "src": "csv" }], "id", "last"],
"expect": [{ "id": "1", "src": "csv" }]
},
{
"name": "case matters: \"A\" and \"a\" are different keys",
"args": [[{ "id": "A" }, { "id": "a" }], "id", "first"],
"expect": [{ "id": "A" }, { "id": "a" }]
},
{
"name": "booleans are keys too",
"args": [[{ "flag": true, "n": 1 }, { "flag": false, "n": 2 }, { "flag": true, "n": 3 }], "flag", "last"],
"expect": [{ "flag": false, "n": 2 }, { "flag": true, "n": 3 }]
},
{
"name": "an unknown keep mode is an error",
"args": [[{ "id": 1 }], "id", "middle"],
"expectError": "keep must be \"first\" or \"last\""
},
{
"name": "an empty key name is an error",
"args": [[{ "id": 1 }], "", "first"],
"expectError": "needs a non-empty key name"
},
{
"name": "a fractional number at the key is an error, not a guess",
"args": [[{ "id": 1.5 }], "id", "first"],
"expectError": "cannot dedupe by the fractional number"
},
{
"name": "a list at the key is an error",
"args": [[{ "id": [1, 2] }], "id", "first"],
"expectError": "cannot dedupe by the list or map"
}
]