mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
const { compareStringsNumeric } = require("../lib/util/comparators.js");
 | 
						|
 | 
						|
/**
 | 
						|
 * @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;
 | 
						|
			} else {
 | 
						|
				if (pA < pB) return -1;
 | 
						|
				if (pA > pB) return 1;
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			const nA = +pA;
 | 
						|
			const nB = +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);
 | 
						|
		});
 | 
						|
	}
 | 
						|
});
 |