UNPKG

random-words-commonjs

Version:
295 lines (269 loc) 12 kB
import assert from "assert"; import { generate, count } from "../index.js"; import { wordList } from "../index.js"; const longestWordSize = wordList.reduce((longestWord, currentWord) => currentWord.length > longestWord.length ? currentWord : longestWord ).length; describe("random-words : generate", function () { it("should return one word when called with no arguments", function () { const word = generate(); assert.ok(typeof word === "string", "word is a string"); assert.ok(word.length, "word is not empty"); assert.ok(word.indexOf(" ") === -1, "word does not contain spaces"); }); it("should return 5 words when called with the number 5", function () { const words = generate(5); assert.ok(words.length === 5, "contains 5 elements"); }); it("should return between 5 and 10 words when called with min: 5 and max: 10", function () { const words = generate({ min: 5, max: 10 }); assert.ok(words.length >= 5 && words.length <= 10); }); it("returns result of variable length when called with min: 5 and max: 10", function () { const lengths = {}; for (let i = 0; i < 100; i++) { const words = generate({ min: 5, max: 10 }); lengths[words.length] = true; } assert.ok(Object.keys(lengths).length > 1, "result varies in length"); }); it("should return 5 space separated words when join is used with exactly: 5", function () { let phrase = generate({ exactly: 5, join: " " }); assert.ok(typeof phrase === "string", "result is a string"); assert.ok(phrase.match(/\S/), "result contains text, not just spaces"); phrase = phrase.replace(/[\S]/g, ""); assert.ok( phrase.length === 4, "result contains 4 spaces joining the 5 words" ); }); it("should return 5 concatenated words when join is used with an empty string and exactly: 5", function () { const phrase = generate({ exactly: 5, join: "" }); assert.ok(typeof phrase === "string", "result is a string"); assert.ok(phrase.match(/\w/), "result contains text, no spaces"); }); it("should return 5 words when called with exactly: 5 and join: false", function () { const words = generate({ exactly: 5, join: false }); assert.ok(words.length === 5, "contains 5 elements"); }); it("should return 5 words when called with exactly: 5 and join: null", function () { const words = generate({ exactly: 5, join: null }); assert.ok(words.length === 5, "contains 5 elements"); }); it("should return one word with a minimum of 8 letters", function () { const minWordSize = 8; const word = generate({ minLength: minWordSize }); assert.ok(word.length >= minWordSize, "result is less than 8 letters"); }); it("should return one word with a maximum of 5 letters", function () { const maxWordSize = 5; const word = generate({ maxLength: maxWordSize }); assert.ok(word.length <= maxWordSize, "result exceeded 5 letters"); }); it("should return one word with the length between 3 and 5 ", function () { const minLengthSize = 3; const maxLengthSize = 5; const word = generate({ minLength: minLengthSize, maxLength: maxLengthSize, }); assert.ok( word.length >= minLengthSize && word.length <= maxLengthSize, "result is not between the limit of 3 and 5" ); }); it("should only return words with a minimum of 8 letters", function () { const minWordSize = 8; const words = generate({ exactly: 10000, minLength: minWordSize }); words.forEach((word) => { assert.ok(word.length >= minWordSize, "result is less than 8 letters"); }); }); it("should only return words with a maximum of 5 letters", function () { const maxWordSize = 5; const words = generate({ exactly: 10000, maxLength: maxWordSize }); words.forEach((word) => { assert.ok(word.length <= maxWordSize, "result exceeded 5 letters"); }); }); it("should only return words with the length between 3 and 5", function () { const minLengthSize = 3; const maxLengthSize = 5; const words = generate({ exactly: 10000, minLength: minLengthSize, maxLength: maxLengthSize, }); words.forEach((word) => { assert.ok( word.length >= minLengthSize && word.length <= maxLengthSize, "result is not between the limit of 3 and 5" ); }); }); it("should only return words with length = 5", function () { const wordSize = 5; const words = generate({ exactly: 10000, minLength: wordSize, maxLength: wordSize, }); words.forEach((word) => { assert.ok(word.length === wordSize, "word length is different from 5"); }); }); it("maxLength larger than the longest word should not result in an endless loop", function () { const wordSize = 100000; const words = generate({ exactly: 1000, maxLength: wordSize, }); words.forEach((word) => { assert.ok(word.length <= longestWordSize); }); }); it("minLength larger than the longest word should not result in an endless loop", function () { const wordSize = 100000; const words = generate({ exactly: 1000, minLength: wordSize, }); words.forEach((word) => { assert.ok(word.length <= longestWordSize); }); }); it("must return a word even without passing a number to minLength and maxLength", function () { const word1 = generate({ minLength: undefined, maxLength: false }); const word2 = generate({ minLength: "string", maxLength: null }); assert.ok( typeof word1 === "string" && typeof word2 === "string", "result is not a string" ); }); it("should return 5 space separated words for each string if wordsPerString is set to 5 and exactly > 1", function () { const words = generate({ exactly: 10, wordsPerString: 5 }); words.forEach((string) => { const stringSplitted = string.split(" "); assert.ok( stringSplitted.length === 5, "the i-th string contains 5 words" ); }); }); it("should reuturn 5 words separated by a separator for each string if wordsPerString > 1, separator is defined as a string and exactly > 1", function () { const separator = "-"; const words = generate({ exactly: 10, wordsPerString: 5, separator }); words.forEach((string) => { const stringSplitted = string.split(separator); assert.ok(typeof separator === "string", "separator is a string"); assert.ok( stringSplitted.length === 5, "the i-th string contains 5 words" ); }); }); it("should return styled strings if formatter is defined as a function that returns a string", function () { const formatter = (word) => word.toUpperCase(); assert.ok(typeof formatter === "function", "formatter is a function"); assert.ok( typeof formatter("test") === "string", "formatter returns a string" ); const words = generate({ exactly: 10, formatter }); words.forEach((word) => { assert.ok(word === word.toUpperCase(), "word is formatted"); }); }); it("should return the same words if the same seed is used", function () { const seed = "seed1"; const exactly = 20; const join = " "; const words = generate({ seed, exactly, join }); const words2 = generate({ seed, exactly, join }); assert.ok(words == words2, "words are the same"); }); it("should return the same number of words if the same seed is used", function () { const seed = "seed1"; const min = 1; const max = 10; const words = generate({ seed, min, max }); const words2 = generate({ seed, min, max }); assert.ok(words.length == words2.length, "number of words is the same"); }); it("should return different words if no seeds are provided", function () { const exactly = 20; const join = " "; const words = generate({ exactly, join }); const words2 = generate({ exactly, join }); // with 1952 possible words, at least one word in 20 should be different assert.ok(words != words2, "words are different"); }); it("should return different words if different seeds are used", function () { const exactly = 20; const words = generate({ seed: "seed1", exactly }); const words2 = generate({ seed: "seed2", exactly }); // with these seeds, all words should be different for (let i = 0; i < exactly; i++) { assert.ok(words[i] != words2[i], "words are different"); } }); it("should return different number of words if different seeds are used", function () { const min = 1; const max = 10; const words = generate({ seed: "seed1", min, max }); const words2 = generate({ seed: "seed2", min, max }); // with these seeds, the number of words should 5 and 3 assert.ok(words.length != words2.length, "number of words is different"); }); }); describe("random-words : count", function () { it("should return the correct count when no options are provided", function () { const totalWords = count(); assert.ok(typeof totalWords === "number" && totalWords != 0 , "total number of words is a number and is not 0"); }); it("should return the correct count when minLength and maxLength options are provided", function () { const options = { minLength: 5, maxLength: 8 }; const totalWords = count(options); assert.ok(typeof totalWords === "number" && totalWords != 0 , "total number of words is a number and is not 0"); }); it("should return the correct count when only minLength option is provided", function () { const options = { minLength: 8 }; const totalWords = count(options); assert.ok(typeof totalWords === "number" && totalWords != 0 , "total number of words is a number and is not 0"); }); it("should return 0 when no words satisfy the length criteria", function () { const options = { minLength: 30, maxLength: 35 }; const totalWords = count(options); assert.ok(totalWords === 0 , "total number of words should be 0 when no words satisfy the length criteria"); }); it("should return 0 when minLength is greater than maxLength", function () { const options = { minLength: 10, maxLength: 5 }; const totalWords = count(options); assert.ok(totalWords === 0 , "total number of words should be 0 when minLength is greater than maxLength"); }); it("should return the default count when incorrect arguments are provided", function () { const options = "Illegal arguments"; const totalWords = count(options); assert.ok(typeof totalWords === "number" && totalWords != 0 , "total number of words is a number and is not 0"); }); it("should treat non-number minLength as default and return the correct count", function () { const options = { minLength: "5" }; const totalWords = count(options); assert.ok(typeof totalWords === "number" && totalWords != 0 , "total number of words is a number and is not 0"); }); it("should ignore other options and return the count based on minLength and maxLength only", function () { const options = { minLength: 4, maxLength: 7, separator: "-", formatter: (word) => word.toUpperCase(), seed: "random" }; const totalWords = count(options); assert.ok(typeof totalWords === "number" && totalWords != 0 , "total number of words is a number and is not 0"); }); it("should return 0 when negative minLength and maxLength are passed", function () { const options = { minLength: -20, maxLength: -10 }; const totalWords = count(options); assert.ok(totalWords === 0 , "total number of words should be 0 when no words satisfy the length criteria"); }); it("should return the correct count when minLength is -1 and maxLength is 10", function () { const options = { minLength: -1, maxLength: 10 }; const totalWords = count(options); assert.ok(typeof totalWords === "number" && totalWords != 0 , "total number of words is a number and is not 0"); }); })