/* jasmine specs for Interpreter.js go here */

describe ('Interpreter', function() {
  var interp;

  beforeEach(function() {
    interp = Interpreter;
  });

  describe('Instantization variables', function() {
    var initInterp, realThread, realTimer;
    beforeEach(function() {
      realThread = Thread;
      realTimer = Timer;
      Thread = threadMock;
      Timer = function() {};
      initInterp = new interp();
    });

    afterEach(function() {
      Thread = realThread;
      Timer = realTimer;
    });

    describe('Interpreter Variables', function() {
      it('should have a primitiveTable collection', function() {
        expect(initInterp.primitiveTable).toEqual({});
      });

      it('should have a variables collection', function() {
        expect(initInterp.variables).toEqual({});
      });

      it('should have a threads array', function() {
        expect(initInterp.threads).toEqual([]);
      });

      it('should have an activeThread variable', function() {
        expect(initInterp.activeThread).toEqual(threadMock());
      });

      it('should have a WorkTime variable', function() {
        expect(initInterp.WorkTime).toBe(30);
      });

      it('should have a currentMSecs variable', function() {
        expect(initInterp.currentMSecs).toBe(null);
      });

      it('should have a timer variable', function() {
        expect(initInterp.timer).toEqual({});
      });

      it('should have a yield variable', function() {
        expect(initInterp.yield).toBe(false);
      });

      it('should have a doRedraw variable', function() {
        expect(initInterp.doRedraw).toBe(false);
      });

      it('should have an opCount variable', function() {
        expect(initInterp.opCount).toBe(0);
      });

      it('should have a debugOps variable', function() {
        expect(initInterp.debugOps).toBe(false);
      });

      it('should have a debugFunc variable', function() {
        expect(initInterp.debugFunc).toBe(null);
      });

      it('should have an opCount2 variable', function() {
        expect(initInterp.opCount2).toBe(0);
      });
    });
  });

  describe('TargetStage', function() {
    it('should return the target.stage object', function() {
      runtime = new runtimeMock();
      expect(interp.prototype.targetStage()).toEqual(runtime.stage);
    });
  });
});