54b92220aa481cce7aa07ff840c94bd1509fe95d
[platform/framework/web/crosswalk-tizen.git] /
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