var assert = require('assert'); var gsass = require('../'); var gutil = require('gulp-util'); var fs = require('fs'); var path = require('path'); var test = require('tape'); function createVinyl(sassFileName, contents) { var base = path.join(__dirname, 'scss'); var filePath = path.join(base, sassFileName); return new gutil.File({ cwd: __dirname, base: base, path: filePath, contents: contents || fs.readFileSync(filePath) }); } test('pass file when isNull()', function (t) { var stream = gsass(); var emptyFile = { isNull: function () { return true; } }; stream.on('data', function (data) { t.equal(data, emptyFile); t.end(); }); stream.write(emptyFile); }); // test('emit error when file isStream()', function (t) { // var stream = gsass(); // var streamFile = { // isNull: function () { return false; }, // isStream: function () { return true; } // }; // stream.on() // }); test('compile a single sass file', function (t) { var sassFile = createVinyl('mixins.scss'); var stream = gsass(); stream.on('data', function (cssFile) { t.ok(cssFile, 'cssFile should exist'); t.ok(cssFile.path, 'cssFile.path should exist'); t.ok(cssFile.relative, 'cssFile.relative should exist'); t.ok(cssFile.contents, 'cssFile.contents should exist'); t.equal(cssFile.path, path.join(__dirname, 'scss', 'mixins.css')); t.equal( fs.readFileSync(path.join(__dirname, 'ref/mixins.css'), 'utf8'), cssFile.contents.toString(), 'file compiles correctly to css' ); t.end(); }) stream.write(sassFile); }); test('compile a single sass file synchronously', function (t) { var sassFile = createVinyl('mixins.scss'); var stream = gsass({sync: true}); stream.on('data', function (cssFile) { t.ok(cssFile, 'cssFile should exist'); t.ok(cssFile.path, 'cssFile.path should exist'); t.ok(cssFile.relative, 'cssFile.relative should exist'); t.ok(cssFile.contents, 'cssFile.contents should exist'); t.equal(cssFile.path, path.join(__dirname, 'scss', 'mixins.css')); t.equal( fs.readFileSync(path.join(__dirname, 'ref/mixins.css'), 'utf8'), cssFile.contents.toString(), 'file compiles correctly to css' ); t.end(); }) stream.write(sassFile); }); test('compile multiple sass files', function (t) { var files = [ createVinyl('inheritance.scss'), createVinyl('mixins.scss'), createVinyl('nesting.scss'), createVinyl('variables.scss') ]; t.plan(files.length * 4); var stream = gsass(); stream.on('data', function (cssFile) { t.ok(cssFile, 'cssFile exists'); t.ok(cssFile.path, 'cssFile.path exists'); t.ok(cssFile.relative, 'cssFile.relative exists'); t.ok(cssFile.contents, 'cssFile.contents exists'); }); files.forEach(function (file) { stream.write(file); }); }); test('emit error on sass errors', function (t) { var stream = gsass(); var errorFile = createVinyl('somefile.sass', new Buffer('body { font \'Comic Sans\'; }')); stream.on('error', function (err) { t.equal(err.message, 'source string:1: error: property "font" must be followed by a \':\'\n' ); t.end(); }); stream.write(errorFile); }); test('emit error on sass errors when using sync true', function (t) { var stream = gsass({sync: true}); var errorFile = createVinyl('somefile.sass', new Buffer('body { font \'Comic Sans\'; }')); stream.on('error', function (err) { t.equal(err.message, 'source string:1: error: property "font" must be followed by a \':\'\n' ); t.end(); }); stream.write(errorFile); }); test('call custom error callback when opts.onError is given', function (t) { var stream = gsass({ onError: function (err) { t.equal(err, 'source string:1: error: property "font" must be followed by a \':\'\n' ); t.end(); }}); var errorFile = createVinyl('somefile.sass', new Buffer('body { font \'Comic Sans\'; }')); stream.write(errorFile); });