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]];
 | ||
|   }
 | ||
| };
 |