1 var _ = require('lodash'),
2 chai = require('chai'),
4 levenshtein = require('../levenshtein.min');
6 var expect = chai.expect,
11 * Create test functions.
14 var createTests = function(str1, str2, expectedLength, options) {
15 options = _.extend({}, {
19 if (!options.description) {
20 options.description = (0 === str1.length ? '(empty)' : str1) + ' <-> ' + (0 === str2.length ? '(empty)' : str2);
25 ret["SYNC:\t" + options.description] = function() {
26 expect(levenshtein.get(str1, str2)).to.eql(expectedLength);
29 ret["ASYNC:\t" + options.description] = function(done) {
30 levenshtein.getAsync(str1, str2, function(err, distance) {
31 expect(err).to.be.null;
32 expect(distance).to.eql(expectedLength);
42 // ----- Basic tests ----- //
53 _.extend(tests, createTests('hello', 'hello', 0));
56 for (i=0; i<=str.length; ++i) {
57 str1 = str.substr(0,i);
60 _.extend(tests, createTests(str1, str2, str.length - i));
64 for (i=str.length-1; i>=0; --i) {
66 str2 = str.substr(0,i);
68 _.extend(tests, createTests(str1, str2, str.length - i));
72 _.extend(tests, createTests("a", "b", 1 ));
73 _.extend(tests, createTests("ab", "ac", 1 ));
74 _.extend(tests, createTests("ac", "bc", 1 ));
75 _.extend(tests, createTests("abc", "axc", 1 ));
76 _.extend(tests, createTests("xabxcdxxefxgx", "1ab2cd34ef5g6", 6 ));
79 _.extend(tests, createTests('xabxcdxxefxgx', 'abcdefg', 6));
80 _.extend(tests, createTests('javawasneat', 'scalaisgreat', 7));
81 _.extend(tests, createTests("example", "samples", 3));
82 _.extend(tests, createTests("sturgeon", "urgently", 6 ));
83 _.extend(tests, createTests("levenshtein", "frankenstein", 6 ));
84 _.extend(tests, createTests("distance", "difference", 5 ));
87 _.extend(tests, createTests('因為我是中國人所以我會說中文', '因為我是英國人所以我會說英文', 2, {
88 description: 'non-latin'
92 _.extend(tests, createTests(
93 'Morbi interdum ultricies neque varius condimentum. Donec volutpat turpis interdum metus ultricies vulputate. Duis ultricies rhoncus sapien, sit amet fermentum risus imperdiet vitae. Ut et lectus',
94 'Duis erat dolor, cursus in tincidunt a, lobortis in odio. Cras magna sem, pharetra et iaculis quis, faucibus quis tellus. Suspendisse dapibus sapien in justo cursus',
97 description: 'long text'
101 exports['Basic'] = tests;
104 // ------ Asynchronous tests ----- //
106 var text1 = fs.readFileSync(__dirname + '/text1.txt', 'utf-8'),
107 text2 = fs.readFileSync(__dirname + '/text2.txt', 'utf-8');
110 'no progress callback': function(done) {
113 var startTime = new Date().valueOf();
115 levenshtein.getAsync(text1, text2, function(err, distance) {
116 var timeElapsed = new Date().valueOf() - startTime;
118 expect(err).to.be.null;
119 expect(distance).to.eql(194);
121 console.log(timeElapsed + ' ms');
126 'with progress callback': function(done) {
130 var progress = function(percent) {
131 percents.push(percent);
134 var startTime = new Date().valueOf();
136 levenshtein.getAsync(text1, text2, function(err, distance) {
137 var timeElapsed = new Date().valueOf() - startTime;
139 expect(err).to.be.null;
140 expect(distance).to.eql(194);
142 console.log(timeElapsed + ' ms, ' + percents.length + ' progress updates');
144 expect(0 < percents.length).to.be.true;
148 _.each(percents, function(percent) {
149 expect(100 >= percent);
150 expect(percent > lastPercent);
151 lastPercent = percent;
159 'progress callback error': function(done) {
160 levenshtein.getAsync(text1 + text2, text2 + text1, function(err) {
161 expect(err.toString()).to.be.eql('Progress callback: Error: Bla bla');
165 progress: function() {
166 throw new Error('Bla bla');