import deepClone from 'packages/utils/deep-clone';
import { isAndroid, isDef, camelize, get } from 'packages/utils';
import { raf, cancel } from 'packages/utils/raf';

describe('Utils', () => {
  it('deepClone', () => {
    const a = { foo: 0 };
    const b = { foo: 0, bar: 1 };
    const fn = () => {};
    const arr = [a, b];
    expect(deepClone(a)).to.eql(a);
    expect(deepClone(b)).to.eql(b);
    expect(deepClone(fn)).to.eql(fn);
    expect(deepClone(arr)).to.eql(arr);
    expect(deepClone(undefined)).to.eql(undefined);
    expect(deepClone(1)).to.eql(1);
  });

  it('isDef', () => {
    expect(isDef(null)).to.be.false;
    expect(isDef(undefined)).to.be.false;
    expect(isDef(1)).to.be.true;
    expect(isDef('1')).to.be.true;
    expect(isDef({})).to.be.true;
    expect(isDef(() => {})).to.be.true;
  });

  it('camelize', () => {
    expect(camelize('ab')).to.equal('ab');
    expect(camelize('a-b')).to.equal('aB');
    expect(camelize('a-b-c-d')).to.equal('aBCD');
    expect(camelize('a-b-')).to.equal('aB-');
    expect(camelize('-a-b')).to.equal('AB');
    expect(camelize('-')).to.equal('-');
  });

  it('get', () => {
    expect(get({ a: 1 }, 'a')).to.equal(1);
    expect(get({ a: { b: 2 }}, 'a.b')).to.equal(2);
    expect(get({ a: { b: 2 }}, 'a.b.c')).to.equal('');
  });

  it('isAndroid', () => {
    expect(isAndroid()).to.be.false;
  });

  it('raf', (done) => {
    const spy = sinon.spy();
    raf(spy);

    setTimeout(() => {
      expect(spy.calledOnce).to.be.true;
      cancel(1);
      done();
    }, 50);
  });
});