232 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| import { useQueue } from '~/composables/audio/queue'
 | |
| import type { Track } from '~/types'
 | |
| 
 | |
| const { tracks, enqueue, dequeue, clear, reorder, currentIndex } = useQueue()
 | |
| 
 | |
| describe('currentIndex', () => {
 | |
|   beforeEach(async () => {
 | |
|     await clear()
 | |
|     await enqueue(
 | |
|       { id: 1, uploads: [] } as any as Track,
 | |
|       { id: 2, uploads: [] } as any as Track,
 | |
|       { id: 3, uploads: [] } as any as Track
 | |
|     )
 | |
|   })
 | |
| 
 | |
|   describe('clamp', () => {
 | |
|     it('should be clamped to queue size', () => {
 | |
|       currentIndex.value = 100
 | |
|       expect(currentIndex.value).toBe(2)
 | |
| 
 | |
|       currentIndex.value = -100
 | |
|       expect(currentIndex.value).toBe(0)
 | |
|     })
 | |
| 
 | |
|     it('should be clamped to queue size after enqueue', async () => {
 | |
|       await enqueue({ id: 4, uploads: [] } as any as Track)
 | |
| 
 | |
|       currentIndex.value = 100
 | |
|       expect(currentIndex.value).toBe(3)
 | |
| 
 | |
|       currentIndex.value = -100
 | |
|       expect(currentIndex.value).toBe(0)
 | |
|     })
 | |
| 
 | |
|     it('should be clamped to queue size after clear', async () => {
 | |
|       await clear()
 | |
|       expect(currentIndex.value).toBe(0)
 | |
| 
 | |
|       currentIndex.value = 100
 | |
|       expect(currentIndex.value).toBe(0)
 | |
| 
 | |
|       currentIndex.value = -100
 | |
|       expect(currentIndex.value).toBe(0)
 | |
|     })
 | |
| 
 | |
|     it('should update currentIndex after removal of last track', async () => {
 | |
|       await dequeue(2)
 | |
| 
 | |
|       currentIndex.value = 100
 | |
|       expect(currentIndex.value).toBe(1)
 | |
| 
 | |
|       currentIndex.value = -100
 | |
|       expect(currentIndex.value).toBe(0)
 | |
|     })
 | |
| 
 | |
|     it('should update currentIndex after removal of last track', async () => {
 | |
|       currentIndex.value = 2
 | |
|       tracks.value.splice(2, 1)
 | |
|       expect(currentIndex.value).toBe(1)
 | |
| 
 | |
|       currentIndex.value = 100
 | |
|       expect(currentIndex.value).toBe(1)
 | |
| 
 | |
|       currentIndex.value = -100
 | |
|       expect(currentIndex.value).toBe(0)
 | |
|     })
 | |
| 
 | |
|     it('should update currentIndex after removal of middle track', async () => {
 | |
|       currentIndex.value = 2
 | |
|       tracks.value.splice(1, 1)
 | |
|       expect(currentIndex.value).toBe(1)
 | |
| 
 | |
|       currentIndex.value = 100
 | |
|       expect(currentIndex.value).toBe(1)
 | |
| 
 | |
|       currentIndex.value = -100
 | |
|       expect(currentIndex.value).toBe(0)
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| describe('Ordered queue', () => {
 | |
|   beforeEach(async () => {
 | |
|     await clear()
 | |
|     await enqueue(
 | |
|       { id: 1, uploads: [] } as any as Track,
 | |
|       { id: 2, uploads: [] } as any as Track,
 | |
|       { id: 3, uploads: [] } as any as Track
 | |
|     )
 | |
|   })
 | |
| 
 | |
|   describe('first track is playing', () => {
 | |
|     beforeEach(() => {
 | |
|       currentIndex.value = 0
 | |
|     })
 | |
| 
 | |
|     it('reorder current track to the middle', () => {
 | |
|       reorder(0, 1)
 | |
|       expect(tracks.value).toEqual([2, 1, 3])
 | |
|       expect(currentIndex.value).toBe(1)
 | |
|     })
 | |
| 
 | |
|     it('reorder current track to the end', () => {
 | |
|       reorder(0, 2)
 | |
|       expect(tracks.value).toEqual([2, 3, 1])
 | |
|       expect(currentIndex.value).toBe(2)
 | |
|     })
 | |
| 
 | |
|     it('reorder middle track to the beginning', () => {
 | |
|       reorder(1, 0)
 | |
|       expect(tracks.value).toEqual([2, 1, 3])
 | |
|       expect(currentIndex.value).toBe(1)
 | |
|     })
 | |
| 
 | |
|     it('reorder middle track to the end', () => {
 | |
|       reorder(1, 2)
 | |
|       expect(tracks.value).toEqual([1, 3, 2])
 | |
|       expect(currentIndex.value).toBe(0)
 | |
|     })
 | |
| 
 | |
|     it('reorder last track to the beginning', () => {
 | |
|       reorder(2, 0)
 | |
|       expect(tracks.value).toEqual([3, 1, 2])
 | |
|       expect(currentIndex.value).toBe(1)
 | |
|     })
 | |
| 
 | |
|     it('reorder last track to the middle', () => {
 | |
|       reorder(2, 1)
 | |
|       expect(tracks.value).toEqual([1, 3, 2])
 | |
|       expect(currentIndex.value).toBe(0)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   describe('middle track is playing', () => {
 | |
|     beforeEach(() => {
 | |
|       currentIndex.value = 1
 | |
|     })
 | |
| 
 | |
|     it('reorder current track to the beginning', () => {
 | |
|       reorder(1, 0)
 | |
|       expect(tracks.value).toEqual([2, 1, 3])
 | |
|       expect(currentIndex.value).toBe(0)
 | |
|     })
 | |
| 
 | |
|     it('reorder current track to the end', () => {
 | |
|       reorder(1, 2)
 | |
|       expect(tracks.value).toEqual([1, 3, 2])
 | |
|       expect(currentIndex.value).toBe(2)
 | |
|     })
 | |
| 
 | |
|     it('reorder first track to the middle', () => {
 | |
|       reorder(0, 1)
 | |
|       expect(tracks.value).toEqual([2, 1, 3])
 | |
|       expect(currentIndex.value).toBe(0)
 | |
|     })
 | |
| 
 | |
|     it('reorder first track to the end', () => {
 | |
|       reorder(0, 2)
 | |
|       expect(tracks.value).toEqual([2, 3, 1])
 | |
|       expect(currentIndex.value).toBe(0)
 | |
|     })
 | |
| 
 | |
|     it('reorder last track to the beginning', () => {
 | |
|       reorder(2, 0)
 | |
|       expect(tracks.value).toEqual([3, 1, 2])
 | |
|       expect(currentIndex.value).toBe(2)
 | |
|     })
 | |
| 
 | |
|     it('reorder last track to the middle', () => {
 | |
|       reorder(2, 1)
 | |
|       expect(tracks.value).toEqual([1, 3, 2])
 | |
|       expect(currentIndex.value).toBe(2)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   describe('last track is playing', () => {
 | |
|     beforeEach(() => {
 | |
|       currentIndex.value = 2
 | |
|     })
 | |
| 
 | |
|     it('reorder current track to the beginning', () => {
 | |
|       reorder(2, 0)
 | |
|       expect(tracks.value).toEqual([3, 1, 2])
 | |
|       expect(currentIndex.value).toBe(0)
 | |
|     })
 | |
| 
 | |
|     it('reorder current track to the middle', () => {
 | |
|       reorder(2, 1)
 | |
|       expect(tracks.value).toEqual([1, 3, 2])
 | |
|       expect(currentIndex.value).toBe(1)
 | |
|     })
 | |
| 
 | |
|     it('reorder first track to the middle', () => {
 | |
|       reorder(0, 1)
 | |
|       expect(tracks.value).toEqual([2, 1, 3])
 | |
|       expect(currentIndex.value).toBe(2)
 | |
|     })
 | |
| 
 | |
|     it('reorder first track to the end', () => {
 | |
|       reorder(0, 2)
 | |
|       expect(tracks.value).toEqual([2, 3, 1])
 | |
|       expect(currentIndex.value).toBe(1)
 | |
|     })
 | |
| 
 | |
|     it('reorder middle track to the beginning', () => {
 | |
|       reorder(1, 0)
 | |
|       expect(tracks.value).toEqual([2, 1, 3])
 | |
|       expect(currentIndex.value).toBe(2)
 | |
|     })
 | |
| 
 | |
|     it('reorder middle track to the end', () => {
 | |
|       reorder(1, 2)
 | |
|       expect(tracks.value).toEqual([1, 3, 2])
 | |
|       expect(currentIndex.value).toBe(1)
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| // TODO: Add tests for the shuffled queue
 | |
| // describe('Shuffled queue', () => {
 | |
| //   beforeEach(async () => {
 | |
| //     await clear()
 | |
| //     await enqueue(
 | |
| //       { id: 1, uploads: [] } as any as Track,
 | |
| //       { id: 2, uploads: [] } as any as Track,
 | |
| //       { id: 3, uploads: [] } as any as Track,
 | |
| //     )
 | |
| //
 | |
| //     shuffle()
 | |
| //   })
 | |
| // })
 |