import assert from 'assert'
import { DimensionError } from '../../../src/error/DimensionError'

describe('DimensionError', function () {
  it('should construct a DimensionError with numbers', function () {
    const err = new DimensionError(3, 5)
    assert(err instanceof Error)
    assert(err instanceof RangeError)
    assert(err instanceof DimensionError)
    assert.strictEqual(err.actual, 3)
    assert.strictEqual(err.expected, 5)
    assert.strictEqual(err.relation, undefined)
    assert.strictEqual(err.toString(), 'DimensionError: Dimension mismatch (3 != 5)')
  })

  it('should construct a DimensionError with numbers and a custom relation', function () {
    const err = new DimensionError(3, 5, '<')
    assert(err instanceof Error)
    assert(err instanceof RangeError)
    assert(err instanceof DimensionError)
    assert.strictEqual(err.actual, 3)
    assert.strictEqual(err.expected, 5)
    assert.strictEqual(err.relation, '<')
    assert.strictEqual(err.toString(), 'DimensionError: Dimension mismatch (3 < 5)')
  })

  it('should construct a DimensionError with arrays', function () {
    const err = new DimensionError([2, 3], [1, 3])
    assert(err instanceof Error)
    assert(err instanceof RangeError)
    assert(err instanceof DimensionError)
    assert.deepStrictEqual(err.actual, [2, 3])
    assert.deepStrictEqual(err.expected, [1, 3])
    assert.strictEqual(err.relation, undefined)
    assert.strictEqual(err.toString(), 'DimensionError: Dimension mismatch ([2, 3] != [1, 3])')
  })

  it('should construct a DimensionError with arrays and a custom relation', function () {
    const err = new DimensionError([2, 3], [1, 3], '<')
    assert(err instanceof Error)
    assert(err instanceof RangeError)
    assert(err instanceof DimensionError)
    assert.deepStrictEqual(err.actual, [2, 3])
    assert.deepStrictEqual(err.expected, [1, 3])
    assert.strictEqual(err.relation, '<')
    assert.strictEqual(err.toString(), 'DimensionError: Dimension mismatch ([2, 3] < [1, 3])')
  })

  it('should throw an error when operator new is missing', function () {
    assert.throws(function () { DimensionError(3, 5) }, SyntaxError)
  })
})
