4 QUnit.module('carousel plugin')
6 QUnit.test('should be defined on jQuery object', function (assert) {
8 assert.ok($(document.body).carousel, 'carousel method is defined')
11 QUnit.module('carousel', {
12 beforeEach: function () {
13 // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
14 $.fn.bootstrapCarousel = $.fn.carousel.noConflict()
16 afterEach: function () {
17 $.fn.carousel = $.fn.bootstrapCarousel
18 delete $.fn.bootstrapCarousel
22 QUnit.test('should provide no conflict', function (assert) {
24 assert.strictEqual($.fn.carousel, undefined, 'carousel was set back to undefined (orig value)')
27 QUnit.test('should return jquery collection containing the element', function (assert) {
30 var $carousel = $el.bootstrapCarousel()
31 assert.ok($carousel instanceof $, 'returns jquery collection')
32 assert.strictEqual($carousel[0], $el[0], 'collection contains element')
35 QUnit.test('should not fire slid when slide is prevented', function (assert) {
37 var done = assert.async()
38 $('<div class="carousel"/>')
39 .on('slide.bs.carousel', function (e) {
41 assert.ok(true, 'slide event fired')
44 .on('slid.bs.carousel', function () {
45 assert.ok(false, 'slid event fired')
47 .bootstrapCarousel('next')
50 QUnit.test('should reset when slide is prevented', function (assert) {
52 var carouselHTML = '<div id="carousel-example-generic" class="carousel slide">'
53 + '<ol class="carousel-indicators">'
54 + '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
55 + '<li data-target="#carousel-example-generic" data-slide-to="1"/>'
56 + '<li data-target="#carousel-example-generic" data-slide-to="2"/>'
58 + '<div class="carousel-inner">'
59 + '<div class="item active">'
60 + '<div class="carousel-caption"/>'
62 + '<div class="item">'
63 + '<div class="carousel-caption"/>'
65 + '<div class="item">'
66 + '<div class="carousel-caption"/>'
69 + '<a class="left carousel-control" href="#carousel-example-generic" data-slide="prev"/>'
70 + '<a class="right carousel-control" href="#carousel-example-generic" data-slide="next"/>'
72 var $carousel = $(carouselHTML)
74 var done = assert.async()
76 .one('slide.bs.carousel', function (e) {
78 setTimeout(function () {
79 assert.ok($carousel.find('.item:eq(0)').is('.active'), 'first item still active')
80 assert.ok($carousel.find('.carousel-indicators li:eq(0)').is('.active'), 'first indicator still active')
81 $carousel.bootstrapCarousel('next')
84 .one('slid.bs.carousel', function () {
85 setTimeout(function () {
86 assert.ok(!$carousel.find('.item:eq(0)').is('.active'), 'first item still active')
87 assert.ok(!$carousel.find('.carousel-indicators li:eq(0)').is('.active'), 'first indicator still active')
88 assert.ok($carousel.find('.item:eq(1)').is('.active'), 'second item active')
89 assert.ok($carousel.find('.carousel-indicators li:eq(1)').is('.active'), 'second indicator active')
93 .bootstrapCarousel('next')
96 QUnit.test('should fire slide event with direction', function (assert) {
98 var carouselHTML = '<div id="myCarousel" class="carousel slide">'
99 + '<div class="carousel-inner">'
100 + '<div class="item active">'
102 + '<div class="carousel-caption">'
103 + '<h4>First Thumbnail label</h4>'
104 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
105 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
106 + 'ultricies vehicula ut id elit.</p>'
109 + '<div class="item">'
111 + '<div class="carousel-caption">'
112 + '<h4>Second Thumbnail label</h4>'
113 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
114 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
115 + 'ultricies vehicula ut id elit.</p>'
118 + '<div class="item">'
120 + '<div class="carousel-caption">'
121 + '<h4>Third Thumbnail label</h4>'
122 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
123 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
124 + 'ultricies vehicula ut id elit.</p>'
128 + '<a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
129 + '<a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
131 var $carousel = $(carouselHTML)
133 var done = assert.async()
136 .one('slide.bs.carousel', function (e) {
137 assert.ok(e.direction, 'direction present on next')
138 assert.strictEqual(e.direction, 'left', 'direction is left on next')
141 .one('slide.bs.carousel', function (e) {
142 assert.ok(e.direction, 'direction present on prev')
143 assert.strictEqual(e.direction, 'right', 'direction is right on prev')
146 .bootstrapCarousel('prev')
148 .bootstrapCarousel('next')
151 QUnit.test('should fire slid event with direction', function (assert) {
153 var carouselHTML = '<div id="myCarousel" class="carousel slide">'
154 + '<div class="carousel-inner">'
155 + '<div class="item active">'
157 + '<div class="carousel-caption">'
158 + '<h4>First Thumbnail label</h4>'
159 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
160 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
161 + 'ultricies vehicula ut id elit.</p>'
164 + '<div class="item">'
166 + '<div class="carousel-caption">'
167 + '<h4>Second Thumbnail label</h4>'
168 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
169 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
170 + 'ultricies vehicula ut id elit.</p>'
173 + '<div class="item">'
175 + '<div class="carousel-caption">'
176 + '<h4>Third Thumbnail label</h4>'
177 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
178 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
179 + 'ultricies vehicula ut id elit.</p>'
183 + '<a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
184 + '<a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
186 var $carousel = $(carouselHTML)
188 var done = assert.async()
191 .one('slid.bs.carousel', function (e) {
192 assert.ok(e.direction, 'direction present on next')
193 assert.strictEqual(e.direction, 'left', 'direction is left on next')
196 .one('slid.bs.carousel', function (e) {
197 assert.ok(e.direction, 'direction present on prev')
198 assert.strictEqual(e.direction, 'right', 'direction is right on prev')
201 .bootstrapCarousel('prev')
203 .bootstrapCarousel('next')
206 QUnit.test('should fire slide event with relatedTarget', function (assert) {
208 var template = '<div id="myCarousel" class="carousel slide">'
209 + '<div class="carousel-inner">'
210 + '<div class="item active">'
212 + '<div class="carousel-caption">'
213 + '<h4>First Thumbnail label</h4>'
214 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
215 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
216 + 'ultricies vehicula ut id elit.</p>'
219 + '<div class="item">'
221 + '<div class="carousel-caption">'
222 + '<h4>Second Thumbnail label</h4>'
223 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
224 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
225 + 'ultricies vehicula ut id elit.</p>'
228 + '<div class="item">'
230 + '<div class="carousel-caption">'
231 + '<h4>Third Thumbnail label</h4>'
232 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
233 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
234 + 'ultricies vehicula ut id elit.</p>'
238 + '<a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
239 + '<a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
242 var done = assert.async()
245 .on('slide.bs.carousel', function (e) {
246 assert.ok(e.relatedTarget, 'relatedTarget present')
247 assert.ok($(e.relatedTarget).hasClass('item'), 'relatedTarget has class "item"')
250 .bootstrapCarousel('next')
253 QUnit.test('should fire slid event with relatedTarget', function (assert) {
255 var template = '<div id="myCarousel" class="carousel slide">'
256 + '<div class="carousel-inner">'
257 + '<div class="item active">'
259 + '<div class="carousel-caption">'
260 + '<h4>First Thumbnail label</h4>'
261 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
262 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
263 + 'ultricies vehicula ut id elit.</p>'
266 + '<div class="item">'
268 + '<div class="carousel-caption">'
269 + '<h4>Second Thumbnail label</h4>'
270 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
271 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
272 + 'ultricies vehicula ut id elit.</p>'
275 + '<div class="item">'
277 + '<div class="carousel-caption">'
278 + '<h4>Third Thumbnail label</h4>'
279 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
280 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
281 + 'ultricies vehicula ut id elit.</p>'
285 + '<a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
286 + '<a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
289 var done = assert.async()
292 .on('slid.bs.carousel', function (e) {
293 assert.ok(e.relatedTarget, 'relatedTarget present')
294 assert.ok($(e.relatedTarget).hasClass('item'), 'relatedTarget has class "item"')
297 .bootstrapCarousel('next')
300 QUnit.test('should set interval from data attribute', function (assert) {
302 var templateHTML = '<div id="myCarousel" class="carousel slide">'
303 + '<div class="carousel-inner">'
304 + '<div class="item active">'
306 + '<div class="carousel-caption">'
307 + '<h4>First Thumbnail label</h4>'
308 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
309 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
310 + 'ultricies vehicula ut id elit.</p>'
313 + '<div class="item">'
315 + '<div class="carousel-caption">'
316 + '<h4>Second Thumbnail label</h4>'
317 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
318 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
319 + 'ultricies vehicula ut id elit.</p>'
322 + '<div class="item">'
324 + '<div class="carousel-caption">'
325 + '<h4>Third Thumbnail label</h4>'
326 + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
327 + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
328 + 'ultricies vehicula ut id elit.</p>'
332 + '<a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
333 + '<a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
335 var $carousel = $(templateHTML)
336 $carousel.attr('data-interval', 1814)
338 $carousel.appendTo('body')
339 $('[data-slide]').first().trigger('click')
340 assert.strictEqual($carousel.data('bs.carousel').options.interval, 1814)
343 $carousel.appendTo('body').attr('data-modal', 'foobar')
344 $('[data-slide]').first().trigger('click')
345 assert.strictEqual($carousel.data('bs.carousel').options.interval, 1814, 'even if there is an data-modal attribute set')
348 $carousel.appendTo('body')
349 $('[data-slide]').first().trigger('click')
350 $carousel.attr('data-interval', 1860)
351 $('[data-slide]').first().trigger('click')
352 assert.strictEqual($carousel.data('bs.carousel').options.interval, 1814, 'attributes should be read only on initialization')
355 $carousel.attr('data-interval', false)
356 $carousel.appendTo('body')
357 $carousel.bootstrapCarousel(1)
358 assert.strictEqual($carousel.data('bs.carousel').options.interval, false, 'data attribute has higher priority than default options')
362 QUnit.test('should skip over non-items when using item indices', function (assert) {
364 var templateHTML = '<div id="myCarousel" class="carousel" data-interval="1814">'
365 + '<div class="carousel-inner">'
366 + '<div class="item active">'
369 + '<script type="text/x-metamorph" id="thingy"/>'
370 + '<div class="item">'
373 + '<div class="item">'
377 var $template = $(templateHTML)
379 $template.bootstrapCarousel()
381 assert.strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item active')
383 $template.bootstrapCarousel(1)
385 assert.strictEqual($template.find('.item')[1], $template.find('.active')[0], 'second item active')
388 QUnit.test('should skip over non-items when using next/prev methods', function (assert) {
390 var templateHTML = '<div id="myCarousel" class="carousel" data-interval="1814">'
391 + '<div class="carousel-inner">'
392 + '<div class="item active">'
395 + '<script type="text/x-metamorph" id="thingy"/>'
396 + '<div class="item">'
399 + '<div class="item">'
403 var $template = $(templateHTML)
405 $template.bootstrapCarousel()
407 assert.strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item active')
409 $template.bootstrapCarousel('next')
411 assert.strictEqual($template.find('.item')[1], $template.find('.active')[0], 'second item active')
414 QUnit.test('should go to previous item if left arrow key is pressed', function (assert) {
416 var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false">'
417 + '<div class="carousel-inner">'
418 + '<div id="first" class="item">'
421 + '<div id="second" class="item active">'
424 + '<div id="third" class="item">'
429 var $template = $(templateHTML)
431 $template.bootstrapCarousel()
433 assert.strictEqual($template.find('.item')[1], $template.find('.active')[0], 'second item active')
435 $template.trigger($.Event('keydown', { which: 37 }))
437 assert.strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item active')
440 QUnit.test('should go to next item if right arrow key is pressed', function (assert) {
442 var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false">'
443 + '<div class="carousel-inner">'
444 + '<div id="first" class="item active">'
447 + '<div id="second" class="item">'
450 + '<div id="third" class="item">'
455 var $template = $(templateHTML)
457 $template.bootstrapCarousel()
459 assert.strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item active')
461 $template.trigger($.Event('keydown', { which: 39 }))
463 assert.strictEqual($template.find('.item')[1], $template.find('.active')[0], 'second item active')
466 QUnit.test('should support disabling the keyboard navigation', function (assert) {
468 var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false" data-keyboard="false">'
469 + '<div class="carousel-inner">'
470 + '<div id="first" class="item active">'
473 + '<div id="second" class="item">'
476 + '<div id="third" class="item">'
481 var $template = $(templateHTML)
483 $template.bootstrapCarousel()
485 assert.strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item active')
487 $template.trigger($.Event('keydown', { which: 39 }))
489 assert.strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item still active after right arrow press')
491 $template.trigger($.Event('keydown', { which: 37 }))
493 assert.strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item still active after left arrow press')
496 QUnit.test('should ignore keyboard events within <input>s and <textarea>s', function (assert) {
498 var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false">'
499 + '<div class="carousel-inner">'
500 + '<div id="first" class="item active">'
502 + '<input type="text" id="in-put">'
503 + '<textarea id="text-area"></textarea>'
505 + '<div id="second" class="item">'
508 + '<div id="third" class="item">'
513 var $template = $(templateHTML)
514 var $input = $template.find('#in-put')
515 var $textarea = $template.find('#text-area')
517 assert.strictEqual($input.length, 1, 'found <input>')
518 assert.strictEqual($textarea.length, 1, 'found <textarea>')
520 $template.bootstrapCarousel()
522 assert.strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item active')
525 $input.trigger($.Event('keydown', { which: 39 }))
526 assert.strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item still active after right arrow press in <input>')
528 $input.trigger($.Event('keydown', { which: 37 }))
529 assert.strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item still active after left arrow press in <input>')
532 $textarea.trigger($.Event('keydown', { which: 39 }))
533 assert.strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item still active after right arrow press in <textarea>')
535 $textarea.trigger($.Event('keydown', { which: 37 }))
536 assert.strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item still active after left arrow press in <textarea>')
539 QUnit.test('should only add mouseenter and mouseleave listeners when not on mobile', function (assert) {
541 var isMobile = 'ontouchstart' in document.documentElement
542 var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false" data-pause="hover">'
543 + '<div class="carousel-inner">'
544 + '<div id="first" class="item active">'
547 + '<div id="second" class="item">'
550 + '<div id="third" class="item">'
555 var $template = $(templateHTML).bootstrapCarousel()
557 $.each(['mouseover', 'mouseout'], function (i, type) {
558 assert.strictEqual(type in $._data($template[0], 'events'), !isMobile, 'does' + (isMobile ? ' not' : '') + ' listen for ' + type + ' events')
562 QUnit.test('should wrap around from end to start when wrap option is true', function (assert) {
564 var carouselHTML = '<div id="carousel-example-generic" class="carousel slide" data-wrap="true">'
565 + '<ol class="carousel-indicators">'
566 + '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
567 + '<li data-target="#carousel-example-generic" data-slide-to="1"/>'
568 + '<li data-target="#carousel-example-generic" data-slide-to="2"/>'
570 + '<div class="carousel-inner">'
571 + '<div class="item active" id="one">'
572 + '<div class="carousel-caption"/>'
574 + '<div class="item" id="two">'
575 + '<div class="carousel-caption"/>'
577 + '<div class="item" id="three">'
578 + '<div class="carousel-caption"/>'
581 + '<a class="left carousel-control" href="#carousel-example-generic" data-slide="prev"/>'
582 + '<a class="right carousel-control" href="#carousel-example-generic" data-slide="next"/>'
584 var $carousel = $(carouselHTML)
585 var getActiveId = function () { return $carousel.find('.item.active').attr('id') }
587 var done = assert.async()
590 .one('slid.bs.carousel', function () {
591 assert.strictEqual(getActiveId(), 'two', 'carousel slid from 1st to 2nd slide')
593 .one('slid.bs.carousel', function () {
594 assert.strictEqual(getActiveId(), 'three', 'carousel slid from 2nd to 3rd slide')
596 .one('slid.bs.carousel', function () {
597 assert.strictEqual(getActiveId(), 'one', 'carousel wrapped around and slid from 3rd to 1st slide')
600 .bootstrapCarousel('next')
602 .bootstrapCarousel('next')
604 .bootstrapCarousel('next')
607 QUnit.test('should wrap around from start to end when wrap option is true', function (assert) {
609 var carouselHTML = '<div id="carousel-example-generic" class="carousel slide" data-wrap="true">'
610 + '<ol class="carousel-indicators">'
611 + '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
612 + '<li data-target="#carousel-example-generic" data-slide-to="1"/>'
613 + '<li data-target="#carousel-example-generic" data-slide-to="2"/>'
615 + '<div class="carousel-inner">'
616 + '<div class="item active" id="one">'
617 + '<div class="carousel-caption"/>'
619 + '<div class="item" id="two">'
620 + '<div class="carousel-caption"/>'
622 + '<div class="item" id="three">'
623 + '<div class="carousel-caption"/>'
626 + '<a class="left carousel-control" href="#carousel-example-generic" data-slide="prev"/>'
627 + '<a class="right carousel-control" href="#carousel-example-generic" data-slide="next"/>'
629 var $carousel = $(carouselHTML)
631 var done = assert.async()
634 .on('slid.bs.carousel', function () {
635 assert.strictEqual($carousel.find('.item.active').attr('id'), 'three', 'carousel wrapped around and slid from 1st to 3rd slide')
638 .bootstrapCarousel('prev')
641 QUnit.test('should stay at the end when the next method is called and wrap is false', function (assert) {
643 var carouselHTML = '<div id="carousel-example-generic" class="carousel slide" data-wrap="false">'
644 + '<ol class="carousel-indicators">'
645 + '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
646 + '<li data-target="#carousel-example-generic" data-slide-to="1"/>'
647 + '<li data-target="#carousel-example-generic" data-slide-to="2"/>'
649 + '<div class="carousel-inner">'
650 + '<div class="item active" id="one">'
651 + '<div class="carousel-caption"/>'
653 + '<div class="item" id="two">'
654 + '<div class="carousel-caption"/>'
656 + '<div class="item" id="three">'
657 + '<div class="carousel-caption"/>'
660 + '<a class="left carousel-control" href="#carousel-example-generic" data-slide="prev"/>'
661 + '<a class="right carousel-control" href="#carousel-example-generic" data-slide="next"/>'
663 var $carousel = $(carouselHTML)
664 var getActiveId = function () { return $carousel.find('.item.active').attr('id') }
666 var done = assert.async()
669 .one('slid.bs.carousel', function () {
670 assert.strictEqual(getActiveId(), 'two', 'carousel slid from 1st to 2nd slide')
672 .one('slid.bs.carousel', function () {
673 assert.strictEqual(getActiveId(), 'three', 'carousel slid from 2nd to 3rd slide')
675 .one('slid.bs.carousel', function () {
676 assert.ok(false, 'carousel slid when it should not have slid')
678 .bootstrapCarousel('next')
679 assert.strictEqual(getActiveId(), 'three', 'carousel did not wrap around and stayed on 3rd slide')
682 .bootstrapCarousel('next')
684 .bootstrapCarousel('next')
687 QUnit.test('should stay at the start when the prev method is called and wrap is false', function (assert) {
689 var carouselHTML = '<div id="carousel-example-generic" class="carousel slide" data-wrap="false">'
690 + '<ol class="carousel-indicators">'
691 + '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
692 + '<li data-target="#carousel-example-generic" data-slide-to="1"/>'
693 + '<li data-target="#carousel-example-generic" data-slide-to="2"/>'
695 + '<div class="carousel-inner">'
696 + '<div class="item active" id="one">'
697 + '<div class="carousel-caption"/>'
699 + '<div class="item" id="two">'
700 + '<div class="carousel-caption"/>'
702 + '<div class="item" id="three">'
703 + '<div class="carousel-caption"/>'
706 + '<a class="left carousel-control" href="#carousel-example-generic" data-slide="prev"/>'
707 + '<a class="right carousel-control" href="#carousel-example-generic" data-slide="next"/>'
709 var $carousel = $(carouselHTML)
712 .on('slid.bs.carousel', function () {
713 assert.ok(false, 'carousel slid when it should not have slid')
715 .bootstrapCarousel('prev')
716 assert.strictEqual($carousel.find('.item.active').attr('id'), 'one', 'carousel did not wrap around and stayed on 1st slide')