var assert = require("assert"), CSSwhat = require("../"); var tests = [ //tag names [ 'div', [ [ { 'type': 'tag', 'name': 'div' } ] ], 'simple tag' ], [ '*', [ [ { 'type': 'universal' } ] ], 'universal' ], //traversal [ 'div div', [ [ { 'type': 'tag', 'name': 'div' }, { 'type': 'descendant' }, { 'type': 'tag', 'name': 'div' } ] ], 'descendant' ], [ 'div\t \n \tdiv', [ [ { 'type': 'tag', 'name': 'div' }, { 'type': 'descendant' }, { 'type': 'tag', 'name': 'div' } ] ], 'descendant /w whitespace' ], [ 'div + div', [ [ { 'type': 'tag', 'name': 'div' }, { 'type': 'adjacent' }, { 'type': 'tag', 'name': 'div' } ] ], 'adjacent' ], [ 'div ~ div', [ [ { 'type': 'tag', 'name': 'div' }, { 'type': 'sibling' }, { 'type': 'tag', 'name': 'div' } ] ], 'sibling' ], [ 'p < div', [ [ { 'type': 'tag', 'name': 'p' }, { 'type': 'parent' }, { 'type': 'tag', 'name': 'div' } ] ], 'parent' ], //Escaped whitespace [ '#\\ > a ', [ [ { 'type': 'attribute', 'action': 'equals', 'name': 'id', 'value': ' ', 'ignoreCase': false }, { 'type': 'child' }, { 'type': 'tag', 'name': 'a' } ] ], 'Space between escaped space and combinator' ], [ '.\\ ', [ [ { 'type': 'attribute', 'name': 'class', 'action': 'element', 'value': ' ', 'ignoreCase': false } ] ], 'Space after escaped space' ], [ '\\61 ', [ [ { 'type': 'tag', 'name': 'a' } ] ], 'Numeric escape with space (BMP)' ], [ '\\1d306\\01d306', [ [ { 'type': 'tag', 'name': '\uD834\uDF06\uD834\uDF06' } ] ], 'Numeric escape (outside BMP)' ], //attributes [ '[name^=\'foo[\']', [ [ { 'type': 'attribute', 'name': 'name', 'action': 'start', 'value': 'foo[', 'ignoreCase': false } ] ], 'quoted attribute' ], [ '[name^=\'foo[bar]\']', [ [ { 'type': 'attribute', 'name': 'name', 'action': 'start', 'value': 'foo[bar]', 'ignoreCase': false } ] ], 'quoted attribute' ], [ '[name$=\'[bar]\']', [ [ { 'type': 'attribute', 'name': 'name', 'action': 'end', 'value': '[bar]', 'ignoreCase': false } ] ], 'quoted attribute' ], [ '[href *= \'google\']', [ [ { 'type': 'attribute', 'name': 'href', 'action': 'any', 'value': 'google', 'ignoreCase': false } ] ], 'quoted attribute with spaces' ], [ '[name=foo\\.baz]', [ [ { 'type': 'attribute', 'name': 'name', 'action': 'equals', 'value': 'foo.baz', 'ignoreCase': false } ] ], 'attribute with escaped dot' ], [ '[name=foo\\[bar\\]]', [ [ { 'type': 'attribute', 'name': 'name', 'action': 'equals', 'value': 'foo[bar]', 'ignoreCase': false } ] ], 'attribute with escaped square brackets' ], [ '[xml\\:test]', [ [ { 'type': 'attribute', 'name': 'xml:test', 'action': 'exists', 'value': '', 'ignoreCase': false } ] ], 'escaped attribute' ], [ '[name="foo ~ < > , bar" i]', [ [ { 'type': 'attribute', 'name': 'name', 'action': 'equals', 'value': 'foo ~ < > , bar', 'ignoreCase': true } ] ], 'attribute with previously normalized characters' ], //pseudo selectors [ ':foo', [ [ { 'type': 'pseudo', 'name': 'foo', 'data': null } ] ], 'pseudo selector without any data' ], [ ':bar(baz)', [ [ { 'type': 'pseudo', 'name': 'bar', 'data': 'baz' } ] ], 'pseudo selector with data' ], [ ':contains(\'(foo)\')', [ [ { 'type': 'pseudo', 'name': 'contains', 'data': '\'(foo)\'' } ] ], 'pseudo selector with data' ], //multiple selectors [ 'a , b', [ [ { 'type': 'tag', 'name': 'a' } ], [ { 'type': 'tag', 'name': 'b' } ] ], 'multiple selectors' ] ]; tests.forEach(function(arr, i){ arr[0] = CSSwhat(arr[0]); assert.deepEqual.apply(null, arr); console.log("\t%d: '%s' passed", i + 1, arr[2]); }); console.log("\nCollected selectors (qwery, sizzle, nwmatcher)..."); var out = require("./out.json"); Object.keys(out).forEach(function(s){ assert.deepEqual(CSSwhat(s), out[s], s); }); console.log("Passed!");