import { describe, it } from 'node:test';

import { expect } from 'chai';

import { collectIteratorPromises } from '../collectIteratorPromises.ts';

describe('collectIteratorPromises', () => {
  it('collects promise values until completion', () => {
    const first = Promise.resolve(1);
    const second = Promise.resolve(2);
    const values: Array<unknown> = [first, 'x', second];

    const iterator: Iterator<unknown> = {
      next() {
        const value = values.shift();
        if (value === undefined) {
          return { done: true, value: undefined };
        }
        return { done: false, value };
      },
    };

    expect(collectIteratorPromises(iterator)).to.deep.equal([first, second]);
  });

  it('returns collected promises when draining throws', () => {
    const first = Promise.resolve(1);
    let nextCalls = 0;

    const iterator: Iterator<unknown> = {
      next() {
        nextCalls += 1;
        if (nextCalls === 1) {
          return { done: false, value: first };
        }
        throw new Error('bad');
      },
    };

    expect(collectIteratorPromises(iterator)).to.deep.equal([first]);
  });
});