1 var JS
= this.JS
|| require('jstest');
2 var m
= require('../string-lerp');
4 var HALF_POOS
= /\uD83D\uD83D|\uDCA9\uDCA9|\uD83D$/;
5 var UNUSUAL_Q
= 'q\u0307\u0323';
7 JS
.Test
.describe('fast lerp', function () { with (this) {
9 var A
= "Do you like green eggs and ham?";
10 var B
= "I do not like them, Sam-I-am.";
12 it("handles empty strings", function () { with (this) {
13 assertEqual("", lerp("", "", -1));
14 assertEqual("", lerp("", "", 0));
15 assertEqual("", lerp("", "", 0.5));
16 assertEqual("", lerp("", "", 1));
17 assertEqual("", lerp("", "", 2));
20 it("maintains identity", function () { with (this) {
21 for (var i
= -1; i
< 2; i
+= 1/1024) {
22 assertEqual(A
, lerp(A
, A
, i
));
23 assertEqual(B
, lerp(B
, B
, i
));
27 it("handles lows", function () { with (this) {
28 assertEqual(A
, lerp(A
, B
, -Infinity
));
29 assertEqual(A
, lerp(A
, B
, -1));
30 assertEqual(A
, lerp(A
, B
, 0));
33 it("handles highs", function () { with (this) {
34 assertEqual(B
, lerp(A
, B
, 1));
35 assertEqual(B
, lerp(A
, B
, 2));
36 assertEqual(B
, lerp(A
, B
, Infinity
));
39 it("crams strings together", function () { with (this) {
40 assertEqual("I do not ke green eggs and ham?", lerp(A
, B
, 0.3));
41 assertEqual("I do not like tn eggs and ham?", lerp(A
, B
, 0.5));
42 assertEqual("I do not like them, Sam-I-am?", lerp(A
, B
, 0.98));
45 it("doesn't make half a poo", function () { with (this) {
46 var poos
= "\uD83D\uDCA9\uD83D\uDCA9\uD83D\uDCA9\uD83D\uDCA9";
47 assertEqual("\uD83D\uDCA9\uD83D\uDCA9", lerp("", poos
, 0.5));
48 assertEqual("\uD83D\uDCA9", lerp("", poos
, 0.35));
50 for (var i
= 0; i
<= 1; i
+= 1/256)
51 assertNot(lerp("", poos
, i
).match(HALF_POOS
));
54 it("doesn't misplace combining marks", function () { with (this) {
55 for (var i
= 0; i
<= 1; i
+= 1/256) {
56 var r
= lerp("a", UNUSUAL_Q
, i
);
57 assert(r
=== "a" || r
=== UNUSUAL_Q
);
62 JS
.Test
.describe('diff lerp', function () { with (this) {
63 var lerp
= m
.diffLerp
;
64 var A
= "Do you like green eggs and ham?";
65 var B
= "I do not like them, Sam-I-am.";
67 it("handles empty strings", function () { with (this) {
68 assertEqual("", lerp("", "", -1));
69 assertEqual("", lerp("", "", 0));
70 assertEqual("", lerp("", "", 0.5));
71 assertEqual("", lerp("", "", 1));
72 assertEqual("", lerp("", "", 2));
75 it("maintains identity", function () { with (this) {
76 for (var i
= -1; i
< 2; i
+= 1/1024) {
77 assertEqual(A
, lerp(A
, A
, i
));
78 assertEqual(B
, lerp(B
, B
, i
));
82 it("handles lows", function () { with (this) {
83 assertEqual(A
, lerp(A
, B
, -Infinity
));
84 assertEqual(A
, lerp(A
, B
, -1));
85 assertEqual(A
, lerp(A
, B
, 0));
88 it("handles highs", function () { with (this) {
89 assertEqual(B
, lerp(A
, B
, 1));
90 assertEqual(B
, lerp(A
, B
, 2));
91 assertEqual(B
, lerp(A
, B
, Infinity
));
94 it("edits strings", function () { with (this) {
95 assertEqual(A
, lerp(A
, B
, 0.01));
96 assertEqual("I do not like treen eggs and ham?", lerp(A
, B
, 0.3));
97 assertEqual("I do not like them, eggs and ham?", lerp(A
, B
, 0.5));
98 assertEqual("I do not like them, Sam-Iham?", lerp(A
, B
, 0.9));
99 assertEqual(B
, lerp(A
, B
, 0.99));
102 it("doesn't make half a poo", function () { with (this) {
103 var poos
= "\uD83D\uDCA9\uD83D\uDCA9\uD83D\uDCA9\uD83D\uDCA9";
104 assertEqual("\uD83D\uDCA9\uD83D\uDCA9", lerp("", poos
, 0.5));
105 assertEqual("\uD83D\uDCA9", lerp("", poos
, 0.35));
107 for (var i
= 0; i
<= 1; i
+= 1/256)
108 assertNot(lerp("", poos
, i
).match(HALF_POOS
));
111 it("doesn't misplace combining marks", function () { with (this) {
112 for (var i
= 0; i
<= 1; i
+= 1/256) {
113 var r
= lerp("a", UNUSUAL_Q
, i
);
114 assert(r
=== "a" || r
=== UNUSUAL_Q
);
118 it("prefers ins/del to sub/sub", function () { with (this) {
119 // When the cost is uniform this string can be transformed by
120 // rewriting the whole thing for the same cost as deleting the
121 // front and adding to the back. But visually, we'd rather do
123 assertEqual("core", lerp("hard core", "core dump", 0.50));
126 it("weights ins/del cheaper than sub", function () { with (this) {
127 // When the cost is uniform it is cheaper to rewrite the
128 // former into the latter. But we'd rather keep the "core" for
129 // visual reasons, so we need to make sure we have unequal
131 assertEqual("core", lerp("apple core", "core dump", 0.51));
135 JS
.Test
.describe('numeric lerp', function () { with (this) {
136 var lerp
= m
.numericLerp
;
138 it("handles empty strings", function () { with (this) {
139 assertEqual("", lerp("", "", -1));
140 assertEqual("", lerp("", "", 0));
141 assertEqual("", lerp("", "", 0.5));
142 assertEqual("", lerp("", "", 1));
143 assertEqual("", lerp("", "", 2));
146 it("handles single numbers", function () { with (this) {
147 assertEqual("0", lerp("0", "100", 0));
148 assertEqual("50", lerp("0", "100", 0.5));
149 assertEqual("100", lerp("0", "100", 1.0));
150 assertEqual("150", lerp("0", "100", 1.5));
153 it("rounds integers", function () { with (this) {
154 assertEqual("12", lerp("0", "100", 0.123));
155 assertEqual("12.3", lerp("0.0", "100.0", 0.123));
156 assertEqual("12.3", lerp("0.0", "100", 0.123));
157 assertEqual("12.3", lerp("0.0", "100.0", 0.123));
160 it("thinks about precision", function () { with (this) {
161 assertEqual("12.30", lerp("0.00", "100.00", 0.123));
162 assertEqual("12.300", lerp("0.000", "100.000", 0.123));
165 it("computes parameters outside [0, 1]", function () { with (this) {
166 assertEqual("Giving 110%", lerp("Giving 0%", "Giving 100%", 1.1));
169 it("handles multiple numbers", function () { with (this) {
170 var A
= "Chapter 0. The sky was rgb(0, 0, 0)."
171 var B
= "Chapter 10. The sky was rgb(0, 0, 255)."
172 assertEqual(A
, lerp(A
, B
, 0));
173 assertEqual(B
, lerp(A
, B
, 1));
174 assertEqual("Chapter 5. The sky was rgb(0, 0, 128).", lerp(A
, B
, 0.5));
178 JS
.Test
.describe('fast lerp', function () { with (this) {
180 var A
= "Do you like green eggs and ham?";
181 var B
= "I do not like them, Sam-I-am.";
183 it("handles empty strings", function () { with (this) {
184 assertEqual("", lerp("", "", -1));
185 assertEqual("", lerp("", "", 0));
186 assertEqual("", lerp("", "", 0.5));
187 assertEqual("", lerp("", "", 1));
188 assertEqual("", lerp("", "", 2));
191 it("maintains identity", function () { with (this) {
192 for (var i
= -1; i
< 2; i
+= 1/1024) {
193 assertEqual(A
, lerp(A
, A
, i
));
194 assertEqual(B
, lerp(B
, B
, i
));
198 it("handles lows", function () { with (this) {
199 assertEqual(A
, lerp(A
, B
, -Infinity
));
200 assertEqual(A
, lerp(A
, B
, -1));
201 assertEqual(A
, lerp(A
, B
, 0));
204 it("handles highs", function () { with (this) {
205 assertEqual(B
, lerp(A
, B
, 1));
206 assertEqual(B
, lerp(A
, B
, 2));
207 assertEqual(B
, lerp(A
, B
, Infinity
));