describe('Graph', function () {

  describe('Options', function () {
    var
      nodeA, nodeB,
      a, b, x, i,
      d1 = [],
      options = {};

      for (i = 0; i < 100; i++) {
        x = (i*1000*3600*24*36.5);
        d1.push([x, i+Math.random()*30+Math.sin(i/20+Math.random()*2)*20+Math.sin(i/10+Math.random())*10]);
      }

      options = {
        xaxis : {
          mode : 'time',
          labelsAngle : 45
        },
        selection : {
          mode : 'x'
        },
        HtmlText : false,
      };

    beforeEach(function () {
      nodeA = buildNode();
      Flotr = TestFlotr;
    });

    afterEach(function () {
      destroyNode(nodeA);
      a = b = null;
      Flotr = null;
    });

    it('should override nested default options with user options', function() {
      a = new TestFlotr.Graph(nodeA, d1, options);
      expect(a.options.xaxis.mode).toEqual(options.xaxis.mode);
    });
    
    it('should retain default options if user option\'s nested object does not define property', function() {
      a = new TestFlotr.Graph(nodeA, d1, options);
      expect(a.options.xaxis.tickFormatter).toBeTruthy();
    });

    it('should not affect default options when modifying graph options (objects)', function() {
      a = new TestFlotr.Graph(nodeA, d1, options);
      a.options.x2axis = {  
        titleAlign : 'left'
      };
      a.options.xaxis.scaling = 'logarithmic';
      expect(TestFlotr.defaultOptions.xaxis.scaling).toEqual('linear');
      expect(TestFlotr.defaultOptions.x2axis.titleAlign).toBeFalsy();
    });
    
    it('should not affect default options when modifying graph options (arrays)', function() {
      a = new TestFlotr.Graph(nodeA, d1, options);
      a.options.colors[1] = '#bada55';
      expect(TestFlotr.defaultOptions.colors[1]).toNotBe('#bada55');
    });

  });

  function buildNode () {
    var node = document.createElement('div');
    document.body.appendChild(node);
    node.style.width = '320px';
    node.style.height = '240px';
    return node;
  }

  function destroyNode (node) {
    document.body.removeChild(node);
  }

});

describe('Graph', function () {

  describe('Options', function () {
    var
      nodeA, nodeB,
      a, b, x, i,
      d1 = [],
      options = {};

      for (i = 0; i < 100; i++) {
        x = (i*1000*3600*24*36.5);
        d1.push([x, i+Math.random()*30+Math.sin(i/20+Math.random()*2)*20+Math.sin(i/10+Math.random())*10]);
      }

      options = {
        xaxis : {
          mode : 'time',
          labelsAngle : 45
        },
        selection : {
          mode : 'x'
        },
        HtmlText : false,
      };

    beforeEach(function () {
      nodeA = buildNode();
      Flotr = TestFlotr;
    });

    afterEach(function () {
      destroyNode(nodeA);
      a = b = null;
      Flotr = null;
    });

    it('should override nested default options with user options', function() {
      a = new TestFlotr.Graph(nodeA, d1, options);
      expect(a.options.xaxis.mode).toEqual(options.xaxis.mode);
    });
    
    it('should retain default options if user option\'s nested object does not define property', function() {
      a = new TestFlotr.Graph(nodeA, d1, options);
      expect(a.options.xaxis.tickFormatter).toBeTruthy();
    });

    it('should not affect default options when modifying graph options (objects)', function() {
      a = new TestFlotr.Graph(nodeA, d1, options);
      a.options.x2axis = {  
        titleAlign : 'left'
      };
      a.options.xaxis.scaling = 'logarithmic';
      expect(TestFlotr.defaultOptions.xaxis.scaling).toEqual('linear');
      expect(TestFlotr.defaultOptions.x2axis.titleAlign).toBeFalsy();
    });
    
    /*
    it('should not affect default options when modifying graph options (arrays)', function() {
      a = new TestFlotr.Graph(nodeA, d1, options);
      a.options.colors[1] = '#bada55';
      expect(TestFlotr.defaultOptions.colors[1]).toNotBe('#bada55');
    });
    */

  });

  function buildNode () {
    var node = document.createElement('div');
    document.body.appendChild(node);
    node.style.width = '320px';
    node.style.height = '240px';
    return node;
  }

  function destroyNode (node) {
    document.body.removeChild(node);
  }

});

Disable deep-array copy test until I dig into data copy.