UNPKG

22.3 kBJavaScriptView Raw
1/*eslint new-cap: ["error", { "capIsNew": false }]*/
2'use strict';
3
4var assert = require('assert').strict;
5var sass = require('../');
6var semver = require('semver');
7
8describe('sass.types', function() {
9 describe('Boolean', function() {
10 it('exists', function() {
11 assert(sass.types.Boolean);
12 });
13
14 it('names the constructor correctly', function() {
15 assert.strictEqual(sass.types.Boolean.name, 'SassBoolean');
16 });
17
18 it('supports call constructor', function() {
19 if(semver.gt(process.version, 'v14.5.0')) {
20 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
21 this.skip();
22 }
23 var t = sass.types.Boolean(true);
24 assert.strictEqual(t.toString(), '[object SassBoolean]');
25
26 var f = sass.types.Boolean(false);
27 assert.strictEqual(f.toString(), '[object SassBoolean]');
28 });
29
30 it('has true and false singletons', function() {
31 assert.strictEqual(sass.types.Boolean(true), sass.types.Boolean(true));
32 assert.strictEqual(sass.types.Boolean(false), sass.types.Boolean(false));
33 assert.notStrictEqual(sass.types.Boolean(false), sass.types.Boolean(true));
34 assert.strictEqual(sass.types.Boolean(true), sass.types.Boolean.TRUE);
35 assert.strictEqual(sass.types.Boolean(false), sass.types.Boolean.FALSE);
36 });
37
38 it('supports DOES NOT support new constructor', function() {
39 assert.throws(function() {
40 new sass.types.Boolean(true);
41 }, function(error) {
42 assert.ok(error instanceof TypeError);
43 assert.strictEqual(error.message, 'Cannot instantiate SassBoolean');
44 return true;
45 });
46 });
47
48 it('throws with incorrect constructor args', function() {
49 assert.throws(function() {
50 sass.types.Boolean();
51 }, function(error) {
52 assert.ok(error instanceof TypeError);
53 assert.strictEqual(error.message, 'Expected one boolean argument');
54 return true;
55 });
56
57 [1, 2, '', 'hi', {}, []].forEach(function(arg) {
58 assert.throws(function() {
59 sass.types.Boolean(arg);
60 }, function(error) {
61 assert.ok(error instanceof TypeError);
62 assert.strictEqual(error.message, 'Expected one boolean argument');
63 return true;
64 });
65 });
66
67 assert.throws(function() {
68 sass.types.Boolean(true, false);
69 }, function(error) {
70 assert.ok(error instanceof TypeError);
71 assert.strictEqual(error.message, 'Expected one boolean argument');
72 return true;
73 });
74 });
75
76 it('implements getValue', function() {
77 var t = sass.types.Boolean(true);
78 assert.strictEqual(typeof t.getValue, 'function');
79 assert.strictEqual(t.getValue(), true);
80
81 var f = sass.types.Boolean(false);
82 assert.strictEqual(typeof f.getValue, 'function');
83 assert.strictEqual(f.getValue(), false);
84 });
85 });
86
87 describe('Color', function() {
88 it('exists', function() {
89 assert(sass.types.Color);
90 });
91
92 it('names the constructor correctly', function() {
93 assert.strictEqual(sass.types.Color.name, 'SassColor');
94 });
95
96 it('supports call constructor', function() {
97 if(semver.gt(process.version, 'v14.5.0')) {
98 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
99 this.skip();
100 }
101
102 var t = sass.types.Color();
103 assert.strictEqual(t.toString(), '[object SassColor]');
104 });
105
106 it('supports new constructor', function() {
107 if(semver.gt(process.version, 'v14.5.0')) {
108 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
109 this.skip();
110 }
111
112 var t = new sass.types.Color(1);
113 assert.strictEqual(t.toString(), '[object SassColor]');
114 });
115
116 it('supports variadic constructor args', function() {
117 var a = new sass.types.Color();
118
119 assert.strictEqual(a.getR(), 0);
120 assert.strictEqual(a.getG(), 0);
121 assert.strictEqual(a.getB(), 0);
122 assert.strictEqual(a.getA(), 1);
123
124 var b = new sass.types.Color(1);
125
126 assert.strictEqual(b.getR(), 0);
127 assert.strictEqual(b.getG(), 0);
128 assert.strictEqual(b.getB(), 1);
129 assert.strictEqual(b.getA(), 0); // why ?
130
131 assert.throws(function() {
132 new sass.types.Color(1, 2);
133 }, function(error) {
134 // assert.ok(error instanceof TypeError);
135 assert.strictEqual(error.message, 'Constructor should be invoked with either 0, 1, 3 or 4 arguments.');
136 return true;
137 });
138
139 var c = new sass.types.Color(1, 2, 3);
140
141 assert.strictEqual(c.getR(), 1);
142 assert.strictEqual(c.getG(), 2);
143 assert.strictEqual(c.getB(), 3);
144 assert.strictEqual(c.getA(), 1);
145
146 var d = new sass.types.Color(1, 2, 3, 4);
147
148 assert.strictEqual(d.getR(), 1);
149 assert.strictEqual(d.getG(), 2);
150 assert.strictEqual(d.getB(), 3);
151 assert.strictEqual(d.getA(), 4);
152
153 assert.throws(function() {
154 new sass.types.Color(1, 2, 3, 4, 5);
155 }, function(error) {
156 // assert.ok(error instanceof TypeError);
157 assert.strictEqual(error.message, 'Constructor should be invoked with either 0, 1, 3 or 4 arguments.');
158 return true;
159 });
160 });
161
162 it('supports get{R,G,B,A} and set{R,G,B,A}', function() {
163 var c = new sass.types.Color();
164
165 assert.strictEqual(c.getR(), 0);
166 assert.strictEqual(c.getG(), 0);
167 assert.strictEqual(c.getB(), 0);
168 assert.strictEqual(c.getA(), 1);
169
170 assert.strictEqual(c.setR(1), undefined);
171
172 assert.strictEqual(c.getR(), 1);
173 assert.strictEqual(c.getG(), 0);
174 assert.strictEqual(c.getB(), 0);
175 assert.strictEqual(c.getA(), 1);
176
177 assert.strictEqual(c.setG(1), undefined);
178
179 assert.strictEqual(c.getR(), 1);
180 assert.strictEqual(c.getG(), 1);
181 assert.strictEqual(c.getB(), 0);
182 assert.strictEqual(c.getA(), 1);
183
184 assert.strictEqual(c.setB(1), undefined);
185
186 assert.strictEqual(c.getR(), 1);
187 assert.strictEqual(c.getG(), 1);
188 assert.strictEqual(c.getB(), 1);
189 assert.strictEqual(c.getA(), 1);
190
191 assert.strictEqual(c.setA(0), undefined);
192
193 assert.strictEqual(c.getR(), 1);
194 assert.strictEqual(c.getG(), 1);
195 assert.strictEqual(c.getB(), 1);
196 assert.strictEqual(c.getA(), 0);
197 });
198
199 it('throws with incorrect set{R,G,B,A} arguments', function() {
200 var c = new sass.types.Color();
201
202 function assertJustOneArgument(cb) {
203 assert.throws(function() {
204 cb();
205 }, function(error) {
206 assert.ok(error instanceof TypeError);
207 assert.strictEqual(error.message, 'Expected just one argument');
208
209 return true;
210 });
211 }
212
213 function assertNumberArgument(arg, cb) {
214 assert.throws(function() {
215 cb();
216 }, function(error) {
217 assert.ok(error instanceof TypeError);
218 assert.strictEqual(error.message, 'Supplied value should be a number');
219
220 return true;
221 }, 'argument was: ' + arg);
222 }
223
224 assertJustOneArgument(function() { c.setR(); });
225 assertJustOneArgument(function() { c.setG(); });
226 assertJustOneArgument(function() { c.setB(); });
227 assertJustOneArgument(function() { c.setA(); });
228
229 assertJustOneArgument(function() { c.setR(1, 2); });
230 assertJustOneArgument(function() { c.setG(1, 2); });
231 assertJustOneArgument(function() { c.setB(1, 2); });
232 assertJustOneArgument(function() { c.setA(1, 2); });
233
234 [true, false, '0', '1', '', 'omg', {}, []].forEach(function(arg) {
235 assertNumberArgument(arg, function() { c.setR(arg); });
236 assertNumberArgument(arg, function() { c.setG(arg); });
237 assertNumberArgument(arg, function() { c.setB(arg); });
238 assertNumberArgument(arg, function() { c.setA(arg); });
239 });
240 });
241 });
242
243 describe('Error', function() {
244 it('exists', function() {
245 assert(sass.types.Error);
246 });
247
248 it('has a correctly named constructor', function() {
249 assert.strictEqual(sass.types.Error.name, 'SassError');
250 });
251
252 it('supports call constructor', function() {
253 if(semver.gt(process.version, 'v14.5.0')) {
254 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
255 this.skip();
256 }
257
258 var e = sass.types.Error('Such Error');
259 assert.ok(e instanceof sass.types.Error);
260 assert.strictEqual(e.toString(), '[object SassError]');
261
262 // TODO: I'm not sure this object works well, it likely needs to be fleshed out more...
263 });
264
265 it('supports new constructor', function() {
266 if(semver.gt(process.version, 'v14.5.0')) {
267 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
268 this.skip();
269 }
270
271 var e = new sass.types.Error('Such Error');
272 assert.ok(e instanceof sass.types.Error);
273 assert.strictEqual(e.toString(), '[object SassError]');
274 // TODO: I'm not sure this object works well, it likely needs to be fleshed out more...
275 });
276 });
277
278 describe('List', function() {
279 it('exists', function() {
280 assert(sass.types.List);
281 });
282
283 it('has a correctly named constructor', function() {
284 assert.strictEqual(sass.types.List.name, 'SassList');
285 });
286
287 it('support call constructor', function() {
288 if(semver.gt(process.version, 'v14.5.0')) {
289 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
290 this.skip();
291 }
292
293 var list = sass.types.List();
294 assert.ok(list instanceof sass.types.List);
295 assert.strictEqual(list.toString(), '[object SassList]');
296 });
297
298 it('support new constructor', function() {
299 if(semver.gt(process.version, 'v14.5.0')) {
300 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
301 this.skip();
302 }
303
304 var list = new sass.types.List();
305 assert.ok(list instanceof sass.types.List);
306 assert.strictEqual(list.toString(), '[object SassList]');
307 });
308
309 it('support variadic constructor', function() {
310 var a = new sass.types.List();
311 assert.strictEqual(a.getLength(), 0);
312 assert.strictEqual(a.getSeparator(), true);
313 var b = new sass.types.List(1);
314 assert.strictEqual(b.getSeparator(), true);
315 assert.strictEqual(b.getLength(), 1);
316 var c = new sass.types.List(1, true);
317 assert.strictEqual(b.getLength(), 1);
318 assert.strictEqual(c.getSeparator(), true);
319 var d = new sass.types.List(1, false);
320 assert.strictEqual(b.getLength(), 1);
321 assert.strictEqual(d.getSeparator(), false);
322 var e = new sass.types.List(1, true, 2);
323 assert.strictEqual(b.getLength(), 1);
324 assert.strictEqual(e.getSeparator(), true);
325
326 assert.throws(function() {
327 new sass.types.List('not-a-number');
328 }, function(error) {
329 // TODO: TypeError
330 assert.strictEqual(error.message, 'First argument should be an integer.');
331 return true;
332 });
333
334 assert.throws(function() {
335 new sass.types.List(1, 'not-a-boolean');
336 }, function(error) {
337 // TODO: TypeError
338 assert.strictEqual(error.message, 'Second argument should be a boolean.');
339 return true;
340 });
341 });
342
343 it('supports {get,set}Separator', function() {
344 var a = new sass.types.List();
345 assert.strictEqual(a.getSeparator(), true);
346 assert.strictEqual(a.setSeparator(true), undefined);
347 assert.strictEqual(a.getSeparator(), true);
348 assert.strictEqual(a.setSeparator(false), undefined);
349 assert.strictEqual(a.getSeparator(), false);
350
351 assert.throws(function() {
352 a.setSeparator();
353 }, function(error) {
354 assert.ok(error instanceof TypeError);
355 assert.strictEqual(error.message, 'Expected just one argument');
356 return true;
357 });
358
359 [1, '', [], {}].forEach(function(arg) {
360 assert.throws(function() {
361 a.setSeparator(arg);
362 }, function(error) {
363 assert.ok(error instanceof TypeError);
364 assert.strictEqual(error.message, 'Supplied value should be a boolean');
365 return true;
366 }, 'setSeparator(' + arg + ')');
367 });
368 });
369
370 it('supports setValue and getValue', function() {
371 var a = new sass.types.List();
372
373 assert.throws(function() {
374 a.getValue();
375 }, function(error) {
376 assert.ok(error instanceof TypeError);
377 assert.strictEqual(error.message, 'Expected just one argument');
378
379 return true;
380 });
381
382 ['hi', [], {}].forEach(function(arg) {
383 assert.throws(function() {
384 a.getValue(arg);
385 }, function(error) {
386 assert.ok(error instanceof TypeError);
387 assert.strictEqual(error.message, 'Supplied index should be an integer');
388
389 return true;
390 }, 'getValue(' + arg + ')');
391 });
392
393 assert.throws(function() {
394 a.getValue(0);
395 }, function(error) {
396 assert.ok(error instanceof RangeError);
397 assert.strictEqual(error.message, 'Out of bound index');
398
399 return true;
400 });
401
402 assert.throws(function() {
403 a.getValue(-1);
404 }, function(error) {
405 assert.ok(error instanceof RangeError);
406 assert.strictEqual(error.message, 'Out of bound index');
407
408 return true;
409 });
410
411 assert.throws(function() {
412 a.setValue();
413 }, function(error) {
414 assert.ok(error instanceof TypeError);
415 assert.strictEqual(error.message, 'Expected two arguments');
416 return true;
417 });
418
419 assert.throws(function() {
420 a.setValue(1);
421 }, function(error) {
422 assert.ok(error instanceof TypeError);
423 assert.strictEqual(error.message, 'Expected two arguments');
424 return true;
425 });
426
427 assert.throws(function() {
428 a.setValue(0, 'no-a-sass-value');
429 }, function(error) {
430 assert.ok(error instanceof TypeError);
431 assert.strictEqual(error.message, 'Supplied value should be a SassValue object');
432 return true;
433 });
434 });
435
436 // TODO: more complex set/get value scenarios
437 });
438
439 describe('Map', function() {
440 it('exists', function() {
441 assert(sass.types.Map);
442 });
443
444 it('has a correctly named constructor', function() {
445 assert.strictEqual(sass.types.Map.name, 'SassMap');
446 });
447
448 it('supports call constructor', function() {
449 if(semver.gt(process.version, 'v14.5.0')) {
450 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
451 this.skip();
452 }
453
454 var x = sass.types.Map();
455 assert.strictEqual(x.toString(), '[object SassMap]');
456 });
457
458 it('supports new constructor', function() {
459 if(semver.gt(process.version, 'v14.5.0')) {
460 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
461 this.skip();
462 }
463
464 var x = new sass.types.Map();
465 assert.strictEqual(x.toString(), '[object SassMap]');
466 });
467
468 it('supports an optional constructor argument', function() {
469 var x = new sass.types.Map();
470 var y = new sass.types.Map(1);
471 var z = new sass.types.Map(2, 3);
472
473 assert.throws(function() {
474 new sass.types.Map('OMG');
475 }, function(error) {
476 assert.strictEqual(error.message, 'First argument should be an integer.');
477 // TODO: TypeError
478
479 return true;
480 });
481
482 assert.strictEqual(x.getLength(), 0);
483 assert.strictEqual(y.getLength(), 1);
484 assert.strictEqual(z.getLength(), 2);
485 });
486
487 it('supports length', function() {
488 var y = new sass.types.Map(1);
489 var z = new sass.types.Map(2);
490
491 assert.strictEqual(y.getLength(), 1);
492 assert.strictEqual(z.getLength(), 2);
493 });
494
495 it('supports {get,set}Value {get,set}Key', function() {
496 var y = new sass.types.Map(1);
497 var omg = new sass.types.String('OMG');
498 y.setValue(0, omg);
499 console.log(y.getValue(0));
500 });
501 });
502
503 describe('Null', function() {
504 it('exists', function() {
505 assert(sass.types.Null);
506 });
507
508 it('has a correctly named constructor', function() {
509 assert.strictEqual(sass.types.Null.name, 'SassNull');
510 });
511
512 it('does not support new constructor', function() {
513 assert.throws(function() {
514 new sass.types.Null();
515 }, function(error) {
516 assert.ok(error instanceof TypeError);
517 assert.strictEqual(error.message, 'Cannot instantiate SassNull');
518 return true;
519 });
520 });
521
522 it('supports call constructor (and is a singleton)', function() {
523 assert.strictEqual(sass.types.Null(), sass.types.Null());
524 assert.strictEqual(sass.types.Null(), sass.types.Null.NULL);
525 });
526 });
527
528 describe('Number', function() {
529 it('exists', function() {
530 assert(sass.types.Number);
531 });
532
533 it('has a correctly named constructor', function() {
534 assert.strictEqual(sass.types.Number.name, 'SassNumber');
535 });
536
537 it('supports new constructor', function() {
538 if(semver.gt(process.version, 'v14.5.0')) {
539 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
540 this.skip();
541 }
542
543 var number = new sass.types.Number();
544 assert.strictEqual(number.toString(), '[object SassNumber]');
545 });
546
547 it('supports call constructor', function() {
548 if(semver.gt(process.version, 'v14.5.0')) {
549 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
550 this.skip();
551 }
552
553 var number = sass.types.Number();
554 assert.strictEqual(number.toString(), '[object SassNumber]');
555 });
556
557 it('supports multiple constructor arguments', function() {
558 var a = new sass.types.Number();
559 var b = new sass.types.Number(1);
560 var c = new sass.types.Number(2, 'px');
561
562 assert.throws(function() {
563 new sass.types.Number('OMG');
564 }, function(error) {
565 // TODO: TypeError
566 assert.strictEqual(error.message, 'First argument should be a number.');
567 return true;
568 });
569
570 assert.throws(function() {
571 new sass.types.Number(1, 2);
572 }, function(error) {
573 // TODO: TypeError
574 assert.strictEqual(error.message, 'Second argument should be a string.');
575 return true;
576 });
577
578 assert.strictEqual(a.getValue(), 0);
579 assert.strictEqual(a.getUnit(), '');
580 assert.strictEqual(b.getValue(), 1);
581 assert.strictEqual(b.getUnit(), '');
582 assert.strictEqual(c.getValue(), 2);
583 assert.strictEqual(c.getUnit(), 'px');
584 });
585
586 it('supports get{Unit,Value}, set{Unit,Value}', function() {
587 var number = new sass.types.Number(1, 'px');
588 assert.strictEqual(number.getValue(), 1);
589 assert.strictEqual(number.getUnit(), 'px');
590
591 number.setValue(2);
592 assert.strictEqual(number.getValue(), 2);
593 assert.strictEqual(number.getUnit(), 'px');
594
595 number.setUnit('em');
596 assert.strictEqual(number.getValue(), 2);
597 assert.strictEqual(number.getUnit(), 'em');
598
599 assert.throws(function() {
600 number.setValue('OMG');
601 }, function(error) {
602 assert.ok(error instanceof TypeError);
603 assert.strictEqual(error.message, 'Supplied value should be a number');
604 return true;
605 });
606
607 assert.throws(function() {
608 number.setValue();
609 }, function(error) {
610 assert.ok(error instanceof TypeError);
611 assert.strictEqual(error.message, 'Expected just one argument');
612 return true;
613 });
614
615 assert.throws(function() {
616 number.setUnit();
617 }, function(error) {
618 assert.ok(error instanceof TypeError);
619 assert.strictEqual(error.message, 'Expected just one argument');
620 return true;
621 });
622
623 assert.throws(function() {
624 number.setUnit(1);
625 }, function(error) {
626 assert.ok(error instanceof TypeError);
627 assert.strictEqual(error.message, 'Supplied value should be a string');
628 return true;
629 });
630 });
631 });
632
633 describe('String', function() {
634 it('exists', function() {
635 assert(sass.types.String);
636 });
637
638 it('has a properly named constructor', function() {
639 assert.strictEqual(sass.types.String.name, 'SassString');
640 });
641
642 it('supports call constructor', function() {
643 if(semver.gt(process.version, 'v14.5.0')) {
644 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
645 this.skip();
646 }
647
648 var x = sass.types.String('OMG');
649
650 assert.strictEqual(x.toString(), '[object SassString]');
651 assert.strictEqual(x.getValue(), 'OMG');
652 });
653
654 it('supports new constructor', function() {
655 if(semver.gt(process.version, 'v14.5.0')) {
656 // v8 issue tracked in https://github.com/sass/node-sass/issues/2972
657 this.skip();
658 }
659
660 var x = new sass.types.String('OMG');
661
662 assert.strictEqual(x.toString(), '[object SassString]');
663 assert.strictEqual(x.getValue(), 'OMG');
664 });
665
666 it('supports multiple constructor arg combinations', function() {
667 new sass.types.String();
668 new sass.types.String('OMG');
669 new sass.types.String('OMG', 'NOPE');
670
671 [null, undefined, [], {}, function() { }].forEach(function(arg) {
672 assert.throws(function() {
673 new sass.types.String(arg);
674 }, function(error) {
675 // TODO: TypeError
676 assert.strictEqual(error.message, 'Argument should be a string.');
677 return true;
678 });
679 });
680 });
681
682 it('supports {get,set}Value', function() {
683 var x = new sass.types.String();
684
685 assert.strictEqual(x.getValue(), '');
686 assert.strictEqual(x.setValue('hi'), undefined);
687 assert.strictEqual(x.getValue(), 'hi');
688 assert.strictEqual(x.setValue('bye'), undefined);
689 assert.strictEqual(x.getValue(), 'bye');
690
691 assert.throws(function() {
692 x.setValue();
693 }, function(error) {
694 assert.ok(error instanceof TypeError);
695 assert.strictEqual(error.message, 'Expected just one argument');
696 return true;
697 });
698
699 assert.throws(function() {
700 x.setValue('hi', 'hi');
701 }, function(error) {
702 assert.ok(error instanceof TypeError);
703 assert.strictEqual(error.message, 'Expected just one argument');
704 return true;
705 });
706 });
707 });
708});