var assert = require(“assert”); var file = require('../file-system'); var fs = require('fs'); var path = require('path');

function getPath(filepath) {

return path.join(__dirname, filepath);

}

describe('copy', function() {

var allFiles = [
  [
    getPath('var/copy/simple/1/demo.html'),
    getPath('var/copy/simple/1/demo.css'),
    getPath('var/copy/simple/1/demo.js'),
    getPath('var/copy/simple/1/2/demo.css'),
    getPath('var/copy/simple/1/2/demo.html'),
    getPath('var/copy/simple/file.js/demo.css'),
    getPath('var/copy/simple/demo.js'),
    getPath('var/copy/simple/demo.css')
  ]
];

before(function() {
  allFiles.forEach(function(files) {
    files.forEach(function(item) {
      file.writeFileSync(item, 'a');
    });
  });
});

it('copySync files with filter', function() {
  var dirpath = getPath('var/copy/simple');
  var destpath = getPath('var/copy/simpledest');

  file.copySync(dirpath, destpath, {
    filter: [
      '**/*.js',
      '1/**/*.css',
      '1/demo.html'
    ]
  });

  var dirDest = [
    getPath('var/copy/simpledest/1/demo.html'),
    getPath('var/copy/simpledest/1/demo.css'),
    getPath('var/copy/simpledest/1/2/demo.css'),
    getPath('var/copy/simpledest/1/demo.js'),
    getPath('var/copy/simpledest/demo.js')
  ];
  var result = [];

  file.recurseSync(destpath, function(filepath, relative,filename) {
    if (!filename) return;

    result.push(filepath);
  });

  assert.equal(result.length, dirDest.length);
});

it('copySync replace filepath', function() {
  var dirpath = getPath('var/copy/simple');
  var destpath = getPath('var/copy/simple-replace');

  file.copySync(dirpath, destpath, {
    process: function(contents, filepath, relative) {
      var basename = path.basename(filepath);
      var newpath = path.join(destpath, relative);

      // Validate relative
      assert(path.relative(dirpath, filepath), relative);

      // Replace html to txt
      newpath = newpath.replace(
        /\.html$/,
        '.txt'
      );

      // Move all css to rootpath of destpath
      if (/\.css$/.test(basename)) {
        var prefix = path.basename(path.dirname(newpath));
        newpath = path.join(destpath, prefix + '-' + basename);
      }

      return {
        contents: contents,
        filepath: newpath
      };
    }
  });

  assert.equal(true, file.existsSync(
    path.join(destpath, '1/demo.txt')
  ));
});

it('copySync with noProcess', function() {
  var dirpath = getPath('var/copy/simple');
  var destpath = getPath('var/copy/simple-noprocess');

  file.copySync(dirpath, destpath, {
    filter: [
      '**/*demo.css',
      '!**/1/demo.css'
    ],
    noProcess: 'demo.css',
    process: function(contents, filepath) {
      return 'b';
    }
  });

  assert.equal(true, file.existsSync(
    path.join(destpath, 'demo.css')
  ));

  assert.equal(false, file.existsSync(
    path.join(destpath, '1/demo.css')
  ));

  assert.equal(true, file.existsSync(
    path.join(destpath, '1/2/demo.css')
  ));

  assert.equal(true, file.existsSync(
    path.join(destpath, 'file.js/demo.css')
  ));

  var content = file.readFileSync(
    path.join(destpath, 'demo.css'),
    { encoding: 'utf8' }
  );

  assert.equal('a',  content);
});

after(function() {
 file.rmdirSync(getPath('var/copy'));
});

});