diff --git a/mz/mz-tests.ts b/mz/mz-tests.ts
new file mode 100644
index 000000000..abcff6ac6
--- /dev/null
+++ b/mz/mz-tests.ts
@@ -0,0 +1,241 @@
+///
+///
+///
+
+
+import assert = require('assert')
+import fs = require('mz/fs')
+
+
+describe('fs', function () {
+
+ it('.stat()', function (done) {
+ fs.stat(__filename).then(function (stats) {
+ assert.equal(typeof stats.size, 'number')
+ done()
+ }).catch(done)
+ })
+
+ it('.statSync()', function () {
+ var stats = fs.statSync(__filename)
+ assert.equal(typeof stats.size, 'number')
+ })
+
+ it('.exists()', function (done) {
+ fs.exists(__filename).then(function (exists) {
+ assert(exists)
+ done()
+ }).catch(done)
+ })
+
+ it('.existsSync()', function () {
+ var exists = fs.existsSync(__filename)
+ assert(exists)
+ })
+
+ describe('callback support', function () {
+ it('.stat()', function (done) {
+ fs.stat(__filename, function (err, stats) {
+ assert(!err)
+ assert.equal(typeof stats.size, 'number')
+ done()
+ })
+ })
+
+ it('.exists()', function (done) {
+ fs.exists(__filename, function (err, exists) {
+ assert(!err)
+ assert(exists)
+ done()
+ })
+ })
+ })
+})
+
+import cp = require('mz/child_process')
+describe('child_process', function () {
+
+
+ it('.exec().then()', function (done) {
+ cp.exec('node --version').then(function (params) {
+ assert.equal(params[0].toString('utf8')[0], 'v')
+ done()
+ })
+ })
+
+ it('.exec().catch()', function (done) {
+ cp.exec('lkajsdfkljalskdfjalsdf').catch(function (err) {
+ done()
+ })
+ })
+
+ describe('callback support', function () {
+ it('.exec() success', function (done) {
+ cp.exec('node --version', function (err, stdout) {
+ assert.equal(stdout.toString('utf8')[0], 'v')
+ done()
+ })
+ })
+
+ it('.exec() err', function (done) {
+ cp.exec('lkajsdfkljalskdfjalsdf', function (err) {
+ assert(err)
+ done()
+ })
+ })
+ })
+})
+
+import crypto = require('mz/crypto')
+
+describe('crypto', function () {
+
+ it('.randomBytes().then()', function (done) {
+ crypto.randomBytes(8).then(function (buf) {
+ assert.equal(buf.length, 8)
+ done()
+ })
+ })
+
+ describe('callback support', function () {
+ it('.randomBytes()', function (done) {
+ crypto.randomBytes(8, function (err, buf) {
+ assert(!err)
+ assert.equal(buf.length, 8)
+ done()
+ })
+ })
+ })
+})
+
+import stream = require('stream')
+import readline = require('mz/readline')
+
+describe('readline', function () {
+
+
+ it('.question().then()', function (done) {
+ var input = new stream.PassThrough()
+ var output = new stream.PassThrough()
+ var rl = readline.createInterface({ input: input, output: output })
+
+ rl.question('a').then(function (answer) {
+ assert.equal(answer, 'b')
+ done()
+ })
+
+ assert.equal(output.read(), 'a')
+ input.write('b\n')
+ })
+
+ it('completer support', function (done) {
+ function completer (line:string) {
+ assert.equal(line, 'b')
+ return Promise.resolve([['bTESTSTRING'], line])
+ }
+
+ var input = new stream.PassThrough()
+ var output = new stream.PassThrough()
+ var bufferedOutput = ''
+ var rl = readline.createInterface( input, output, completer, true )
+
+ rl.question('a').then(function (answer: string) {
+ assert.equal(answer, 'bTESTSTRING')
+ done()
+ })
+
+ function onOutputData (data: Buffer | String) {
+ bufferedOutput += data.toString()
+
+ if (bufferedOutput.match(/TESTSTRING/)) {
+ input.write('\n')
+ output.removeListener('data', onOutputData)
+ }
+ }
+
+ output.on('data', onOutputData)
+ input.write('b\t')
+ })
+
+ describe('callback support', function () {
+ it('.question()', function (done) {
+ var input = new stream.PassThrough()
+ var output = new stream.PassThrough()
+ var rl = readline.createInterface({ input: input, output: output })
+
+ rl.question('a', function (answer) {
+ assert.equal(answer, 'b')
+ done()
+ })
+
+ assert.equal(output.read(), 'a')
+ input.write('b\n')
+ })
+
+ it('completer support sync', function (done) {
+ function completer (line: string) {
+ assert.equal(line, 'b')
+ return <[string[], string]>[['bTESTSTRING'], line]
+ }
+
+ var input = new stream.PassThrough()
+ var output = new stream.PassThrough()
+ var rl = readline.createInterface(input, output, completer, true)
+
+ rl.question('a').then(function (answer) {
+ assert.ok(output.read().toString().match(/TESTSTRING/))
+ done()
+ })
+
+ input.write('b\t\n')
+ })
+
+ it('completer support async', function (done) {
+ function completer (line: string, cb: (err: any, result: [string[], string]) => void) {
+ assert.equal(line, 'b')
+ cb(null, [['bTESTSTRING'], line])
+ }
+
+ var input = new stream.PassThrough()
+ var output = new stream.PassThrough()
+ var rl = readline.createInterface(input, output, completer, true )
+
+ rl.question('a').then(function (answer) {
+ assert.ok(output.read().toString().match(/TESTSTRING/))
+ done()
+ })
+
+ input.write('b\t\n')
+ })
+ })
+})
+
+import zlib = require('mz/zlib')
+
+describe('zlib', function () {
+
+ it('.gzip().then().gunzip()', function (done) {
+ var buf = new Buffer("lol", 'utf-8');
+ zlib.gzip(buf).then(function (res) {
+ return zlib.gunzip(res)
+ }).then(function (string) {
+ assert.equal(string, 'lol')
+ done()
+ })
+ })
+
+ describe('callback support', function () {
+ it('.gzip() and .gunzip()', function (done) {
+ var buf = new Buffer("lol", 'utf-8');
+ zlib.gzip(buf, function (err, res) {
+ assert(!err)
+ assert(Buffer.isBuffer(res))
+ zlib.gunzip(res, function (err, string) {
+ assert(!err)
+ assert.equal(string, 'lol')
+ done()
+ })
+ })
+ })
+ })
+})