import { invokeTaskQueue } from '../../../lib/taskQueue'

describe('invoke task queue', () => {
  test('should execute tasks in order', () => {
    const taskArray = [
      jest.fn(() => Promise.resolve('Task 1')),
      jest.fn(() => Promise.resolve('Task 2')),
      jest.fn(() => Promise.resolve('Task 3')),
    ]

    return invokeTaskQueue(taskArray).then(() => {
      expect(taskArray[0]).toHaveBeenCalled()
      expect(taskArray[1]).toHaveBeenCalled()
      expect(taskArray[2]).toHaveBeenCalled()
      expect(taskArray[0].mock.invocationCallOrder[0]).toBeLessThan(
        taskArray[1].mock.invocationCallOrder[0],
      )
      expect(taskArray[1].mock.invocationCallOrder[0]).toBeLessThan(
        taskArray[2].mock.invocationCallOrder[0],
      )
    })
  })

  test('should handle empty task array', () => {
    const taskArray: Array<(...args: any) => any> = []

    return invokeTaskQueue(taskArray).then(() => {
      expect(taskArray.length).toBe(0)
    })
  })

  test('should handle tasks that return promises', () => {
    const taskArray = [
      jest.fn(() => Promise.resolve('Task 1')),
      jest.fn(() => Promise.resolve('Task 2')),
      jest.fn(() => Promise.resolve('Task 3')),
    ]

    return invokeTaskQueue(taskArray).then(() => {
      expect(taskArray[0]).toHaveBeenCalled()
      expect(taskArray[1]).toHaveBeenCalled()
      expect(taskArray[2]).toHaveBeenCalled()
    })
  })
})
