<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />

    <title>reveal.js - Test State</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="reveal" style="display: none">
      <div class="slides">
        <section>No state</section>
        <section id="slide2" data-state="state1">State 1</section>
        <section data-state="state1">State 1</section>
        <section data-state="state2">State 2</section>
        <section>
          <section>No state</section>
          <section data-state="state1">State 1</section>
          <section data-state="state3">State 3</section>
          <section>No state</section>
        </section>
        <section>No state</section>
      </div>
    </div>

    <script src="../dist/reveal.js"></script>
    <script>
      Reveal.initialize();

      QUnit.module("State");

      QUnit.test("Fire events when changing slide", function (assert) {
        assert.expect(2);
        var state1 = assert.async();
        var state2 = assert.async();

        var _onState1 = function (event) {
          assert.ok(true, "state1 fired");
          state1();
        };

        var _onState2 = function (event) {
          assert.ok(true, "state2 fired");
          state2();
        };

        Reveal.on("state1", _onState1);
        Reveal.on("state2", _onState2);

        Reveal.slide(1);
        Reveal.slide(3);

        Reveal.off("state1", _onState1);
        Reveal.off("state2", _onState2);
      });

      QUnit.test("Fire state events for vertical slides", function (assert) {
        assert.expect(2);
        var done = assert.async(2);

        var _onState1 = function (event) {
          assert.ok(true, "state1 fired");
          done();
        };

        var _onState3 = function (event) {
          assert.ok(true, "state3 fired");
          done();
        };

        Reveal.on("state1", _onState1);
        Reveal.on("state3", _onState3);

        Reveal.slide(0);
        Reveal.slide(4, 1);
        Reveal.slide(4, 2);

        Reveal.off("state1", _onState1);
        Reveal.off("state3", _onState3);
      });

      QUnit.test("No events if state remains unchanged", function (assert) {
        var stateChanges = 0;

        var _onEvent = function (event) {
          stateChanges += 1;
        };

        Reveal.on("state1", _onEvent);

        Reveal.slide(0); // no state
        Reveal.slide(1); // state1
        Reveal.slide(2); // state1
        Reveal.prev(); // state1
        Reveal.next(); // state1
        Reveal.slide(4, 1); // state1
        Reveal.slide(0); // no state

        Reveal.off("state1", _onEvent);

        assert.strictEqual(
          stateChanges,
          1,
          "no event was fired when going to slide with same state"
        );
      });

      QUnit.test("Event order", function (assert) {
        var _onEvent = function (event) {
          assert.ok(
            Reveal.getCurrentSlide() == document.querySelector("#slide2"),
            "correct current slide immediately after state event"
          );
        };

        Reveal.on("state1", _onEvent);

        Reveal.slide(0);
        Reveal.slide(1);

        Reveal.off("state1", _onEvent);
      });
    </script>
  </body>
</html>