import { MAX_SAFE_CHAIN_ID } from '../constants/network';
import {
  isSafeChainId,
  isPrefixedFormattedHexString,
  isTokenDetectionEnabledForNetwork,
} from './network.utils';

describe('network utils', () => {
  describe('isSafeChainId', () => {
    it('returns true given an integer greater than 0 and less than or equal to the max safe chain ID', () => {
      expect(isSafeChainId(3)).toBe(true);
    });

    it('returns true given the max safe chain ID', () => {
      expect(isSafeChainId(MAX_SAFE_CHAIN_ID)).toBe(true);
    });

    it('returns false given something other than an integer', () => {
      expect(isSafeChainId('not-an-integer')).toBe(false);
    });

    it('returns false given a negative integer', () => {
      expect(isSafeChainId(-1)).toBe(false);
    });

    it('returns false given an integer greater than the max safe chain ID', () => {
      expect(isSafeChainId(MAX_SAFE_CHAIN_ID + 1)).toBe(false);
    });
  });

  describe('isPrefixedFormattedHexString', () => {
    it('returns true given a string that matches a hex number formatted as a "0x"-prefixed, non-zero, non-zero-padded string', () => {
      expect(isPrefixedFormattedHexString('0x1')).toBe(true);
      expect(isPrefixedFormattedHexString('0xa')).toBe(true);
      expect(isPrefixedFormattedHexString('0xabc123')).toBe(true);
    });

    it('returns true given a "0x"-prefixed hex string that contains uppercase characters', () => {
      expect(isPrefixedFormattedHexString('0XABC123')).toBe(true);
    });

    it('returns false given a "0x"-prefixed hex string that evaluates to zero', () => {
      expect(isPrefixedFormattedHexString('0x0')).toBe(false);
    });

    it('returns false given a "0x"-prefixed hex string that does not evaluate to zero but is zero-padded', () => {
      expect(isPrefixedFormattedHexString('0x01')).toBe(false);
    });

    it('returns false given a hex number that is simply a string but not "0x"-prefixed', () => {
      expect(isPrefixedFormattedHexString('abc123')).toBe(false);
    });

    it('returns false if given something other than a string', () => {
      expect(isPrefixedFormattedHexString({ something: 'else' })).toBe(false);
    });
  });

  describe('isTokenDetectionEnabledForNetwork', () => {
    it('returns true given the chain ID for Mainnet', () => {
      expect(isTokenDetectionEnabledForNetwork('0x1')).toBe(true);
    });

    it('returns true given the chain ID for BSC', () => {
      expect(isTokenDetectionEnabledForNetwork('0x38')).toBe(true);
    });

    it('returns true given the chain ID for Polygon', () => {
      expect(isTokenDetectionEnabledForNetwork('0x89')).toBe(true);
    });

    it('returns true given the chain ID for Avalanche', () => {
      expect(isTokenDetectionEnabledForNetwork('0xa86a')).toBe(true);
    });

    it('returns true given the chain ID for Aurora', () => {
      expect(isTokenDetectionEnabledForNetwork('0x4e454152')).toBe(true);
    });

    it('returns false given a string that is not the chain ID for Mainnet, BSC, Polygon, or Avalanche', () => {
      expect(isTokenDetectionEnabledForNetwork('some other chain ID')).toBe(
        false,
      );
    });

    it('returns false given undefined', () => {
      expect(isTokenDetectionEnabledForNetwork(undefined)).toBe(false);
    });
  });
});
