[ { "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" } ]