mirror of
https://github.com/dmuth/diceware.git
synced 2024-11-21 16:36:28 -05:00
Added getRandomValue(), getBase6(), and unit tests for both with Qunit.
This commit is contained in:
parent
f2682d341f
commit
43b4f4c7b1
3 changed files with 123 additions and 0 deletions
65
main.js
65
main.js
|
@ -20,6 +20,71 @@ Diceware.i_can_has_good_crypto = function() {
|
||||||
} // End of i_can_has_good_crypto()
|
} // End of i_can_has_good_crypto()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a random integer between 1 max.
|
||||||
|
*/
|
||||||
|
Diceware.getRandomValue = function(max) {
|
||||||
|
|
||||||
|
if (max <= 0){
|
||||||
|
return(NaN);
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = new Uint32Array(1);
|
||||||
|
window.crypto.getRandomValues(a);
|
||||||
|
retval = (a[0] % max);
|
||||||
|
|
||||||
|
return(retval);
|
||||||
|
|
||||||
|
} // End of getRandomValue()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a number from base 10 into base 6.
|
||||||
|
*
|
||||||
|
* @param integer roll The random value.
|
||||||
|
* @param integer num_dice The number of dice we're returning.
|
||||||
|
*
|
||||||
|
* @return array An array of the base 6 numbers.
|
||||||
|
*/
|
||||||
|
Diceware.getBase6 = function(roll, num_dice) {
|
||||||
|
|
||||||
|
var retval = [];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Sanity check
|
||||||
|
//
|
||||||
|
var max_dice_roll = Math.pow(6, num_dice) - 1;
|
||||||
|
if (roll > max_dice_roll) {
|
||||||
|
throw("Value too large!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (roll < 0) {
|
||||||
|
throw("Value cannot be negative!");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Go through each die, starting with the most significant one, and
|
||||||
|
// get its value.
|
||||||
|
//
|
||||||
|
var num_dice_left = num_dice - 1;
|
||||||
|
var dice_value_left = roll;
|
||||||
|
|
||||||
|
for (i = num_dice_left; i >= 0; i--) {
|
||||||
|
|
||||||
|
var die_value = Math.pow(6, i);
|
||||||
|
var value = Math.floor( dice_value_left / die_value);
|
||||||
|
var left = dice_value_left % die_value;
|
||||||
|
|
||||||
|
retval.push(value);
|
||||||
|
dice_value_left = dice_value_left - (die_value * value);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return(retval);
|
||||||
|
|
||||||
|
} // End of getBase6()
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Roll a die.
|
* Roll a die.
|
||||||
*
|
*
|
||||||
|
|
16
tests/index.html
Normal file
16
tests/index.html
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width">
|
||||||
|
<title>QUnit Example</title>
|
||||||
|
<link rel="stylesheet" href="https://code.jquery.com/qunit/qunit-2.1.1.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="qunit"></div>
|
||||||
|
<div id="qunit-fixture"></div>
|
||||||
|
<script src="https://code.jquery.com/qunit/qunit-2.1.1.js"></script>
|
||||||
|
<script src="../main.js"></script>
|
||||||
|
<script src="tests.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
42
tests/tests.js
Normal file
42
tests/tests.js
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Our unit tests.
|
||||||
|
* Documentation on assert() can be found at https://api.qunitjs.com/category/assert/
|
||||||
|
*/
|
||||||
|
|
||||||
|
QUnit.module( "Diceware" );
|
||||||
|
|
||||||
|
QUnit.test("Test random numbers", function(assert) {
|
||||||
|
|
||||||
|
assert.ok(isNaN(Diceware.getRandomValue(-1)), "Negative numbers should be NaN");
|
||||||
|
assert.ok(isNaN(Diceware.getRandomValue(0)), "0 should be NaN");
|
||||||
|
assert.equal(Diceware.getRandomValue(1), 0, "1 should be NaN");
|
||||||
|
assert.ok(Diceware.getRandomValue(2) < 2, "getRandomValue(2) < 2");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
QUnit.test("Base 6 conversion", function(assert) {
|
||||||
|
|
||||||
|
assert.deepEqual(Diceware.getBase6(0, 1), [0]);
|
||||||
|
assert.deepEqual(Diceware.getBase6(1, 1), [1]);
|
||||||
|
assert.deepEqual(Diceware.getBase6(5, 1), [5]);
|
||||||
|
assert.deepEqual(Diceware.getBase6(6, 2), [1, 0]);
|
||||||
|
assert.deepEqual(Diceware.getBase6(12, 2), [2, 0]);
|
||||||
|
assert.deepEqual(Diceware.getBase6(35, 2), [5, 5]);
|
||||||
|
assert.deepEqual(Diceware.getBase6(36, 3), [1, 0, 0]);
|
||||||
|
assert.deepEqual(Diceware.getBase6(180, 3), [5, 0, 0]);
|
||||||
|
assert.deepEqual(Diceware.getBase6(215, 3), [5, 5, 5]);
|
||||||
|
assert.deepEqual(Diceware.getBase6(216, 4), [1, 0, 0, 0]);
|
||||||
|
assert.deepEqual(Diceware.getBase6(1080, 4), [5, 0, 0, 0]);
|
||||||
|
assert.deepEqual(Diceware.getBase6(1295, 4), [5, 5, 5, 5]);
|
||||||
|
|
||||||
|
assert.throws(function() {Diceware.getBase6(6, 1); }, /too large/, "Value too large");
|
||||||
|
assert.throws(function() {Diceware.getBase6(36, 2); }, /too large/, "Value too large");
|
||||||
|
assert.throws(function() {Diceware.getBase6(216, 3); }, /too large/, "Value too large");
|
||||||
|
assert.throws(function() {Diceware.getBase6(-1, 1); }, /negative/, "Negative value");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue