Source: lib/baseContext.js

/** @module */
'use strict'

/**
 * Generate a random string with base64 chars (A-Za-z0-9+/)
 * @param {number} [len=8]
 * @param {string} [alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/']
 * @returns {string}
 */
module.exports.randomStr = function (len, alphabet) {
	var str = ''
	len = len || 8
	alphabet = alphabet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
	for (var i = 0; i < len; i++) {
		str += alphabet[Math.floor(Math.random() * alphabet.length)]
	}
	return str
}

/**
 * Generate a random string with hex chars (0-9a-f)
 * @param {number} [len=8]
 * @returns {string}
 */
module.exports.randomHex = function (len) {
	return module.exports.randomStr(len, '0123456789abcdef')
}

/**
 * Generate a random string with digits (0-9)
 * @param {number} [len=8]
 * @returns {string}
 */
module.exports.randomCode = function (len) {
	return module.exports.randomStr(len, '0123456789')
}

/**
 * Generate a random valid email address
 * @param {string} [domain='example.com']
 * @returns {string}
 */
module.exports.randomEmail = function (domain) {
	domain = domain || 'example.com'
	return 'test-' + module.exports.randomHex(24) + '@' + domain
}

/**
 * Generate a random valid url
 * @param {string} [base='http://example.com']
 * @returns {string}
 */
module.exports.randomUrl = function (base) {
	base = base || 'http://example.com'
	return base + '/' + module.exports.randomHex(24)
}

/**
 * Generate a random number
 * random() is the same as Math.random(): 0 <= x < 1
 * random(N) returns a number 0 <= x < N
 * random(M, N) returns M <= x < N
 * @param {number} [min=0]
 * @param {number} [max=1]
 * @returns {number}
 */
module.exports.random = function (min, max) {
	if (min === undefined && max === undefined) {
		return Math.random()
	} else if (max === undefined) {
		return Math.random() * min
	} else {
		return min + Math.random() * (max - min)
	}
}

/**
 * Generate a random int min <= x < max
 * randomInt() is equal to randomInt(0, 100)
 * randomInt(N) is equal to randomInt(0, N)
 * @param {number} [min=0]
 * @param {number} [max=100]
 * @returns {number}
 */
module.exports.randomInt = function (min, max) {
	if (min === undefined && max === undefined) {
		return module.exports.randomInt(0, 100)
	} else if (max === undefined) {
		return module.exports.randomInt(0, min)
	} else {
		return Math.floor(module.exports.random(min, max))
	}
}

/**
 * @returns {boolean}
 */
module.exports.randomBool = function () {
	return Math.random() < 0.5
}

/**
 * Generate a random Date previous from a given Date
 * @param {number} [interval=86.4e6]
 * @param {Date} [baseDate=new Date]
 * @returns {Date}
 */
module.exports.randomDate = function (interval, baseDate) {
	if (interval instanceof Date) {
		baseDate = interval
		interval = 86.4e6
	} else {
		interval = interval || 86.4e6
		baseDate = baseDate || new Date
	}
	return new Date(baseDate.getTime() - Math.random() * interval)
}

/**
 * Return one of its arguments
 * @param {...*} value
 * @returns {*}
 */
module.exports.randomOf = function () {
	return arguments[Math.floor(Math.random() * arguments.length)]
}

/**
 * The empty object
 */
module.exports.empty = {}