text: 
  'use strict';
  
  const request = require('supertest');
  const assert = require('assert');
  const Koa = require('../..');
  
  describe('app.use(fn)', () => {
    it('should compose middleware', async() => {
      const app = new Koa();
      const calls = [];
  
      app.use((ctx, next) => {
        calls.push(1);
        return next().then(() => {
          calls.push(6);
        });
      });
  
      app.use((ctx, next) => {
        calls.push(2);
        return next().then(() => {
          calls.push(5);
        });
      });
  
      app.use((ctx, next) => {
        calls.push(3);
        return next().then(() => {
          calls.push(4);
        });
      });
  
      const server = app.listen();
  
      await request(server)
        .get('/')
        .expect(404);
  
      assert.deepEqual(calls, [1, 2, 3, 4, 5, 6]);
    });
  
    it('should compose mixed middleware', async() => {
      process.once('deprecation', () => {}); // silence deprecation message
      const app = new Koa();
      const calls = [];
  
      app.use((ctx, next) => {
        calls.push(1);
        return next().then(() => {
          calls.push(6);
        });
      });
  
      app.use(function * (next){
        calls.push(2);
        yield next;
        calls.push(5);
      });
  
      app.use((ctx, next) => {
        calls.push(3);
        return next().then(() => {
          calls.push(4);
        });
      });
  
      const server = app.listen();
  
      await request(server)
        .get('/')
        .expect(404);
  
      assert.deepEqual(calls, [1, 2, 3, 4, 5, 6]);
    });
  
    // https://github.com/koajs/koa/pull/530#issuecomment-148138051
    it('should catch thrown errors in non-async functions', () => {
      const app = new Koa();
  
      app.use(ctx => ctx.throw('Not Found', 404));
  
      return request(app.callback())
        .get('/')
        .expect(404);
    });
  
    it('should accept both generator and function middleware', () => {
      process.once('deprecation', () => {}); // silence deprecation message
      const app = new Koa();
  
      app.use((ctx, next) => next());
      app.use(function * (next){ this.body = 'generator'; });
  
      return request(app.callback())
        .get('/')
        .expect(200)
        .expect('generator');
    });
  
    it('should throw error for non function', () => {
      const app = new Koa();
  
      [null, undefined, 0, false, 'not a function'].forEach(v => {
        assert.throws(() => app.use(v), /middleware must be a function!/);
      });
    });
  
    it('should output deprecation message for generator functions', done => {
      process.once('deprecation', message => {
        assert(/Support for generators will be removed/.test(message));
        done();
      });
  
      const app = new Koa();
      app.use(function * (){});
    });
  });
  