Skip to content

Commit

Permalink
Merge pull request sasstools#258 from bgriffith/feature/sass-tests
Browse files Browse the repository at this point in the history
Add Sass tests for rules & fix related issues
  • Loading branch information
DanPurdy committed Oct 8, 2015
2 parents d33cfa0 + 5eeb918 commit b3d46f1
Show file tree
Hide file tree
Showing 95 changed files with 3,290 additions and 217 deletions.
191 changes: 159 additions & 32 deletions lib/rules/empty-line-between-blocks.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,104 @@

var helpers = require('../helpers');

var findNearestReturn = function (parent, i) {
var counter,
syntax;

var findNearestReturnSCSS = function (parent, i) {
var previous,
doublePrevious,
space;

if (i >= 2) {
doublePrevious = parent.content[i - 2];
if (parent.content[i - 1]) {
previous = parent.content[i - 1];

if (i >= 2) {
doublePrevious = parent.content[i - 2];

if (doublePrevious.type.indexOf('Comment') !== -1) {
return findNearestReturn(parent, i - 1);
// First check to see that the previous line is not a new line as if it is
// we don't want to recursively run the function again

if (!helpers.isEmptyLine(previous.content)) {
if (doublePrevious.type.indexOf('Comment') !== -1) {
return findNearestReturnSCSS(parent, i - 1);
}
}
}
}

if (i >= 1) {
previous = parent.content[i - 1];
if (i >= 1) {
if (previous.type.indexOf('Comment') !== -1) {
return findNearestReturnSCSS(parent, i - 1);
}

if (previous.type.indexOf('Comment') !== -1) {
return findNearestReturn(parent, i - 1);
if (previous.type === 'space') {
space = helpers.isEmptyLine(previous.content);

// If there's not a new line and it's the first within the block, ignore
if (!space && (i - 1 === 0)) {
return false;
}

return {
'space': space,
'previous': previous
};
}
}
}
};

var findNearestReturnSass = function (parent, i) {
var previous;

if (previous.type === 'space') {
space = helpers.isEmptyLine(previous.content);
if (parent.content[i - 1]) {
previous = parent.content[i - 1];

if (counter === 2) {
return {
'space': space,
'previous': previous
space: true,
previous: previous
};
}

if (previous.is('space') || previous.is('declarationDelimiter')) {
if (helpers.hasEOL(previous.content)) {
counter++;
}

return findNearestReturnSass(parent, i - 1);
}

// If ruleset, we must reset the parent to be the previous node and
// loop through that
else if (previous.is('ruleset') || previous.is('include')) {
var previousNode = previous.content[previous.content.length - 1];

// Set the i parameter for findNearestReturn to be the length of the
// content array in order to get the last one
return findNearestReturnSass(previousNode, previousNode.content.length);
}
else {
counter = 0;

if (previous.type.indexOf('Comment') !== -1) {

// If it's the first line
if (previous.start.line === 1) {
return {
space: true,
previous: previous
};
}

return findNearestReturnSass(parent, i - 1);
}
}
}

return {
space: false,
previous: previous
};
};

module.exports = {
Expand All @@ -40,31 +109,89 @@ module.exports = {
},
'detect': function (ast, parser) {
var result = [];
syntax = ast.syntax;

ast.traverseByType(['ruleset'], function (ruleset, i, parent) {
ast.traverseByType('ruleset', function (node, j, p) {
var space;

space = findNearestReturn(parent, i);
if (syntax === 'scss') {
space = findNearestReturnSCSS(p, j);

if (space) {
if (parser.options.include && !space.space && i !== 1) {
result = helpers.addUnique(result, {
'ruleId': parser.rule.name,
'line': space.previous.end.line,
'column': space.previous.end.column,
'message': 'Space expected between blocks',
'severity': parser.severity
});
if (space) {
if (parser.options.include && !space.space && j !== 1) {
result = helpers.addUnique(result, {
'ruleId': parser.rule.name,
'line': space.previous.end.line,
'column': 1,
'message': 'Space expected between blocks',
'severity': parser.severity
});
}
else if (!parser.options.include && space.space) {
result = helpers.addUnique(result, {
'ruleId': parser.rule.name,
'line': space.previous.end.line,
'column': 1,
'message': 'Space not allowed between blocks',
'severity': parser.severity
});
}
}
else if (!parser.options.include && space.space) {
result = helpers.addUnique(result, {
'ruleId': parser.rule.name,
'line': space.previous.end.line,
'column': space.previous.end.column,
'message': 'Space not allowed between blocks',
'severity': parser.severity
}
else if (syntax === 'sass') {
// Reset the counter for each ruleset
counter = 0;

if (node.is('ruleset')) {

node.forEach('block', function (block, i, parent) {
var previous;

// Capture the previous node
if (parent.content[i - 1]) {
previous = parent.content[i - 1];
}
else {
// Else set the block to act as the previous node
previous = block;
}

// If it's a new line, lets go back up to the selector
if (previous.is('space') && helpers.hasEOL(previous.content)) {

// If we have a node (most likely type of selector)
if (parent.content[i - 2]) {

if (typeof parent.content[i - 3] === 'undefined') {
space = findNearestReturnSass(p, j);
}
}
}
});
}

if (space && space.previous) {
if (space.previous.start.line !== 1) {
if (parser.options.include && !space.space) {
result = helpers.addUnique(result, {
'ruleId': parser.rule.name,
'line': space.previous.end.line + 1,
'column': 1,
'message': 'Space expected between blocks',
'severity': parser.severity
});
}
else if (!parser.options.include && space.space) {
result = helpers.addUnique(result, {
'ruleId': parser.rule.name,
'line': space.previous.end.line + 1,
'column': 1,
'message': 'Space not allowed between blocks',
'severity': parser.severity
});
}
}
}
}
});

Expand Down
37 changes: 35 additions & 2 deletions tests/rules/border-zero.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,42 @@

var lint = require('./_lint');

var file = lint.file('border-zero.scss');
//////////////////////////////
// SCSS syntax tests
//////////////////////////////
describe('border zero - scss', function () {
var file = lint.file('border-zero.scss');

it('[convention: 0]', function (done) {
lint.test(file, {
'border-zero': 1
}, function (data) {
lint.assert.equal(3, data.warningCount);
done();
});
});

it('[convention: \'none\']', function (done) {
lint.test(file, {
'border-zero': [
1,
{
'convention': 'none'
}
]
}, function (data) {
lint.assert.equal(2, data.warningCount);
done();
});
});
});

//////////////////////////////
// Sass syntax tests
//////////////////////////////
describe('border zero - sass', function () {
var file = lint.file('border-zero.sass');

describe('border zero', function () {
it('[convention: 0]', function (done) {
lint.test(file, {
'border-zero': 1
Expand Down
7 changes: 5 additions & 2 deletions tests/rules/brace-style.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

var lint = require('./_lint');

var file = lint.file('brace-style.scss');
//////////////////////////////
// SCSS syntax tests
//////////////////////////////
describe('brace style - scss', function () {
var file = lint.file('brace-style.scss');

describe('brace style', function () {
it('[style: 1tbs, allow-single-line: true]', function (done) {
lint.test(file, {
'brace-style': 1
Expand Down
65 changes: 63 additions & 2 deletions tests/rules/clean-import-paths.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

var lint = require('./_lint');

var file = lint.file('clean-import-paths.scss');
//////////////////////////////
// SCSS syntax tests
//////////////////////////////
describe('clean import paths - scss', function () {
var file = lint.file('clean-import-paths.scss');

describe('clean import paths', function () {
it('[leading-underscore: false, filename-extension: false]', function (done) {
lint.test(file, {
'clean-import-paths': 1
Expand Down Expand Up @@ -56,5 +59,63 @@ describe('clean import paths', function () {
done();
});
});
});

//////////////////////////////
// Sass syntax tests
//////////////////////////////
describe('clean import paths - sass', function () {
var file = lint.file('clean-import-paths.sass');

it('[leading-underscore: false, filename-extension: false]', function (done) {
lint.test(file, {
'clean-import-paths': 1
}, function (data) {
lint.assert.equal(8, data.warningCount);
done();
});
});

it('[leading-underscore: true, filename-extension: false]', function (done) {
lint.test(file, {
'clean-import-paths': [
1,
{
'leading-underscore': true
}
]
}, function (data) {
lint.assert.equal(8, data.warningCount);
done();
});
});

it('[leading-underscore: false, filename-extension: true]', function (done) {
lint.test(file, {
'clean-import-paths': [
1,
{
'filename-extension': true
}
]
}, function (data) {
lint.assert.equal(8, data.warningCount);
done();
});
});

it('[leading-underscore: true, filename-extension: true]', function (done) {
lint.test(file, {
'clean-import-paths': [
1,
{
'leading-underscore': true,
'filename-extension': true
}
]
}, function (data) {
lint.assert.equal(8, data.warningCount);
done();
});
});
});
Loading

0 comments on commit b3d46f1

Please sign in to comment.