/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

const TEST_USER_INTERACTION_ID = "testing.interaction";
const TEST_VALUE_1 = "some value";
const TEST_VALUE_2 = "some other value";
const TEST_INVALID_VALUE =
  "This is a value that is far too long - it has too many characters.";
const TEST_ADDITIONAL_TEXT_1 = "some additional text";
const TEST_ADDITIONAL_TEXT_2 = "some other additional text";

function run_test() {
  let obj1 = {};
  let obj2 = {};

  Assert.ok(UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_1));
  Assert.ok(
    UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_1, obj1)
  );
  Assert.ok(
    UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_1, obj2)
  );

  Assert.ok(UserInteraction.running(TEST_USER_INTERACTION_ID));
  Assert.ok(UserInteraction.running(TEST_USER_INTERACTION_ID, obj1));
  Assert.ok(UserInteraction.running(TEST_USER_INTERACTION_ID, obj2));

  // We can clobber UserInteractions.
  Assert.ok(UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_1));
  Assert.ok(
    UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_1, obj1)
  );
  Assert.ok(
    UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_1, obj2)
  );

  Assert.ok(UserInteraction.running(TEST_USER_INTERACTION_ID));
  Assert.ok(UserInteraction.running(TEST_USER_INTERACTION_ID, obj1));
  Assert.ok(UserInteraction.running(TEST_USER_INTERACTION_ID, obj2));

  // Ensure that we can finish a UserInteraction that was accidentally started
  // twice
  Assert.ok(UserInteraction.finish(TEST_USER_INTERACTION_ID));
  Assert.ok(UserInteraction.finish(TEST_USER_INTERACTION_ID, obj1));
  Assert.ok(UserInteraction.finish(TEST_USER_INTERACTION_ID, obj2));

  // Make sure we can't start or finish non-existent UserInteractions.
  Assert.ok(!UserInteraction.start("non-existent.interaction", TEST_VALUE_1));
  Assert.ok(
    !UserInteraction.start("non-existent.interaction", TEST_VALUE_1, obj1)
  );
  Assert.ok(
    !UserInteraction.start("non-existent.interaction", TEST_VALUE_1, obj2)
  );
  Assert.ok(!UserInteraction.running("non-existent.interaction"));
  Assert.ok(!UserInteraction.running("non-existent.interaction", obj1));
  Assert.ok(!UserInteraction.running("non-existent.interaction", obj2));
  Assert.ok(!UserInteraction.finish("non-existent.interaction"));
  Assert.ok(!UserInteraction.finish("non-existent.interaction", obj1));
  Assert.ok(!UserInteraction.finish("non-existent.interaction", obj2));

  // Ensure that we enforce the character limit on value strings.
  Assert.ok(
    !UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_INVALID_VALUE)
  );
  Assert.ok(
    !UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_INVALID_VALUE, obj1)
  );
  Assert.ok(
    !UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_INVALID_VALUE, obj2)
  );
  Assert.ok(!UserInteraction.running(TEST_USER_INTERACTION_ID));
  Assert.ok(!UserInteraction.running(TEST_USER_INTERACTION_ID, obj1));
  Assert.ok(!UserInteraction.running(TEST_USER_INTERACTION_ID, obj2));

  // Verify that they can be used again
  Assert.ok(UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_2));
  Assert.ok(
    UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_2, obj1)
  );
  Assert.ok(
    UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_2, obj2)
  );
  Assert.ok(UserInteraction.running(TEST_USER_INTERACTION_ID));
  Assert.ok(UserInteraction.running(TEST_USER_INTERACTION_ID, obj1));
  Assert.ok(UserInteraction.running(TEST_USER_INTERACTION_ID, obj2));
  Assert.ok(UserInteraction.finish(TEST_USER_INTERACTION_ID));
  Assert.ok(UserInteraction.finish(TEST_USER_INTERACTION_ID, obj1));
  Assert.ok(UserInteraction.finish(TEST_USER_INTERACTION_ID, obj2));

  Assert.ok(!UserInteraction.finish(TEST_USER_INTERACTION_ID));
  Assert.ok(!UserInteraction.finish(TEST_USER_INTERACTION_ID, obj1));
  Assert.ok(!UserInteraction.finish(TEST_USER_INTERACTION_ID, obj2));
  Assert.ok(!UserInteraction.running(TEST_USER_INTERACTION_ID));
  Assert.ok(!UserInteraction.running(TEST_USER_INTERACTION_ID, obj1));
  Assert.ok(!UserInteraction.running(TEST_USER_INTERACTION_ID, obj2));

  // Verify that they can be used again with different values.
  Assert.ok(UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_1));
  Assert.ok(
    UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_2, obj1)
  );
  Assert.ok(
    UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_1, obj2)
  );
  Assert.ok(UserInteraction.running(TEST_USER_INTERACTION_ID));
  Assert.ok(UserInteraction.running(TEST_USER_INTERACTION_ID, obj1));
  Assert.ok(UserInteraction.running(TEST_USER_INTERACTION_ID, obj2));
  Assert.ok(UserInteraction.finish(TEST_USER_INTERACTION_ID));
  Assert.ok(
    UserInteraction.finish(
      TEST_USER_INTERACTION_ID,
      obj1,
      TEST_ADDITIONAL_TEXT_1
    )
  );
  Assert.ok(
    UserInteraction.finish(
      TEST_USER_INTERACTION_ID,
      obj2,
      TEST_ADDITIONAL_TEXT_2
    )
  );

  // Test that they can be cancelled
  Assert.ok(UserInteraction.start(TEST_USER_INTERACTION_ID, TEST_VALUE_1));
  Assert.ok(UserInteraction.cancel(TEST_USER_INTERACTION_ID));
  Assert.ok(!UserInteraction.running(TEST_USER_INTERACTION_ID));
  Assert.ok(!UserInteraction.finish(TEST_USER_INTERACTION_ID));

  // Test that they cannot be cancelled twice
  Assert.ok(!UserInteraction.cancel(TEST_USER_INTERACTION_ID));
  Assert.ok(!UserInteraction.cancel(TEST_USER_INTERACTION_ID));
}
