var fastLevenshtein = require('../levenshtein.min').get,

levenshtein = require('levenshtein'),
levenshteinEditDistance = require('levenshtein-edit-distance'),
levenshteinComponent = require('levenshtein-component'),
levenshteinDeltas = require('levenshtein-deltas'),
natural = require('natural').LevenshteinDistance;

/* The first 100 words from Letterpress: github.com/atebits/Words */ source = Array(11).join([

'aa',
'aah',
'aahed',
'aahing',
'aahs',
'aal',
'aalii',
'aaliis',
'aals',
'aardvark',
'aardvarks',
'aardwolf',
'aardwolves',
'aargh',
'aarrgh',
'aarrghh',
'aarti',
'aartis',
'aas',
'aasvogel',
'aasvogels',
'ab',
'aba',
'abac',
'abaca',
'abacas',
'abaci',
'aback',
'abacs',
'abacterial',
'abactinal',
'abactinally',
'abactor',
'abactors',
'abacus',
'abacuses',
'abaft',
'abaka',
'abakas',
'abalone',
'abalones',
'abamp',
'abampere',
'abamperes',
'abamps',
'aband',
'abanded',
'abanding',
'abandon',
'abandoned',
'abandonedly',
'abandonee',
'abandonees',
'abandoner',
'abandoners',
'abandoning',
'abandonment',
'abandonments',
'abandons',
'abandonware',
'abandonwares',
'abands',
'abapical',
'abas',
'abase',
'abased',
'abasedly',
'abasement',
'abasements',
'abaser',
'abasers',
'abases',
'abash',
'abashed',
'abashedly',
'abashes',
'abashing',
'abashless',
'abashment',
'abashments',
'abasia',
'abasias',
'abasing',
'abask',
'abatable',
'abate',
'abated',
'abatement',
'abatements',
'abater',
'abaters',
'abates',
'abating',
'abatis',
'abatises',
'abator',
'abators',
'abattis',
'abattises',
'abattoir',
'abattoirs'

].join('|')).split('|');

/**

* The actual test loop.
* @param  {Function} fn Levenshtein distance function.
*/

var loop = function(fn) {

var iterator = -1,
  previousValue = '',
  value,
  dist;

while (value = source[++iterator]) {
  dist = fn(previousValue, value);
  previousValue = value;
}

};

/** @type {Object} Test config */ module.exports = {

name: 'Implementation comparison',
onComplete: function() {
  console.log('Benchmark done.');
},
tests: [
  {
    name: 'levenshtein-edit-distance',
    fn: function() {
      loop(levenshteinEditDistance);
    }
  },
  {
    name: 'levenshtein-component',
    fn: function() {
      loop(levenshteinComponent);
    }
  },
  {
    name: 'levenshtein-deltas',
    fn: function() {
      loop(function(v1,v2) {
          return new levenshteinDeltas.Lev(v1,v2).distance();
      });
    }
  },
  {
    name: 'natural',
    fn: function() {
      loop(natural);
    }
  },
  {
    name: 'levenshtein',
    fn: function() {
      loop(levenshtein);
    }
  },
  {
    name: 'fast-levenshtein',
    fn: function() {
      loop(fastLevenshtein);
    }
  },
]

};