/* eslint max-nested-callbacks:[1] */ 'use strict'; var fs = require('fs'); var path = require('path'); var gulp = require('gulp'); var gutil = require('gulp-util'); var rimraf = require('rimraf'); var mkdirp = require('mkdirp'); var assert = require('assert'); var streamtest = require('streamtest'); var neatequal = require('neatequal'); var svgicons2svgfont = require('../src/index'); var defaultMetadataProvider = require('svgicons2svgfont/src/metadata'); describe('gulp-svgicons2svgfont', function() { beforeEach(function(done) { mkdirp(path.join(__dirname, 'results'), done); }); afterEach(function(done) { rimraf(path.join(__dirname, 'results'), done); }); streamtest.versions.forEach(function(version) { describe('for ' + version + ' streams', function() { describe('must emit an error', function() { it('when a glyph is bad', function(done) { streamtest[version].fromObjects([new gutil.File({ path: 'bibabelula.svg', contents: streamtest.v2.fromChunks(['oh', 'yeah']), })]) .pipe(svgicons2svgfont({ fontName: 'unprefixedicons', }) .on('error', function(err) { assert.equal( err.message, 'Non-whitespace before first tag.\nLine: 0\nColumn: 1\nChar: o' ); }).pipe(streamtest.v2.toObjects(function(err) { if(err) { return done(err); } done(); }))); }); }); describe('with null contents', function() { it('should let null files pass through', function(done) { var file = new gutil.File({ path: 'bibabelula.svg', contents: null, }); streamtest[version].fromObjects([file]) .pipe(svgicons2svgfont({ fontName: 'cleanicons', })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files[0].path, 'bibabelula.svg'); assert.equal(files[0].contents, null); assert.equal(files.length, 1); done(); })); }); }); it('should let non-svg files pass through (prependUnicode)', function(done) { var file = new gutil.File({ path: 'bibabelula.foo', contents: streamtest.v2.fromChunks(['oh', 'yeah']), }); streamtest[version].fromObjects([file]) .pipe(svgicons2svgfont({ fontName: 'unprefixedicons', startUnicode: 0xE001, prependUnicode: true, })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files[0].path, 'bibabelula.foo'); assert.equal(files.length, 1); done(); })); }); it('should let non-svg files pass through', function(done) { var file = new gutil.File({ path: 'bibabelula.foo', contents: streamtest.v2.fromChunks(['oh', 'yeah']), }); streamtest[version].fromObjects([file]) .pipe(svgicons2svgfont({ fontName: 'unprefixedicons', startUnicode: 0xE001, })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files[0].path, 'bibabelula.foo'); assert.equal(files.length, 1); done(); })); }); describe('in stream mode', function() { it('should work with cleanicons', function(done) { gulp.src( path.join(__dirname, 'fixtures', 'cleanicons', '*.svg'), { buffer: false } ) .pipe(svgicons2svgfont({ fontName: 'cleanicons', startUnicode: 0xE001, })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files.length, 1); assert.equal(files[0].isStream(), true); files[0].pipe(streamtest.v2.toText(function(err2, text) { if(err2) { return done(err2); } assert.equal( text, fs.readFileSync( path.join(__dirname, 'expected', 'test-cleanicons-font.svg'), 'utf8' ) ); done(); })); })); }); it('should work with the metadataProvider option', function(done) { gulp.src( path.join(__dirname, 'fixtures', 'cleanicons', '*.svg'), { buffer: false } ) .pipe(svgicons2svgfont({ fontName: 'cleanicons', metadataProvider: defaultMetadataProvider({ startUnicode: 0xE001, }), })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files.length, 1); assert.equal(files[0].isStream(), true); files[0].pipe(streamtest.v2.toText(function(err2, text) { if(err2) { return done(err2); } assert.equal( text, fs.readFileSync( path.join(__dirname, 'expected', 'test-cleanicons-font.svg'), 'utf8' ) ); done(); })); })); }); it('should work with prefixedicons', function(done) { gulp.src( path.join(__dirname, 'fixtures', 'prefixedicons', '*.svg'), { buffer: false } ) .pipe(svgicons2svgfont({ fontName: 'prefixedicons', startUnicode: 0xE001, })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files.length, 1); assert.equal(files[0].isStream(), true); files[0].pipe(streamtest.v2.toText(function(err2, text) { if(err2) { return done(err2); } assert.equal( text, fs.readFileSync( path.join(__dirname, 'expected', 'test-prefixedicons-font.svg'), 'utf8' ) ); done(); })); })); }); it('should work with originalicons', function(done) { gulp.src( path.join(__dirname, 'fixtures', 'originalicons', '*.svg'), { buffer: false } ) .pipe(svgicons2svgfont({ fontName: 'originalicons', })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files.length, 1); assert.equal(files[0].isStream(), true); files[0].pipe(streamtest.v2.toText(function(err2, text) { if(err2) { return done(err2); } assert.equal( text, fs.readFileSync( path.join(__dirname, 'expected', 'test-originalicons-font.svg'), 'utf8' ) ); done(); })); })); }); describe('', function() { beforeEach(function(done) { gulp.src(path.join(__dirname, 'fixtures', 'unprefixedicons', '*.svg')) .pipe(gulp.dest(path.join(__dirname, 'results', 'unprefixedicons'))) .on('error', done) .on('end', done); }); it('should work with unprefixed icons and the prependUnicode option', function(done) { gulp.src( path.join(__dirname, 'results', 'unprefixedicons', '*.svg'), { buffer: false } ) .pipe(svgicons2svgfont({ fontName: 'unprefixedicons', prependUnicode: true, })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files.length, 1); assert.equal(files[0].isStream(), true); files[0].pipe(streamtest.v2.toText(function(err2, text) { if(err2) { return done(err2); } assert.equal( text, fs.readFileSync( path.join(__dirname, 'expected', 'test-unprefixedicons-font.svg'), 'utf8' ) ); assert.equal(fs.existsSync(path.join( __dirname, 'results', 'unprefixedicons', 'uEA01-arrow-down.svg' )), true); assert.equal( fs.readFileSync(path.join( __dirname, 'results', 'unprefixedicons', 'uEA01-arrow-down.svg' ), 'utf8'), fs.readFileSync(path.join( __dirname, 'fixtures', 'unprefixedicons', 'arrow-down.svg' ), 'utf8') ); assert.equal(fs.existsSync(path.join( __dirname, 'results', 'unprefixedicons', 'uEA02-arrow-left.svg' )), true); assert.equal( fs.readFileSync(path.join( __dirname, 'results', 'unprefixedicons', 'uEA02-arrow-left.svg' ), 'utf8'), fs.readFileSync(path.join( __dirname, 'fixtures', 'unprefixedicons', 'arrow-left.svg' ), 'utf8') ); assert.equal(fs.existsSync(path.join( __dirname, 'results', 'unprefixedicons', 'uEA03-arrow-right.svg' )), true); assert.equal( fs.readFileSync(path.join( __dirname, 'results', 'unprefixedicons', 'uEA03-arrow-right.svg' ), 'utf8'), fs.readFileSync(path.join( __dirname, 'fixtures', 'unprefixedicons', 'arrow-right.svg' ), 'utf8') ); assert.equal(fs.existsSync(path.join( __dirname, 'results', 'unprefixedicons', 'uEA04-arrow-up.svg' )), true); assert.equal( fs.readFileSync(path.join( __dirname, 'results', 'unprefixedicons', 'uEA04-arrow-up.svg' ), 'utf8'), fs.readFileSync(path.join( __dirname, 'fixtures', 'unprefixedicons', 'arrow-up.svg' ), 'utf8') ); done(); })); })); }); }); describe('', function() { beforeEach(function(done) { gulp.src(path.join(__dirname, 'fixtures', 'unicons', '*.svg')) .pipe(gulp.dest(path.join(__dirname, 'results', 'unicons'))) .on('error', done) .on('end', done); }); it('should work with mixed icons and the prependUnicode option', function(done) { gulp.src( path.join(__dirname, 'results', 'unicons', '*.svg'), { buffer: false } ) .pipe(svgicons2svgfont({ fontName: 'unicons', prependUnicode: true, })).on('error', done) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files.length, 1); assert.equal(files[0].isStream(), true); files[0].pipe(streamtest.v2.toText(function(err2, text) { if(err2) { return done(err2); } assert.equal( text, fs.readFileSync( path.join(__dirname, 'expected', 'test-unicons-font.svg'), 'utf8' ) ); assert.equal(fs.existsSync(path.join( __dirname, 'results', 'unicons', 'uEA01-twitter.svg' )), true); assert.equal( fs.readFileSync(path.join( __dirname, 'results', 'unicons', 'uEA01-twitter.svg' ), 'utf8'), fs.readFileSync(path.join( __dirname, 'fixtures', 'unicons', 'uEA01-twitter.svg' ), 'utf8') ); assert.equal(fs.existsSync(path.join( __dirname, 'results', 'unicons', 'uEA02-facebook.svg' )), true); assert.equal( fs.readFileSync(path.join( __dirname, 'results', 'unicons', 'uEA02-facebook.svg' ), 'utf8'), fs.readFileSync(path.join( __dirname, 'fixtures', 'unicons', 'facebook.svg' ), 'utf8') ); done(); })); })); }); }); it('should emit an event with the codepoint mapping', function(done) { var codepoints; gulp.src( path.join(__dirname, 'fixtures', 'cleanicons', '*.svg'), { buffer: false } ) .pipe(svgicons2svgfont({ fontName: 'cleanicons', startUnicode: 0xE001, })) .on('glyphs', function(_codepoints_) { codepoints = _codepoints_; }) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files.length, 1); assert.equal(files[0].isStream(), true); files[0].pipe(streamtest.v2.toText(function(err2, text) { if(err2) { return done(err2); } assert(codepoints); neatequal( codepoints, JSON.parse(fs.readFileSync( path.join(__dirname, 'expected', 'test-codepoints.json'), 'utf8' )) ); assert.equal( text, fs.readFileSync( path.join(__dirname, 'expected', 'test-cleanicons-font.svg'), 'utf8' ) ); done(); })); })); }); it('should support filename change', function(done) { gulp.src( path.join(__dirname, 'fixtures', 'cleanicons', '*.svg'), { buffer: false } ) .pipe(svgicons2svgfont({ fontName: 'cleanicons', fileName: 'newName', startUnicode: 0xE001, })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files.length, 1); assert.equal(files[0].isStream(), true); assert.equal(fs.exists(__dirname, 'fixtures', 'cleanicons', 'newName.svg')); done(); })); }); }); describe('in buffer mode', function() { it('should work with cleanicons', function(done) { gulp.src( path.join(__dirname, 'fixtures', 'cleanicons', '*.svg'), { buffer: true } ) .pipe(svgicons2svgfont({ fontName: 'cleanicons', startUnicode: 0xE001, })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files.length, 1); assert.equal(files[0].isBuffer(), true); assert.equal( files[0].contents.toString('utf8'), fs.readFileSync(path.join(__dirname, 'expected', 'test-cleanicons-font.svg')) ); done(); })); }); it('should work with prefixedicons', function(done) { gulp.src( path.join(__dirname, 'fixtures', 'prefixedicons', '*.svg'), { buffer: true } ) .pipe(svgicons2svgfont({ fontName: 'prefixedicons', startUnicode: 0xE001, })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files.length, 1); assert.equal(files[0].isBuffer(), true); assert.equal( files[0].contents.toString('utf8'), fs.readFileSync(path.join(__dirname, 'expected', 'test-prefixedicons-font.svg')) ); done(); })); }); it('should work with originalicons', function(done) { gulp.src( path.join(__dirname, 'fixtures', 'originalicons', '*.svg'), { buffer: true } ) .pipe(svgicons2svgfont({ fontName: 'originalicons', })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files.length, 1); assert.equal(files[0].isBuffer(), true); assert.equal( files[0].contents.toString('utf8'), fs.readFileSync(path.join(__dirname, 'expected', 'test-originalicons-font.svg')) ); done(); })); }); it('should support filename change', function(done) { gulp.src( path.join(__dirname, 'fixtures', 'cleanicons', '*.svg'), { buffer: true } ) .pipe(svgicons2svgfont({ fontName: 'cleanicons', fileName: 'newName', startUnicode: 0xE001, })) .pipe(streamtest.v2.toObjects(function(err, files) { if(err) { return done(err); } assert.equal(files.length, 1); assert.equal(files[0].isBuffer(), true); assert.equal(fs.exists(__dirname, 'fixtures', 'cleanicons', 'newName.svg')); done(); })); }); }); }); }); describe('must throw error', function() { it('when no fontname is given', function() { assert.throws(function() { svgicons2svgfont(); }); }); it('when using old options', function() { assert.throws(function() { svgicons2svgfont({ appendUnicode: true, }); }); }); }); });