<!doctype html>
<html lang="en">

	<head>
		<meta charset="utf-8">

		<title>reveal.js - Test Iframes</title>

		<link rel="stylesheet" href="../dist/reveal.css">
		<link rel="stylesheet" href="../node_modules/qunit/qunit/qunit.css">
		<script src="../node_modules/qunit/qunit/qunit.js"></script>
	</head>

	<body style="overflow: auto;">

		<div id="qunit"></div>
		<div id="qunit-fixture"></div>

		<div class="deck1">
			<div class="reveal" style="display: none;">
				<div class="slides">
					<section>1.1</section>
					<section data-state="deck1slide2">1.2</section>
					<section>1.3</section>
				</div>
			</div>
		</div>

		<div class="deck2">
			<div class="reveal" style="display: none;">
				<div class="slides">
					<section>2.1</section>
					<section>2.2</section>
					<section>2.3</section>
				</div>
			</div>
		</div>

		<script type="module">

			import Reveal from '../dist/reveal.esm.js';
			import Zoom from '../plugin/zoom/zoom.esm.js';

			QUnit.module( 'Multiple reveal.js instances' );

			let r1 = new Reveal( document.querySelector( '.deck1 .reveal' ), {
				embedded: true,
				keyboard: true,
				plugins: [ Zoom ]
			} );
			r1.initialize();

			let r2 = new Reveal( document.querySelector( '.deck2 .reveal' ), {
				embedded: true,
				keyboard: false
			} );
			r2.initialize();

			QUnit.test( 'Can make independent changes', function( assert ) {

				r1.slide(1);
				r2.slide(2);
				assert.strictEqual( r1.getCurrentSlide().textContent, '1.2' );
				assert.strictEqual( r2.getCurrentSlide().textContent, '2.3' );

				r2.toggleOverview( true );
				assert.strictEqual( r1.isOverview(), false );
				assert.strictEqual( r2.isOverview(), true );
				r2.toggleOverview( false );

				assert.strictEqual( r1.getConfig().keyboard, true );
				assert.strictEqual( r2.getConfig().keyboard, false );

			});

			QUnit.test( 'Can register plugins independently', function( assert ) {

				assert.ok( r1.hasPlugin( 'zoom' ) );
				assert.notOk( r2.hasPlugin( 'zoom' ) );

			});

			QUnit.test( 'Slide state is set at the viewport level', function( assert ) {

				r1.slide(1);

				assert.ok( r1.getViewportElement().classList.contains( r1.getCurrentSlide().getAttribute( 'data-state' ) ) );

				r1.slide(2);

				assert.ok( !r1.getViewportElement().classList.contains( r1.getCurrentSlide().getAttribute( 'data-state' ) ), 'unset' );

			});

		</script>
		<script>
			QUnit.test( 'Reveal does not leak to window', function( assert ) {
				assert.strictEqual( window.Reveal, undefined );
			});
		</script>

	</body>
</html>
