import { expect } from 'chai';
import ExtendableError from '../src/index';

class TestError extends ExtendableError {}
class SubTestError extends TestError {}

describe('ExtendableError', () => {
  it('instance of', () => {
    let err = new ExtendableError();
    expect(err).to.be.an.instanceof(Error);
    expect(err).to.be.an.instanceof(ExtendableError);

    let err2 = new TestError();
    expect(err2).to.be.an.instanceof(Error);
    expect(err2).to.be.an.instanceof(ExtendableError);
    expect(err2).to.be.an.instanceof(TestError);

    let err3 = new SubTestError();
    expect(err3).to.be.an.instanceof(Error);
    expect(err3).to.be.an.instanceof(ExtendableError);
    expect(err3).to.be.an.instanceof(TestError);
    expect(err3).to.be.an.instanceof(SubTestError);
  });

  it('.name', () => {
    let err = new ExtendableError();
    expect(err.name).to.equal('ExtendableError');

    let err2 = new TestError();
    expect(err2.name).to.equal('TestError');

    let err3 = new SubTestError();
    expect(err3.name).to.equal('SubTestError');
  });

  it('name is not enumerable', () => {
    let err = new ExtendableError();
    expect(err.propertyIsEnumerable('name')).to.be.false;
  });

  it('.stack', () => {
    let err = new ExtendableError();
    expect(err.stack).to.be.a('string');

    let err2 = new TestError();
    expect(err2.stack).to.be.a('string');
  });

  it('#toString', () => {
    let err = new ExtendableError();
    expect(err.toString()).to.equal('ExtendableError');

    let err2 = new TestError();
    expect(err2.toString()).to.equal('TestError');

    let err3 = new SubTestError();
    expect(err3.toString()).to.equal('SubTestError');
  });

  it('.message', () => {
    let err = new ExtendableError('error occurred');
    expect(err.message).to.equal('error occurred');
  })
});