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

3
package.json

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

2
src/index.ts

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

19
src/list-diff.ts

@ -1,13 +1,20 @@ @@ -1,13 +1,20 @@
import { STATUS, ListDiff, ListData } from "./model";
import { STATUS, ListDiff, ListData, DiffStatus } from "./model";
import { isEqual } from "./utils";
function formatSingleListDiff(
listData: ListData,
status: "added" | "removed"
listData: ListData[],
status: DiffStatus
): ListDiff {
console.log("formatsingle", listData);
return {
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 = ( @@ -22,10 +29,10 @@ export const getListDiff = (
};
}
if (!prevList) {
return formatSingleListDiff(nextList, "added");
return formatSingleListDiff(nextList as ListData, STATUS.ADDED);
}
if (!nextList) {
return formatSingleListDiff(prevList, "removed");
return formatSingleListDiff(prevList as ListData, STATUS.DELETED);
}
const diff: ListDiff["diff"] = [];
nextList.forEach((nextValue, i) => {

127
test/list-diff.test.ts

@ -1,7 +1,130 @@ @@ -1,7 +1,130 @@
import { getListDiff } from "../src/list-diff";
describe("getListDiff", () => {
it("", () => {
expect(getListDiff(null, null)).toStrictEqual(null);
it("returns an empty diff if no lists are provided", () => {
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 @@ @@ -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