Pop-up dictionary browser extension for language learning. Successor to Yomichan. (PERSONAL FORK)
1/*
2 * Copyright (C) 2023-2025 Yomitan Authors
3 * Copyright (C) 2020-2022 Yomichan Authors
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
18
19import {englishTransforms} from '../../ext/js/language/en/english-transforms.js';
20import {LanguageTransformer} from '../../ext/js/language/language-transformer.js';
21import {testLanguageTransformer} from '../fixtures/language-transformer-test.js';
22
23/* eslint-disable @stylistic/no-multi-spaces */
24const tests = [
25 {
26 category: 'nouns',
27 valid: true,
28 tests: [
29 {term: 'cat', source: 'cats', rule: 'ns', reasons: ['plural']},
30 {term: 'cat', source: 'cat\'s', rule: 'ns', reasons: ['possessive']},
31 {term: 'cat', source: 'cats\'', rule: 'ns', reasons: ['plural', 'possessive']},
32 {term: 'cats', source: 'cats\'', rule: 'ns', reasons: ['possessive']},
33 {term: 'dirt', source: 'dirty', rule: 'ns', reasons: ['-y']},
34 {term: 'haze', source: 'hazy', rule: 'ns', reasons: ['-y']},
35 {term: 'bag', source: 'baggy', rule: 'ns', reasons: ['-y']},
36 {term: 'scum', source: 'scummy', rule: 'ns', reasons: ['-y']},
37 {term: 'run', source: 'runny', rule: 'ns', reasons: ['-y']},
38 {term: 'slip', source: 'slippy', rule: 'ns', reasons: ['-y']},
39 {term: 'star', source: 'starry', rule: 'ns', reasons: ['-y']},
40 {term: 'gas', source: 'gassy', rule: 'ns', reasons: ['-y']},
41 {term: 'wit', source: 'witty', rule: 'ns', reasons: ['-y']},
42 ],
43 },
44 {
45 category: 'verbs',
46 valid: true,
47 tests: [
48 {term: 'walk', source: 'walked', rule: 'v', reasons: ['past']},
49 {term: 'walk', source: 'going to walk', rule: 'v', reasons: ['going-to future']},
50 {term: 'walk', source: 'will walk', rule: 'v', reasons: ['will future']},
51 {term: 'walk', source: 'don\'t walk', rule: 'v', reasons: ['imperative negative']},
52 {term: 'walk', source: 'do not walk', rule: 'v', reasons: ['imperative negative']},
53 {term: 'hope', source: 'hoped', rule: 'v', reasons: ['past']},
54 {term: 'try', source: 'tried', rule: 'v', reasons: ['past']},
55 {term: 'frolic', source: 'frolicked', rule: 'v', reasons: ['past']},
56 {term: 'rub', source: 'rubbed', rule: 'v', reasons: ['past']},
57 {term: 'bid', source: 'bidded', rule: 'v', reasons: ['past']},
58 {term: 'rig', source: 'rigged', rule: 'v', reasons: ['past']},
59 {term: 'yak', source: 'yakked', rule: 'v', reasons: ['past']},
60 {term: 'dial', source: 'dialled', rule: 'v', reasons: ['past']},
61 {term: 'skim', source: 'skimmed', rule: 'v', reasons: ['past']},
62 {term: 'bin', source: 'binned', rule: 'v', reasons: ['past']},
63 {term: 'rip', source: 'ripped', rule: 'v', reasons: ['past']},
64 {term: 'star', source: 'starred', rule: 'v', reasons: ['past']},
65 {term: 'bus', source: 'bussed', rule: 'v', reasons: ['past']},
66 {term: 'pit', source: 'pitted', rule: 'v', reasons: ['past']},
67 {term: 'quiz', source: 'quizzed', rule: 'v', reasons: ['past']},
68 {term: 'lay', source: 'laid', rule: 'v', reasons: ['past']},
69 {term: 'pay', source: 'paid', rule: 'v', reasons: ['past']},
70 {term: 'say', source: 'said', rule: 'v', reasons: ['past']},
71 {term: 'adorn', source: 'adorn\'d', rule: 'v', reasons: ['past', 'archaic']},
72 {term: 'walk', source: 'walking', rule: 'v', reasons: ['ing']},
73 {term: 'drive', source: 'driving', rule: 'v', reasons: ['ing']},
74 {term: 'lie', source: 'lying', rule: 'v', reasons: ['ing']},
75 {term: 'panic', source: 'panicking', rule: 'v', reasons: ['ing']},
76 {term: 'rub', source: 'rubbing', rule: 'v', reasons: ['ing']},
77 {term: 'bid', source: 'bidding', rule: 'v', reasons: ['ing']},
78 {term: 'rig', source: 'rigging', rule: 'v', reasons: ['ing']},
79 {term: 'yak', source: 'yakking', rule: 'v', reasons: ['ing']},
80 {term: 'dial', source: 'dialling', rule: 'v', reasons: ['ing']},
81 {term: 'skim', source: 'skimming', rule: 'v', reasons: ['ing']},
82 {term: 'bin', source: 'binning', rule: 'v', reasons: ['ing']},
83 {term: 'rip', source: 'ripping', rule: 'v', reasons: ['ing']},
84 {term: 'star', source: 'starring', rule: 'v', reasons: ['ing']},
85 {term: 'bus', source: 'bussing', rule: 'v', reasons: ['ing']},
86 {term: 'pit', source: 'pitting', rule: 'v', reasons: ['ing']},
87 {term: 'quiz', source: 'quizzing', rule: 'v', reasons: ['ing']},
88 {term: 'run', source: 'runnin\'', rule: 'v', reasons: ['ing', 'dropped g']},
89 {term: 'walk', source: 'walks', rule: 'v', reasons: ['3rd pers. sing. pres']},
90 {term: 'teach', source: 'teaches', rule: 'v', reasons: ['3rd pers. sing. pres']},
91 {term: 'try', source: 'tries', rule: 'v', reasons: ['3rd pers. sing. pres']},
92 {term: 'push', source: 'pushy', rule: 'v', reasons: ['-y']},
93 {term: 'groove', source: 'groovy', rule: 'v', reasons: ['-y']},
94 {term: 'sag', source: 'saggy', rule: 'v', reasons: ['-y']},
95 {term: 'swim', source: 'swimmy', rule: 'v', reasons: ['-y']},
96 {term: 'slip', source: 'slippy', rule: 'v', reasons: ['-y']},
97 {term: 'blur', source: 'blurry', rule: 'v', reasons: ['-y']},
98 {term: 'chat', source: 'chatty', rule: 'v', reasons: ['-y']},
99 {term: 'learn', source: 'unlearn', rule: 'v', reasons: ['un-']},
100 ],
101 },
102 {
103 category: 'phrasal verbs',
104 valid: true,
105 tests: [
106 {term: 'look up', source: 'look something up', rule: 'v_phr', reasons: ['interposed object']},
107 {term: 'look up', source: 'look it up', rule: 'v_phr', reasons: ['interposed object']},
108 {term: 'look up', source: 'look one up', rule: 'v_phr', reasons: ['interposed object']},
109 {term: 'look up', source: 'looking up', rule: 'v_phr', reasons: ['ing']},
110 {term: 'look up', source: 'looked up', rule: 'v_phr', reasons: ['past']},
111 {term: 'look up', source: 'looks up', rule: 'v_phr', reasons: ['3rd pers. sing. pres']},
112 {term: 'look up', source: 'looked something up', rule: 'v_phr', reasons: ['past', 'interposed object']},
113 ],
114 },
115 {
116 category: 'adverbs',
117 valid: true,
118 tests: [
119 {term: 'interestingly', source: 'uninterestingly', rule: 'adj', reasons: ['un-']},
120 ],
121 },
122 {
123 category: 'adjectives',
124 valid: true,
125 tests: [
126 {term: 'funny', source: 'unfunny', rule: 'adj', reasons: ['un-']},
127 {term: 'cool', source: 'cooler', rule: 'adj', reasons: ['comparative']},
128 {term: 'subtle', source: 'subtler', rule: 'adj', reasons: ['comparative']},
129 {term: 'funny', source: 'funnier', rule: 'adj', reasons: ['comparative']},
130 {term: 'drab', source: 'drabber', rule: 'adj', reasons: ['comparative']},
131 {term: 'mad', source: 'madder', rule: 'adj', reasons: ['comparative']},
132 {term: 'big', source: 'bigger', rule: 'adj', reasons: ['comparative']},
133 {term: 'dim', source: 'dimmer', rule: 'adj', reasons: ['comparative']},
134 {term: 'tan', source: 'tanner', rule: 'adj', reasons: ['comparative']},
135 {term: 'hot', source: 'hotter', rule: 'adj', reasons: ['comparative']},
136 {term: 'cool', source: 'coolest', rule: 'adj', reasons: ['superlative']},
137 {term: 'subtle', source: 'subtlest', rule: 'adj', reasons: ['superlative']},
138 {term: 'funny', source: 'funniest', rule: 'adj', reasons: ['superlative']},
139 {term: 'drab', source: 'drabbest', rule: 'adj', reasons: ['superlative']},
140 {term: 'mad', source: 'maddest', rule: 'adj', reasons: ['superlative']},
141 {term: 'big', source: 'biggest', rule: 'adj', reasons: ['superlative']},
142 {term: 'dim', source: 'dimmest', rule: 'adj', reasons: ['superlative']},
143 {term: 'tan', source: 'tannest', rule: 'adj', reasons: ['superlative']},
144 {term: 'hot', source: 'hottest', rule: 'adj', reasons: ['superlative']},
145 {term: 'quick', source: 'quickly', rule: 'adj', reasons: ['adverb']},
146 {term: 'happy', source: 'happily', rule: 'adj', reasons: ['adverb']},
147 {term: 'humble', source: 'humbly', rule: 'adj', reasons: ['adverb']},
148 ],
149 },
150 {
151 category: 'invalid deinflections',
152 valid: false,
153 tests: [
154 {term: 'boss', source: 'bo', rule: 'ns', reasons: ['plural', 'plural']},
155 {term: 'sta', source: 'stable', rule: 'adj', reasons: ['-able']},
156 ],
157 },
158
159 {
160 category: '-able',
161 valid: true,
162 tests: [
163 {term: 'forget', source: 'unforgettable', rule: 'adj', reasons: ['un-', '-able']},
164 {term: 'forget', source: 'forgettable', rule: 'adj', reasons: ['-able']},
165 {term: 'like', source: 'likeable', rule: 'adj', reasons: ['-able']},
166 {term: 'do', source: 'doable', rule: 'adj', reasons: ['-able']},
167 {term: 'desire', source: 'desirable', rule: 'adj', reasons: ['-able']},
168 {term: 'rely', source: 'reliable', rule: 'adj', reasons: ['-able']},
169 {term: 'move', source: 'movable', rule: 'adj', reasons: ['-able']},
170 {term: 'adore', source: 'adorable', rule: 'adj', reasons: ['-able']},
171 {term: 'carry', source: 'carriable', rule: 'adj', reasons: ['-able']},
172 ],
173 },
174];
175/* eslint-enable @stylistic/no-multi-spaces */
176
177const languageTransformer = new LanguageTransformer();
178languageTransformer.addDescriptor(englishTransforms);
179testLanguageTransformer(languageTransformer, tests);