123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708 |
- /*eslint new-cap: ["error", { "capIsNew": false }]*/
- 'use strict';
- var assert = require('assert').strict;
- var sass = require('../');
- var semver = require('semver');
- describe('sass.types', function() {
- describe('Boolean', function() {
- it('exists', function() {
- assert(sass.types.Boolean);
- });
- it('names the constructor correctly', function() {
- assert.strictEqual(sass.types.Boolean.name, 'SassBoolean');
- });
- it('supports call constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var t = sass.types.Boolean(true);
- assert.strictEqual(t.toString(), '[object SassBoolean]');
- var f = sass.types.Boolean(false);
- assert.strictEqual(f.toString(), '[object SassBoolean]');
- });
- it('has true and false singletons', function() {
- assert.strictEqual(sass.types.Boolean(true), sass.types.Boolean(true));
- assert.strictEqual(sass.types.Boolean(false), sass.types.Boolean(false));
- assert.notStrictEqual(sass.types.Boolean(false), sass.types.Boolean(true));
- assert.strictEqual(sass.types.Boolean(true), sass.types.Boolean.TRUE);
- assert.strictEqual(sass.types.Boolean(false), sass.types.Boolean.FALSE);
- });
- it('supports DOES NOT support new constructor', function() {
- assert.throws(function() {
- new sass.types.Boolean(true);
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Cannot instantiate SassBoolean');
- return true;
- });
- });
- it('throws with incorrect constructor args', function() {
- assert.throws(function() {
- sass.types.Boolean();
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Expected one boolean argument');
- return true;
- });
- [1, 2, '', 'hi', {}, []].forEach(function(arg) {
- assert.throws(function() {
- sass.types.Boolean(arg);
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Expected one boolean argument');
- return true;
- });
- });
- assert.throws(function() {
- sass.types.Boolean(true, false);
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Expected one boolean argument');
- return true;
- });
- });
- it('implements getValue', function() {
- var t = sass.types.Boolean(true);
- assert.strictEqual(typeof t.getValue, 'function');
- assert.strictEqual(t.getValue(), true);
- var f = sass.types.Boolean(false);
- assert.strictEqual(typeof f.getValue, 'function');
- assert.strictEqual(f.getValue(), false);
- });
- });
- describe('Color', function() {
- it('exists', function() {
- assert(sass.types.Color);
- });
- it('names the constructor correctly', function() {
- assert.strictEqual(sass.types.Color.name, 'SassColor');
- });
- it('supports call constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var t = sass.types.Color();
- assert.strictEqual(t.toString(), '[object SassColor]');
- });
- it('supports new constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var t = new sass.types.Color(1);
- assert.strictEqual(t.toString(), '[object SassColor]');
- });
- it('supports variadic constructor args', function() {
- var a = new sass.types.Color();
- assert.strictEqual(a.getR(), 0);
- assert.strictEqual(a.getG(), 0);
- assert.strictEqual(a.getB(), 0);
- assert.strictEqual(a.getA(), 1);
- var b = new sass.types.Color(1);
- assert.strictEqual(b.getR(), 0);
- assert.strictEqual(b.getG(), 0);
- assert.strictEqual(b.getB(), 1);
- assert.strictEqual(b.getA(), 0); // why ?
- assert.throws(function() {
- new sass.types.Color(1, 2);
- }, function(error) {
- // assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Constructor should be invoked with either 0, 1, 3 or 4 arguments.');
- return true;
- });
- var c = new sass.types.Color(1, 2, 3);
- assert.strictEqual(c.getR(), 1);
- assert.strictEqual(c.getG(), 2);
- assert.strictEqual(c.getB(), 3);
- assert.strictEqual(c.getA(), 1);
- var d = new sass.types.Color(1, 2, 3, 4);
- assert.strictEqual(d.getR(), 1);
- assert.strictEqual(d.getG(), 2);
- assert.strictEqual(d.getB(), 3);
- assert.strictEqual(d.getA(), 4);
- assert.throws(function() {
- new sass.types.Color(1, 2, 3, 4, 5);
- }, function(error) {
- // assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Constructor should be invoked with either 0, 1, 3 or 4 arguments.');
- return true;
- });
- });
- it('supports get{R,G,B,A} and set{R,G,B,A}', function() {
- var c = new sass.types.Color();
- assert.strictEqual(c.getR(), 0);
- assert.strictEqual(c.getG(), 0);
- assert.strictEqual(c.getB(), 0);
- assert.strictEqual(c.getA(), 1);
- assert.strictEqual(c.setR(1), undefined);
- assert.strictEqual(c.getR(), 1);
- assert.strictEqual(c.getG(), 0);
- assert.strictEqual(c.getB(), 0);
- assert.strictEqual(c.getA(), 1);
- assert.strictEqual(c.setG(1), undefined);
- assert.strictEqual(c.getR(), 1);
- assert.strictEqual(c.getG(), 1);
- assert.strictEqual(c.getB(), 0);
- assert.strictEqual(c.getA(), 1);
- assert.strictEqual(c.setB(1), undefined);
- assert.strictEqual(c.getR(), 1);
- assert.strictEqual(c.getG(), 1);
- assert.strictEqual(c.getB(), 1);
- assert.strictEqual(c.getA(), 1);
- assert.strictEqual(c.setA(0), undefined);
- assert.strictEqual(c.getR(), 1);
- assert.strictEqual(c.getG(), 1);
- assert.strictEqual(c.getB(), 1);
- assert.strictEqual(c.getA(), 0);
- });
- it('throws with incorrect set{R,G,B,A} arguments', function() {
- var c = new sass.types.Color();
- function assertJustOneArgument(cb) {
- assert.throws(function() {
- cb();
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Expected just one argument');
- return true;
- });
- }
- function assertNumberArgument(arg, cb) {
- assert.throws(function() {
- cb();
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Supplied value should be a number');
- return true;
- }, 'argument was: ' + arg);
- }
- assertJustOneArgument(function() { c.setR(); });
- assertJustOneArgument(function() { c.setG(); });
- assertJustOneArgument(function() { c.setB(); });
- assertJustOneArgument(function() { c.setA(); });
- assertJustOneArgument(function() { c.setR(1, 2); });
- assertJustOneArgument(function() { c.setG(1, 2); });
- assertJustOneArgument(function() { c.setB(1, 2); });
- assertJustOneArgument(function() { c.setA(1, 2); });
- [true, false, '0', '1', '', 'omg', {}, []].forEach(function(arg) {
- assertNumberArgument(arg, function() { c.setR(arg); });
- assertNumberArgument(arg, function() { c.setG(arg); });
- assertNumberArgument(arg, function() { c.setB(arg); });
- assertNumberArgument(arg, function() { c.setA(arg); });
- });
- });
- });
- describe('Error', function() {
- it('exists', function() {
- assert(sass.types.Error);
- });
- it('has a correctly named constructor', function() {
- assert.strictEqual(sass.types.Error.name, 'SassError');
- });
- it('supports call constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var e = sass.types.Error('Such Error');
- assert.ok(e instanceof sass.types.Error);
- assert.strictEqual(e.toString(), '[object SassError]');
- // TODO: I'm not sure this object works well, it likely needs to be fleshed out more...
- });
- it('supports new constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var e = new sass.types.Error('Such Error');
- assert.ok(e instanceof sass.types.Error);
- assert.strictEqual(e.toString(), '[object SassError]');
- // TODO: I'm not sure this object works well, it likely needs to be fleshed out more...
- });
- });
- describe('List', function() {
- it('exists', function() {
- assert(sass.types.List);
- });
- it('has a correctly named constructor', function() {
- assert.strictEqual(sass.types.List.name, 'SassList');
- });
- it('support call constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var list = sass.types.List();
- assert.ok(list instanceof sass.types.List);
- assert.strictEqual(list.toString(), '[object SassList]');
- });
- it('support new constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var list = new sass.types.List();
- assert.ok(list instanceof sass.types.List);
- assert.strictEqual(list.toString(), '[object SassList]');
- });
- it('support variadic constructor', function() {
- var a = new sass.types.List();
- assert.strictEqual(a.getLength(), 0);
- assert.strictEqual(a.getSeparator(), true);
- var b = new sass.types.List(1);
- assert.strictEqual(b.getSeparator(), true);
- assert.strictEqual(b.getLength(), 1);
- var c = new sass.types.List(1, true);
- assert.strictEqual(b.getLength(), 1);
- assert.strictEqual(c.getSeparator(), true);
- var d = new sass.types.List(1, false);
- assert.strictEqual(b.getLength(), 1);
- assert.strictEqual(d.getSeparator(), false);
- var e = new sass.types.List(1, true, 2);
- assert.strictEqual(b.getLength(), 1);
- assert.strictEqual(e.getSeparator(), true);
- assert.throws(function() {
- new sass.types.List('not-a-number');
- }, function(error) {
- // TODO: TypeError
- assert.strictEqual(error.message, 'First argument should be an integer.');
- return true;
- });
- assert.throws(function() {
- new sass.types.List(1, 'not-a-boolean');
- }, function(error) {
- // TODO: TypeError
- assert.strictEqual(error.message, 'Second argument should be a boolean.');
- return true;
- });
- });
- it('supports {get,set}Separator', function() {
- var a = new sass.types.List();
- assert.strictEqual(a.getSeparator(), true);
- assert.strictEqual(a.setSeparator(true), undefined);
- assert.strictEqual(a.getSeparator(), true);
- assert.strictEqual(a.setSeparator(false), undefined);
- assert.strictEqual(a.getSeparator(), false);
- assert.throws(function() {
- a.setSeparator();
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Expected just one argument');
- return true;
- });
- [1, '', [], {}].forEach(function(arg) {
- assert.throws(function() {
- a.setSeparator(arg);
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Supplied value should be a boolean');
- return true;
- }, 'setSeparator(' + arg + ')');
- });
- });
- it('supports setValue and getValue', function() {
- var a = new sass.types.List();
- assert.throws(function() {
- a.getValue();
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Expected just one argument');
- return true;
- });
- ['hi', [], {}].forEach(function(arg) {
- assert.throws(function() {
- a.getValue(arg);
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Supplied index should be an integer');
- return true;
- }, 'getValue(' + arg + ')');
- });
- assert.throws(function() {
- a.getValue(0);
- }, function(error) {
- assert.ok(error instanceof RangeError);
- assert.strictEqual(error.message, 'Out of bound index');
- return true;
- });
- assert.throws(function() {
- a.getValue(-1);
- }, function(error) {
- assert.ok(error instanceof RangeError);
- assert.strictEqual(error.message, 'Out of bound index');
- return true;
- });
- assert.throws(function() {
- a.setValue();
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Expected two arguments');
- return true;
- });
- assert.throws(function() {
- a.setValue(1);
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Expected two arguments');
- return true;
- });
- assert.throws(function() {
- a.setValue(0, 'no-a-sass-value');
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Supplied value should be a SassValue object');
- return true;
- });
- });
- // TODO: more complex set/get value scenarios
- });
- describe('Map', function() {
- it('exists', function() {
- assert(sass.types.Map);
- });
- it('has a correctly named constructor', function() {
- assert.strictEqual(sass.types.Map.name, 'SassMap');
- });
- it('supports call constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var x = sass.types.Map();
- assert.strictEqual(x.toString(), '[object SassMap]');
- });
- it('supports new constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var x = new sass.types.Map();
- assert.strictEqual(x.toString(), '[object SassMap]');
- });
- it('supports an optional constructor argument', function() {
- var x = new sass.types.Map();
- var y = new sass.types.Map(1);
- var z = new sass.types.Map(2, 3);
- assert.throws(function() {
- new sass.types.Map('OMG');
- }, function(error) {
- assert.strictEqual(error.message, 'First argument should be an integer.');
- // TODO: TypeError
- return true;
- });
- assert.strictEqual(x.getLength(), 0);
- assert.strictEqual(y.getLength(), 1);
- assert.strictEqual(z.getLength(), 2);
- });
- it('supports length', function() {
- var y = new sass.types.Map(1);
- var z = new sass.types.Map(2);
- assert.strictEqual(y.getLength(), 1);
- assert.strictEqual(z.getLength(), 2);
- });
- it('supports {get,set}Value {get,set}Key', function() {
- var y = new sass.types.Map(1);
- var omg = new sass.types.String('OMG');
- y.setValue(0, omg);
- console.log(y.getValue(0));
- });
- });
- describe('Null', function() {
- it('exists', function() {
- assert(sass.types.Null);
- });
- it('has a correctly named constructor', function() {
- assert.strictEqual(sass.types.Null.name, 'SassNull');
- });
- it('does not support new constructor', function() {
- assert.throws(function() {
- new sass.types.Null();
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Cannot instantiate SassNull');
- return true;
- });
- });
- it('supports call constructor (and is a singleton)', function() {
- assert.strictEqual(sass.types.Null(), sass.types.Null());
- assert.strictEqual(sass.types.Null(), sass.types.Null.NULL);
- });
- });
- describe('Number', function() {
- it('exists', function() {
- assert(sass.types.Number);
- });
- it('has a correctly named constructor', function() {
- assert.strictEqual(sass.types.Number.name, 'SassNumber');
- });
- it('supports new constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var number = new sass.types.Number();
- assert.strictEqual(number.toString(), '[object SassNumber]');
- });
- it('supports call constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var number = sass.types.Number();
- assert.strictEqual(number.toString(), '[object SassNumber]');
- });
- it('supports multiple constructor arguments', function() {
- var a = new sass.types.Number();
- var b = new sass.types.Number(1);
- var c = new sass.types.Number(2, 'px');
- assert.throws(function() {
- new sass.types.Number('OMG');
- }, function(error) {
- // TODO: TypeError
- assert.strictEqual(error.message, 'First argument should be a number.');
- return true;
- });
- assert.throws(function() {
- new sass.types.Number(1, 2);
- }, function(error) {
- // TODO: TypeError
- assert.strictEqual(error.message, 'Second argument should be a string.');
- return true;
- });
- assert.strictEqual(a.getValue(), 0);
- assert.strictEqual(a.getUnit(), '');
- assert.strictEqual(b.getValue(), 1);
- assert.strictEqual(b.getUnit(), '');
- assert.strictEqual(c.getValue(), 2);
- assert.strictEqual(c.getUnit(), 'px');
- });
- it('supports get{Unit,Value}, set{Unit,Value}', function() {
- var number = new sass.types.Number(1, 'px');
- assert.strictEqual(number.getValue(), 1);
- assert.strictEqual(number.getUnit(), 'px');
- number.setValue(2);
- assert.strictEqual(number.getValue(), 2);
- assert.strictEqual(number.getUnit(), 'px');
- number.setUnit('em');
- assert.strictEqual(number.getValue(), 2);
- assert.strictEqual(number.getUnit(), 'em');
- assert.throws(function() {
- number.setValue('OMG');
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Supplied value should be a number');
- return true;
- });
- assert.throws(function() {
- number.setValue();
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Expected just one argument');
- return true;
- });
- assert.throws(function() {
- number.setUnit();
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Expected just one argument');
- return true;
- });
- assert.throws(function() {
- number.setUnit(1);
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Supplied value should be a string');
- return true;
- });
- });
- });
- describe('String', function() {
- it('exists', function() {
- assert(sass.types.String);
- });
- it('has a properly named constructor', function() {
- assert.strictEqual(sass.types.String.name, 'SassString');
- });
- it('supports call constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var x = sass.types.String('OMG');
- assert.strictEqual(x.toString(), '[object SassString]');
- assert.strictEqual(x.getValue(), 'OMG');
- });
- it('supports new constructor', function() {
- if(semver.gt(process.version, 'v14.5.0')) {
- // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
- this.skip();
- }
- var x = new sass.types.String('OMG');
- assert.strictEqual(x.toString(), '[object SassString]');
- assert.strictEqual(x.getValue(), 'OMG');
- });
- it('supports multiple constructor arg combinations', function() {
- new sass.types.String();
- new sass.types.String('OMG');
- new sass.types.String('OMG', 'NOPE');
- [null, undefined, [], {}, function() { }].forEach(function(arg) {
- assert.throws(function() {
- new sass.types.String(arg);
- }, function(error) {
- // TODO: TypeError
- assert.strictEqual(error.message, 'Argument should be a string.');
- return true;
- });
- });
- });
- it('supports {get,set}Value', function() {
- var x = new sass.types.String();
- assert.strictEqual(x.getValue(), '');
- assert.strictEqual(x.setValue('hi'), undefined);
- assert.strictEqual(x.getValue(), 'hi');
- assert.strictEqual(x.setValue('bye'), undefined);
- assert.strictEqual(x.getValue(), 'bye');
- assert.throws(function() {
- x.setValue();
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Expected just one argument');
- return true;
- });
- assert.throws(function() {
- x.setValue('hi', 'hi');
- }, function(error) {
- assert.ok(error instanceof TypeError);
- assert.strictEqual(error.message, 'Expected just one argument');
- return true;
- });
- });
- });
- });
|