| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Include test fixture. | |
| 6 GEN_INCLUDE(['../testing/chromevox_unittest_base.js']); | |
| 7 | |
| 8 UnserializableSpan = function() {}; | |
| 9 | |
| 10 StatelessSerializableSpan = function() {}; | |
| 11 | |
| 12 NonStatelessSerializableSpan = function(value) { | |
| 13 this.value = value; | |
| 14 }; | |
| 15 | |
| 16 /** | |
| 17 * @param {!Object} obj object containing the | |
| 18 * serializable representation. | |
| 19 * @return {!Object} The Spannable. | |
| 20 */ | |
| 21 NonStatelessSerializableSpan.fromJson = function(obj) { | |
| 22 return new NonStatelessSerializableSpan(obj.value / 2); | |
| 23 }; | |
| 24 | |
| 25 /** | |
| 26 * @return {Object} the json serializable form. | |
| 27 */ | |
| 28 NonStatelessSerializableSpan.prototype.toJson = function() { | |
| 29 return {value: this.value * 2}; | |
| 30 }; | |
| 31 | |
| 32 /** | |
| 33 * Test fixture. | |
| 34 * @constructor | |
| 35 * @extends {ChromeVoxUnitTestBase} | |
| 36 */ | |
| 37 function CvoxSpannableUnitTest() {} | |
| 38 | |
| 39 CvoxSpannableUnitTest.prototype = { | |
| 40 __proto__: ChromeVoxUnitTestBase.prototype, | |
| 41 | |
| 42 /** @override */ | |
| 43 closureModuleDeps: [ | |
| 44 'cvox.Spannable', | |
| 45 ], | |
| 46 | |
| 47 /** @override */ | |
| 48 setUp: function() { | |
| 49 cvox.Spannable.registerStatelessSerializableSpan( | |
| 50 StatelessSerializableSpan, 'StatelessSerializableSpan'); | |
| 51 | |
| 52 cvox.Spannable.registerSerializableSpan( | |
| 53 NonStatelessSerializableSpan, 'NonStatelessSerializableSpan', | |
| 54 NonStatelessSerializableSpan.fromJson, | |
| 55 NonStatelessSerializableSpan.prototype.toJson); | |
| 56 } | |
| 57 }; | |
| 58 | |
| 59 TEST_F('CvoxSpannableUnitTest', 'ToStringUnannotated', function() { | |
| 60 assertEquals('', new cvox.Spannable().toString()); | |
| 61 assertEquals('hello world', new cvox.Spannable('hello world').toString()); | |
| 62 }); | |
| 63 | |
| 64 /** Tests that toString works correctly on annotated strings. */ | |
| 65 TEST_F('CvoxSpannableUnitTest', 'ToStringAnnotated', function() { | |
| 66 var spannable = new cvox.Spannable('Hello Google'); | |
| 67 spannable.setSpan('http://www.google.com/', 6, 12); | |
| 68 assertEquals('Hello Google', spannable.toString()); | |
| 69 }); | |
| 70 | |
| 71 /** Tests the length calculation. */ | |
| 72 TEST_F('CvoxSpannableUnitTest', 'GetLength', function() { | |
| 73 var spannable = new cvox.Spannable('Hello'); | |
| 74 spannable.setSpan({}, 0, 3); | |
| 75 assertEquals(5, spannable.getLength()); | |
| 76 spannable.append(' world'); | |
| 77 assertEquals(11, spannable.getLength()); | |
| 78 spannable.append(new cvox.Spannable(' from cvox.Spannable')); | |
| 79 assertEquals(31, spannable.getLength()); | |
| 80 }); | |
| 81 | |
| 82 /** Tests that a span can be added and retrieved at the beginning. */ | |
| 83 TEST_F('CvoxSpannableUnitTest', 'SpanBeginning', function() { | |
| 84 var annotation = {}; | |
| 85 var spannable = new cvox.Spannable('Hello world'); | |
| 86 spannable.setSpan(annotation, 0, 5); | |
| 87 assertSame(annotation, spannable.getSpan(0)); | |
| 88 assertSame(annotation, spannable.getSpan(3)); | |
| 89 assertUndefined(spannable.getSpan(5)); | |
| 90 assertUndefined(spannable.getSpan(8)); | |
| 91 }); | |
| 92 | |
| 93 /** Tests that a span can be added and retrieved at the beginning. */ | |
| 94 TEST_F('CvoxSpannableUnitTest', 'SpanEnd', function() { | |
| 95 var annotation = {}; | |
| 96 var spannable = new cvox.Spannable('Hello world'); | |
| 97 spannable.setSpan(annotation, 6, 11); | |
| 98 assertUndefined(spannable.getSpan(3)); | |
| 99 assertUndefined(spannable.getSpan(5)); | |
| 100 assertSame(annotation, spannable.getSpan(6)); | |
| 101 assertSame(annotation, spannable.getSpan(10)); | |
| 102 }); | |
| 103 | |
| 104 /** Tests that a zero-length span is not retrieved. */ | |
| 105 TEST_F('CvoxSpannableUnitTest', 'SpanZeroLength', function() { | |
| 106 var annotation = {}; | |
| 107 var spannable = new cvox.Spannable('Hello world'); | |
| 108 spannable.setSpan(annotation, 3, 3); | |
| 109 assertUndefined(spannable.getSpan(2)); | |
| 110 assertUndefined(spannable.getSpan(3)); | |
| 111 assertUndefined(spannable.getSpan(4)); | |
| 112 }); | |
| 113 | |
| 114 /** Tests that a removed span is not returned. */ | |
| 115 TEST_F('CvoxSpannableUnitTest', 'RemoveSpan', function() { | |
| 116 var annotation = {}; | |
| 117 var spannable = new cvox.Spannable('Hello world'); | |
| 118 spannable.setSpan(annotation, 0, 3); | |
| 119 assertSame(annotation, spannable.getSpan(1)); | |
| 120 spannable.removeSpan(annotation); | |
| 121 assertUndefined(spannable.getSpan(1)); | |
| 122 }); | |
| 123 | |
| 124 /** Tests that adding a span in one place removes it from another. */ | |
| 125 TEST_F('CvoxSpannableUnitTest', 'SetSpanMoves', function() { | |
| 126 var annotation = {}; | |
| 127 var spannable = new cvox.Spannable('Hello world'); | |
| 128 spannable.setSpan(annotation, 0, 3); | |
| 129 assertSame(annotation, spannable.getSpan(1)); | |
| 130 assertUndefined(spannable.getSpan(4)); | |
| 131 spannable.setSpan(annotation, 3, 6); | |
| 132 assertUndefined(spannable.getSpan(1)); | |
| 133 assertSame(annotation, spannable.getSpan(4)); | |
| 134 }); | |
| 135 | |
| 136 /** Tests that setSpan objects to out-of-range arguments. */ | |
| 137 TEST_F('CvoxSpannableUnitTest', 'SetSpanRangeError', function() { | |
| 138 var spannable = new cvox.Spannable('Hello world'); | |
| 139 | |
| 140 // Start index out of range. | |
| 141 assertException('expected range error', function() { | |
| 142 spannable.setSpan({}, -1, 0); | |
| 143 }, 'RangeError'); | |
| 144 | |
| 145 // End index out of range. | |
| 146 assertException('expected range error', function() { | |
| 147 spannable.setSpan({}, 0, 12); | |
| 148 }, 'RangeError'); | |
| 149 | |
| 150 // End before start. | |
| 151 assertException('expected range error', function() { | |
| 152 spannable.setSpan({}, 1, 0); | |
| 153 }, 'RangeError'); | |
| 154 }); | |
| 155 | |
| 156 /** | |
| 157 * Tests that multiple spans can be retrieved at one point. | |
| 158 * The first one added which applies should be returned by getSpan. | |
| 159 */ | |
| 160 TEST_F('CvoxSpannableUnitTest', 'MultipleSpans', function() { | |
| 161 var annotation1 = { number: 1 }; | |
| 162 var annotation2 = { number: 2 }; | |
| 163 assertNotSame(annotation1, annotation2); | |
| 164 var spannable = new cvox.Spannable('Hello world'); | |
| 165 spannable.setSpan(annotation1, 1, 4); | |
| 166 spannable.setSpan(annotation2, 2, 7); | |
| 167 assertSame(annotation1, spannable.getSpan(1)); | |
| 168 assertThat([annotation1], eqJSON(spannable.getSpans(1))); | |
| 169 assertSame(annotation1, spannable.getSpan(3)); | |
| 170 assertThat([annotation1, annotation2], eqJSON(spannable.getSpans(3))); | |
| 171 assertSame(annotation2, spannable.getSpan(6)); | |
| 172 assertThat([annotation2], eqJSON(spannable.getSpans(6))); | |
| 173 }); | |
| 174 | |
| 175 /** Tests that appending appends the strings. */ | |
| 176 TEST_F('CvoxSpannableUnitTest', 'AppendToString', function() { | |
| 177 var spannable = new cvox.Spannable('Google'); | |
| 178 assertEquals('Google', spannable.toString()); | |
| 179 spannable.append(' Chrome'); | |
| 180 assertEquals('Google Chrome', spannable.toString()); | |
| 181 spannable.append(new cvox.Spannable('Vox')); | |
| 182 assertEquals('Google ChromeVox', spannable.toString()); | |
| 183 }); | |
| 184 | |
| 185 /** | |
| 186 * Tests that appending Spannables combines annotations. | |
| 187 */ | |
| 188 TEST_F('CvoxSpannableUnitTest', 'AppendAnnotations', function() { | |
| 189 var annotation1 = { number: 1 }; | |
| 190 var annotation2 = { number: 2 }; | |
| 191 assertNotSame(annotation1, annotation2); | |
| 192 var left = new cvox.Spannable('hello'); | |
| 193 left.setSpan(annotation1, 0, 3); | |
| 194 var right = new cvox.Spannable(' world'); | |
| 195 right.setSpan(annotation2, 0, 3); | |
| 196 left.append(right); | |
| 197 assertSame(annotation1, left.getSpan(1)); | |
| 198 assertSame(annotation2, left.getSpan(6)); | |
| 199 }); | |
| 200 | |
| 201 /** | |
| 202 * Tests that a span's bounds can be retrieved. | |
| 203 */ | |
| 204 TEST_F('CvoxSpannableUnitTest', 'GetSpanStartAndEnd', function() { | |
| 205 var annotation = {}; | |
| 206 var spannable = new cvox.Spannable('potato wedges'); | |
| 207 spannable.setSpan(annotation, 8, 12); | |
| 208 assertEquals(8, spannable.getSpanStart(annotation)); | |
| 209 assertEquals(12, spannable.getSpanEnd(annotation)); | |
| 210 }); | |
| 211 | |
| 212 /** | |
| 213 * Tests that an absent span's bounds are reported correctly. | |
| 214 */ | |
| 215 TEST_F('CvoxSpannableUnitTest', 'GetSpanStartAndEndAbsent', function() { | |
| 216 var annotation = {}; | |
| 217 var spannable = new cvox.Spannable('potato wedges'); | |
| 218 assertUndefined(spannable.getSpanStart(annotation)); | |
| 219 assertUndefined(spannable.getSpanEnd(annotation)); | |
| 220 }); | |
| 221 | |
| 222 /** | |
| 223 * Test that a zero length span can still be found. | |
| 224 */ | |
| 225 TEST_F('CvoxSpannableUnitTest', 'GetSpanStartAndEndZeroLength', function() { | |
| 226 var annotation = {}; | |
| 227 var spannable = new cvox.Spannable('potato wedges'); | |
| 228 spannable.setSpan(annotation, 8, 8); | |
| 229 assertEquals(8, spannable.getSpanStart(annotation)); | |
| 230 assertEquals(8, spannable.getSpanEnd(annotation)); | |
| 231 }); | |
| 232 | |
| 233 /** | |
| 234 * Tests that == (but not ===) objects are treated distinctly when getting | |
| 235 * span bounds. | |
| 236 */ | |
| 237 TEST_F('CvoxSpannableUnitTest', 'GetSpanStartAndEndEquality', function() { | |
| 238 // Note that 0 == '' and '' == 0 in JavaScript. | |
| 239 var spannable = new cvox.Spannable('wat'); | |
| 240 spannable.setSpan(0, 0, 0); | |
| 241 spannable.setSpan('', 1, 3); | |
| 242 assertEquals(0, spannable.getSpanStart(0)); | |
| 243 assertEquals(0, spannable.getSpanEnd(0)); | |
| 244 assertEquals(1, spannable.getSpanStart('')); | |
| 245 assertEquals(3, spannable.getSpanEnd('')); | |
| 246 }); | |
| 247 | |
| 248 /** | |
| 249 * Tests that substrings have the correct character sequence. | |
| 250 */ | |
| 251 TEST_F('CvoxSpannableUnitTest', 'Substring', function() { | |
| 252 var assertSubstringResult = function(expected, initial, start, opt_end) { | |
| 253 var spannable = new cvox.Spannable(initial); | |
| 254 var substring = spannable.substring(start, opt_end); | |
| 255 assertEquals(expected, substring.toString()); | |
| 256 }; | |
| 257 assertSubstringResult('Page', 'Google PageRank', 7, 11); | |
| 258 assertSubstringResult('Goog', 'Google PageRank', 0, 4); | |
| 259 assertSubstringResult('Rank', 'Google PageRank', 11, 15); | |
| 260 assertSubstringResult('Rank', 'Google PageRank', 11); | |
| 261 }); | |
| 262 | |
| 263 /** | |
| 264 * Tests that substring arguments are validated properly. | |
| 265 */ | |
| 266 TEST_F('CvoxSpannableUnitTest', 'SubstringRangeError', function() { | |
| 267 var assertRangeError = function(initial, start, opt_end) { | |
| 268 var spannable = new cvox.Spannable(initial); | |
| 269 assertException('expected range error', function() { | |
| 270 spannable.substring(start, opt_end); | |
| 271 }, 'RangeError'); | |
| 272 }; | |
| 273 assertRangeError('Google PageRank', -1, 5); | |
| 274 assertRangeError('Google PageRank', 0, 99); | |
| 275 assertRangeError('Google PageRank', 5, 2); | |
| 276 }); | |
| 277 | |
| 278 /** | |
| 279 * Tests that spans in the substring range are preserved. | |
| 280 */ | |
| 281 TEST_F('CvoxSpannableUnitTest', 'SubstringSpansIncluded', function() { | |
| 282 var assertSpanIncluded = function(expectedSpanStart, expectedSpanEnd, | |
| 283 initial, initialSpanStart, initialSpanEnd, start, opt_end) { | |
| 284 var annotation = {}; | |
| 285 var spannable = new cvox.Spannable(initial); | |
| 286 spannable.setSpan(annotation, initialSpanStart, initialSpanEnd); | |
| 287 var substring = spannable.substring(start, opt_end); | |
| 288 assertEquals(expectedSpanStart, substring.getSpanStart(annotation)); | |
| 289 assertEquals(expectedSpanEnd, substring.getSpanEnd(annotation)); | |
| 290 }; | |
| 291 assertSpanIncluded(1, 5, 'potato wedges', 8, 12, 7); | |
| 292 assertSpanIncluded(1, 5, 'potato wedges', 8, 12, 7, 13); | |
| 293 assertSpanIncluded(1, 5, 'potato wedges', 8, 12, 7, 12); | |
| 294 assertSpanIncluded(0, 4, 'potato wedges', 8, 12, 8, 12); | |
| 295 assertSpanIncluded(0, 3, 'potato wedges', 0, 3, 0); | |
| 296 assertSpanIncluded(0, 3, 'potato wedges', 0, 3, 0, 3); | |
| 297 assertSpanIncluded(0, 3, 'potato wedges', 0, 3, 0, 6); | |
| 298 assertSpanIncluded(0, 5, 'potato wedges', 8, 13, 8); | |
| 299 assertSpanIncluded(0, 5, 'potato wedges', 8, 13, 8, 13); | |
| 300 assertSpanIncluded(1, 6, 'potato wedges', 8, 13, 7, 13); | |
| 301 | |
| 302 // Note: we should keep zero-length spans, even at the edges of the range. | |
| 303 assertSpanIncluded(0, 0, 'potato wedges', 0, 0, 0, 0); | |
| 304 assertSpanIncluded(0, 0, 'potato wedges', 0, 0, 0, 6); | |
| 305 assertSpanIncluded(1, 1, 'potato wedges', 8, 8, 7, 13); | |
| 306 assertSpanIncluded(6, 6, 'potato wedges', 6, 6, 0, 6); | |
| 307 }); | |
| 308 | |
| 309 /** | |
| 310 * Tests that spans outside the range are omitted. | |
| 311 * It's fine to keep zero-length spans at the ends, though. | |
| 312 */ | |
| 313 TEST_F('CvoxSpannableUnitTest', 'SubstringSpansExcluded', function() { | |
| 314 var assertSpanExcluded = function(initial, spanStart, spanEnd, | |
| 315 start, opt_end) { | |
| 316 var annotation = {}; | |
| 317 var spannable = new cvox.Spannable(initial); | |
| 318 spannable.setSpan(annotation, spanStart, spanEnd); | |
| 319 var substring = spannable.substring(start, opt_end); | |
| 320 assertUndefined(substring.getSpanStart(annotation)); | |
| 321 assertUndefined(substring.getSpanEnd(annotation)); | |
| 322 }; | |
| 323 assertSpanExcluded('potato wedges', 8, 12, 0, 6); | |
| 324 assertSpanExcluded('potato wedges', 7, 12, 0, 6); | |
| 325 assertSpanExcluded('potato wedges', 0, 6, 8); | |
| 326 assertSpanExcluded('potato wedges', 6, 6, 8); | |
| 327 }); | |
| 328 | |
| 329 /** | |
| 330 * Tests that spans which cross the boundary are clipped. | |
| 331 */ | |
| 332 TEST_F('CvoxSpannableUnitTest', 'SubstringSpansClipped', function() { | |
| 333 var assertSpanIncluded = function(expectedSpanStart, expectedSpanEnd, | |
| 334 initial, initialSpanStart, initialSpanEnd, start, opt_end) { | |
| 335 var annotation = {}; | |
| 336 var spannable = new cvox.Spannable(initial); | |
| 337 spannable.setSpan(annotation, initialSpanStart, initialSpanEnd); | |
| 338 var substring = spannable.substring(start, opt_end); | |
| 339 assertEquals(expectedSpanStart, substring.getSpanStart(annotation)); | |
| 340 assertEquals(expectedSpanEnd, substring.getSpanEnd(annotation)); | |
| 341 }; | |
| 342 assertSpanIncluded(0, 4, 'potato wedges', 7, 13, 8, 12); | |
| 343 assertSpanIncluded(0, 0, 'potato wedges', 0, 6, 0, 0); | |
| 344 assertSpanIncluded(0, 0, 'potato wedges', 0, 6, 6, 6); | |
| 345 | |
| 346 // The first of the above should produce "edge". | |
| 347 assertEquals('edge', | |
| 348 new cvox.Spannable('potato wedges').substring(8, 12).toString()); | |
| 349 }); | |
| 350 | |
| 351 /** | |
| 352 * Tests that whitespace is trimmed. | |
| 353 */ | |
| 354 TEST_F('CvoxSpannableUnitTest', 'Trim', function() { | |
| 355 var assertTrimResult = function(expected, initial) { | |
| 356 assertEquals(expected, new cvox.Spannable(initial).trim().toString()); | |
| 357 }; | |
| 358 assertTrimResult('John F. Kennedy', 'John F. Kennedy'); | |
| 359 assertTrimResult('John F. Kennedy', ' John F. Kennedy'); | |
| 360 assertTrimResult('John F. Kennedy', 'John F. Kennedy '); | |
| 361 assertTrimResult('John F. Kennedy', ' \r\t \nJohn F. Kennedy\n\n \n'); | |
| 362 assertTrimResult('', ''); | |
| 363 assertTrimResult('', ' \t\t \n\r'); | |
| 364 }); | |
| 365 | |
| 366 /** | |
| 367 * Tests that trim keeps, drops and clips spans. | |
| 368 */ | |
| 369 TEST_F('CvoxSpannableUnitTest', 'TrimSpans', function() { | |
| 370 var spannable = new cvox.Spannable(' \t Kennedy\n'); | |
| 371 spannable.setSpan('tab', 1, 2); | |
| 372 spannable.setSpan('jfk', 3, 10); | |
| 373 spannable.setSpan('jfk-newline', 3, 11); | |
| 374 var trimmed = spannable.trim(); | |
| 375 assertUndefined(trimmed.getSpanStart('tab')); | |
| 376 assertUndefined(trimmed.getSpanEnd('tab')); | |
| 377 assertEquals(0, trimmed.getSpanStart('jfk')); | |
| 378 assertEquals(7, trimmed.getSpanEnd('jfk')); | |
| 379 assertEquals(0, trimmed.getSpanStart('jfk-newline')); | |
| 380 assertEquals(7, trimmed.getSpanEnd('jfk-newline')); | |
| 381 }); | |
| 382 | |
| 383 /** | |
| 384 * Tests that when a string is all whitespace, we trim off the *end*. | |
| 385 */ | |
| 386 TEST_F('CvoxSpannableUnitTest', 'TrimAllWhitespace', function() { | |
| 387 var spannable = new cvox.Spannable(' '); | |
| 388 spannable.setSpan('cursor 1', 0, 0); | |
| 389 spannable.setSpan('cursor 2', 2, 2); | |
| 390 var trimmed = spannable.trim(); | |
| 391 assertEquals(0, trimmed.getSpanStart('cursor 1')); | |
| 392 assertEquals(0, trimmed.getSpanEnd('cursor 1')); | |
| 393 assertUndefined(trimmed.getSpanStart('cursor 2')); | |
| 394 assertUndefined(trimmed.getSpanEnd('cursor 2')); | |
| 395 }); | |
| 396 | |
| 397 /** | |
| 398 * Tests finding a span which is an instance of a given class. | |
| 399 */ | |
| 400 TEST_F('CvoxSpannableUnitTest', 'GetSpanInstanceOf', function() { | |
| 401 function ExampleConstructorBase() {} | |
| 402 function ExampleConstructor1() {} | |
| 403 function ExampleConstructor2() {} | |
| 404 function ExampleConstructor3() {} | |
| 405 ExampleConstructor1.prototype = new ExampleConstructorBase(); | |
| 406 ExampleConstructor2.prototype = new ExampleConstructorBase(); | |
| 407 ExampleConstructor3.prototype = new ExampleConstructorBase(); | |
| 408 var ex1 = new ExampleConstructor1(); | |
| 409 var ex2 = new ExampleConstructor2(); | |
| 410 var spannable = new cvox.Spannable('Hello world'); | |
| 411 spannable.setSpan(ex1, 0, 0); | |
| 412 spannable.setSpan(ex2, 1, 1); | |
| 413 assertEquals(ex1, spannable.getSpanInstanceOf(ExampleConstructor1)); | |
| 414 assertEquals(ex2, spannable.getSpanInstanceOf(ExampleConstructor2)); | |
| 415 assertUndefined(spannable.getSpanInstanceOf(ExampleConstructor3)); | |
| 416 assertEquals(ex1, spannable.getSpanInstanceOf(ExampleConstructorBase)); | |
| 417 }); | |
| 418 | |
| 419 /** Tests trimming only left or right. */ | |
| 420 TEST_F('CvoxSpannableUnitTest', 'TrimLeftOrRight', function() { | |
| 421 var spannable = new cvox.Spannable(' '); | |
| 422 spannable.setSpan('cursor 1', 0, 0); | |
| 423 spannable.setSpan('cursor 2', 2, 2); | |
| 424 var trimmed = spannable.trimLeft(); | |
| 425 assertEquals(0, trimmed.getSpanStart('cursor 1')); | |
| 426 assertEquals(0, trimmed.getSpanEnd('cursor 1')); | |
| 427 assertUndefined(trimmed.getSpanStart('cursor 2')); | |
| 428 assertUndefined(trimmed.getSpanEnd('cursor 2')); | |
| 429 | |
| 430 var spannable2 = new cvox.Spannable('0 '); | |
| 431 spannable2.setSpan('cursor 1', 0, 0); | |
| 432 spannable2.setSpan('cursor 2', 2, 2); | |
| 433 var trimmed2 = spannable2.trimLeft(); | |
| 434 assertEquals(0, trimmed2.getSpanStart('cursor 1')); | |
| 435 assertEquals(0, trimmed2.getSpanEnd('cursor 1')); | |
| 436 assertEquals(2, trimmed2.getSpanStart('cursor 2')); | |
| 437 assertEquals(2, trimmed2.getSpanEnd('cursor 2')); | |
| 438 trimmed2 = trimmed2.trimRight(); | |
| 439 assertEquals(0, trimmed2.getSpanStart('cursor 1')); | |
| 440 assertEquals(0, trimmed2.getSpanEnd('cursor 1')); | |
| 441 assertUndefined(trimmed2.getSpanStart('cursor 2')); | |
| 442 assertUndefined(trimmed2.getSpanEnd('cursor 2')); | |
| 443 | |
| 444 var spannable3 = new cvox.Spannable(' 0'); | |
| 445 spannable3.setSpan('cursor 1', 0, 0); | |
| 446 spannable3.setSpan('cursor 2', 2, 2); | |
| 447 var trimmed3 = spannable3.trimRight(); | |
| 448 assertEquals(0, trimmed3.getSpanStart('cursor 1')); | |
| 449 assertEquals(0, trimmed3.getSpanEnd('cursor 1')); | |
| 450 assertEquals(2, trimmed3.getSpanStart('cursor 2')); | |
| 451 assertEquals(2, trimmed3.getSpanEnd('cursor 2')); | |
| 452 trimmed3 = trimmed3.trimLeft(); | |
| 453 assertUndefined(trimmed3.getSpanStart('cursor 1')); | |
| 454 assertUndefined(trimmed3.getSpanEnd('cursor 1')); | |
| 455 assertEquals(0, trimmed3.getSpanStart('cursor 2')); | |
| 456 assertEquals(0, trimmed3.getSpanEnd('cursor 2')); | |
| 457 }); | |
| 458 | |
| 459 TEST_F('CvoxSpannableUnitTest', 'Serialize', function() { | |
| 460 var fresh = new cvox.Spannable('text'); | |
| 461 var freshStatelessSerializable = new StatelessSerializableSpan(); | |
| 462 var freshNonStatelessSerializable = new NonStatelessSerializableSpan(14); | |
| 463 fresh.setSpan(new UnserializableSpan(), 0, 1); | |
| 464 fresh.setSpan(freshStatelessSerializable, 0, 2); | |
| 465 fresh.setSpan(freshNonStatelessSerializable, 3, 4); | |
| 466 var thawn = cvox.Spannable.fromJson(fresh.toJson()); | |
| 467 var thawnStatelessSerializable = thawn.getSpanInstanceOf( | |
| 468 StatelessSerializableSpan); | |
| 469 var thawnNonStatelessSerializable = thawn.getSpanInstanceOf( | |
| 470 NonStatelessSerializableSpan); | |
| 471 assertThat('text', eqJSON(thawn.toString())); | |
| 472 assertUndefined(thawn.getSpanInstanceOf(UnserializableSpan)); | |
| 473 assertThat( | |
| 474 fresh.getSpanStart(freshStatelessSerializable), | |
| 475 eqJSON(thawn.getSpanStart(thawnStatelessSerializable))); | |
| 476 assertThat( | |
| 477 fresh.getSpanEnd(freshStatelessSerializable), | |
| 478 eqJSON(thawn.getSpanEnd(thawnStatelessSerializable))); | |
| 479 assertThat(freshNonStatelessSerializable, | |
| 480 eqJSON(thawnNonStatelessSerializable)); | |
| 481 }); | |
| OLD | NEW |