1const t = require('tap')
2const MPS = require('../')
3
4t.test('ok if size checks out', t => {
5  const mps = new MPS({ size: 4 })
6
7  mps.write(Buffer.from('a').toString('hex'), 'hex')
8  mps.write(Buffer.from('sd'))
9  mps.end('f')
10  return mps.concat().then(data => t.equal(data.toString(), 'asdf'))
11})
12
13t.test('error if size exceeded', t => {
14  const mps = new MPS({ size: 1 })
15  mps.on('error', er => {
16    t.match(er, {
17      message: 'Bad data size: expected 1 bytes, but got 4',
18      found: 4,
19      expect: 1,
20      code: 'EBADSIZE',
21      name: 'SizeError',
22    })
23    t.end()
24  })
25  mps.write('asdf')
26})
27
28t.test('error if size is not met', t => {
29  const mps = new MPS({ size: 999 })
30  t.throws(() => mps.end(), {
31    message: 'Bad data size: expected 999 bytes, but got 0',
32    found: 0,
33    name: 'SizeError',
34    expect: 999,
35    code: 'EBADSIZE',
36  })
37  t.end()
38})
39
40t.test('error if non-string/buffer is written', t => {
41  const mps = new MPS({size:1})
42  mps.on('error', er => {
43    t.match(er, {
44      message: 'MinipassSized streams only work with string and buffer data'
45    })
46    t.end()
47  })
48  mps.write({some:'object'})
49})
50
51t.test('projectiles', t => {
52  t.throws(() => new MPS(), {
53    message: 'invalid expected size: undefined'
54  }, 'size is required')
55  t.throws(() => new MPS({size: true}), {
56    message: 'invalid expected size: true'
57  }, 'size must be number')
58  t.throws(() => new MPS({size: NaN}), {
59    message: 'invalid expected size: NaN'
60  }, 'size must not be NaN')
61  t.throws(() => new MPS({size:1.2}), {
62    message: 'invalid expected size: 1.2'
63  }, 'size must be integer')
64  t.throws(() => new MPS({size: Infinity}), {
65    message: 'invalid expected size: Infinity'
66  }, 'size must be finite')
67  t.throws(() => new MPS({size: -1}), {
68    message: 'invalid expected size: -1'
69  }, 'size must be positive')
70  t.throws(() => new MPS({objectMode: true}), {
71    message: 'MinipassSized streams only work with string and buffer data'
72  }, 'no objectMode')
73  t.throws(() => new MPS({size: Number.MAX_SAFE_INTEGER + 1000000}), {
74    message: 'invalid expected size: 9007199255740992'
75  })
76  t.end()
77})
78
79t.test('exports SizeError class', t => {
80  t.isa(MPS.SizeError, 'function')
81  t.isa(MPS.SizeError.prototype, Error)
82  t.end()
83})
84