import {
  combineStatus,
  getFileName,
  getStatusWeight,
} from 'sentry/components/events/interfaces/debugMeta-v2/utils';
import {ImageStatus} from 'sentry/types/debugImage';

describe('DebugMeta  - utils', () => {
  describe('getStatusWeight function', () => {
    const data = [
      {
        parameter: ImageStatus.FOUND,
        result: 1,
      },
      {
        parameter: ImageStatus.UNUSED,
        result: 0,
      },
      {
        parameter: null,
        result: 0,
      },
      {
        parameter: ImageStatus.MISSING,
        result: 2,
      },
      {
        parameter: ImageStatus.MALFORMED,
        result: 2,
      },
      {
        parameter: ImageStatus.FETCHING_FAILED,
        result: 2,
      },
      {
        parameter: ImageStatus.TIMEOUT,
        result: 2,
      },
      {
        parameter: ImageStatus.OTHER,
        result: 2,
      },
    ];

    it('should return a number according to the passed parameter', () => {
      for (const {parameter, result} of data) {
        const statusWeight = getStatusWeight(parameter);
        expect(statusWeight).toEqual(result);
      }
    });
  });

  describe('getFileName function', () => {
    const filePaths = [
      {
        fileName: 'libsystem_kernel.dylib',
        directory: '/usr/lib/system/',
      },
      {
        fileName: 'libsentry.dylib',
        directory: '/Users/user/Coding/sentry-native/build/',
      },
    ];

    it('should return the file name of a provided filepath', () => {
      for (const {directory, fileName} of filePaths) {
        const result = getFileName(`${directory}${fileName}`);
        expect(result).toEqual(fileName);
      }
    });
  });

  describe('combineStatus function', () => {
    const status = [
      {
        debugStatus: ImageStatus.MISSING,
        unwindStatus: ImageStatus.UNUSED,
        combinedStatus: ImageStatus.MISSING,
      },
      {
        debugStatus: ImageStatus.FOUND,
        unwindStatus: ImageStatus.MISSING,
        combinedStatus: ImageStatus.MISSING,
      },
      {
        debugStatus: ImageStatus.FOUND,
        unwindStatus: ImageStatus.UNUSED,
        combinedStatus: ImageStatus.FOUND,
      },
      {
        debugStatus: ImageStatus.FOUND,
        unwindStatus: null,
        combinedStatus: ImageStatus.FOUND,
      },
      {
        debugStatus: undefined,
        unwindStatus: undefined,
        combinedStatus: ImageStatus.UNUSED,
      },
      {
        debugStatus: undefined,
        unwindStatus: null,
        combinedStatus: ImageStatus.UNUSED,
      },
      {
        debugStatus: null,
        unwindStatus: null,
        combinedStatus: ImageStatus.UNUSED,
      },
    ];

    it('should return the status according to the passed parameters', () => {
      for (const {debugStatus, unwindStatus, combinedStatus} of status) {
        const result = combineStatus(debugStatus, unwindStatus);
        expect(result).toEqual(combinedStatus);
      }
    });
  });
});
