1 | "use strict";
|
---|
2 |
|
---|
3 | var resolve = require('resolve');
|
---|
4 | var path = require('path');
|
---|
5 |
|
---|
6 | var testFolder = path.relative(process.cwd(), path.dirname(resolve.sync('@less/test-data')));
|
---|
7 | var lessFolder = path.join(testFolder, 'less');
|
---|
8 |
|
---|
9 | module.exports = function(grunt) {
|
---|
10 | grunt.option("stack", true);
|
---|
11 |
|
---|
12 | // Report the elapsed execution time of tasks.
|
---|
13 | require("time-grunt")(grunt);
|
---|
14 |
|
---|
15 | var COMPRESS_FOR_TESTS = false;
|
---|
16 | var git = require("git-rev");
|
---|
17 |
|
---|
18 | // Sauce Labs browser
|
---|
19 | var browsers = [
|
---|
20 | // Desktop browsers
|
---|
21 | {
|
---|
22 | browserName: "chrome",
|
---|
23 | version: "latest",
|
---|
24 | platform: "Windows 7"
|
---|
25 | },
|
---|
26 | {
|
---|
27 | browserName: "firefox",
|
---|
28 | version: "latest",
|
---|
29 | platform: "Linux"
|
---|
30 | },
|
---|
31 | {
|
---|
32 | browserName: "safari",
|
---|
33 | version: "9",
|
---|
34 | platform: "OS X 10.11"
|
---|
35 | },
|
---|
36 | {
|
---|
37 | browserName: "internet explorer",
|
---|
38 | version: "8",
|
---|
39 | platform: "Windows XP"
|
---|
40 | },
|
---|
41 | {
|
---|
42 | browserName: "internet explorer",
|
---|
43 | version: "11",
|
---|
44 | platform: "Windows 8.1"
|
---|
45 | },
|
---|
46 | {
|
---|
47 | browserName: "edge",
|
---|
48 | version: "13",
|
---|
49 | platform: "Windows 10"
|
---|
50 | },
|
---|
51 | // Mobile browsers
|
---|
52 | {
|
---|
53 | browserName: "ipad",
|
---|
54 | deviceName: "iPad Air Simulator",
|
---|
55 | deviceOrientation: "portrait",
|
---|
56 | version: "8.4",
|
---|
57 | platform: "OS X 10.9"
|
---|
58 | },
|
---|
59 | {
|
---|
60 | browserName: "iphone",
|
---|
61 | deviceName: "iPhone 5 Simulator",
|
---|
62 | deviceOrientation: "portrait",
|
---|
63 | version: "9.3",
|
---|
64 | platform: "OS X 10.11"
|
---|
65 | },
|
---|
66 | {
|
---|
67 | browserName: "android",
|
---|
68 | deviceName: "Google Nexus 7 HD Emulator",
|
---|
69 | deviceOrientation: "portrait",
|
---|
70 | version: "4.4",
|
---|
71 | platform: "Linux"
|
---|
72 | }
|
---|
73 | ];
|
---|
74 |
|
---|
75 | var sauceJobs = {};
|
---|
76 |
|
---|
77 | var browserTests = [
|
---|
78 | "filemanager-plugin",
|
---|
79 | "visitor-plugin",
|
---|
80 | "global-vars",
|
---|
81 | "modify-vars",
|
---|
82 | "production",
|
---|
83 | "rootpath-relative",
|
---|
84 | "rootpath-rewrite-urls",
|
---|
85 | "rootpath",
|
---|
86 | "relative-urls",
|
---|
87 | "rewrite-urls",
|
---|
88 | "browser",
|
---|
89 | "no-js-errors",
|
---|
90 | "legacy"
|
---|
91 | ];
|
---|
92 |
|
---|
93 | function makeJob(testName) {
|
---|
94 | sauceJobs[testName] = {
|
---|
95 | options: {
|
---|
96 | urls:
|
---|
97 | testName === "all"
|
---|
98 | ? browserTests.map(function(name) {
|
---|
99 | return (
|
---|
100 | "http://localhost:8081/tmp/browser/test-runner-" +
|
---|
101 | name +
|
---|
102 | ".html"
|
---|
103 | );
|
---|
104 | })
|
---|
105 | : [
|
---|
106 | "http://localhost:8081/tmp/browser/test-runner-" +
|
---|
107 | testName +
|
---|
108 | ".html"
|
---|
109 | ],
|
---|
110 | testname:
|
---|
111 | testName === "all" ? "Unit Tests for Less.js" : testName,
|
---|
112 | browsers: browsers,
|
---|
113 | public: "public",
|
---|
114 | recordVideo: false,
|
---|
115 | videoUploadOnPass: false,
|
---|
116 | recordScreenshots: process.env.TRAVIS_BRANCH !== "master",
|
---|
117 | build:
|
---|
118 | process.env.TRAVIS_BRANCH === "master"
|
---|
119 | ? process.env.TRAVIS_JOB_ID
|
---|
120 | : undefined,
|
---|
121 | tags: [
|
---|
122 | process.env.TRAVIS_BUILD_NUMBER,
|
---|
123 | process.env.TRAVIS_PULL_REQUEST,
|
---|
124 | process.env.TRAVIS_BRANCH
|
---|
125 | ],
|
---|
126 | statusCheckAttempts: -1,
|
---|
127 | sauceConfig: {
|
---|
128 | "idle-timeout": 100
|
---|
129 | },
|
---|
130 | throttled: 5,
|
---|
131 | onTestComplete: function(result, callback) {
|
---|
132 | // Called after a unit test is done, per page, per browser
|
---|
133 | // 'result' param is the object returned by the test framework's reporter
|
---|
134 | // 'callback' is a Node.js style callback function. You must invoke it after you
|
---|
135 | // finish your work.
|
---|
136 | // Pass a non-null value as the callback's first parameter if you want to throw an
|
---|
137 | // exception. If your function is synchronous you can also throw exceptions
|
---|
138 | // directly.
|
---|
139 | // Passing true or false as the callback's second parameter passes or fails the
|
---|
140 | // test. Passing undefined does not alter the test result. Please note that this
|
---|
141 | // only affects the grunt task's result. You have to explicitly update the Sauce
|
---|
142 | // Labs job's status via its REST API, if you want so.
|
---|
143 |
|
---|
144 | // This should be the encrypted value in Travis
|
---|
145 | var user = process.env.SAUCE_USERNAME;
|
---|
146 | var pass = process.env.SAUCE_ACCESS_KEY;
|
---|
147 |
|
---|
148 | git.short(function(hash) {
|
---|
149 | require("phin")(
|
---|
150 | {
|
---|
151 | method: "PUT",
|
---|
152 | url: [
|
---|
153 | "https://saucelabs.com/rest/v1",
|
---|
154 | user,
|
---|
155 | "jobs",
|
---|
156 | result.job_id
|
---|
157 | ].join("/"),
|
---|
158 | auth: { user: user, pass: pass },
|
---|
159 | data: {
|
---|
160 | passed: result.passed,
|
---|
161 | build: "build-" + hash
|
---|
162 | }
|
---|
163 | },
|
---|
164 | function(error, response) {
|
---|
165 | if (error) {
|
---|
166 | console.log(error);
|
---|
167 | callback(error);
|
---|
168 | } else if (response.statusCode !== 200) {
|
---|
169 | console.log(response);
|
---|
170 | callback(
|
---|
171 | new Error("Unexpected response status")
|
---|
172 | );
|
---|
173 | } else {
|
---|
174 | callback(null, result.passed);
|
---|
175 | }
|
---|
176 | }
|
---|
177 | );
|
---|
178 | });
|
---|
179 | }
|
---|
180 | }
|
---|
181 | };
|
---|
182 | }
|
---|
183 |
|
---|
184 | // Make the SauceLabs jobs
|
---|
185 | ["all"].concat(browserTests).map(makeJob);
|
---|
186 |
|
---|
187 | var semver = require('semver');
|
---|
188 | var path = require('path');
|
---|
189 |
|
---|
190 | // Handle async / await in Rollup build for tests
|
---|
191 | // Remove this when Node 6 is no longer supported for the build/test process
|
---|
192 | const nodeVersion = semver.major(process.versions.node);
|
---|
193 | const tsNodeRuntime = path.resolve(path.join('node_modules', '.bin', 'ts-node'));
|
---|
194 | let scriptRuntime = 'node';
|
---|
195 | if (nodeVersion < 8) {
|
---|
196 | scriptRuntime = tsNodeRuntime;
|
---|
197 | }
|
---|
198 |
|
---|
199 | // Project configuration.
|
---|
200 | grunt.initConfig({
|
---|
201 | shell: {
|
---|
202 | options: {
|
---|
203 | stdout: true,
|
---|
204 | failOnError: true,
|
---|
205 | execOptions: {
|
---|
206 | maxBuffer: Infinity
|
---|
207 | }
|
---|
208 | },
|
---|
209 | build: {
|
---|
210 | command: [
|
---|
211 | /** Browser runtime */
|
---|
212 | scriptRuntime + " build/rollup.js --dist",
|
---|
213 | /** Copy to repo root */
|
---|
214 | "npm run copy:root",
|
---|
215 | /** Node.js runtime */
|
---|
216 | "npm run build"
|
---|
217 | ].join(" && ")
|
---|
218 | },
|
---|
219 | testbuild: {
|
---|
220 | command: [
|
---|
221 | "npm run build",
|
---|
222 | scriptRuntime + " build/rollup.js --browser --out=./tmp/browser/less.min.js"
|
---|
223 | ].join(" && ")
|
---|
224 | },
|
---|
225 | testcjs: {
|
---|
226 | command: "npm run build"
|
---|
227 | },
|
---|
228 | testbrowser: {
|
---|
229 | command: scriptRuntime + " build/rollup.js --browser --out=./tmp/browser/less.min.js"
|
---|
230 | },
|
---|
231 | test: {
|
---|
232 | command: [
|
---|
233 | tsNodeRuntime + " test/test-es6.ts",
|
---|
234 | "node test/index.js"
|
---|
235 | ].join(' && ')
|
---|
236 | },
|
---|
237 | generatebrowser: {
|
---|
238 | command: 'node test/browser/generator/generate.js'
|
---|
239 | },
|
---|
240 | runbrowser: {
|
---|
241 | command: 'node test/browser/generator/runner.js'
|
---|
242 | },
|
---|
243 | benchmark: {
|
---|
244 | command: "node benchmark/index.js"
|
---|
245 | },
|
---|
246 | opts: {
|
---|
247 | // test running with all current options (using `opts` since `options` means something already)
|
---|
248 | command: [
|
---|
249 | // @TODO: make this more thorough
|
---|
250 | // CURRENT OPTIONS
|
---|
251 | `node bin/lessc --ie-compat ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
---|
252 | // --math
|
---|
253 | `node bin/lessc --math=always ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
---|
254 | `node bin/lessc --math=parens-division ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
---|
255 | `node bin/lessc --math=parens ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
---|
256 | `node bin/lessc --math=strict ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
---|
257 | `node bin/lessc --math=strict-legacy ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
---|
258 |
|
---|
259 | // DEPRECATED OPTIONS
|
---|
260 | // --strict-math
|
---|
261 | `node bin/lessc --strict-math=on ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`
|
---|
262 | ].join(" && ")
|
---|
263 | },
|
---|
264 | plugin: {
|
---|
265 | command: [
|
---|
266 | `node bin/lessc --clean-css="--s1 --advanced" ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
---|
267 | "cd lib",
|
---|
268 | `node ../bin/lessc --clean-css="--s1 --advanced" ../${lessFolder}/_main/lazy-eval.less ../tmp/lazy-eval.css`,
|
---|
269 | "cd ..",
|
---|
270 | // Test multiple plugins
|
---|
271 | `node bin/lessc --plugin=clean-css="--s1 --advanced" --plugin=autoprefix="ie 11,Edge >= 13,Chrome >= 47,Firefox >= 45,iOS >= 9.2,Safari >= 9" ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`
|
---|
272 | ].join(" && ")
|
---|
273 | },
|
---|
274 | "sourcemap-test": {
|
---|
275 | // quoted value doesn't seem to get picked up by time-grunt, or isn't output, at least; maybe just "sourcemap" is fine?
|
---|
276 | command: [
|
---|
277 | `node bin/lessc --source-map=test/sourcemaps/maps/import-map.map ${lessFolder}/_main/import.less test/sourcemaps/import.css`,
|
---|
278 | `node bin/lessc --source-map ${lessFolder}/sourcemaps/basic.less test/sourcemaps/basic.css`
|
---|
279 | ].join(" && ")
|
---|
280 | }
|
---|
281 | },
|
---|
282 |
|
---|
283 | eslint: {
|
---|
284 | target: [
|
---|
285 | "test/**/*.js",
|
---|
286 | "src/less*/**/*.js",
|
---|
287 | "!test/less/errors/plugin/plugin-error.js"
|
---|
288 | ],
|
---|
289 | options: {
|
---|
290 | configFile: ".eslintrc.json",
|
---|
291 | fix: true
|
---|
292 | }
|
---|
293 | },
|
---|
294 |
|
---|
295 | connect: {
|
---|
296 | server: {
|
---|
297 | options: {
|
---|
298 | port: 8081
|
---|
299 | }
|
---|
300 | }
|
---|
301 | },
|
---|
302 |
|
---|
303 | "saucelabs-mocha": sauceJobs,
|
---|
304 |
|
---|
305 | // Clean the version of less built for the tests
|
---|
306 | clean: {
|
---|
307 | test: ["test/browser/less.js", "tmp", "test/less-bom"],
|
---|
308 | "sourcemap-test": [
|
---|
309 | "test/sourcemaps/*.css",
|
---|
310 | "test/sourcemaps/*.map"
|
---|
311 | ],
|
---|
312 | sauce_log: ["sc_*.log"]
|
---|
313 | }
|
---|
314 | });
|
---|
315 |
|
---|
316 | // Load these plugins to provide the necessary tasks
|
---|
317 | grunt.loadNpmTasks("grunt-saucelabs");
|
---|
318 |
|
---|
319 | require("jit-grunt")(grunt);
|
---|
320 |
|
---|
321 | // by default, run tests
|
---|
322 | grunt.registerTask("default", ["test"]);
|
---|
323 |
|
---|
324 | // Release
|
---|
325 | grunt.registerTask("dist", [
|
---|
326 | "shell:build"
|
---|
327 | ]);
|
---|
328 |
|
---|
329 | // Create the browser version of less.js
|
---|
330 | grunt.registerTask("browsertest-lessjs", [
|
---|
331 | "shell:testbrowser"
|
---|
332 | ]);
|
---|
333 |
|
---|
334 | // Run all browser tests
|
---|
335 | grunt.registerTask("browsertest", [
|
---|
336 | "browsertest-lessjs",
|
---|
337 | "connect",
|
---|
338 | "shell:runbrowser"
|
---|
339 | ]);
|
---|
340 |
|
---|
341 | // setup a web server to run the browser tests in a browser rather than phantom
|
---|
342 | grunt.registerTask("browsertest-server", [
|
---|
343 | "browsertest-lessjs",
|
---|
344 | "shell:generatebrowser",
|
---|
345 | "connect::keepalive"
|
---|
346 | ]);
|
---|
347 |
|
---|
348 | var previous_force_state = grunt.option("force");
|
---|
349 |
|
---|
350 | grunt.registerTask("force", function(set) {
|
---|
351 | if (set === "on") {
|
---|
352 | grunt.option("force", true);
|
---|
353 | } else if (set === "off") {
|
---|
354 | grunt.option("force", false);
|
---|
355 | } else if (set === "restore") {
|
---|
356 | grunt.option("force", previous_force_state);
|
---|
357 | }
|
---|
358 | });
|
---|
359 |
|
---|
360 | grunt.registerTask("sauce", [
|
---|
361 | "browsertest-lessjs",
|
---|
362 | "shell:generatebrowser",
|
---|
363 | "connect",
|
---|
364 | "sauce-after-setup"
|
---|
365 | ]);
|
---|
366 |
|
---|
367 | grunt.registerTask("sauce-after-setup", [
|
---|
368 | "saucelabs-mocha:all",
|
---|
369 | "clean:sauce_log"
|
---|
370 | ]);
|
---|
371 |
|
---|
372 | var testTasks = [
|
---|
373 | "clean",
|
---|
374 | "eslint",
|
---|
375 | "shell:testbuild",
|
---|
376 | "shell:test",
|
---|
377 | "shell:opts",
|
---|
378 | "shell:plugin",
|
---|
379 | "connect",
|
---|
380 | "shell:runbrowser"
|
---|
381 | ];
|
---|
382 |
|
---|
383 | if (
|
---|
384 | isNaN(Number(process.env.TRAVIS_PULL_REQUEST, 10)) &&
|
---|
385 | (process.env.TRAVIS_BRANCH === "master")
|
---|
386 | ) {
|
---|
387 | testTasks.push("force:on");
|
---|
388 | testTasks.push("sauce-after-setup");
|
---|
389 | testTasks.push("force:off");
|
---|
390 | }
|
---|
391 |
|
---|
392 | // Run all tests
|
---|
393 | grunt.registerTask("test", testTasks);
|
---|
394 |
|
---|
395 | // Run shell option tests (includes deprecated options)
|
---|
396 | grunt.registerTask("shell-options", ["shell:opts"]);
|
---|
397 |
|
---|
398 | // Run shell plugin test
|
---|
399 | grunt.registerTask("shell-plugin", ["shell:plugin"]);
|
---|
400 |
|
---|
401 | // Quickly build and run Node tests
|
---|
402 | grunt.registerTask("quicktest", [
|
---|
403 | "shell:testcjs",
|
---|
404 | "shell:test"
|
---|
405 | ]);
|
---|
406 |
|
---|
407 | // generate a good test environment for testing sourcemaps
|
---|
408 | grunt.registerTask("sourcemap-test", [
|
---|
409 | "clean:sourcemap-test",
|
---|
410 | "shell:build:lessc",
|
---|
411 | "shell:sourcemap-test",
|
---|
412 | "connect::keepalive"
|
---|
413 | ]);
|
---|
414 |
|
---|
415 | // Run benchmark
|
---|
416 | grunt.registerTask("benchmark", [
|
---|
417 | "shell:testcjs",
|
---|
418 | "shell:benchmark"
|
---|
419 | ]);
|
---|
420 | };
|
---|