import { Icon } from "../icon";
import { addIcons, getIconMap, getName, getSrc, getUrl } from "../utils";
describe('getUrl', () => {
  let i;
  beforeEach(() => {
    i = new Icon();
  });
  it('use icon prop, as name', () => {
    i.icon = 'some-name';
    expect(getUrl(i)).toBe('/svg/some-name.svg');
  });
  it('use icon prop, as url', () => {
    i.icon = './some.svg';
    expect(getUrl(i)).toBe('./some.svg');
  });
  it('use name prop', () => {
    i.name = 'some-name';
    expect(getUrl(i)).toBe('/svg/some-name.svg');
  });
  it('use src prop', () => {
    i.src = './some.svg';
    i.name = 'some-name';
    i.icon = 'some-icon';
    expect(getUrl(i)).toBe('./some.svg');
  });
});
describe('getSrc', () => {
  it('both . and /', () => {
    expect(getSrc('./somefile.svg')).toBe('./somefile.svg');
  });
  it('url', () => {
    expect(getSrc('https://ionicons/somefile.svg')).toBe('https://ionicons/somefile.svg');
  });
  it('just a .', () => {
    expect(getSrc('somefile.svg')).toBe('somefile.svg');
  });
  it('just a /', () => {
    expect(getSrc('/somesvg')).toBe('/somesvg');
  });
  it('no . or /', () => {
    expect(getSrc('some-name')).toBe(null);
  });
});
describe('getName', () => {
  it('not allow special chars', () => {
    expect(getName('some\\name', '', 'io', '', '')).toBe(null);
    expect(getName('some$name', '', 'io', '', '')).toBe(null);
    expect(getName('some:name', '', 'io', '', '')).toBe(null);
    expect(getName('some.name', '', 'io', '', '')).toBe(null);
    expect(getName('some/name', '', 'io', '', '')).toBe(null);
  });
  it('use ios mode prefixed', () => {
    expect(getName('ios-some-name', '', '', '', '')).toBe('ios-some-name');
  });
  it('use md mode prefixed', () => {
    expect(getName('md-some-name', '', '', '', '')).toBe('md-some-name');
  });
  it('should not use name if no name, ios or md', () => {
    expect(getName(undefined, undefined, '', '', '')).toBe(null);
  });
});
describe('addIcons', () => {
  it('should add an svg to the icon cache', () => {
    const testData = 'stubbed data';
    expect(getIconMap().get('logo-ionic')).toEqual(undefined);
    addIcons({ 'logo-ionic': 'stubbed data' });
    expect(getIconMap().get('logo-ionic')).toEqual(testData);
  });
  it('should add kebab and camel case names to the icon cache', () => {
    const logoIonitron = 'stubbed data';
    expect(getIconMap().get('logo-ionitron')).toEqual(undefined);
    expect(getIconMap().get('logoIonitron')).toEqual(undefined);
    addIcons({ logoIonitron });
    expect(getIconMap().get('logo-ionitron')).toEqual(logoIonitron);
    expect(getIconMap().get('logoIonitron')).toEqual(logoIonitron);
    const logoIonitron0 = 'stubbed data 0';
    expect(getIconMap().get('logo-ionitron-0')).toEqual(undefined);
    expect(getIconMap().get('logoIonitron0')).toEqual(undefined);
    addIcons({ logoIonitron0 });
    expect(getIconMap().get('logo-ionitron-0')).toEqual(logoIonitron0);
    expect(getIconMap().get('logoIonitron0')).toEqual(logoIonitron0);
  });
  it('should map to a name that does not match the svg', () => {
    const logoIonitron = 'stubbed data';
    expect(getIconMap().get('my-fun-icon')).toEqual(undefined);
    addIcons({ 'my-fun-icon': logoIonitron });
    expect(getIconMap().get('my-fun-icon')).toEqual(logoIonitron);
  });
  it('should map to an explicit camel case name', () => {
    const logoIonitron = 'stubbed data';
    expect(getIconMap().get('myCoolIcon')).toEqual(undefined);
    addIcons({ 'myCoolIcon': logoIonitron });
    expect(getIconMap().get('myCoolIcon')).toEqual(logoIonitron);
  });
  it('should not warn when mapping the same icon twice', () => {
    const spy = jest.spyOn(console, 'warn');
    const myIcon = 'my-icon';
    expect(spy).not.toHaveBeenCalled();
    addIcons({ myIcon });
    expect(spy).not.toHaveBeenCalled();
    addIcons({ myIcon });
    expect(spy).not.toHaveBeenCalled();
  });
  it('should not overwrite icons', () => {
    const spy = jest.spyOn(console, 'warn');
    const logoA = 'logo a';
    const logoB = 'logo b';
    expect(spy).not.toHaveBeenCalled();
    expect(getIconMap().get('logo-a')).toEqual(undefined);
    addIcons({ 'logo-a': logoB, logoA });
    expect(getIconMap().get('logo-a')).toEqual(logoB);
    expect(getIconMap().get('logoA')).toEqual(logoA);
    expect(spy).toHaveBeenCalled();
  });
});
