const expect = require('chai').expect;
const sinon = require('sinon');
const Clock = require('../src/clock.js');

describe("Clock Tests", function(){
  var count = 0;
  var count2 = 0;
  var tick = ()=>{count += 1;};
  var tick2 = () =>{count2 += 1;};
  var clk = (new Clock()).clk(tick);
  var clk2 = (new Clock(2)).clk(tick).clk(tick2, 1);

  function speedTest(hz, c){
    c = (c) ? c : 1;
    let stime = Date.now();
    let ltime = stime;
    let dt = 0;
    let _clk = (c === 1) ? clk : clk2;
    _clk.hz = hz;
    while (count < hz && dt < 1000){
      let ctime = Date.now();
      let _dt = ctime - ltime;
      if (_dt > 0){
        ltime = ctime;
        _clk.tick(_dt);
      }
      dt = Date.now() - stime;
    }
    return dt;
  }

  it("4hz for approx. 1 second", function(){
    let dt = speedTest(4);
    expect(count).to.equal(4);
    expect(dt).to.be.gt(750);
  });

  it("4Khz for approx. 1 second", function(){
    count = 0;
    let ts = 4000;
    let d = ts * 0.01;
    let dt = speedTest(ts); 
    expect(count).to.be.gt(ts - d);
    expect(count).to.be.lt(ts + d);
    expect(dt).to.be.gt(990);
    expect(dt).to.be.lt(1010);
  });

  it("4Mhz for approx. 1 second", function(){
    count = 0;
    let ts = 4000000;
    let d = ts * 0.01;
    let dt = speedTest(ts); 
    expect(count).to.be.gt(ts - d);
    expect(count).to.be.lt(ts + d);
    expect(dt).to.be.gt(990);
    expect(dt).to.be.lt(1010);
  });

  it("4khz w/two layers for approx. 1 second", function(){
    count = 0;
    count2 = 0;
    let ts = 4000;
    let d = ts * 0.01;
    let dt = speedTest(ts, 2);
    expect(count).to.be.gt((ts*0.5) - dt);
    expect(count).to.be.lt((ts*0.5) + dt);
    expect(count2).to.be.gt((ts*0.5) - dt);
    expect(count2).to.be.lt((ts*0.5) + dt);
    expect(dt).to.be.gt(990);
    expect(dt).to.be.lt(1010);
  });
});