predictionary
Version:
JavaScript dictionary-based word prediction library.
707 lines (631 loc) • 36.7 kB
JavaScript
import Predictionary from './index.mjs'
let TESTKEY = 'TESTKEY';
let TESTKEY2 = 'TESTKEY2';
let fruits = ['Apple', 'Apricot', 'Avocado', 'Banana', 'Bilberry', 'Blackberry', 'Blackcurrant', 'Blueberry', 'Boysenberry', 'Currant', 'Cherry', 'Cherimoya', 'Cloudberry', 'Coconut', 'Cranberry', 'Cucumber', 'Damson', 'Date', 'Dragonfruit', 'Durian', 'Elderberry', 'Feijoa', 'Fig', 'Goji', 'Gooseberry', 'GrapeRaisin', 'Grapefruit', 'Guava', 'Honeyberry', 'Huckleberry', 'Jabuticaba', 'Jackfruit', 'Jambul', 'Jujube', 'Kiwifruit', 'Kumquat', 'Lemon', 'Lime', 'Loquat', 'Longan', 'Lychee', 'Mango', 'Marionberry', 'Melon', 'Cantaloupe', 'Watermelon', 'Mulberry', 'Nectarine', 'Nance', 'Olive', 'Orange', 'Clementine', 'Mandarine', 'Tangerine', 'Papaya', 'Passionfruit', 'Peach', 'Pear', 'Persimmon', 'Physalis', 'Plantain', 'Pineapple', 'Pomegranate', 'Pomelo', 'Quince', 'Raspberry', 'Salmonberry', 'Rambutan', 'Redcurrant', 'Salak', 'Satsuma', 'Soursop', 'Strawberry', 'Tamarillo', 'Tamarind', 'Yuzu'];
let verbs = ['ask', 'be', 'become', 'begin', 'call', 'can', 'come', 'could', 'do', 'feel', 'find', 'get', 'give', 'go', 'have', 'hear', 'help', 'keep', 'know', 'leave', 'let', 'like', 'live', 'look', 'make', 'may', 'mean', 'might', 'move', 'need', 'play', 'put', 'run', 'say', 'see', 'seem', 'should', 'show', 'start', 'take', 'talk', 'tell', 'think', 'try', 'turn', 'use', 'want', 'will', 'work', 'would'];
let predictionary = null;
beforeEach(() => {
predictionary = Predictionary.instance();
});
test.skip('addDictionary, predict, performance', () => {
predictionary.addWords(fruits);
let startTime = new Date().getTime();
for (let i = 0; i < 60000; i++) {
expect(predictionary.predict('A')).toEqual(expect.arrayContaining(['Apple', 'Apricot', 'Avocado']));
}
console.log('needed time: ' + (new Date().getTime() - startTime) + 'ms')
});
test.skip('predict non existing, but same beginning, truncate input, performance', () => {
predictionary.addWords(fruits);
let startTime = new Date().getTime();
for (let i = 0; i < 60000; i++) {
expect(predictionary.predict('Appleasdfbasdfasdf')).toEqual(['Apple']);
}
console.log('needed time: ' + (new Date().getTime() - startTime) + 'ms')
});
test('addDictionary, predict', () => {
predictionary.addWords(fruits, TESTKEY);
expect(predictionary.predict('A')).toEqual(expect.arrayContaining(['Apple', 'Apricot', 'Avocado']));
expect(predictionary.predict('a')).toEqual(expect.arrayContaining(['Apple', 'Apricot', 'Avocado']));
});
test('addDictionary, predict, sequence', () => {
predictionary.addWords(fruits, TESTKEY);
expect(predictionary.predict('a')).toEqual(expect.arrayContaining(['Apple', 'Apricot', 'Avocado']));
expect(predictionary.predict('ap')).toEqual(expect.arrayContaining(['Apple', 'Apricot']));
expect(predictionary.predict('app')).toEqual(expect.arrayContaining(['Apple']));
expect(predictionary.predict('appl')).toEqual(expect.arrayContaining(['Apple']));
expect(predictionary.predict('apple')).toEqual(expect.arrayContaining(['Apple']));
expect(predictionary.predict('apple2')).toEqual(expect.arrayContaining(['Apple']));
expect(predictionary.predict('appletreeflowerbanana')).toEqual(expect.arrayContaining(['Apple']));
expect(predictionary.predict('', {maxPredictions: 1000})).toEqual(expect.arrayContaining(fruits));
expect(predictionary.predict('b')).toEqual(expect.arrayContaining(['Bilberry', 'Blackberry', 'Blackcurrant', 'Blueberry', 'Boysenberry']));
expect(predictionary.predict('bl')).toEqual(expect.arrayContaining(['Blackberry', 'Blackcurrant', 'Blueberry']));
expect(predictionary.predict('bla')).toEqual(expect.arrayContaining(['Blackberry', 'Blackcurrant']));
expect(predictionary.predict('blap')).toEqual(expect.arrayContaining(['Blackberry', 'Blackcurrant']));
expect(predictionary.predict('apple2')).toEqual(expect.arrayContaining(['Apple']));
expect(predictionary.predict('blap')).toEqual(expect.arrayContaining(['Blackberry', 'Blackcurrant']));
});
test('predict, learn', () => {
predictionary.addWords(fruits);
expect(predictionary.predict('A')).toEqual(expect.arrayContaining(['Apple', 'Apricot', 'Avocado']));
predictionary.learn('Apricot');
expect(predictionary.predict('a')).toEqual(expect.arrayContaining(['Apricot', 'Apple', 'Avocado']));
expect(predictionary.predict('a')[0]).toEqual('Apricot');
predictionary.learn('Avocado');
predictionary.learn('Avocado');
expect(predictionary.predict('a')).toEqual(expect.arrayContaining(['Avocado', 'Apricot', 'Apple']));
expect(predictionary.predict('a')[0]).toEqual('Avocado');
});
test('predict empty, learn', () => {
predictionary.addWords(fruits);
expect(predictionary.predict('', {maxPredictions: 1000})).toEqual(expect.arrayContaining(fruits));
predictionary.learn('Cherry');
let result = predictionary.predict('', {maxPredictions: 1000});
expect(result).toEqual(expect.arrayContaining(fruits));
expect(result[0]).toEqual('Cherry');
});
test('predict non existing, should be empty', () => {
predictionary.addWords(fruits);
expect(predictionary.predict('v')).toEqual([]);
});
test('predict non existing, but same beginning, truncate input', () => {
predictionary.addWords(fruits);
expect(predictionary.predict('Appleasdfbasdfasdf')).toEqual(['Apple']);
});
test('predict, option numberOfPredictions', () => {
predictionary.addWords(fruits);
let result = predictionary.predict('', {maxPredictions: 5});
expect(result.length).toEqual(5);
expect(fruits).toEqual(expect.arrayContaining(result));
});
test('predict, option maxPredicitons, legacy version wrong spelling', () => {
predictionary.addWords(fruits);
let result = predictionary.predict('', {maxPredicitons: 5});
expect(result.length).toEqual(5);
expect(fruits).toEqual(expect.arrayContaining(result));
});
test('predict, option numberOfPredictions, learn', () => {
predictionary.addWords(fruits);
predictionary.learn('Cherry');
predictionary.learn('Coconut');
predictionary.learn('Coconut');
let result = predictionary.predict('', {maxPredictions: 5});
expect(result.length).toEqual(5);
expect(fruits).toEqual(expect.arrayContaining(result));
expect(result[0]).toEqual('Coconut');
expect(result[1]).toEqual('Cherry');
});
test('addWord, single string', () => {
predictionary.addWords(fruits);
predictionary.addWord('Test');
expect(predictionary.predict('', {maxPredictions: 1000})).toEqual(expect.arrayContaining(fruits.concat(['Test'])));
predictionary.learn('Test');
let result = predictionary.predict('', {maxPredictions: 1000});
expect(result).toEqual(expect.arrayContaining(fruits.concat(['Test'])));
expect(result[0]).toEqual('Test');
});
test('addWord, with rank', () => {
predictionary.addWords(fruits);
predictionary.addWord({
word: 'Test',
rank: 1
});
let result = predictionary.predict('', {maxPredictions: 1000});
expect(result).toEqual(expect.arrayContaining(fruits.concat(['Test'])));
expect(result[0]).toEqual('Test');
});
test('learn, with adding', () => {
predictionary.addWords(fruits);
predictionary.learn('Test');
let result = predictionary.predict('', {maxPredictions: 1});
expect(result.length).toEqual(1);
expect(result[0]).toEqual('Test');
});
test('dictionariesToJSON, loadDictionaries', () => {
predictionary.addWords(fruits);
predictionary.addWord("Apple2");
let json = predictionary.dictionariesToJSON();
expect(json.length).toBeLessThan(2500);
let newPredictionary = new Predictionary();
newPredictionary.loadDictionaries(json);
expect(predictionary.predict('A')).toEqual(expect.arrayContaining(['Apple2', 'Apple', 'Apricot', 'Avocado']));
});
test('dictionaryToJSON, loadDictionary', () => {
predictionary.addWords(fruits);
predictionary.addWord("Apple2");
let json = predictionary.dictionaryToJSON();
let newPredictionary = new Predictionary();
newPredictionary.loadDictionary(json);
expect(newPredictionary.predict('A')).toEqual(expect.arrayContaining(['Apple2', 'Apple', 'Apricot', 'Avocado']));
});
test('two dictionaries, predict', () => {
predictionary.addDictionary(TESTKEY, fruits);
predictionary.addDictionary(TESTKEY2, verbs);
expect(predictionary.predict('A')).toEqual(expect.arrayContaining(['ask', 'Apple', 'Apricot', 'Avocado']));
expect(predictionary.predict('w')).toEqual(expect.arrayContaining(['would']));
expect(predictionary.predict('y')).toEqual(expect.arrayContaining(['Yuzu']));
});
test('two dictionaries, predict, duplicates, unique items', () => {
predictionary.addDictionary(TESTKEY, fruits);
predictionary.addDictionary(TESTKEY2, ['Apple', 'America']);
predictionary.learn('Apple');
expect(predictionary.predict('A', {maxPredictions: 4})).toEqual(expect.arrayContaining(['Apple', 'Apricot', 'Avocado', 'America']));
});
test('two dictionaries, predict, learn', () => {
predictionary.addDictionary(TESTKEY, fruits);
predictionary.addDictionary(TESTKEY2, verbs);
predictionary.learn('ask');
predictionary.learn('Apple');
predictionary.learn('Apple');
expect(predictionary.predict('A')[0]).toEqual('Apple');
predictionary.learn('ask');
predictionary.learn('ask');
expect(predictionary.predict('A')[0]).toEqual('ask');
});
test('two dictionaries, dictionariesToJSON, loadDictionaries', () => {
predictionary.addDictionary(TESTKEY, fruits);
predictionary.addDictionary(TESTKEY2, verbs);
predictionary.addWord("Apple2", TESTKEY);
let json = predictionary.dictionariesToJSON();
let newPredictionary = new Predictionary();
newPredictionary.loadDictionaries(json);
expect(predictionary.predict('A')).toEqual(expect.arrayContaining(['ask', 'Apple2', 'Apple', 'Apricot', 'Avocado']));
});
test('two dictionaries, useDictionary, useAllDictionaries, useDictionaries', () => {
predictionary.addDictionary(TESTKEY, fruits);
predictionary.addDictionary(TESTKEY2, verbs);
predictionary.addWord("Apple2", TESTKEY);
predictionary.useDictionary(TESTKEY);
expect(predictionary.predict('A')).toEqual(expect.arrayContaining(['Apple2', 'Apple', 'Apricot', 'Avocado']));
predictionary.useDictionary(TESTKEY2);
expect(predictionary.predict('A')).toEqual(expect.arrayContaining(['ask']));
predictionary.useDictionaries([TESTKEY, TESTKEY2]);
expect(predictionary.predict('A')).toEqual(expect.arrayContaining(['ask', 'Apple2', 'Apple', 'Apricot', 'Avocado']));
predictionary.useDictionaries([]);
expect(predictionary.predict('A')).toEqual([]);
predictionary.useAllDictionaries();
expect(predictionary.predict('A')).toEqual(expect.arrayContaining(['ask', 'Apple2', 'Apple', 'Apricot', 'Avocado']));
});
test('useDictionaries, use default by default', () => {
predictionary.addWord('ATestword');
predictionary.addDictionary(TESTKEY, fruits);
predictionary.addDictionary(TESTKEY2, verbs);
predictionary.useDictionaries([TESTKEY]);
expect(predictionary.predict('A')).toEqual(expect.arrayContaining(['ATestword', 'Apple', 'Apricot', 'Avocado']));
predictionary.useDictionaries([TESTKEY2]);
expect(predictionary.predict('A')).toEqual(expect.arrayContaining(['ask', 'ATestword']));
predictionary.useDictionaries([]);
expect(predictionary.predict('A')).toEqual(['ATestword']);
});
test('learn, with previous word, predict automatically', () => {
predictionary.addWords(fruits);
predictionary.learn('Banana', 'Apple');
expect(predictionary.predict('app')).toEqual(expect.arrayContaining(['Apple']));
expect(predictionary.predict('apple ')).toEqual(expect.arrayContaining(['Banana']));
expect(predictionary.predict('Apple ')).toEqual(expect.arrayContaining(['Banana']));
});
test('learn, with previous word, different case, predict automatically', () => {
predictionary.addWords(fruits);
predictionary.learn('banana', 'apple');
expect(predictionary.predict('app')).toEqual(expect.arrayContaining(['Apple']));
expect(predictionary.predict('apple ')).toEqual(expect.arrayContaining(['Banana']));
expect(predictionary.predict('Apple ')).toEqual(expect.arrayContaining(['Banana']));
});
test('learn, with previous word, different case, predict automatically, change order', () => {
predictionary.addWords(fruits);
predictionary.learn('banana', 'apple');
predictionary.learn('Banana', 'apple');
predictionary.learn('Apricot', 'Apple');
expect(predictionary.predict('appl')).toEqual(expect.arrayContaining(['Apple']));
expect(predictionary.predict('apple ')).toEqual(expect.arrayContaining(['Banana', 'Apricot']));
expect(predictionary.predict('Apple ')).toEqual(expect.arrayContaining(['Banana', 'Apricot']));
expect(predictionary.predict('Apple ')[0]).toEqual('Banana');
predictionary.learn('Apricot', 'Apple');
predictionary.learn('apricot', 'apple');
expect(predictionary.predict('Apple ')[0]).toEqual('Apricot');
expect(predictionary.predict('Apple ').length).toEqual(2);
});
test('learn, with previous word, predictNextWord', () => {
predictionary.addWords(fruits);
predictionary.learn('banana', 'apple');
predictionary.learn('Apricot', 'Apple');
expect(predictionary.predictNextWord('apple')).toEqual(expect.arrayContaining(['Banana', 'Apricot']));
predictionary.learn('Banana', 'Apple');
expect(predictionary.predictNextWord('Apple')).toEqual(expect.arrayContaining(['Banana', 'Apricot']));
expect(predictionary.predictNextWord('Apple')[0]).toEqual('Banana');
});
test('learn, with previous word, predictCompleteWord', () => {
predictionary.addWords(fruits);
predictionary.learn('banana', 'apple');
predictionary.learn('Apricot', 'Apple');
expect(predictionary.predictCompleteWord('a')).toEqual(expect.arrayContaining(['Apple', 'Apricot', 'Avocado']));
expect(predictionary.predictCompleteWord('appl').length).toEqual(1);
expect(predictionary.predictCompleteWord('appl')[0]).toEqual('Apple');
predictionary.learn('Apricot', 'Apple');
expect(predictionary.predictCompleteWord('a')).toEqual(expect.arrayContaining(['Apple', 'Apricot', 'Avocado']));
expect(predictionary.predictCompleteWord('a')[0]).toEqual('Apricot');
});
test('predictCompleteWord, with spaces', () => {
predictionary.addWords(fruits);
expect(predictionary.predictCompleteWord(' a ')).toEqual(expect.arrayContaining(['Apple', 'Apricot', 'Avocado']));
expect(predictionary.predictCompleteWord(' appl ')).toEqual(['Apple']);
});
test('predictNextWord, with spaces', () => {
predictionary.addWords(fruits);
predictionary.learn('Apricot', 'Apple');
expect(predictionary.predictNextWord(' apple ')).toEqual(['Apricot']);
});
test('predictNextWord, with previous text', () => {
predictionary.addWords(fruits);
predictionary.learn('Apricot', 'Apple');
expect(predictionary.predictNextWord('i want an apple ')).toEqual(['Apricot']);
expect(predictionary.predictNextWord('i want an apple')).toEqual(['Apricot']);
expect(predictionary.predictNextWord('i want an appl')).toEqual([]);
});
test('predictCompleteWord, with previous text', () => {
predictionary.addWords(fruits);
expect(predictionary.predictCompleteWord('i want an apple ')).toEqual(['Apple']);
expect(predictionary.predictCompleteWord('i want an apple')).toEqual(['Apple']);
expect(predictionary.predictCompleteWord('i want an ap')).toEqual(expect.arrayContaining(['Apple', 'Apricot']));
});
test('predict, with previous text, automatically', () => {
predictionary.addWords(fruits);
predictionary.learn('Apricot', 'Apple');
expect(predictionary.predict('i want an apple ')).toEqual(['Apricot']);
expect(predictionary.predict('i want an apple')).toEqual(['Apple']);
expect(predictionary.predict('i want an ap')).toEqual(expect.arrayContaining(['Apple', 'Apricot']));
});
test('predict, other separator', () => {
predictionary.addWords(fruits);
expect(predictionary.predict('i want no\nap')).toEqual(expect.arrayContaining(['Apple', 'Apricot']));
expect(predictionary.predict('i want no!ap')).toEqual(expect.arrayContaining(['Apple', 'Apricot']));
expect(predictionary.predict('i want no.ap')).toEqual(expect.arrayContaining(['Apple', 'Apricot']));
expect(predictionary.predict('i want no?ap')).toEqual(expect.arrayContaining(['Apple', 'Apricot']));
});
test('predict, eliminate duplicate suggestions', () => {
predictionary.addWords(fruits);
predictionary.learn('Apricot');
predictionary.addDictionary(TESTKEY2, ['Apple', 'Apricot', 'apple'])
expect(predictionary.predict('ap')).toEqual(expect.arrayContaining(['Apple', 'Apricot', 'apple']));
expect(predictionary.predict('ap').length).toEqual(3);
expect(predictionary.predict('ap')[0]).toEqual('Apricot');
});
test('predict, apply to input, complete word', () => {
predictionary.addWords(fruits);
expect(predictionary.predict('i want an ap', {applyToInput: true})).toEqual(expect.arrayContaining(['i want an Apple ', 'i want an Apricot ']));
expect(predictionary.predict('i want an ', {applyToInput: true})).toEqual([]);
});
test('predict, apply to input, next word', () => {
predictionary.addWords(fruits);
predictionary.learn('apple', 'an');
expect(predictionary.predict('i want an ', {applyToInput: true})).toEqual(['i want an Apple ']);
});
test('applyPrediction, automatically', () => {
expect(predictionary.applyPrediction('i want an appl', 'Apple')).toEqual('i want an Apple ');
expect(predictionary.applyPrediction('i want an Apple ', 'to')).toEqual('i want an Apple to ');
expect(predictionary.applyPrediction('i want an Apple to e', 'eat')).toEqual('i want an Apple to eat ');
});
test('applyPrediction, manually', () => {
expect(predictionary.applyPrediction('i want an appl', 'Apple', {shouldCompleteLastWord: true})).toEqual('i want an Apple ');
expect(predictionary.applyPrediction('i want an appl', 'Apple', {shouldCompleteLastWord: false})).toEqual('i want an appl Apple ');
expect(predictionary.applyPrediction('i want an appl ', 'Apple', {shouldCompleteLastWord: true})).toEqual('i want an Apple ');
expect(predictionary.applyPrediction('i want an appl ', 'Apple', {shouldCompleteLastWord: false})).toEqual('i want an appl Apple ');
expect(predictionary.applyPrediction('appl', 'Apple', {shouldCompleteLastWord: true})).toEqual('Apple ');
expect(predictionary.applyPrediction('appl', 'Apple', {shouldCompleteLastWord: false})).toEqual('appl Apple ');
});
test('applyPrediction, test automatic learning', () => {
predictionary.addWords(fruits);
predictionary.learn('Apple');
expect(predictionary.predict('ap', {maxPredictions: 1})).toEqual(['Apple']);
expect(predictionary.applyPrediction('i want an ap', 'Apricot')).toEqual('i want an Apricot ');
predictionary.learn('Apricot'); //second time to chose Apricot
expect(predictionary.predict('ap', {maxPredictions: 2})).toEqual(['Apricot', 'Apple']);
});
test('applyPrediction, test automatic learning subsequent words', () => {
predictionary.addWords(fruits);
expect(predictionary.applyPrediction('i want an apple ', 'Apricot')).toEqual('i want an apple Apricot ');
expect(predictionary.predict('apple ')).toEqual(['Apricot']);
});
test('applyPrediction, test automatic learning subsequent words, next word, new word add to dict', () => {
predictionary.addWords(fruits);
expect(predictionary.applyPrediction('i want no ', 'Apricot')).toEqual('i want no Apricot ');
expect(predictionary.predict('i want no ')).toEqual(['Apricot']);
expect(predictionary.applyPrediction('i want no ', 'Apple')).toEqual('i want no Apple ');
});
test('applyPrediction, test automatic learning subsequent words, complete word, new word add to dict', () => {
predictionary.addWords(fruits);
expect(predictionary.applyPrediction('i want no ap', 'Apricot')).toEqual('i want no Apricot ');
expect(predictionary.predict('i want no ')).toEqual(['Apricot']);
expect(predictionary.applyPrediction('i want no ap', 'Apple')).toEqual('i want no Apple ');
});
test('applyPrediction, test automatic learning subsequent words, special inbetween chars', () => {
predictionary.addWords(fruits);
expect(predictionary.applyPrediction('i want all.', 'Apricot')).toEqual('i want all. Apricot ');
expect(predictionary.predict('i want all ')).toEqual(['Apricot']);
expect(predictionary.predict('i want all.')).toEqual(['Apricot']);
expect(predictionary.predict('i want all. ')).toEqual(['Apricot']);
expect(predictionary.predict('i want all! ')).toEqual(['Apricot']);
expect(predictionary.predict('i want all? ')).toEqual(['Apricot']);
});
test('parseWords, default', () => {
let importString = 'apple;banana;lemon';
predictionary.parseWords(importString);
expect(predictionary.predict('')).toEqual(expect.arrayContaining(['apple', 'banana', 'lemon']));
});
test('parseWords, custom separator', () => {
let importString = 'apple\nbanana\nlemon';
predictionary.parseWords(importString, {
elementSeparator: '\n'
});
expect(predictionary.predict('')).toEqual(expect.arrayContaining(['apple', 'banana', 'lemon']));
});
test('parseWords, with rank, custom separators', () => {
let importString = 'apple,3:banana,2:lemon,1';
predictionary.parseWords(importString, {
elementSeparator: ':',
rankSeparator: ',',
wordPosition: 0,
rankPosition: 1
});
expect(predictionary.predict('')).toEqual(['lemon', 'banana', 'apple']);
});
test('parseWords, with rank, custom separators, different order', () => {
let importString = 'apple,3:banana,2:lemon,1';
predictionary.parseWords(importString, {
elementSeparator: ':',
rankSeparator: ',',
wordPosition: 1,
rankPosition: 0
});
expect(predictionary.predict('')).toEqual(expect.arrayContaining(['1', '2', '3']));
});
test('parseWords, predict, hebrew', () => {
let importString = '1\tכמו\tas\n' +
'2\tאני\tI\n' +
'3\tשלו\this';
predictionary.parseWords(importString, {
elementSeparator: '\n',
rankSeparator: '\t',
wordPosition: 1,
rankPosition: 0
});
expect(predictionary.predict('')).toEqual(expect.arrayContaining(['כמו', 'אני', 'שלו']));
expect(predictionary.predict('כ')).toEqual(expect.arrayContaining(['כמו']));
});
test('parseWords, without rank, rankIsIndex', () => {
let importString = 'sun,salat,single,super,apple,banana';
predictionary.parseWords(importString, {
elementSeparator: ',',
rankIsIndex: true
});
expect(predictionary.predict('s')).toEqual(['sun', 'salat', 'single', 'super']);
});
test('parseWords, without rank, rankIsIndex2', () => {
let importString = 'salat,sun,single,super,apple,banana';
predictionary.parseWords(importString, {
elementSeparator: ',',
rankIsIndex: true
});
expect(predictionary.predict('s')).toEqual(['salat', 'sun', 'single', 'super']);
});
test('predict, fuzzyMatch correct order, two dictionaries', () => {
predictionary.addDictionary(TESTKEY, ['Apple', 'Apricot', 'Ant']);
predictionary.addDictionary(TESTKEY2, ['America']);
expect(predictionary.predict('Am', {maxPredictions: 1})).toEqual(['America']);
expect(predictionary.predict('Am', {maxPredictions: 4})).toEqual(expect.arrayContaining(['America', 'Apple', 'Apricot', 'Ant']));
});
test('getDictionaryKeys, isUsingOnlyDefaultDictionary, default', () => {
expect(predictionary.isUsingOnlyDefaultDictionary()).toEqual(true);
predictionary.addWords(fruits);
expect(predictionary.getDictionaryKeys()).toEqual([predictionary.DEFAULT_DICTIONARY_KEY]);
expect(predictionary.isUsingOnlyDefaultDictionary()).toEqual(true);
});
test('getDictionaryKeys, isUsingOnlyDefaultDictionary, custom', () => {
predictionary.addDictionary(TESTKEY, fruits);
expect(predictionary.getDictionaryKeys()).toEqual([TESTKEY]);
expect(predictionary.isUsingOnlyDefaultDictionary()).toEqual(false);
});
test('getDictionaryKeys, addWords', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.addWords(verbs, TESTKEY2);
expect(predictionary.getDictionaryKeys()).toEqual(expect.arrayContaining([TESTKEY, TESTKEY2]));
expect(predictionary.getDictionaryKeys(true)).toEqual(expect.arrayContaining([TESTKEY, TESTKEY2]));
predictionary.useDictionary(TESTKEY);
expect(predictionary.getDictionaryKeys(true)).toEqual(expect.arrayContaining([TESTKEY]));
});
test('learnFromInput', () => {
predictionary.learnFromInput('He');
predictionary.learnFromInput('Hello');
predictionary.learnFromInput('Hello my');
predictionary.learnFromInput('Hello my na');
predictionary.learnFromInput('Hello my name ');
expect(predictionary.predict('hello ')).toEqual(['my']);
predictionary.learnFromInput('Hello my name is ');
predictionary.learnFromInput('Hello my name is Mi');
predictionary.learnFromInput('Hello my name is Michael ');
predictionary.learnFromInput('Hello my name is Michael and ');
predictionary.learnFromInput('Hello my name is Michael and my ');
predictionary.learnFromInput('Hello my name is Michael and my house ');
predictionary.learnFromInput('Hello my name is Michael and my house is ');
predictionary.learnFromInput('Hello my name is Michael and my house is big.');
predictionary.learnFromInput('Hello my name is Michael and my house is big. yeah.');
expect(predictionary.predict('hello ')).toEqual(['my']);
expect(predictionary.predict('hello my ')).toEqual(expect.arrayContaining(['name', 'house']));
expect(predictionary.predict('This is ')).toEqual(expect.arrayContaining(['Michael', 'big']));
expect(predictionary.predict('name ')).toEqual(['is']);
expect(predictionary.predict('and ')).toEqual(['my']);
expect(predictionary.predict('house ')).toEqual(['is']);
});
test('learnFromInput, return value', () => {
expect(predictionary.learnFromInput('He')).toEqual(false);
expect(predictionary.learnFromInput('Hello')).toEqual(false);
expect(predictionary.learnFromInput('Hello my')).toEqual(false);
expect(predictionary.learnFromInput('Hello my na')).toEqual(false);
expect(predictionary.learnFromInput('Hello my name ')).toEqual(true);
expect(predictionary.learnFromInput('Hello my name is ')).toEqual(true);
expect(predictionary.learnFromInput('Hello my name is Mi')).toEqual(false);
expect(predictionary.learnFromInput('Hello my name is Michael ')).toEqual(true);
});
test('addWord, sanitize', () => {
predictionary.addWord(" heiße !");
expect(predictionary.predict('h')).toEqual(['heiße']);
predictionary.addWord("but, ");
expect(predictionary.predict('b')).toEqual(['but']);
predictionary.addWord("Don't\n ");
expect(predictionary.predict('d')).toEqual(["Don't"]);
predictionary.addWord("didn`t");
expect(predictionary.predict('di')).toEqual(["didn`t"]);
predictionary.addWord("won’t");
expect(predictionary.predict('w')).toEqual(["won’t"]);
predictionary.addWord("Hello");
expect(predictionary.predict('hel')).toEqual(["Hello"]);
});
test('getWords, default dictionary, additional dictionary', () => {
predictionary.addWords(fruits);
expect(predictionary.getWords()).toEqual(expect.arrayContaining(fruits));
predictionary.addDictionary(TESTKEY, ['test']);
expect(predictionary.getWords()).toEqual(expect.arrayContaining(fruits.concat(['test'])));
expect(predictionary.getWords(TESTKEY)).toEqual(['test']);
expect(predictionary.getWords(TESTKEY2)).toEqual([]);
});
test('getWords, one dictionary, learn to correct dictionary, unknown words', () => {
predictionary.addWords(fruits, TESTKEY);
expect(predictionary.getWords(TESTKEY)).toEqual(expect.arrayContaining(fruits));
predictionary.learn('test', 'test2');
expect(predictionary.getWords(TESTKEY)).toEqual(expect.arrayContaining(fruits));
expect(predictionary.getWords().length).toEqual(fruits.length + 2);
});
test('learn to correct dictionary, only one existing dictionary', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.learn('anything', 'anywhere');
expect(predictionary.getWords(TESTKEY)).toEqual(expect.arrayContaining(['anything', 'anywhere']));
expect(predictionary.getDictionaryKeys()).toEqual([TESTKEY]);
});
test('learn to correct default dictionary, two existing dictionaries', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.addWords(verbs, TESTKEY2);
predictionary.learn('anything', 'anywhere');
expect(predictionary.getWords(predictionary.DEFAULT_DICTIONARY_KEY)).toEqual(expect.arrayContaining(['anything', 'anywhere']));
expect(predictionary.getDictionaryKeys()).toEqual(expect.arrayContaining([TESTKEY, TESTKEY2, predictionary.DEFAULT_DICTIONARY_KEY]));
});
test('getWords, one dictionary, learn to correct dictionary, known chosen word', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.learn('Apple', 'test');
expect(predictionary.getWords(TESTKEY)).toEqual(expect.arrayContaining(fruits.concat(['test'])));
expect(predictionary.getWords().length).toEqual(fruits.length + 1);
});
test('getWords, one dictionary, learn to correct dictionary, known previous word', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.learn('test', 'Apple');
expect(predictionary.getWords(TESTKEY)).toEqual(expect.arrayContaining(fruits.concat(['test'])));
expect(predictionary.getWords().length).toEqual(fruits.length + 1);
});
test('getWords, two dictionaries, learn to correct dictionary, word existing', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.addWords(verbs, TESTKEY2);
predictionary.learn('Apple', 'an');
expect(predictionary.getWords(TESTKEY)).toEqual(expect.arrayContaining(fruits.concat(['an'])));
expect(predictionary.getWords(TESTKEY2).length).toEqual(verbs.length);
expect(predictionary.getWords().length).toEqual(verbs.length + fruits.length + 1);
});
test('getWords, two dictionaries, learn to correct dictionary, word not existing', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.addWords(verbs, TESTKEY2);
predictionary.learn('Flower', 'an');
expect(predictionary.getWords(TESTKEY).length).toEqual(fruits.length);
expect(predictionary.getWords(TESTKEY2).length).toEqual(verbs.length);
expect(predictionary.getWords()).toEqual(expect.arrayContaining(fruits.concat(['an', 'Flower'])));
});
test('getWords, apply prediction to correct dictionary', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.addWords(verbs, TESTKEY2);
predictionary.applyPrediction('i want an ap', 'Apple');
expect(predictionary.getWords().length).toEqual(fruits.length + verbs.length + 1);
expect(predictionary.getWords()).toEqual(expect.arrayContaining(fruits.concat(['an'])));
});
test('getWords, learn from input to correct dictionary', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.addWords(verbs, TESTKEY2);
predictionary.learnFromInput('Hello ');
predictionary.learnFromInput('Hello I ');
predictionary.learnFromInput('Hello I want ');
predictionary.learnFromInput('Hello I want an ');
predictionary.learnFromInput('Hello I want an apple ');
predictionary.learnFromInput('Hello I want an apple now ');
expect(predictionary.getWords(TESTKEY2)).toEqual(expect.arrayContaining(verbs.concat(['I'])));
expect(predictionary.getWords().length).toEqual(fruits.length + verbs.length + 5);
});
test('getWords, learn from input to correct dictionary', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.addWords(verbs, TESTKEY2);
predictionary.learnFromInput('Apple ');
predictionary.learnFromInput('Apple is ');
predictionary.learnFromInput('Apple is a ');
predictionary.learnFromInput('Apple is a fruit ');
predictionary.learnFromInput('Play ');
predictionary.learnFromInput('Play something ');
predictionary.learnFromInput('Play something with ');
predictionary.learnFromInput('Play something with me ');
expect(predictionary.getWords(TESTKEY)).toEqual(expect.arrayContaining(fruits.concat(['is', 'a'])));
expect(predictionary.getWords(TESTKEY2)).toEqual(expect.arrayContaining(verbs.concat(['something', 'with'])));
expect(predictionary.getWords().length).toEqual(fruits.length + verbs.length + 4);
});
test('hasWord', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.addWords(verbs, TESTKEY2);
expect(predictionary.hasWord('apple')).toEqual(true);
expect(predictionary.hasWord('become')).toEqual(true);
expect(predictionary.hasWord('become', TESTKEY)).toEqual(false);
expect(predictionary.hasWord('become', TESTKEY2)).toEqual(true);
expect(predictionary.hasWord('apple', TESTKEY)).toEqual(true);
expect(predictionary.hasWord('apple', TESTKEY, true)).toEqual(false);
expect(predictionary.hasWord('Apple', TESTKEY, true)).toEqual(true);
});
test('delete, single word, match case', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.addWords(['apple'], TESTKEY2);
expect(predictionary.predict('a')).toEqual(expect.arrayContaining(['apple', 'Apple']));
predictionary.delete('apple');
expect(predictionary.predict('a').includes('apple')).toEqual(false);
expect(predictionary.predict('a').includes('Apple')).toEqual(true);
predictionary.delete('Apple');
expect(predictionary.hasWord('Apple')).toEqual(false);
});
test('delete, single word, ignore case', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.addWords(['apple'], TESTKEY2);
expect(predictionary.predict('a')).toEqual(expect.arrayContaining(['apple', 'Apple']));
predictionary.delete('apple', {ignoreCase: true});
expect(predictionary.predict('a').includes('apple')).toEqual(false);
expect(predictionary.predict('a').includes('Apple')).toEqual(false);
expect(predictionary.hasWord('Apple')).toEqual(false);
});
test('delete, whole sentence, ignore case', () => {
predictionary.addWords(fruits, TESTKEY);
predictionary.addWords(['apple'], TESTKEY2);
expect(predictionary.predict('a')).toEqual(expect.arrayContaining(['apple', 'Apple']));
predictionary.delete('I want an apple', {ignoreCase: true});
expect(predictionary.predict('a').includes('apple')).toEqual(false);
expect(predictionary.predict('a').includes('Apple')).toEqual(false);
expect(predictionary.hasWord('Apple')).toEqual(false);
expect(predictionary.predict('a')).toEqual(expect.arrayContaining(['Apricot']));
});
test('delete, whole sentence, ignore case', () => {
predictionary.addWords(fruits);
predictionary.learn('Apple', 'an');
expect(predictionary.predict('an ')).toEqual(['Apple']);
predictionary.delete('apple', {ignoreCase: true});
expect(predictionary.predict('an ')).toEqual([]);
});
test('learnFromText', () => {
predictionary.learnFromText("Hello, this is a test. I want to predict something. Hello again.");
expect(predictionary.predict('hello ')).toEqual(expect.arrayContaining(['this', 'again']));
expect(predictionary.predict('this ')).toEqual(['is']);
expect(predictionary.predict('is ')).toEqual(['a']);
expect(predictionary.predict('test ')).toEqual([]);
expect(predictionary.predict('i ')).toEqual(['want']);
expect(predictionary.predict('want ')).toEqual(['to']);
expect(predictionary.predict('to ')).toEqual(['predict']);
expect(predictionary.predict('predict ')).toEqual(['something']);
expect(predictionary.predict('something ')).toEqual([]);
});