| 
									
										
										
										
											2020-07-11 16:30:18 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const { | 
					
						
							|  |  |  | 	DELETE, | 
					
						
							| 
									
										
										
										
											2025-07-03 17:06:45 +08:00
										 |  |  | 	cachedCleverMerge, | 
					
						
							|  |  |  | 	cleverMerge, | 
					
						
							| 
									
										
										
										
											2021-01-05 18:29:54 +08:00
										 |  |  | 	removeOperations, | 
					
						
							| 
									
										
										
										
											2025-07-03 17:06:45 +08:00
										 |  |  | 	resolveByProperty | 
					
						
							| 
									
										
										
										
											2020-07-11 16:30:18 +08:00
										 |  |  | } = require("../lib/util/cleverMerge"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe("cleverMerge", () => { | 
					
						
							|  |  |  | 	const base = { | 
					
						
							|  |  |  | 		a1: [1], | 
					
						
							|  |  |  | 		a2: [1], | 
					
						
							|  |  |  | 		a3: [1], | 
					
						
							|  |  |  | 		b1: [1, "...", 2], | 
					
						
							|  |  |  | 		b2: [1, "...", 2], | 
					
						
							|  |  |  | 		b3: [1, "...", 2], | 
					
						
							|  |  |  | 		bySomething: { | 
					
						
							|  |  |  | 			x: { | 
					
						
							|  |  |  | 				a2: [5], | 
					
						
							|  |  |  | 				a3: [5, "...", 6], | 
					
						
							|  |  |  | 				a4: [5], | 
					
						
							|  |  |  | 				a5: [5, "...", 6], | 
					
						
							|  |  |  | 				b2: [5], | 
					
						
							|  |  |  | 				b3: [5, "...", 6], | 
					
						
							|  |  |  | 				b4: [5], | 
					
						
							|  |  |  | 				b5: [5, "...", 6] | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 	const cases = { | 
					
						
							|  |  |  | 		"different properties": [{ a: 1 }, { b: 2 }, { a: 1, b: 2 }], | 
					
						
							|  |  |  | 		"same property": [{ a: 1 }, { a: 2 }, { a: 2 }], | 
					
						
							|  |  |  | 		arrays: [ | 
					
						
							|  |  |  | 			{ a1: 1, a2: 1, b1: [], b2: [], c1: [1], c2: [1] }, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: [2], | 
					
						
							|  |  |  | 				a2: [2, "...", 3], | 
					
						
							|  |  |  | 				b1: [2], | 
					
						
							|  |  |  | 				b2: [2, "...", 3], | 
					
						
							|  |  |  | 				c1: [2], | 
					
						
							|  |  |  | 				c2: [2, "...", 3] | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: [2], | 
					
						
							|  |  |  | 				a2: [2, 1, 3], | 
					
						
							|  |  |  | 				b1: [2], | 
					
						
							|  |  |  | 				b2: [2, 3], | 
					
						
							|  |  |  | 				c1: [2], | 
					
						
							|  |  |  | 				c2: [2, 1, 3] | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		"by field override": [ | 
					
						
							|  |  |  | 			base, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: [8], | 
					
						
							|  |  |  | 				a2: [8], | 
					
						
							|  |  |  | 				a3: [8], | 
					
						
							|  |  |  | 				a4: [8], | 
					
						
							|  |  |  | 				a5: [8], | 
					
						
							|  |  |  | 				b1: [8], | 
					
						
							|  |  |  | 				b2: [8], | 
					
						
							|  |  |  | 				b3: [8], | 
					
						
							|  |  |  | 				b4: [8], | 
					
						
							|  |  |  | 				b5: [8] | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: [8], | 
					
						
							|  |  |  | 				a2: [8], | 
					
						
							|  |  |  | 				a3: [8], | 
					
						
							|  |  |  | 				a4: [8], | 
					
						
							|  |  |  | 				a5: [8], | 
					
						
							|  |  |  | 				b1: [8], | 
					
						
							|  |  |  | 				b2: [8], | 
					
						
							|  |  |  | 				b3: [8], | 
					
						
							|  |  |  | 				b4: [8], | 
					
						
							|  |  |  | 				b5: [8] | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		"by field extend default": [ | 
					
						
							|  |  |  | 			base, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: [8, "..."], | 
					
						
							|  |  |  | 				a2: [8, "..."], | 
					
						
							|  |  |  | 				a3: [8, "..."], | 
					
						
							|  |  |  | 				a4: [8, "..."], | 
					
						
							|  |  |  | 				a5: [8, "..."], | 
					
						
							|  |  |  | 				b1: [8, "..."], | 
					
						
							|  |  |  | 				b2: [8, "..."], | 
					
						
							|  |  |  | 				b3: [8, "..."] | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: [8, 1], | 
					
						
							|  |  |  | 				a2: [8, 1], | 
					
						
							|  |  |  | 				a3: [1], | 
					
						
							|  |  |  | 				a4: [8, "..."], | 
					
						
							|  |  |  | 				b1: [8, 1, "...", 2], | 
					
						
							|  |  |  | 				b2: [8, 1, "...", 2], | 
					
						
							|  |  |  | 				b3: [1, "...", 2], | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						a2: [8, 5], | 
					
						
							|  |  |  | 						a3: [8, 5, "...", 6], | 
					
						
							|  |  |  | 						a4: [8, 5], | 
					
						
							|  |  |  | 						a5: [8, 5, "...", 6], | 
					
						
							|  |  |  | 						b2: [8, 5], | 
					
						
							|  |  |  | 						b3: [8, 5, "...", 6], | 
					
						
							|  |  |  | 						b4: [5], | 
					
						
							|  |  |  | 						b5: [5, "...", 6] | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					default: { | 
					
						
							|  |  |  | 						a3: [8, "..."], | 
					
						
							|  |  |  | 						a5: [8, "..."], | 
					
						
							|  |  |  | 						b3: [8, "..."] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		"by field override other": [ | 
					
						
							|  |  |  | 			base, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					y: { | 
					
						
							|  |  |  | 						a1: [8], | 
					
						
							|  |  |  | 						a2: [8], | 
					
						
							|  |  |  | 						a3: [8], | 
					
						
							|  |  |  | 						a4: [8], | 
					
						
							|  |  |  | 						a5: [8], | 
					
						
							|  |  |  | 						b1: [8], | 
					
						
							|  |  |  | 						b2: [8], | 
					
						
							|  |  |  | 						b3: [8], | 
					
						
							|  |  |  | 						b4: [8], | 
					
						
							|  |  |  | 						b5: [8] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: [1], | 
					
						
							|  |  |  | 				a2: [1], | 
					
						
							|  |  |  | 				a3: [1], | 
					
						
							|  |  |  | 				b1: [1, "...", 2], | 
					
						
							|  |  |  | 				b2: [1, "...", 2], | 
					
						
							|  |  |  | 				b3: [1, "...", 2], | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						a2: [5], | 
					
						
							|  |  |  | 						a3: [5, "...", 6], | 
					
						
							|  |  |  | 						a4: [5], | 
					
						
							|  |  |  | 						a5: [5, "...", 6], | 
					
						
							|  |  |  | 						b2: [5], | 
					
						
							|  |  |  | 						b3: [5, "...", 6], | 
					
						
							|  |  |  | 						b4: [5], | 
					
						
							|  |  |  | 						b5: [5, "...", 6] | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					y: { | 
					
						
							|  |  |  | 						a1: [8], | 
					
						
							|  |  |  | 						a2: [8], | 
					
						
							|  |  |  | 						a3: [8], | 
					
						
							|  |  |  | 						a4: [8], | 
					
						
							|  |  |  | 						a5: [8], | 
					
						
							|  |  |  | 						b1: [8], | 
					
						
							|  |  |  | 						b2: [8], | 
					
						
							|  |  |  | 						b3: [8], | 
					
						
							|  |  |  | 						b4: [8], | 
					
						
							|  |  |  | 						b5: [8] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		"by field override same": [ | 
					
						
							|  |  |  | 			base, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						a1: [8], | 
					
						
							|  |  |  | 						a2: [8], | 
					
						
							|  |  |  | 						a3: [8], | 
					
						
							|  |  |  | 						a4: [8], | 
					
						
							|  |  |  | 						a5: [8], | 
					
						
							|  |  |  | 						b1: [8], | 
					
						
							|  |  |  | 						b2: [8], | 
					
						
							|  |  |  | 						b3: [8], | 
					
						
							|  |  |  | 						b4: [8], | 
					
						
							|  |  |  | 						b5: [8] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: [1], | 
					
						
							|  |  |  | 				a2: [1], | 
					
						
							|  |  |  | 				a3: [1], | 
					
						
							|  |  |  | 				b1: [1, "...", 2], | 
					
						
							|  |  |  | 				b2: [1, "...", 2], | 
					
						
							|  |  |  | 				b3: [1, "...", 2], | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						a1: [8], | 
					
						
							|  |  |  | 						a2: [8], | 
					
						
							|  |  |  | 						a3: [8], | 
					
						
							|  |  |  | 						a4: [8], | 
					
						
							|  |  |  | 						a5: [8], | 
					
						
							|  |  |  | 						b1: [8], | 
					
						
							|  |  |  | 						b2: [8], | 
					
						
							|  |  |  | 						b3: [8], | 
					
						
							|  |  |  | 						b4: [8], | 
					
						
							|  |  |  | 						b5: [8] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		"by field extend other": [ | 
					
						
							|  |  |  | 			base, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					y: { | 
					
						
							|  |  |  | 						a1: [8, "..."], | 
					
						
							|  |  |  | 						a2: [8, "..."], | 
					
						
							|  |  |  | 						a3: [8, "..."], | 
					
						
							|  |  |  | 						a4: [8, "..."], | 
					
						
							|  |  |  | 						a5: [8, "..."], | 
					
						
							|  |  |  | 						b1: [8, "..."], | 
					
						
							|  |  |  | 						b2: [8, "..."], | 
					
						
							|  |  |  | 						b3: [8, "..."] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: [1], | 
					
						
							|  |  |  | 				a2: [1], | 
					
						
							|  |  |  | 				a3: [1], | 
					
						
							|  |  |  | 				b1: [1, "...", 2], | 
					
						
							|  |  |  | 				b2: [1, "...", 2], | 
					
						
							|  |  |  | 				b3: [1, "...", 2], | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						a2: [5], | 
					
						
							|  |  |  | 						a3: [5, "...", 6], | 
					
						
							|  |  |  | 						a4: [5], | 
					
						
							|  |  |  | 						a5: [5, "...", 6], | 
					
						
							|  |  |  | 						b2: [5], | 
					
						
							|  |  |  | 						b3: [5, "...", 6], | 
					
						
							|  |  |  | 						b4: [5], | 
					
						
							|  |  |  | 						b5: [5, "...", 6] | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					y: { | 
					
						
							|  |  |  | 						a1: [8, "..."], | 
					
						
							|  |  |  | 						a2: [8, "..."], | 
					
						
							|  |  |  | 						a3: [8, "..."], | 
					
						
							|  |  |  | 						a4: [8, "..."], | 
					
						
							|  |  |  | 						a5: [8, "..."], | 
					
						
							|  |  |  | 						b1: [8, "..."], | 
					
						
							|  |  |  | 						b2: [8, "..."], | 
					
						
							|  |  |  | 						b3: [8, "..."] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		"by field extend same": [ | 
					
						
							|  |  |  | 			base, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						a1: [8, "..."], | 
					
						
							|  |  |  | 						a2: [8, "..."], | 
					
						
							|  |  |  | 						a3: [8, "..."], | 
					
						
							|  |  |  | 						a4: [8, "..."], | 
					
						
							|  |  |  | 						a5: [8, "..."], | 
					
						
							|  |  |  | 						b1: [8, "..."], | 
					
						
							|  |  |  | 						b2: [8, "..."], | 
					
						
							|  |  |  | 						b3: [8, "..."] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: [1], | 
					
						
							|  |  |  | 				a2: [1], | 
					
						
							|  |  |  | 				a3: [1], | 
					
						
							|  |  |  | 				b1: [1, "...", 2], | 
					
						
							|  |  |  | 				b2: [1, "...", 2], | 
					
						
							|  |  |  | 				b3: [1, "...", 2], | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						a1: [8, "..."], | 
					
						
							|  |  |  | 						a2: [8, 5], | 
					
						
							|  |  |  | 						a3: [8, 5, "...", 6], | 
					
						
							|  |  |  | 						a4: [8, 5], | 
					
						
							|  |  |  | 						a5: [8, 5, "...", 6], | 
					
						
							|  |  |  | 						b1: [8, "..."], | 
					
						
							|  |  |  | 						b2: [8, 5], | 
					
						
							|  |  |  | 						b3: [8, 5, "...", 6], | 
					
						
							|  |  |  | 						b4: [5], | 
					
						
							|  |  |  | 						b5: [5, "...", 6] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		"by field extend base, same and other": [ | 
					
						
							|  |  |  | 			base, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: [7, "..."], | 
					
						
							|  |  |  | 				a2: [7, "..."], | 
					
						
							|  |  |  | 				a3: [7, "..."], | 
					
						
							|  |  |  | 				a4: [7, "..."], | 
					
						
							|  |  |  | 				a5: [7, "..."], | 
					
						
							|  |  |  | 				b1: [7, "..."], | 
					
						
							|  |  |  | 				b2: [7, "..."], | 
					
						
							|  |  |  | 				b3: [7, "..."], | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						a1: [8, "..."], | 
					
						
							|  |  |  | 						a2: [8, "..."], | 
					
						
							|  |  |  | 						a3: [8, "..."], | 
					
						
							|  |  |  | 						a4: [8, "..."], | 
					
						
							|  |  |  | 						a5: [8, "..."], | 
					
						
							|  |  |  | 						b1: [8, "..."], | 
					
						
							|  |  |  | 						b2: [8, "..."], | 
					
						
							|  |  |  | 						b3: [8, "..."] | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					y: { | 
					
						
							|  |  |  | 						a1: [9, "..."], | 
					
						
							|  |  |  | 						a2: [9, "..."], | 
					
						
							|  |  |  | 						a3: [9, "..."], | 
					
						
							|  |  |  | 						a4: [9, "..."], | 
					
						
							|  |  |  | 						a5: [9, "..."], | 
					
						
							|  |  |  | 						b1: [9, "..."], | 
					
						
							|  |  |  | 						b2: [9, "..."], | 
					
						
							|  |  |  | 						b3: [9, "..."] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: [7, 1], | 
					
						
							|  |  |  | 				a2: [7, 1], | 
					
						
							|  |  |  | 				a3: [1], | 
					
						
							|  |  |  | 				a4: [7, "..."], | 
					
						
							|  |  |  | 				b1: [7, 1, "...", 2], | 
					
						
							|  |  |  | 				b2: [7, 1, "...", 2], | 
					
						
							|  |  |  | 				b3: [1, "...", 2], | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						a1: [8, "..."], | 
					
						
							|  |  |  | 						a2: [8, 7, 5], | 
					
						
							|  |  |  | 						a3: [8, 7, 5, "...", 6], | 
					
						
							|  |  |  | 						a4: [8, 7, 5], | 
					
						
							|  |  |  | 						a5: [8, 7, 5, "...", 6], | 
					
						
							|  |  |  | 						b1: [8, "..."], | 
					
						
							|  |  |  | 						b2: [8, 7, 5], | 
					
						
							|  |  |  | 						b3: [8, 7, 5, "...", 6], | 
					
						
							|  |  |  | 						b4: [5], | 
					
						
							|  |  |  | 						b5: [5, "...", 6] | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					y: { | 
					
						
							|  |  |  | 						a1: [9, "..."], | 
					
						
							|  |  |  | 						a2: [9, "..."], | 
					
						
							|  |  |  | 						a3: [9, 7, "..."], | 
					
						
							|  |  |  | 						a4: [9, "..."], | 
					
						
							|  |  |  | 						a5: [9, 7, "..."], | 
					
						
							|  |  |  | 						b1: [9, "..."], | 
					
						
							|  |  |  | 						b2: [9, "..."], | 
					
						
							|  |  |  | 						b3: [9, 7, "..."] | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					default: { | 
					
						
							|  |  |  | 						a3: [7, "..."], | 
					
						
							|  |  |  | 						a5: [7, "..."], | 
					
						
							|  |  |  | 						b3: [7, "..."] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		"by field promoting edge cases": [ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: [1, "...", 2], | 
					
						
							|  |  |  | 				b: [1, "...", 2], | 
					
						
							|  |  |  | 				c: [1, "...", 2], | 
					
						
							|  |  |  | 				d: [1, "...", 2], | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						a: [3, "...", 4], | 
					
						
							|  |  |  | 						b: [3, "...", 4], | 
					
						
							|  |  |  | 						d: [3, "...", 4] | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					y: { | 
					
						
							|  |  |  | 						a: [5], | 
					
						
							|  |  |  | 						b: [5] | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					default: { | 
					
						
							|  |  |  | 						a: [6, "...", 7], | 
					
						
							|  |  |  | 						c: [6, "...", 7] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: [8, "...", 9], | 
					
						
							|  |  |  | 				b: [8, "...", 9], | 
					
						
							|  |  |  | 				c: [8, "...", 9], | 
					
						
							|  |  |  | 				d: [8, "...", 9] | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: [1, "...", 2], | 
					
						
							|  |  |  | 				b: [1, "...", 2], | 
					
						
							|  |  |  | 				c: [1, "...", 2], | 
					
						
							|  |  |  | 				d: [1, "...", 2], | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						a: [8, 3, "...", 4, 9], | 
					
						
							|  |  |  | 						b: [8, 3, "...", 4, 9], | 
					
						
							|  |  |  | 						c: [8, "...", 9], | 
					
						
							|  |  |  | 						d: [8, 3, "...", 4, 9] | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					y: { | 
					
						
							|  |  |  | 						a: [8, 5, 9], | 
					
						
							|  |  |  | 						b: [8, 5, 9], | 
					
						
							|  |  |  | 						c: [8, "...", 9], | 
					
						
							|  |  |  | 						d: [8, "...", 9] | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					default: { | 
					
						
							|  |  |  | 						a: [8, 6, "...", 7, 9], | 
					
						
							|  |  |  | 						b: [8, "...", 9], | 
					
						
							|  |  |  | 						c: [8, 6, "...", 7, 9], | 
					
						
							|  |  |  | 						d: [8, "...", 9] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		"by field clone default": [ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: 1, | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						b: 2 | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					default: { | 
					
						
							|  |  |  | 						c: 3 | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					y: { | 
					
						
							|  |  |  | 						d: 4 | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: 1, | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						b: 2 | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					y: { | 
					
						
							|  |  |  | 						c: 3, | 
					
						
							|  |  |  | 						d: 4 | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					default: { | 
					
						
							|  |  |  | 						c: 3 | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		deleting: [ | 
					
						
							|  |  |  | 			base, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: DELETE, | 
					
						
							|  |  |  | 				a2: DELETE, | 
					
						
							|  |  |  | 				a3: DELETE, | 
					
						
							|  |  |  | 				a4: DELETE, | 
					
						
							|  |  |  | 				a5: DELETE, | 
					
						
							|  |  |  | 				b1: DELETE, | 
					
						
							|  |  |  | 				b2: DELETE, | 
					
						
							|  |  |  | 				b3: DELETE | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a1: DELETE, | 
					
						
							|  |  |  | 				a2: DELETE, | 
					
						
							|  |  |  | 				a3: DELETE, | 
					
						
							|  |  |  | 				a4: DELETE, | 
					
						
							|  |  |  | 				a5: DELETE, | 
					
						
							|  |  |  | 				b1: DELETE, | 
					
						
							|  |  |  | 				b2: DELETE, | 
					
						
							|  |  |  | 				b3: DELETE, | 
					
						
							|  |  |  | 				bySomething: { | 
					
						
							|  |  |  | 					x: { | 
					
						
							|  |  |  | 						b4: [5], | 
					
						
							|  |  |  | 						b5: [5, "...", 6] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		"merge objects": [ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				nested: base | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				nested: base | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				nested: { | 
					
						
							|  |  |  | 					a1: [1], | 
					
						
							|  |  |  | 					a2: [1], | 
					
						
							|  |  |  | 					a3: [1], | 
					
						
							|  |  |  | 					b1: [1, 1, "...", 2, 2], | 
					
						
							|  |  |  | 					b2: [1, 1, "...", 2, 2], | 
					
						
							|  |  |  | 					b3: [1, "...", 2], | 
					
						
							|  |  |  | 					bySomething: { | 
					
						
							|  |  |  | 						x: { | 
					
						
							|  |  |  | 							a2: [5], | 
					
						
							|  |  |  | 							a3: [5, "...", 6], | 
					
						
							|  |  |  | 							a4: [5], | 
					
						
							|  |  |  | 							a5: [5, 5, "...", 6, 6], | 
					
						
							|  |  |  | 							b2: [5], | 
					
						
							|  |  |  | 							b3: [5, 1, 5, "...", 6, 2, 6], | 
					
						
							|  |  |  | 							b4: [5], | 
					
						
							|  |  |  | 							b5: [5, 5, "...", 6, 6] | 
					
						
							|  |  |  | 						}, | 
					
						
							|  |  |  | 						default: { | 
					
						
							|  |  |  | 							b3: [1, "...", 2] | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2021-01-05 18:29:54 +08:00
										 |  |  | 		], | 
					
						
							|  |  |  | 		dynamicSecond: [ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: 4, // keep
 | 
					
						
							|  |  |  | 				b: 5, // static override
 | 
					
						
							|  |  |  | 				c: 6 // dynamic override
 | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				b: 50, | 
					
						
							|  |  |  | 				y: 20, | 
					
						
							|  |  |  | 				byArguments: (x, y, z) => ({ | 
					
						
							|  |  |  | 					c: 60, | 
					
						
							|  |  |  | 					x, | 
					
						
							|  |  |  | 					y, | 
					
						
							|  |  |  | 					z | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: 4, | 
					
						
							|  |  |  | 				b: 50, | 
					
						
							|  |  |  | 				c: 60, | 
					
						
							|  |  |  | 				x: 1, | 
					
						
							|  |  |  | 				y: 2, | 
					
						
							|  |  |  | 				z: 3 | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		dynamicBoth: [ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: 4, // keep
 | 
					
						
							|  |  |  | 				b: 5, // static override
 | 
					
						
							|  |  |  | 				c: 6, // dynamic override
 | 
					
						
							|  |  |  | 				byArguments: (x, y, z) => ({ | 
					
						
							|  |  |  | 					x, // keep
 | 
					
						
							|  |  |  | 					y, // static override
 | 
					
						
							|  |  |  | 					z // dynamic override
 | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				b: 50, | 
					
						
							|  |  |  | 				y: 20, | 
					
						
							|  |  |  | 				byArguments: (x, y, z) => ({ | 
					
						
							|  |  |  | 					c: 60, | 
					
						
							|  |  |  | 					z: z * 10 | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: 4, | 
					
						
							|  |  |  | 				b: 50, | 
					
						
							|  |  |  | 				c: 60, | 
					
						
							|  |  |  | 				x: 1, | 
					
						
							|  |  |  | 				y: 20, | 
					
						
							|  |  |  | 				z: 30 | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		dynamicChained: [ | 
					
						
							|  |  |  | 			cleverMerge( | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					a: 6, // keep
 | 
					
						
							|  |  |  | 					b: 7, // static override
 | 
					
						
							|  |  |  | 					c: 8, // dynamic override
 | 
					
						
							|  |  |  | 					d: 9, // static override (3rd)
 | 
					
						
							|  |  |  | 					e: 10, // dynamic override (3rd)
 | 
					
						
							|  |  |  | 					byArguments: (x, y, z, v, w) => ({ | 
					
						
							|  |  |  | 						x, // keep
 | 
					
						
							|  |  |  | 						y, // static override
 | 
					
						
							|  |  |  | 						z, // dynamic override
 | 
					
						
							|  |  |  | 						v, // static override (3rd)
 | 
					
						
							|  |  |  | 						w // dynamic override (3rd)
 | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					b: 70, | 
					
						
							|  |  |  | 					y: 20, | 
					
						
							|  |  |  | 					byArguments: (x, y, z) => ({ | 
					
						
							|  |  |  | 						c: 80, | 
					
						
							|  |  |  | 						z: z * 10 | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			), | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				d: 90, | 
					
						
							|  |  |  | 				v: 40, | 
					
						
							|  |  |  | 				byArguments: (x, y, z, v, w) => ({ | 
					
						
							|  |  |  | 					e: 100, | 
					
						
							|  |  |  | 					w: w * 10 | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: 6, | 
					
						
							|  |  |  | 				b: 70, | 
					
						
							|  |  |  | 				c: 80, | 
					
						
							|  |  |  | 				d: 90, | 
					
						
							|  |  |  | 				e: 100, | 
					
						
							|  |  |  | 				x: 1, | 
					
						
							|  |  |  | 				y: 20, | 
					
						
							|  |  |  | 				z: 30, | 
					
						
							|  |  |  | 				v: 40, | 
					
						
							|  |  |  | 				w: 50 | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		dynamicFalse1: [ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: 1, | 
					
						
							|  |  |  | 				byArguments: () => false | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				b: 2 | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			false | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		dynamicFalse2: [ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: 1 | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				b: 2, | 
					
						
							|  |  |  | 				byArguments: () => false | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			false | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		dynamicFalse3: [ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				a: 1, | 
					
						
							|  |  |  | 				byArguments: () => false | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				b: 2, | 
					
						
							|  |  |  | 				byArguments: () => false | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			false | 
					
						
							| 
									
										
										
										
											2021-01-06 17:51:44 +08:00
										 |  |  | 		], | 
					
						
							|  |  |  | 		nonObject1: [1, 2, 2], | 
					
						
							|  |  |  | 		nonObject2: [1, { a: 1 }, 1], | 
					
						
							|  |  |  | 		nonObject3: [{ a: 1 }, 1, 1], | 
					
						
							|  |  |  | 		nonObject4: [{ a: 1 }, undefined, { a: 1 }], | 
					
						
							|  |  |  | 		nonObject5: [undefined, { a: 1 }, { a: 1 }] | 
					
						
							| 
									
										
										
										
											2020-07-11 16:30:18 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 	for (const key of Object.keys(cases)) { | 
					
						
							|  |  |  | 		const testCase = cases[key]; | 
					
						
							| 
									
										
										
										
											2025-07-02 20:10:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-11 16:30:18 +08:00
										 |  |  | 		it(`should merge ${key} correctly`, () => { | 
					
						
							| 
									
										
										
										
											2021-01-05 18:29:54 +08:00
										 |  |  | 			let merged = cleverMerge(testCase[0], testCase[1]); | 
					
						
							| 
									
										
										
										
											2021-01-06 17:51:44 +08:00
										 |  |  | 			let merged1 = cachedCleverMerge(testCase[0], testCase[1]); | 
					
						
							|  |  |  | 			let merged2 = cachedCleverMerge(testCase[0], testCase[1]); | 
					
						
							|  |  |  | 			expect(merged2).toBe(merged1); | 
					
						
							| 
									
										
										
										
											2021-01-05 18:29:54 +08:00
										 |  |  | 			merged = resolveByProperty(merged, "byArguments", 1, 2, 3, 4, 5); | 
					
						
							| 
									
										
										
										
											2021-01-06 17:51:44 +08:00
										 |  |  | 			merged1 = resolveByProperty(merged1, "byArguments", 1, 2, 3, 4, 5); | 
					
						
							|  |  |  | 			merged2 = resolveByProperty(merged2, "byArguments", 1, 2, 3, 4, 5); | 
					
						
							| 
									
										
										
										
											2021-01-05 18:29:54 +08:00
										 |  |  | 			expect(merged).toEqual(testCase[2]); | 
					
						
							| 
									
										
										
										
											2021-01-06 17:51:44 +08:00
										 |  |  | 			expect(merged1).toEqual(testCase[2]); | 
					
						
							|  |  |  | 			expect(merged2).toEqual(testCase[2]); | 
					
						
							| 
									
										
										
										
											2020-07-11 16:30:18 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	it("should allow to remove operations", () => { | 
					
						
							|  |  |  | 		expect( | 
					
						
							|  |  |  | 			removeOperations({ | 
					
						
							|  |  |  | 				a: 1, | 
					
						
							|  |  |  | 				b: DELETE, | 
					
						
							|  |  |  | 				c: ["..."], | 
					
						
							|  |  |  | 				d: [1, "...", 2], | 
					
						
							|  |  |  | 				e: [1, 2, 3], | 
					
						
							|  |  |  | 				f: { | 
					
						
							|  |  |  | 					a: 1, | 
					
						
							|  |  |  | 					b: DELETE, | 
					
						
							|  |  |  | 					c: ["..."], | 
					
						
							|  |  |  | 					d: [1, "...", 2], | 
					
						
							|  |  |  | 					e: [1, 2, 3], | 
					
						
							|  |  |  | 					f: { | 
					
						
							|  |  |  | 						a: 1, | 
					
						
							|  |  |  | 						b: DELETE, | 
					
						
							|  |  |  | 						c: ["..."], | 
					
						
							|  |  |  | 						d: [1, "...", 2], | 
					
						
							|  |  |  | 						e: [1, 2, 3] | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		).toEqual({ | 
					
						
							|  |  |  | 			a: 1, | 
					
						
							|  |  |  | 			c: [], | 
					
						
							|  |  |  | 			d: [1, 2], | 
					
						
							|  |  |  | 			e: [1, 2, 3], | 
					
						
							|  |  |  | 			f: { | 
					
						
							|  |  |  | 				a: 1, | 
					
						
							|  |  |  | 				c: [], | 
					
						
							|  |  |  | 				d: [1, 2], | 
					
						
							|  |  |  | 				e: [1, 2, 3], | 
					
						
							|  |  |  | 				f: { | 
					
						
							|  |  |  | 					a: 1, | 
					
						
							|  |  |  | 					c: [], | 
					
						
							|  |  |  | 					d: [1, 2], | 
					
						
							|  |  |  | 					e: [1, 2, 3] | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }); |