m = require('mochainon')
path = require('path')
stream = require('stream')
StringStream = require('string-stream')
utils = require('../lib/utils')

describe 'Utils:', ->

	describe '.createTemporaryWriteStream()', ->

		it 'should create an instanceof WriteStream', (done) ->
			promise = utils.createTemporaryWriteStream()
			promise.spread (temporaryStream, temporaryPath, cleanupCallback) ->
				m.chai.expect(temporaryStream).to.be.an.instanceof(stream.Writable)
				cleanupCallback()
			.nodeify(done)

		it 'should pass an absolute path to the temporary file', (done) ->
			isAbsolute = (input) ->
				path.resolve(input) is path.normalize(input)

			promise = utils.createTemporaryWriteStream()
			promise.spread (temporaryStream, temporaryPath, cleanupCallback) ->
				m.chai.expect(isAbsolute(temporaryPath)).to.be.true
				cleanupCallback()
			.nodeify(done)

	describe '.replaceStream()', ->

		describe 'given a single replace match', ->

			it 'should replace the match', (done) ->
				input = new StringStream('foo bar baz')
				output = new StringStream()

				utils.replaceStream(input, output, /bar/, 'qux').then ->
					m.chai.expect(output.toString()).to.equal('foo qux baz')
				.nodeify(done)

		describe 'given no replace match', ->

			it 'should keep the stream intact', (done) ->
				input = new StringStream('foo bar baz')
				output = new StringStream()

				utils.replaceStream(input, output, /hello/, 'qux').then ->
					m.chai.expect(output.toString()).to.equal('foo bar baz')
				.nodeify(done)

		describe 'given multiple replace matches', ->

			it 'should replace them all if using the global flag', (done) ->
				input = new StringStream('foo bar baz\nbar bar qux')
				output = new StringStream()

				utils.replaceStream(input, output, /bar/g, 'qux').then ->
					m.chai.expect(output.toString()).to.equal('foo qux baz\nqux qux qux')
				.nodeify(done)

			it 'should replace the first one if not using the global flag', (done) ->
				input = new StringStream('foo bar baz\nbar bar qux')
				output = new StringStream()

				utils.replaceStream(input, output, /bar/, 'qux').then ->
					m.chai.expect(output.toString()).to.equal('foo qux baz\nbar bar qux')
				.nodeify(done)
