(function() {

function Tests(ASSERT, PBKDF2, MD, UTIL) {
  describe('pbkdf2', function() {
    it('should derive a password with hmac-sha-1 c=1', function() {
      var dkHex = UTIL.bytesToHex(PBKDF2('password', 'salt', 1, 20));
      ASSERT.equal(dkHex, '0c60c80f961f0e71f3a9b524af6012062fe037a6');
    });

    it('should derive a password with hmac-sha-1 c=2', function() {
      var dkHex = UTIL.bytesToHex(PBKDF2('password', 'salt', 2, 20));
      ASSERT.equal(dkHex, 'ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957');
    });

    it('should derive a password with hmac-sha-1 c=5 keylen=8', function() {
      var salt = UTIL.hexToBytes('1234567878563412');
      var dkHex = UTIL.bytesToHex(PBKDF2('password', salt, 5, 8));
      ASSERT.equal(dkHex, 'd1daa78615f287e6');
    });

    it('should derive a password with hmac-sha-1 c=4096', function() {
      // Note: might be too slow on old browsers
      var dkHex = UTIL.bytesToHex(PBKDF2('password', 'salt', 4096, 20));
      ASSERT.equal(dkHex, '4b007901b765489abead49d926f721d065a429c1');
    });

    /*
    it('should derive a password with hmac-sha-1 c=16777216', function() {
      // Note: too slow
      var dkHex = UTIL.bytesToHex(PBKDF2('password', 'salt', 16777216, 20));
      ASSERT.equal(dkHex, 'eefe3d61cd4da4e4e9945b3d6ba2158c2634e984');
    });*/

    it('should derive a password with hmac-sha-256 c=1000', function() {
      // Note: might be too slow on old browsers
      var salt = '4bcda0d1c689fe465c5b8a817f0ddf3d';
      var md = MD.sha256.create();
      var dkHex = UTIL.bytesToHex(PBKDF2('password', salt, 1000, 48, md));
      ASSERT.equal(dkHex, '9da8a5f4ae605f35e82e5beac5f362df15c4255d88f738d641466a4107f9970238e768e72af29ac89a1b16ff277b31d2');
    });

    it('should asynchronously derive a password with hmac-sha-1 c=1', function(done) {
      PBKDF2('password', 'salt', 1, 20, function(err, dk) {
        var dkHex = UTIL.bytesToHex(dk);
        ASSERT.equal(dkHex, '0c60c80f961f0e71f3a9b524af6012062fe037a6');
        done();
      });
    });

    it('should asynchronously derive a password with hmac-sha-1 c=2', function(done) {
      PBKDF2('password', 'salt', 2, 20, function(err, dk) {
        var dkHex = UTIL.bytesToHex(dk);
        ASSERT.equal(dkHex, 'ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957');
        done();
      });
    });

    it('should asynchronously derive a password with hmac-sha-1 c=5 keylen=8', function(done) {
      var salt = UTIL.hexToBytes('1234567878563412');
      PBKDF2('password', salt, 5, 8, function(err, dk) {
        var dkHex = UTIL.bytesToHex(dk);
        ASSERT.equal(dkHex, 'd1daa78615f287e6');
        done();
      });
    });

    it('should asynchronously derive a password with hmac-sha-1 c=4096', function(done) {
      // Note: might be too slow on old browsers
      PBKDF2('password', 'salt', 4096, 20, function(err, dk) {
        var dkHex = UTIL.bytesToHex(dk);
        ASSERT.equal(dkHex, '4b007901b765489abead49d926f721d065a429c1');
        done();
      });
    });

    /*
    it('should asynchronously derive a password with hmac-sha-1 c=16777216', function(done) {
      // Note: too slow
      PBKDF2('password', 'salt', 16777216, 20, function(err, dk) {
        var dkHex = UTIL.bytesToHex(dk);
        ASSERT.equal(dkHex, 'eefe3d61cd4da4e4e9945b3d6ba2158c2634e984');
        done();
      });
    });*/

    it('should asynchronously derive a password with hmac-sha-256 c=1000', function(done) {
      // Note: might be too slow on old browsers
      var salt = '4bcda0d1c689fe465c5b8a817f0ddf3d';
      var md = MD.sha256.create();
      PBKDF2('password', salt, 1000, 48, md, function(err, dk) {
        var dkHex = UTIL.bytesToHex(dk);
        ASSERT.equal(dkHex, '9da8a5f4ae605f35e82e5beac5f362df15c4255d88f738d641466a4107f9970238e768e72af29ac89a1b16ff277b31d2');
        done();
      });
    });
  });
}

// check for AMD
if(typeof define === 'function') {
  define([
    'forge/pbkdf2',
    'forge/md',
    'forge/util'
  ], function(PBKDF2, MD, UTIL) {
    Tests(
      // Global provided by test harness
      ASSERT,
      PBKDF2(),
      MD(),
      UTIL()
    );
  });
} else if(typeof module === 'object' && module.exports) {
  // assume NodeJS
  Tests(
    require('assert'),
    require('../../js/pbkdf2')(),
    require('../../js/md')(),
    require('../../js/util')());
}

})();
