Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80690 views
1
var _ = require('lodash'),
2
chai = require('chai'),
3
fs = require('fs'),
4
levenshtein = require('../levenshtein.min');
5
6
var expect = chai.expect,
7
assert = chai.assert;
8
9
10
/**
11
* Create test functions.
12
* @return Object
13
*/
14
var createTests = function(str1, str2, expectedLength, options) {
15
options = _.extend({}, {
16
description: null
17
}, options);
18
19
if (!options.description) {
20
options.description = (0 === str1.length ? '(empty)' : str1) + ' <-> ' + (0 === str2.length ? '(empty)' : str2);
21
}
22
23
var ret = {};
24
25
ret["SYNC:\t" + options.description] = function() {
26
expect(levenshtein.get(str1, str2)).to.eql(expectedLength);
27
};
28
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);
33
34
done();
35
});
36
};
37
38
return ret;
39
};
40
41
42
// ----- Basic tests ----- //
43
44
(function() {
45
46
var tests = {},
47
str = 'hello',
48
str1 = str,
49
str2 = str,
50
i;
51
52
// equal strings
53
_.extend(tests, createTests('hello', 'hello', 0));
54
55
// inserts
56
for (i=0; i<=str.length; ++i) {
57
str1 = str.substr(0,i);
58
str2 = str;
59
60
_.extend(tests, createTests(str1, str2, str.length - i));
61
}
62
63
// deletes
64
for (i=str.length-1; i>=0; --i) {
65
str1 = str;
66
str2 = str.substr(0,i);
67
68
_.extend(tests, createTests(str1, str2, str.length - i));
69
}
70
71
// substitutions
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 ));
77
78
// many ops
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 ));
85
86
// non-latin
87
_.extend(tests, createTests('因為我是中國人所以我會說中文', '因為我是英國人所以我會說英文', 2, {
88
description: 'non-latin'
89
}));
90
91
// long text
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',
95
143,
96
{
97
description: 'long text'
98
}
99
));
100
101
exports['Basic'] = tests;
102
})();
103
104
// ------ Asynchronous tests ----- //
105
106
var text1 = fs.readFileSync(__dirname + '/text1.txt', 'utf-8'),
107
text2 = fs.readFileSync(__dirname + '/text2.txt', 'utf-8');
108
109
exports['Async'] = {
110
'no progress callback': function(done) {
111
this.timeout(20000);
112
113
var startTime = new Date().valueOf();
114
115
levenshtein.getAsync(text1, text2, function(err, distance) {
116
var timeElapsed = new Date().valueOf() - startTime;
117
118
expect(err).to.be.null;
119
expect(distance).to.eql(194);
120
121
console.log(timeElapsed + ' ms');
122
123
done();
124
});
125
},
126
'with progress callback': function(done) {
127
this.timeout(20000);
128
129
var percents = [];
130
var progress = function(percent) {
131
percents.push(percent);
132
};
133
134
var startTime = new Date().valueOf();
135
136
levenshtein.getAsync(text1, text2, function(err, distance) {
137
var timeElapsed = new Date().valueOf() - startTime;
138
139
expect(err).to.be.null;
140
expect(distance).to.eql(194);
141
142
console.log(timeElapsed + ' ms, ' + percents.length + ' progress updates');
143
144
expect(0 < percents.length).to.be.true;
145
146
// check percentages
147
var lastPercent = 0;
148
_.each(percents, function(percent) {
149
expect(100 >= percent);
150
expect(percent > lastPercent);
151
lastPercent = percent;
152
});
153
154
done();
155
}, {
156
progress: progress
157
});
158
},
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');
162
163
done();
164
}, {
165
progress: function() {
166
throw new Error('Bla bla');
167
}
168
});
169
}
170
};
171
172
173