| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 | /* * grunt * http://gruntjs.com/ * * Copyright (c) 2012 "Cowboy" Ben Alman * Licensed under the MIT license. * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT */// For now, run this "test suite" with:// grunt --gruntfile ./test/gruntfile/multi-task-files.js'use strict';module.exports = function(grunt) {  grunt.file.setBase('../fixtures/files');  grunt.initConfig({    build: '123',    mappings: {      cwd: 'src/',      dest: 'foo/',      ext: '.bar',      rename: function(destBase, destPath) {        return destBase + 'baz/' + destPath.replace(/\.js$/, '<%= mappings.ext %>');      },    },    run: {      options: {a: 1, b: 11},      // This is the "compact" format, where the target name is actually the      // dest filename. Doesn't support per-target options, templated dest, or      // >1 srcs-dest grouping.      'dist/built.js': 'src/*1.js',      'dist/built1.js': ['src/*1.js', 'src/*2.js'],      // This is the "medium" format. The target name is arbitrary and can be      // used like "grunt run:built". Supports per-target options, templated      // dest, and arbitrary "extra" paramters. Doesn't support >1 srcs-dest      // grouping.      built: {        options: {a: 2, c: 22},        src: ['src/*1.js', 'src/*2.js'],        dest: 'dist/built-<%= build %>.js',        extra: 123,      },      // This is the "full" format. The target name is arbitrary and can be      // used like "grunt run:long1". Supports per-target options, templated      // dest and >1 srcs-dest grouping.      long1: {        options: {a: 3, c: 33},        files: {          'dist/built-<%= build %>-a.js': ['src/*1.js'],          'dist/built-<%= build %>-b.js': ['src/*1.js', 'src/*2.js'],        }      },      long2: {        options: {a: 4, c: 44},        files: [          {'dist/built-<%= build %>-a.js': ['src/*.whoops']},          {'dist/built-<%= build %>-b.js': ['src/*1.js', 'src/*2.js']},        ]      },      // This "full" variant supports per srcs-dest arbitrary "extra" paramters.      long3: {        options: {a: 5, c: 55},        files: [          {dest: 'dist/built-<%= build %>-a.js', src: ['src/*2.js'], extra: 456},          {dest: 'dist/built-<%= build %>-b.js', src: ['src/*1.js', 'src/*2.js'], extra: 789},        ]      },      // File mapping options can be specified in these 2 formats.      built_mapping: {        options: {a: 6, c: 66},        expand: true,        cwd: '<%= mappings.cwd %>',        src: ['*1.js', '*2.js'],        dest: '<%= mappings.dest %>',        rename: '<%= mappings.rename %>',        extra: 123      },      long3_mapping: {        options: {a: 7, c: 77},        files: [          {            expand: true,            cwd: '<%= mappings.cwd %>',            src: ['*1.js', '*2.js'],            dest: '<%= mappings.dest %>',            rename: '<%= mappings.rename %>',            extra: 123          }        ]      },      // Need to ensure the task function is run if no files or options were      // specified!      no_files_or_options: {},    },  });  var results = {};  var counters = [];  var counter = -1;  grunt.registerMultiTask('run', 'Store stuff for later testing.', function() {    var key = this.nameArgs;    results[key] = {      options: this.options({d: 9}),      files: this.files,    };    // Test asynchronous-ness.    var done;    if (counter++ % 2 === 0) {      done = this.async();      setTimeout(function() {        counters.push(counter);        done();      }, 10);    } else {      counters.push(counter);    }  });  var expecteds = {    'run:no_files_or_options': {      options: {a: 1, b: 11, d: 9},      files: [],    },    'run:dist/built.js': {      options: {a: 1, b: 11, d: 9},      files: [        {          dest: 'dist/built.js',          src: ['src/file1.js'],          orig: {            dest: 'dist/built.js',            src: ['src/*1.js'],          },        },      ]    },    'run:dist/built1.js': {      options: {a: 1, b: 11, d: 9},      files: [        {          dest: 'dist/built1.js',          src: ['src/file1.js', 'src/file2.js'],          orig: {            dest: 'dist/built1.js',            src: ['src/*1.js', 'src/*2.js'],          },        },      ]    },    'run:built': {      options: {a: 2, b: 11, c: 22, d: 9},      files: [        {          dest: 'dist/built-123.js',          src: ['src/file1.js', 'src/file2.js'],          extra: 123,          orig: {            dest: 'dist/built-123.js',            src: ['src/*1.js', 'src/*2.js'],            extra: 123,          },        },      ],    },    'run:long1': {      options: {a: 3, b: 11, c: 33, d: 9},      files: [        {          dest: 'dist/built-123-a.js',          src: ['src/file1.js'],          orig: {            dest: 'dist/built-123-a.js',            src: ['src/*1.js'],          },        },        {          dest: 'dist/built-123-b.js',          src: ['src/file1.js', 'src/file2.js'],          orig: {            dest: 'dist/built-123-b.js',            src: ['src/*1.js', 'src/*2.js'],          },        },      ],    },    'run:long2': {      options: {a: 4, b: 11, c: 44, d: 9},      files: [        {          dest: 'dist/built-123-a.js',          src: [],          orig: {            dest: 'dist/built-123-a.js',            src: ['src/*.whoops'],          },        },        {          dest: 'dist/built-123-b.js',          src: ['src/file1.js', 'src/file2.js'],          orig: {            dest: 'dist/built-123-b.js',            src: ['src/*1.js', 'src/*2.js'],          },        },      ],    },    'run:long3': {      options: {a: 5, b: 11, c: 55, d: 9},      files: [        {          dest: 'dist/built-123-a.js',          src: ['src/file2.js'],          extra: 456,          orig: {            dest: 'dist/built-123-a.js',            src: ['src/*2.js'],            extra: 456,          },        },        {          dest: 'dist/built-123-b.js',          src: ['src/file1.js', 'src/file2.js'],          extra: 789,          orig: {            src: ['src/*1.js', 'src/*2.js'],            dest: 'dist/built-123-b.js',            extra: 789,          },        },      ],    },    'run:built_mapping': {      options: {a: 6, b: 11, c: 66, d: 9},      files: [        {          dest: 'foo/baz/file1.bar',          src: ['src/file1.js'],          extra: 123,          orig: {            expand: true,            cwd: grunt.config.get('mappings.cwd'),            src: ['*1.js', '*2.js'],            dest: grunt.config.get('mappings.dest'),            rename: grunt.config.get('run.built_mapping.rename'),            extra: 123,          },        },        {          dest: 'foo/baz/file2.bar',          src: ['src/file2.js'],          extra: 123,          orig: {            expand: true,            cwd: grunt.config.get('run.built_mapping.cwd'),            src: ['*1.js', '*2.js'],            dest: grunt.config.get('run.built_mapping.dest'),            rename: grunt.config.get('run.built_mapping.rename'),            extra: 123,          },        },      ],    },    'run:long3_mapping': {      options: {a: 7, b: 11, c: 77, d: 9},      files: [        {          dest: 'foo/baz/file1.bar',          src: ['src/file1.js'],          extra: 123,          orig: {            expand: true,            cwd: grunt.config.get('mappings.cwd'),            src: ['*1.js', '*2.js'],            dest: grunt.config.get('mappings.dest'),            rename: grunt.config.get('mappings.rename'),            extra: 123,          },        },        {          dest: 'foo/baz/file2.bar',          src: ['src/file2.js'],          extra: 123,          orig: {            expand: true,            cwd: grunt.config.get('mappings.cwd'),            src: ['*1.js', '*2.js'],            dest: grunt.config.get('mappings.dest'),            rename: grunt.config.get('run.built_mapping.rename'),            extra: 123,          },        },      ],    },  };  var assert = require('assert');  var difflet = require('difflet')({indent: 2, comment: true});  var test = function(name, fn) {    try {      fn();    } catch (err) {      grunt.log.subhead('Assertion Failure in ' + name);      console.log(difflet.compare(err.expected, err.actual));      throw new Error(err.message);    }  };  grunt.registerTask('test', 'Test file and option objects.', function() {    var key = 'run:' + this.nameArgs.replace(/^.*?:/, '');    var all = key === 'run:all';    var actual = all ? results : results[key];    var expected = all ? expecteds : expecteds[key];    test(this.name, function() {      assert.deepEqual(actual, expected, 'Actual should match expected.');    });    if (all) {      results = {};    } else {      delete results[key];    }  });  grunt.registerTask('test:counters', 'Test function execution order.', function() {    test(this.name, function() {      assert.equal(counters.length, counter + 1, 'Task functions should have run the correct number of times.');      var expected = [];      for (var i = 0; i < counters.length; i++) { expected.push(i); }      assert.deepEqual(counters, expected, 'Task functions should have actually executed in-order.');    });  });  grunt.registerTask('default', [    'run:no_files_or_options',    'test:no_files_or_options',    'run:dist/built.js',    'test:dist/built.js',    'run:dist/built1.js',    'test:dist/built1.js',    'run:built',    'test:built',    'run:long1',    'test:long1',    'run:long2',    'test:long2',    'run:long3',    'test:long3',    'run:built_mapping',    'test:built_mapping',    'run:long3_mapping',    'test:long3_mapping',    'run',    'test:all',    'test:counters',  ]);};
 |