'use strict';
const common = require('../common');
const assert = require('assert');

const stream = require('stream');
let state = 0;

/*
What you do
var stream = new stream.Transform({
  transform: function transformCallback(chunk, _, next) {
    // part 1
    this.push(chunk);
    //part 2
    next();
  },
  final: function endCallback(done) {
    // part 1
    process.nextTick(function () {
      // part 2
      done();
    });
  },
  flush: function flushCallback(done) {
    // part 1
    process.nextTick(function () {
      // part 2
      done();
    });
  }
});
t.on('data', dataListener);
t.on('end', endListener);
t.on('finish', finishListener);
t.write(1);
t.write(4);
t.end(7, endMethodCallback);

The order things are called

1. transformCallback part 1
2. dataListener
3. transformCallback part 2
4. transformCallback part 1
5. dataListener
6. transformCallback part 2
7. transformCallback part 1
8. dataListener
9. transformCallback part 2
10. finalCallback part 1
11. finalCallback part 2
12. flushCallback part 1
13. finishListener
14. endMethodCallback
15. flushCallback part 2
16. endListener
*/

const t = new stream.Transform({
  objectMode: true,
  transform: common.mustCall(function(chunk, _, next) {
    // transformCallback part 1
    assert.strictEqual(++state, chunk);
    this.push(state);
    // transformCallback part 2
    assert.strictEqual(++state, chunk + 2);
    process.nextTick(next);
  }, 3),
  final: common.mustCall(function(done) {
    state++;
    // finalCallback part 1
    assert.strictEqual(state, 10);
    setTimeout(function() {
      state++;
      // finalCallback part 2
      assert.strictEqual(state, 11);
      done();
    }, 100);
  }, 1),
  flush: common.mustCall(function(done) {
    state++;
    // flushCallback part 1
    assert.strictEqual(state, 12);
    process.nextTick(function() {
      state++;
      // flushCallback part 2
      assert.strictEqual(state, 15);
      done();
    });
  }, 1)
});
t.on('finish', common.mustCall(function() {
  state++;
  // finishListener
  assert.strictEqual(state, 13);
}, 1));
t.on('end', common.mustCall(function() {
  state++;
  // end event
  assert.strictEqual(state, 16);
}, 1));
t.on('data', common.mustCall(function(d) {
  // dataListener
  assert.strictEqual(++state, d + 1);
}, 3));
t.write(1);
t.write(4);
t.end(7, common.mustCall(function() {
  state++;
  // endMethodCallback
  assert.strictEqual(state, 14);
}, 1));
