UNPKG

2.71 kBJavaScriptView Raw
1var fs = require('fs')
2var path = require('path')
3var test = require('tape')
4var postcss = require('postcss')
5var Detector = require('../lib/detect-feature-use')
6
7/*
8 * Parse the feature-key: count lines in the leading comment of
9 * each test case fixture.
10 */
11var parseTestCase = function (cssString) {
12 var meta = /\s*\/\*(\s*only)?\s*expect:\s*([a-zA-Z0-9\-:\s\n]*)/
13 var matches = cssString.match(meta)
14 if (!matches) { return }
15
16 var features = {}
17 matches[2].split('\n')
18 .filter(function (s) {
19 return s.trim().length > 0
20 })
21 .forEach(function (s) {
22 var line = s.replace(/\s*/, '').split(':')
23 var feat = line[0]
24 var count = +line[1]
25 features[feat] = count
26 })
27
28 if (Object.keys(features).length > 0) {
29 return {
30 only: !!matches[1],
31 expected: features
32 }
33 } else {
34 return false
35 }
36}
37
38/**
39 * make a spy callback.
40 *
41 * spy functions save results from calls on `spyFn.results`.
42 */
43var spy = function () {
44 var results = []
45 var fn = function (param) {
46 var feature = param.feature
47 var usage = param.usage
48 var obj = {
49 feature: feature,
50 location: usage.source.start,
51 selector: usage.selector,
52 property: usage.property,
53 value: usage.value
54 }
55
56 if (results[feature]) {
57 results[feature]
58 } else {
59 results[feature] = []
60 }
61
62 return results[feature].push(obj)
63 }
64 fn.results = results
65 return fn
66}
67
68var runTest = function (tc, cssString, expected, only) {
69 var features = Object.keys(expected).sort()
70 var testFn = only ? test.only.bind(test) : test
71
72 testFn('detecting CSS features (' + tc.replace('.css', '') + ')', function (t) {
73 var detector = new Detector(features)
74 var cb = spy()
75 detector.process(postcss.parse(cssString), cb)
76
77 var res = Object.keys(cb.results).sort()
78 for (var feature in expected) {
79 if (expected[feature] === 0) {
80 t.notOk(cb.results[feature])
81 } else {
82 t.deepEqual(res, features)
83 t.equal(cb.results[feature].length, expected[feature], 'count of ' + feature)
84 }
85 }
86
87 t.end()
88 })
89}
90
91var caseFiles = fs.readdirSync(path.join(__dirname, '/cases'))
92 .filter(function (tc) { return /\.css$/.test(tc) })
93
94var cases = []
95for (var i = 0; i < caseFiles.length; ++i) {
96 var tc = caseFiles[i]
97
98 var cssString = fs.readFileSync(path.join(__dirname, 'cases', tc)).toString()
99 var parsed = parseTestCase(cssString)
100 if (parsed) {
101 var testCase = {
102 name: tc,
103 expected: parsed.expected,
104 cssString: cssString
105 }
106 cases.push(testCase)
107 }
108}
109
110cases.forEach(function (testCase) {
111 runTest(testCase.name, testCase.cssString, testCase.expected, cases.length === 1)
112})