Skip to content

Commit

Permalink
feat: String.random util
Browse files Browse the repository at this point in the history
  • Loading branch information
medikoo committed Nov 23, 2017
1 parent 4edc960 commit 7c28739
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 0 deletions.
1 change: 1 addition & 0 deletions string/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ module.exports = {
"formatMethod": require("./format-method"),
"fromCodePoint": require("./from-code-point"),
"isString": require("./is-string"),
"random": require("./random"),
"randomUniq": require("./random-uniq"),
"raw": require("./raw")
};
42 changes: 42 additions & 0 deletions string/random.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"use strict";

var isValue = require("../object/is-value")
, toNaturalNumber = require("../number/to-pos-integer");

var generated = Object.create(null), random = Math.random, uniqTryLimit = 100;

var getChunk = function () {
return random()
.toString(36)
.slice(2);
};

var getString = function (/* length */) {
var str = getChunk(), length = arguments[0];
if (!isValue(length)) return str;
while (str.length < length) str += getChunk();
return str.slice(0, length);
};

module.exports = function (/* options */) {
var options = Object(arguments[0]), length = options.length, isUnique = options.isUnique;

if (isValue(length)) length = toNaturalNumber(length);

var str = getString(length);
if (isUnique) {
var count = 0;
while (generated[str]) {
if (++count === uniqTryLimit) {
throw new Error(
"Cannot generate random string.\n" +
"String.random is not designed to effectively generate many short and " +
"unique random strings"
);
}
str = getString(length);
}
generated[str] = true;
}
return str;
};
13 changes: 13 additions & 0 deletions test/string/random.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"use strict";

var isValidFormat = RegExp.prototype.test.bind(/^[a-z0-9]+$/);

module.exports = function (t, a) {
a(typeof t(), "string");
a.ok(t().length > 7);
a.not(t({ isUnique: true }), t({ isUnique: true }));
a.ok(isValidFormat(t()));
a(t({ length: 1 }).length, 1);
a(t({ length: 100 }).length, 100);
a(t({ length: 0 }), "");
};

0 comments on commit 7c28739

Please sign in to comment.