Browse Source

feat: start list test

pull/1/head
antoine lanoe 2 years ago
parent
commit
996b8ac4ab
  1. 5
      jest.config.js
  2. 3
      package.json
  3. 2
      src/index.ts
  4. 19
      src/list-diff.ts
  5. 127
      test/list-diff.test.ts
  6. 20
      tsconfig.json

5
jest.config.js

@ -0,0 +1,5 @@
module.exports = {
transform: {
"^.+\\.(ts|js)$": "ts-jest",
},
};

3
package.json

@ -3,6 +3,9 @@
"version": "1.0.0", "version": "1.0.0",
"main": "index.js", "main": "index.js",
"license": "MIT", "license": "MIT",
"scripts": {
"test": "jest"
},
"devDependencies": { "devDependencies": {
"@babel/preset-env": "^7.20.2", "@babel/preset-env": "^7.20.2",
"@types/jest": "^29.2.4", "@types/jest": "^29.2.4",

2
src/index.ts

@ -0,0 +1,2 @@
export { getObjectDiff } from "./object-diff";
export { getListDiff } from "./list-diff";

19
src/list-diff.ts

@ -1,13 +1,20 @@
import { STATUS, ListDiff, ListData } from "./model"; import { STATUS, ListDiff, ListData, DiffStatus } from "./model";
import { isEqual } from "./utils"; import { isEqual } from "./utils";
function formatSingleListDiff( function formatSingleListDiff(
listData: ListData, listData: ListData[],
status: "added" | "removed" status: DiffStatus
): ListDiff { ): ListDiff {
console.log("formatsingle", listData);
return { return {
type: "list", type: "list",
diff: listData.map((data) => ({ value: data, status })), diff: listData.map((data: ListData, i) => ({
value: data,
prevIndex: status === STATUS.ADDED ? null : i,
newIndex: status === STATUS.ADDED ? i : null,
indexDiff: null,
status,
})),
}; };
} }
@ -22,10 +29,10 @@ export const getListDiff = (
}; };
} }
if (!prevList) { if (!prevList) {
return formatSingleListDiff(nextList, "added"); return formatSingleListDiff(nextList as ListData, STATUS.ADDED);
} }
if (!nextList) { if (!nextList) {
return formatSingleListDiff(prevList, "removed"); return formatSingleListDiff(prevList as ListData, STATUS.DELETED);
} }
const diff: ListDiff["diff"] = []; const diff: ListDiff["diff"] = [];
nextList.forEach((nextValue, i) => { nextList.forEach((nextValue, i) => {

127
test/list-diff.test.ts

@ -1,7 +1,130 @@
import { getListDiff } from "../src/list-diff"; import { getListDiff } from "../src/list-diff";
describe("getListDiff", () => { describe("getListDiff", () => {
it("", () => { it("returns an empty diff if no lists are provided", () => {
expect(getListDiff(null, null)).toStrictEqual(null); expect(getListDiff(null, null)).toStrictEqual({ type: "list", diff: [] });
});
it("consider previous list as completely deleted if no next list is provided", () => {
const res = getListDiff(["mbappe", "mendes", "verratti", "ruiz"], null);
console.log("res", JSON.stringify(res, null, 2));
expect(
getListDiff(["mbappe", "mendes", "verratti", "ruiz"], null)
).toStrictEqual({
type: "list",
diff: [
{
value: "mbappe",
prevIndex: 0,
newIndex: null,
indexDiff: null,
status: "deleted",
},
{
value: "mendes",
prevIndex: 1,
newIndex: null,
indexDiff: null,
status: "deleted",
},
{
value: "verratti",
prevIndex: 2,
newIndex: null,
indexDiff: null,
status: "deleted",
},
{
value: "ruiz",
prevIndex: 3,
newIndex: null,
indexDiff: null,
status: "deleted",
},
],
});
});
it("consider next list as completely added if no previous list is provided", () => {
expect(
getListDiff(null, ["mbappe", "mendes", "verratti", "ruiz"])
).toStrictEqual({
type: "list",
diff: [
{
value: "mbappe",
prevIndex: null,
newIndex: 0,
indexDiff: null,
status: "added",
},
{
value: "mendes",
prevIndex: null,
newIndex: 1,
indexDiff: null,
status: "added",
},
{
value: "verratti",
prevIndex: null,
newIndex: 2,
indexDiff: null,
status: "added",
},
{
value: "ruiz",
prevIndex: null,
newIndex: 3,
indexDiff: null,
status: "added",
},
],
});
});
it("detects changed values in the list", () => {
expect(
getListDiff(
["mbappe", "mendes", "verratti", "ruiz"],
["mbappe", "messi", "ruiz"]
)
).toStrictEqual({
type: "list",
diff: [
{
value: "mbappe",
prevIndex: 0,
newIndex: 0,
indexDiff: 0,
status: "equal",
},
{
value: "mendes",
prevIndex: 1,
newIndex: null,
indexDiff: null,
status: "deleted",
},
{
value: "verratti",
prevIndex: 2,
newIndex: null,
indexDiff: null,
status: "deleted",
},
{
value: "messi",
prevIndex: null,
newIndex: 1,
indexDiff: null,
status: "added",
},
{
value: "ruiz",
prevIndex: 3,
newIndex: 2,
indexDiff: -1,
status: "moved",
},
],
});
}); });
}); });

20
tsconfig.json

@ -0,0 +1,20 @@
{
"compilerOptions": {
"declaration": true,
"declarationDir": "./dist",
"jsx": "react",
"lib": ["esnext", "dom"],
"module": "esnext",
"moduleResolution": "node",
"noUnusedParameters": true,
"esModuleInterop": true,
"noImplicitAny": true,
"outDir": "./dist",
"strict": true,
"target": "es5",
"resolveJsonModule": true,
"allowSyntheticDefaultImports": true
},
"include": ["src/**/*.tsx"],
"exclude": ["node_modules"]
}
Loading…
Cancel
Save