mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| "use strict";
 | |
| 
 | |
| const { compareStringsNumeric } = require("../lib/util/comparators");
 | |
| 
 | |
| /**
 | |
|  * @param {string} a string
 | |
|  * @param {string} b string
 | |
|  * @returns {-1|0|1} compare result
 | |
|  */
 | |
| const referenceComparer = (a, b) => {
 | |
| 	const partsA = a.split(/(\d+)/);
 | |
| 	const partsB = b.split(/(\d+)/);
 | |
| 	const len = Math.min(partsA.length, partsB.length);
 | |
| 	for (let i = 0; i < len; i++) {
 | |
| 		const pA = partsA[i];
 | |
| 		const pB = partsB[i];
 | |
| 		if (i % 2 === 0) {
 | |
| 			if (pA.length > pB.length) {
 | |
| 				if (pA.slice(0, pB.length) > pB) return 1;
 | |
| 				return -1;
 | |
| 			} else if (pB.length > pA.length) {
 | |
| 				if (pB.slice(0, pA.length) > pA) return -1;
 | |
| 				return 1;
 | |
| 			}
 | |
| 			if (pA < pB) return -1;
 | |
| 			if (pA > pB) return 1;
 | |
| 		} else {
 | |
| 			const nA = Number(pA);
 | |
| 			const nB = Number(pB);
 | |
| 			if (nA < nB) return -1;
 | |
| 			if (nA > nB) return 1;
 | |
| 		}
 | |
| 	}
 | |
| 	if (partsB.length < partsA.length) return 1;
 | |
| 	if (partsB.length > partsA.length) return -1;
 | |
| 	return 0;
 | |
| };
 | |
| 
 | |
| describe(compareStringsNumeric.name, () => {
 | |
| 	const testCases = [
 | |
| 		["", "a", 1],
 | |
| 		["a", "", -1],
 | |
| 		["", "0", -1],
 | |
| 		["1", "", 1],
 | |
| 		["", "", 0],
 | |
| 		["a", "1", -1],
 | |
| 		["1", "a", 1],
 | |
| 		["_", "1", -1],
 | |
| 		["1", "_", 1],
 | |
| 		["a", "b", -1],
 | |
| 		["b", "a", 1],
 | |
| 		["a", "a", 0],
 | |
| 		["a1", "a2", -1],
 | |
| 		["a2", "a1", 1],
 | |
| 		["a1", "a1", 0],
 | |
| 		["ab1", "ab2", -1],
 | |
| 		["ab2", "ab1", 1],
 | |
| 		["ab1", "a1", -1],
 | |
| 		["a1", "ab1", 1],
 | |
| 		["a1", "a10", -1],
 | |
| 		["a10", "a1", 1],
 | |
| 		["a1", "a01", 0],
 | |
| 		["a1", "a1a", 1],
 | |
| 		["a1a", "a1", -1],
 | |
| 		["a1a", "a01a", 0],
 | |
| 		["a1a", "a1b", -1],
 | |
| 		["a1b", "a1a", 1],
 | |
| 		["a1a", "a1a1", -1],
 | |
| 		["a1a1", "a1a", 1],
 | |
| 		["a1a1", "a1a1", 0],
 | |
| 		["a1a1", "a1a2", -1],
 | |
| 		["a1a2", "a1a1", 1],
 | |
| 		["a1a1", "a1a01", 0],
 | |
| 		["a1a1", "a1a1a", 1],
 | |
| 		["a1a1a", "a1a1", -1],
 | |
| 		["a1a1a", "a1a1a", 0],
 | |
| 		["a1a1a", "a1a1b", -1],
 | |
| 		["a1a1b", "a1a1a", 1],
 | |
| 		["a1a1a", "a1a1a1", -1],
 | |
| 		["a1a1a1", "a1a1a", 1],
 | |
| 		["a1a1a1", "a1a1a1", 0],
 | |
| 		["a1a1a1", "a1a1a2", -1],
 | |
| 		["a1a1a2", "a1a1a1", 1],
 | |
| 		["a1a1a1", "a1a1a01", 0],
 | |
| 		["a1a1a1", "a1a1a1a", 1]
 | |
| 	];
 | |
| 
 | |
| 	for (const testCase of testCases) {
 | |
| 		const [a, b, expected] = testCase;
 | |
| 
 | |
| 		it(`returns ${expected} when comparing "${a}" to "${b}"`, () => {
 | |
| 			expect(referenceComparer(a, b)).toBe(expected);
 | |
| 			expect(compareStringsNumeric(a, b)).toBe(expected);
 | |
| 		});
 | |
| 	}
 | |
| });
 |