"use strict";

const {PasswordGenerator} = ChromeUtils.import("resource://gre/modules/PasswordGenerator.jsm");

add_task(async function test_shuffleString() {
  let original = "1234567890";
  let shuffled = PasswordGenerator._shuffleString(original);
  notEqual(original, shuffled, "String should have been shuffled");
});

add_task(async function test_randomUInt8Index() {
  throws(() => PasswordGenerator._randomUInt8Index(256), /uint8/, "Should throw for larger than uint8");
  ok(Number.isSafeInteger(PasswordGenerator._randomUInt8Index(255)), "Check integer returned");
});

add_task(async function test_generatePassword_classes() {
  let password = PasswordGenerator.generatePassword(/* REQUIRED_CHARACTER_CLASSES */ 3);
  info(password);
  equal(password.length, 3, "Check length is correct");
  ok(password.match(/[a-km-np-z]/), "Minimal password should include at least one lowercase character");
  ok(password.match(/[A-HJ-NP-Z]/), "Minimal password should include at least one uppercase character");
  ok(password.match(/[2-9]/), "Minimal password should include at least one digit");
  ok(password.match(/^[a-km-np-zA-HJ-NP-Z2-9]+$/), "All characters should be in the expected set");
});

add_task(async function test_generatePassword_length() {
  let password = PasswordGenerator.generatePassword(5);
  info(password);
  equal(password.length, 5, "Check length is correct");

  throws(() => PasswordGenerator.generatePassword(2), /too short/i, "Throws if too short");
  throws(() => PasswordGenerator.generatePassword(Math.pow(2, 8)), /too long/i, "Throws if too long");
  ok(password.match(/^[a-km-np-zA-HJ-NP-Z2-9]+$/), "All characters should be in the expected set");
});

add_task(async function test_generatePassword_defaultLength() {
  let password = PasswordGenerator.generatePassword();
  info(password);
  equal(password.length, 15, "Check default length is correct");
  ok(password.match(/^[a-km-np-zA-HJ-NP-Z2-9]{15}$/), "All characters should be in the expected set");
});

