const assume = require('assume');
const tripleBeam = require('./');

describe('triple-beam', function () {
  describe('LEVEL constant', function () {
    it('is exposed', function () {
      assume(tripleBeam.LEVEL);
    });

    it('is a Symbol', function () {
      assume(tripleBeam.LEVEL).is.a('symbol');
    });

    it('is not mutable', function () {
      //
      // Assert that the symbol does not change
      // even though the operation does not throw.
      //
      const OVERWRITE = Symbol('overwrite');
      const LEVEL = tripleBeam.LEVEL;

      assume(LEVEL).not.equals(OVERWRITE);
      tripleBeam.LEVEL = OVERWRITE;
      assume(tripleBeam.LEVEL).equals(LEVEL);
    });
  });

  describe('MESSAGE constant', function () {
    it('is exposed', function () {
      assume(tripleBeam.MESSAGE);
    });

    it('is a Symbol', function () {
      assume(tripleBeam.MESSAGE).is.a('symbol');
    });

    it('is not mutable', function () {
      //
      // Assert that the symbol does not change
      // even though the operation does not throw.
      //
      const OVERWRITE = Symbol('overwrite');
      const MESSAGE = tripleBeam.MESSAGE;

      assume(MESSAGE).not.equals(OVERWRITE);
      tripleBeam.MESSAGE = OVERWRITE;
      assume(tripleBeam.MESSAGE).equals(MESSAGE);
    });
  });

  describe('SPLAT constant', function () {
    it('is exposed', function () {
      assume(tripleBeam.SPLAT);
    });

    it('is a Symbol', function () {
      assume(tripleBeam.SPLAT).is.a('symbol');
    });

    it('is not mutable', function () {
      //
      // Assert that the symbol does not change
      // even though the operation does not throw.
      //
      const OVERWRITE = Symbol('overwrite');
      const SPLAT = tripleBeam.SPLAT;

      assume(SPLAT).not.equals(OVERWRITE);
      tripleBeam.SPLAT = OVERWRITE;
      assume(tripleBeam.SPLAT).equals(SPLAT);
    });
  });

  describe('configs constant', function () {
    it('is exposed', function () {
      assume(tripleBeam.configs);
    });

    it('is a Symbol', function () {
      assume(tripleBeam.configs).is.an('Object');
    });

    it('is not mutable', function () {
      //
      // Assert that the object does not change
      // even though the operation does not throw.
      //
      const overwrite = {
        overwrite: 'overwrite'
      };
      const configs = tripleBeam.configs;

      assume(configs).not.equals(overwrite);
      tripleBeam.configs = overwrite;
      assume(tripleBeam.configs).equals(configs);
    });
  });
});