'use strict'

const test = require('tap').test
const boot = require('..')

test('pretty print', t => {
  t.plan(19)

  const app = boot()
  app
    .use(first)
    .use(duplicate, { count: 3 })
    .use(second).after(afterUse).after(after)
    .use(duplicate, { count: 2 })
    .use(third).after(after)
    .use(duplicate, { count: 1 })

  const linesExpected = [/bound root \d+ ms/,
    /├── first \d+ ms/,
    /├─┬ duplicate \d+ ms/,
    /│ └─┬ duplicate \d+ ms/,
    /│ {3}└─┬ duplicate \d+ ms/,
    /│ {5}└── duplicate \d+ ms/,
    /├── second \d+ ms/,
    /├─┬ bound _after \d+ ms/,
    /│ └── afterInsider \d+ ms/,
    /├── bound _after \d+ ms/,
    /├─┬ duplicate \d+ ms/,
    /│ └─┬ duplicate \d+ ms/,
    /│ {3}└── duplicate \d+ ms/,
    /├── third \d+ ms/,
    /├── bound _after \d+ ms/,
    /└─┬ duplicate \d+ ms/,
    / {2}└── duplicate \d+ ms/,
    ''
  ]

  app.on('preReady', function show () {
    const print = app.prettyPrint()
    const lines = print.split('\n')

    t.equals(lines.length, linesExpected.length)
    lines.forEach((l, i) => {
      t.match(l, linesExpected[i])
    })
  })

  function first (s, opts, done) {
    done()
  }
  function second (s, opts, done) {
    done()
  }
  function third (s, opts, done) {
    done()
  }
  function after (err, cb) {
    cb(err)
  }
  function afterUse (err, cb) {
    app.use(afterInsider)
    cb(err)
  }

  function afterInsider (s, opts, done) {
    done()
  }

  function duplicate (instance, opts, cb) {
    if (opts.count > 0) {
      instance.use(duplicate, { count: opts.count - 1 })
    }
    setTimeout(cb, 20)
  }
})
