252 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			252 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | const { sortChallenges } = require('./sort-challenges'); | |||
|  | 
 | |||
|  | const challenges = [ | |||
|  |   { | |||
|  |     name: 'HTML - project 1 - step 1', | |||
|  |     superOrder: 1, | |||
|  |     order: 1, | |||
|  |     challengeOrder: 1 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'HTML - project 1 - step 2', | |||
|  |     superOrder: 1, | |||
|  |     order: 1, | |||
|  |     challengeOrder: 2 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'HTML - project 1 - step 3', | |||
|  |     superOrder: 1, | |||
|  |     order: 1, | |||
|  |     challengeOrder: 3 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'HTML - project 1 - step 4', | |||
|  |     superOrder: 1, | |||
|  |     order: 1, | |||
|  |     challengeOrder: 4 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'HTML - project 2 - step 1', | |||
|  |     superOrder: 1, | |||
|  |     order: 2, | |||
|  |     challengeOrder: 1 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'HTML - project 2 - step 2', | |||
|  |     superOrder: 1, | |||
|  |     order: 2, | |||
|  |     challengeOrder: 2 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'HTML - project 2 - step 3', | |||
|  |     superOrder: 1, | |||
|  |     order: 2, | |||
|  |     challengeOrder: 3 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'HTML - project 2 - step 4', | |||
|  |     superOrder: 1, | |||
|  |     order: 2, | |||
|  |     challengeOrder: 4 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'HTML - project 3 - step 1', | |||
|  |     superOrder: 1, | |||
|  |     order: 3, | |||
|  |     challengeOrder: 1 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'HTML - project 3 - step 2', | |||
|  |     superOrder: 1, | |||
|  |     order: 3, | |||
|  |     challengeOrder: 2 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'HTML - project 3 - step 3', | |||
|  |     superOrder: 1, | |||
|  |     order: 3, | |||
|  |     challengeOrder: 3 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'HTML - project 3 - step 4', | |||
|  |     superOrder: 1, | |||
|  |     order: 3, | |||
|  |     challengeOrder: 4 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'CSS - project 1 - step 1', | |||
|  |     superOrder: 2, | |||
|  |     order: 1, | |||
|  |     challengeOrder: 1 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'CSS - project 1 - step 2', | |||
|  |     superOrder: 2, | |||
|  |     order: 1, | |||
|  |     challengeOrder: 2 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'CSS - project 1 - step 3', | |||
|  |     superOrder: 2, | |||
|  |     order: 1, | |||
|  |     challengeOrder: 3 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'CSS - project 1 - step 4', | |||
|  |     superOrder: 2, | |||
|  |     order: 1, | |||
|  |     challengeOrder: 4 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'CSS - project 2 - step 1', | |||
|  |     superOrder: 2, | |||
|  |     order: 2, | |||
|  |     challengeOrder: 1 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'CSS - project 2 - step 2', | |||
|  |     superOrder: 2, | |||
|  |     order: 2, | |||
|  |     challengeOrder: 2 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'CSS - project 2 - step 3', | |||
|  |     superOrder: 2, | |||
|  |     order: 2, | |||
|  |     challengeOrder: 3 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'CSS - project 2 - step 4', | |||
|  |     superOrder: 2, | |||
|  |     order: 2, | |||
|  |     challengeOrder: 4 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'CSS - project 3 - step 1', | |||
|  |     superOrder: 2, | |||
|  |     order: 3, | |||
|  |     challengeOrder: 1 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'CSS - project 3 - step 2', | |||
|  |     superOrder: 2, | |||
|  |     order: 3, | |||
|  |     challengeOrder: 2 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'CSS - project 3 - step 3', | |||
|  |     superOrder: 2, | |||
|  |     order: 3, | |||
|  |     challengeOrder: 3 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'CSS - project 3 - step 4', | |||
|  |     superOrder: 2, | |||
|  |     order: 3, | |||
|  |     challengeOrder: 4 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'JS - project 1 - step 1', | |||
|  |     superOrder: 3, | |||
|  |     order: 1, | |||
|  |     challengeOrder: 1 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'JS - project 1 - step 2', | |||
|  |     superOrder: 3, | |||
|  |     order: 1, | |||
|  |     challengeOrder: 2 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'JS - project 1 - step 3', | |||
|  |     superOrder: 3, | |||
|  |     order: 1, | |||
|  |     challengeOrder: 3 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'JS - project 1 - step 4', | |||
|  |     superOrder: 3, | |||
|  |     order: 1, | |||
|  |     challengeOrder: 4 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'JS - project 2 - step 1', | |||
|  |     superOrder: 3, | |||
|  |     order: 2, | |||
|  |     challengeOrder: 1 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'JS - project 2 - step 2', | |||
|  |     superOrder: 3, | |||
|  |     order: 2, | |||
|  |     challengeOrder: 2 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'JS - project 2 - step 3', | |||
|  |     superOrder: 3, | |||
|  |     order: 2, | |||
|  |     challengeOrder: 3 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'JS - project 2 - step 4', | |||
|  |     superOrder: 3, | |||
|  |     order: 2, | |||
|  |     challengeOrder: 4 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'JS - project 3 - step 1', | |||
|  |     superOrder: 3, | |||
|  |     order: 3, | |||
|  |     challengeOrder: 1 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'JS - project 3 - step 2', | |||
|  |     superOrder: 3, | |||
|  |     order: 3, | |||
|  |     challengeOrder: 2 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'JS - project 3 - step 3', | |||
|  |     superOrder: 3, | |||
|  |     order: 3, | |||
|  |     challengeOrder: 3 | |||
|  |   }, | |||
|  |   { | |||
|  |     name: 'JS - project 3 - step 4', | |||
|  |     superOrder: 3, | |||
|  |     order: 3, | |||
|  |     challengeOrder: 4 | |||
|  |   } | |||
|  | ]; | |||
|  | 
 | |||
|  | describe('sortChallenges', () => { | |||
|  |   it('sorts challenges by superblock, block and challenge order', () => { | |||
|  |     const copyOfChallenges = [...challenges]; | |||
|  |     shuffle(copyOfChallenges); | |||
|  |     const actualChallenges = sortChallenges(copyOfChallenges); | |||
|  | 
 | |||
|  |     expect(actualChallenges).toEqual(challenges); | |||
|  |   }); | |||
|  | 
 | |||
|  |   it('does not change the original array', () => { | |||
|  |     const copyOfChallenges = [...challenges]; | |||
|  |     copyOfChallenges[0] = { | |||
|  |       name: 'JS - project 3 - step 4', | |||
|  |       superOrder: 3, | |||
|  |       order: 3, | |||
|  |       challengeOrder: 4 | |||
|  |     }; | |||
|  |     const actualChallenges = sortChallenges(copyOfChallenges); | |||
|  | 
 | |||
|  |     expect(actualChallenges[0]).not.toEqual(copyOfChallenges[0]); | |||
|  |   }); | |||
|  | }); | |||
|  | 
 | |||
|  | // Use the Fisher–Yates shuffle algorithm to shuffle array
 | |||
|  | const shuffle = arr => { | |||
|  |   for (let i = arr.length - 1; i > 0; i--) { | |||
|  |     const j = Math.floor(Math.random() * (i + 1)); | |||
|  |     [arr[i], arr[j]] = [arr[j], arr[i]]; | |||
|  |   } | |||
|  | }; |