/*
 * Copyright (C) 2023-2024  Yomitan Authors
 * Copyright (C) 2020-2022  Yomichan Authors
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

import {koreanTransforms} from '../../ext/js/language/ko/korean-transforms.js';
import {LanguageTransformer} from '../../ext/js/language/language-transformer.js';
import {testLanguageTransformer} from '../fixtures/language-transformer-test.js';
import {Hangul} from '../../ext/lib/hangul-js.js';

/* eslint-disable @stylistic/no-multi-spaces */
const tests = [
    {
        category: 'ㅏ다',
        valid: true,
        tests: [
            {term: '가다', source: '가다',        rule: 'v', reasons: []},
            {term: '가다', source: '갑니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '가다', source: '가요',        rule: 'v', reasons: ['-아/어요']},
            {term: '가다', source: '가',        rule: 'v', reasons: ['어간']},
            {term: '가다', source: '간다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '가다', source: '갔습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '가다', source: '갔어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '가다', source: '갔어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '가다', source: '갔다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '가다', source: '가겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '가다', source: '가겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '가다', source: '가겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '가다', source: '가겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '가다', source: '갑니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '가다', source: '가냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '가다', source: '갔습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '가다', source: '갔냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '가다', source: '가겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '가다', source: '가겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '가다', source: '가네',        rule: 'v', reasons: ['-네']},
            {term: '가다', source: '가는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '가다', source: '감',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '가다', source: '간',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '가다', source: '가게',        rule: 'v', reasons: ['-게']},
            {term: '가다', source: '가고',        rule: 'v', reasons: ['-고']},
            {term: '가다', source: '가면',        rule: 'v', reasons: ['-(으)면']},
            {term: '가다', source: '가니',        rule: 'v', reasons: ['-(으)니']},
            {term: '가다', source: '가십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '가다', source: '가세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '가다', source: '가라',        rule: 'v', reasons: ['-아/어라']},
            {term: '가다', source: '갑시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
            {term: '가다', source: '가자',        rule: 'v', reasons: ['-자']},
        ],
    },
    {
        category: 'ㅓ다',
        valid: true,
        tests: [
            {term: '서다', source: '서다',        rule: 'v', reasons: []},
            {term: '서다', source: '섭니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '서다', source: '서요',        rule: 'v', reasons: ['-아/어요']},
            {term: '서다', source: '서',        rule: 'v', reasons: ['어간']},
            {term: '서다', source: '선다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '서다', source: '섰어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '서다', source: '섰어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '서다', source: '섰다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '서다', source: '섰습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '서다', source: '서겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '서다', source: '서겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '서다', source: '서겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '서다', source: '서겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '서다', source: '섭니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '서다', source: '서냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '서다', source: '섰습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '서다', source: '섰냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '서다', source: '서겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '서다', source: '서겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '서다', source: '서는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '서다', source: '서네',        rule: 'v', reasons: ['-네']},
            {term: '서다', source: '섬',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '서다', source: '선',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '서다', source: '서게',        rule: 'v', reasons: ['-게']},
            {term: '서다', source: '서면',        rule: 'v', reasons: ['-(으)면']},
            {term: '서다', source: '서고',        rule: 'v', reasons: ['-고']},
            {term: '서다', source: '서니',        rule: 'v', reasons: ['-(으)니']},
            {term: '서다', source: '서세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '서다', source: '서십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '서다', source: '서라',        rule: 'v', reasons: ['-아/어라']},
            {term: '서다', source: '서자',        rule: 'v', reasons: ['-자']},
            {term: '서다', source: '섭시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
        ],
    },
    {
        category: 'ㅗ다',
        valid: true,
        tests: [
            {term: '오다', source: '오다',        rule: 'v', reasons: []},
            {term: '오다', source: '옵니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '오다', source: '와요',        rule: 'v', reasons: ['-아/어요']},
            {term: '오다', source: '와',        rule: 'v', reasons: ['-아/어']},
            {term: '오다', source: '온다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '오다', source: '왔습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '오다', source: '왔어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '오다', source: '왔어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '오다', source: '왔다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '오다', source: '오겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '오다', source: '오겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '오다', source: '오겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '오다', source: '오겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '오다', source: '옵니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '오다', source: '오냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '오다', source: '왔습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '오다', source: '왔냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '오다', source: '오겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '오다', source: '오겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '오다', source: '오네',        rule: 'v', reasons: ['-네']},
            {term: '오다', source: '오는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '오다', source: '옴',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '오다', source: '온',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '오다', source: '오게',        rule: 'v', reasons: ['-게']},
            {term: '오다', source: '오고',        rule: 'v', reasons: ['-고']},
            {term: '오다', source: '오면',        rule: 'v', reasons: ['-(으)면']},
            {term: '오다', source: '오니',        rule: 'v', reasons: ['-(으)니']},
            {term: '오다', source: '오십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '오다', source: '오세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '오다', source: '와라',        rule: 'v', reasons: ['-아/어라']},
            {term: '오다', source: '옵시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
            {term: '오다', source: '오자',        rule: 'v', reasons: ['-자']},
        ],
    },
    {
        category: 'ㅜ다',
        valid: true,
        tests: [
            {term: '나누다', source: '나누다',        rule: 'v', reasons: []},
            {term: '나누다', source: '나눕니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '나누다', source: '나눈다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '나누다', source: '나눠',        rule: 'v', reasons: ['-아/어']},
            {term: '나누다', source: '나눠요',        rule: 'v', reasons: ['-아/어요']},
            {term: '나누다', source: '나눴어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '나누다', source: '나눴어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '나누다', source: '나눴다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '나누다', source: '나눴습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '나누다', source: '나누겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '나누다', source: '나누겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '나누다', source: '나누겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '나누다', source: '나누겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '나누다', source: '나눕니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '나누다', source: '나누냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '나누다', source: '나눴냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '나누다', source: '나눴습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '나누다', source: '나누겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '나누다', source: '나누겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '나누다', source: '나누네',        rule: 'v', reasons: ['-네']},
            {term: '나누다', source: '나누는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '나누다', source: '나눔',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '나누다', source: '나눈',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '나누다', source: '나누게',        rule: 'v', reasons: ['-게']},
            {term: '나누다', source: '나누니',        rule: 'v', reasons: ['-(으)니']},
            {term: '나누다', source: '나누면',        rule: 'v', reasons: ['-(으)면']},
            {term: '나누다', source: '나누고',        rule: 'v', reasons: ['-고']},
            {term: '나누다', source: '나누세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '나누다', source: '나눠라',        rule: 'v', reasons: ['-아/어라']},
            {term: '나누다', source: '나누십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '나누다', source: '나누자',        rule: 'v', reasons: ['-자']},
            {term: '나누다', source: '나눕시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
        ],
    },
    {
        category: 'ㅡ다',
        valid: true,
        tests: [
            {term: '쓰다', source: '쓰다',        rule: 'v', reasons: []},
            {term: '쓰다', source: '씁니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '쓰다', source: '써요',        rule: 'v', reasons: ['-아/어요']},
            {term: '쓰다', source: '써',        rule: 'v', reasons: ['-아/어']},
            {term: '쓰다', source: '쓴다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '쓰다', source: '썼습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '쓰다', source: '썼어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '쓰다', source: '썼어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '쓰다', source: '썼다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '쓰다', source: '쓰겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '쓰다', source: '쓰겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '쓰다', source: '쓰겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '쓰다', source: '쓰겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '쓰다', source: '씁니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '쓰다', source: '쓰냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '쓰다', source: '썼습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '쓰다', source: '썼을까',        rule: 'v', reasons: ['-았/었', '-(으)ㄹ까']},
            {term: '쓰다', source: '썼냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '쓰다', source: '쓰겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '쓰다', source: '쓰겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '쓰다', source: '쓰네',        rule: 'v', reasons: ['-네']},
            // Adjective 쓰다
            {term: '쓰다', source: '쓰구나',        rule: 'adj', reasons: ['-구나']},
            {term: '쓰다', source: '쓰는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '쓰다', source: '씀',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '쓰다', source: '쓴',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '쓰다', source: '쓰게',        rule: 'v', reasons: ['-게']},
            {term: '쓰다', source: '쓰고',        rule: 'v', reasons: ['-고']},
            {term: '쓰다', source: '쓰면',        rule: 'v', reasons: ['-(으)면']},
            {term: '쓰다', source: '쓰니',        rule: 'v', reasons: ['-(으)니']},
            {term: '쓰다', source: '쓰세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '쓰다', source: '써라',        rule: 'v', reasons: ['-아/어라']},
            {term: '쓰다', source: '쓰십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '쓰다', source: '쓰자',        rule: 'v', reasons: ['-자']},
            {term: '쓰다', source: '씁시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
        ],
    },
    {
        category: 'ㅣ다',
        valid: true,
        tests: [
            {term: '기다리다', source: '기다리다',        rule: 'v', reasons: []},
            {term: '기다리다', source: '기다립니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '기다리다', source: '기다려요',        rule: 'v', reasons: ['-아/어요']},
            {term: '기다리다', source: '기다려',        rule: 'v', reasons: ['-아/어']},
            {term: '기다리다', source: '기다린다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '기다리다', source: '기다렸습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '기다리다', source: '기다렸어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '기다리다', source: '기다렸어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '기다리다', source: '기다렸다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '기다리다', source: '기다리겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '기다리다', source: '기다리겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '기다리다', source: '기다리겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '기다리다', source: '기다리겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '기다리다', source: '기다립니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '기다리다', source: '기다리냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '기다리다', source: '기다렸습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '기다리다', source: '기다렸냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '기다리다', source: '기다리겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '기다리다', source: '기다리겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '기다리다', source: '기다리네',        rule: 'v', reasons: ['-네']},
            {term: '기다리다', source: '기다리는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '기다리다', source: '기다림',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '기다리다', source: '기다린',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '기다리다', source: '기다리게',        rule: 'v', reasons: ['-게']},
            {term: '기다리다', source: '기다리고',        rule: 'v', reasons: ['-고']},
            {term: '기다리다', source: '기다리면',        rule: 'v', reasons: ['-(으)면']},
            {term: '기다리다', source: '기다리니',        rule: 'v', reasons: ['-(으)니']},
            {term: '기다리다', source: '기다리십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '기다리다', source: '기다리세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '기다리다', source: '기다려라',        rule: 'v', reasons: ['-아/어라']},
            {term: '기다리다', source: '기다립시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
            {term: '기다리다', source: '기다리자',        rule: 'v', reasons: ['-자']},
        ],
    },
    {
        category: 'ㅚ다',
        valid: true,
        tests: [
            {term: '되다', source: '되다',        rule: 'v', reasons: []},
            {term: '되다', source: '됩니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '되다', source: '돼요',        rule: 'v', reasons: ['-아/어요']},
            {term: '되다', source: '돼',        rule: 'v', reasons: ['-아/어']},
            {term: '되다', source: '된다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '되다', source: '됐습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '되다', source: '됐어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '되다', source: '됐어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '되다', source: '됐다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '되다', source: '되겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '되다', source: '되겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '되다', source: '되겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '되다', source: '되겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '되다', source: '됩니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '되다', source: '되냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '되다', source: '됐습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '되다', source: '됐냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '되다', source: '되겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '되다', source: '되겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '되다', source: '되네',        rule: 'v', reasons: ['-네']},
            {term: '되다', source: '되는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '되다', source: '됨',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '되다', source: '된',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '되다', source: '되게',        rule: 'v', reasons: ['-게']},
            {term: '되다', source: '되고',        rule: 'v', reasons: ['-고']},
            {term: '되다', source: '되면',        rule: 'v', reasons: ['-(으)면']},
            {term: '되다', source: '되니',        rule: 'v', reasons: ['-(으)니']},
            {term: '되다', source: '되십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '되다', source: '되세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '되다', source: '돼라',        rule: 'v', reasons: ['-아/어라']},
            {term: '되다', source: '됩시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
            {term: '되다', source: '되자',        rule: 'v', reasons: ['-자']},
        ],
    },
    {
        category: 'ㅐ다',
        valid: true,
        tests: [
            {term: '보내다', source: '보내다',        rule: 'v', reasons: []},
            {term: '보내다', source: '보냅니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '보내다', source: '보내요',        rule: 'v', reasons: ['-아/어요']},
            {term: '보내다', source: '보내',        rule: 'v', reasons: ['어간']},
            {term: '보내다', source: '보낸다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '보내다', source: '보냈습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '보내다', source: '보냈어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '보내다', source: '보냈어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '보내다', source: '보냈다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '보내다', source: '보내겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '보내다', source: '보내겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '보내다', source: '보내겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '보내다', source: '보내겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '보내다', source: '보냅니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '보내다', source: '보내냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '보내다', source: '보냈습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '보내다', source: '보냈냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '보내다', source: '보내겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '보내다', source: '보내겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '보내다', source: '보내네',        rule: 'v', reasons: ['-네']},
            {term: '보내다', source: '보내는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '보내다', source: '보냄',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '보내다', source: '보낸',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '보내다', source: '보내게',        rule: 'v', reasons: ['-게']},
            {term: '보내다', source: '보내고',        rule: 'v', reasons: ['-고']},
            {term: '보내다', source: '보내면',        rule: 'v', reasons: ['-(으)면']},
            {term: '보내다', source: '보내니',        rule: 'v', reasons: ['-(으)니']},
            {term: '보내다', source: '보내십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '보내다', source: '보내세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '보내다', source: '보내라',        rule: 'v', reasons: ['-아/어라']},
            {term: '보내다', source: '보냅시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
            {term: '보내다', source: '보내자',        rule: 'v', reasons: ['-자']},
        ],
    },
    {
        category: 'ㅕ다',
        valid: true,
        tests: [
            {term: '펴다', source: '펴다',        rule: 'v', reasons: []},
            {term: '펴다', source: '폅니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '펴다', source: '펴요',        rule: 'v', reasons: ['-아/어요']},
            {term: '펴다', source: '펴',        rule: 'v', reasons: ['어간']},
            {term: '펴다', source: '편다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '펴다', source: '폈습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '펴다', source: '폈어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '펴다', source: '폈어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '펴다', source: '폈다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '펴다', source: '펴겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '펴다', source: '펴겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '펴다', source: '펴겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '펴다', source: '펴겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '펴다', source: '폅니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '펴다', source: '펴냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '펴다', source: '폈습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '펴다', source: '폈냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '펴다', source: '펴겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '펴다', source: '펴겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '펴다', source: '펴네',        rule: 'v', reasons: ['-네']},
            {term: '펴다', source: '펴는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '펴다', source: '폄',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '펴다', source: '편',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '펴다', source: '펴게',        rule: 'v', reasons: ['-게']},
            {term: '펴다', source: '펴고',        rule: 'v', reasons: ['-고']},
            {term: '펴다', source: '펴면',        rule: 'v', reasons: ['-(으)면']},
            {term: '펴다', source: '펴니',        rule: 'v', reasons: ['-(으)니']},
            {term: '펴다', source: '펴십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '펴다', source: '펴세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '펴다', source: '펴라',        rule: 'v', reasons: ['-아/어라']},
            {term: '펴다', source: '폅시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
            {term: '펴다', source: '펴자',        rule: 'v', reasons: ['-자']},
        ],
    },
    {
        category: 'ㅏ + consonant + 다',
        valid: true,
        tests: [
            {term: '받다', source: '받다',        rule: 'v', reasons: []},
            {term: '받다', source: '받습니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '받다', source: '받아요',        rule: 'v', reasons: ['-아/어요']},
            {term: '받다', source: '받아',        rule: 'v', reasons: ['-아/어']},
            {term: '받다', source: '받는다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '받다', source: '받았습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '받다', source: '받았어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '받다', source: '받았어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '받다', source: '받았다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '받다', source: '받겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '받다', source: '받겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '받다', source: '받겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '받다', source: '받겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '받다', source: '받습니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '받다', source: '받냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '받다', source: '받았습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '받다', source: '받았냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '받다', source: '받겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '받다', source: '받겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '받다', source: '받네',        rule: 'v', reasons: ['-네']},
            {term: '받다', source: '받는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '받다', source: '받음',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '받다', source: '받은',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '받다', source: '받게',        rule: 'v', reasons: ['-게']},
            {term: '받다', source: '받고',        rule: 'v', reasons: ['-고']},
            {term: '받다', source: '받으면',        rule: 'v', reasons: ['-(으)면']},
            {term: '받다', source: '받으니',        rule: 'v', reasons: ['-(으)니']},
            {term: '받다', source: '받으십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '받다', source: '받으세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '받다', source: '받아라',        rule: 'v', reasons: ['-아/어라']},
            {term: '받다', source: '받읍시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
            {term: '받다', source: '받자',        rule: 'v', reasons: ['-자']},
        ],
    },
    {
        category: 'ㅗ + consonant + 다',
        valid: true,
        tests: [
            {term: '좋다', source: '좋다',        rule: 'adj', reasons: []},
            {term: '좋다', source: '좋습니다',        rule: 'adj', reasons: ['-(스)ㅂ니다']},
            {term: '좋다', source: '좋아요',        rule: 'adj', reasons: ['-아/어요']},
            {term: '좋다', source: '좋아',        rule: 'adj', reasons: ['-아/어']},
            {term: '좋다', source: '좋았습니다',        rule: 'adj', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '좋다', source: '좋았어요',        rule: 'adj', reasons: ['-았/었', '-아/어요']},
            {term: '좋다', source: '좋았어',        rule: 'adj', reasons: ['-았/었', '-아/어']},
            {term: '좋다', source: '좋았다',        rule: 'adj', reasons: ['-았/었', '-다']},
            {term: '좋다', source: '좋겠습니다',        rule: 'adj', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '좋다', source: '좋겠어요',        rule: 'adj', reasons: ['-겠', '-아/어요']},
            {term: '좋다', source: '좋겠어',        rule: 'adj', reasons: ['-겠', '-아/어']},
            {term: '좋다', source: '좋겠다',        rule: 'adj', reasons: ['-겠', '-다']},
            {term: '좋다', source: '좋습니까',        rule: 'adj', reasons: ['-(스)ㅂ니까']},
            {term: '좋다', source: '좋냐',        rule: 'adj', reasons: ['-(으)냐']},
            {term: '좋다', source: '좋았습니까',        rule: 'adj', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '좋다', source: '좋았을까',        rule: 'adj', reasons: ['-았/었', '-(으)ㄹ까']},
            {term: '좋다', source: '좋았냐',        rule: 'adj', reasons: ['-았/었', '-(으)냐']},
            {term: '좋다', source: '좋겠습니까',        rule: 'adj', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '좋다', source: '좋겠냐',        rule: 'adj', reasons: ['-겠', '-(으)냐']},
            {term: '좋다', source: '좋네',        rule: 'adj', reasons: ['-네']},
            {term: '좋다', source: '좋구나',        rule: 'adj', reasons: ['-구나']},
            {term: '좋다', source: '좋음',        rule: 'adj', reasons: ['-(으)ㅁ']},
            {term: '좋다', source: '좋은',        rule: 'adj', reasons: ['-(으)ㄴ']},
            {term: '좋다', source: '좋게',        rule: 'adj', reasons: ['-게']},
            {term: '좋다', source: '좋고',        rule: 'adj', reasons: ['-고']},
            {term: '좋다', source: '좋으면',        rule: 'adj', reasons: ['-(으)면']},
            {term: '좋다', source: '좋으니',        rule: 'adj', reasons: ['-(으)니']},
        ],
    },
    {
        category: 'other vowel + consonant + 다',
        valid: true,
        tests: [
            {term: '먹다', source: '먹다',        rule: 'v', reasons: []},
            {term: '먹다', source: '먹습니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '먹다', source: '먹어요',        rule: 'v', reasons: ['-아/어요']},
            {term: '먹다', source: '먹어',        rule: 'v', reasons: ['-아/어']},
            {term: '먹다', source: '먹는다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '먹다', source: '먹었습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '먹다', source: '먹었어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '먹다', source: '먹었어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '먹다', source: '먹었다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '먹다', source: '먹겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '먹다', source: '먹겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '먹다', source: '먹겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '먹다', source: '먹겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '먹다', source: '먹습니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '먹다', source: '먹냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '먹다', source: '먹었습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '먹다', source: '먹었냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '먹다', source: '먹겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '먹다', source: '먹겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '먹다', source: '먹네',        rule: 'v', reasons: ['-네']},
            {term: '먹다', source: '먹는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '먹다', source: '먹음',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '먹다', source: '먹은',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '먹다', source: '먹게',        rule: 'v', reasons: ['-게']},
            {term: '먹다', source: '먹고',        rule: 'v', reasons: ['-고']},
            {term: '먹다', source: '먹으면',        rule: 'v', reasons: ['-(으)면']},
            {term: '먹다', source: '먹으니',        rule: 'v', reasons: ['-(으)니']},
            {term: '먹다', source: '먹으십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '먹다', source: '먹으세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '먹다', source: '먹어라',        rule: 'v', reasons: ['-아/어라']},
            {term: '먹다', source: '먹읍시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
            {term: '먹다', source: '먹자',        rule: 'v', reasons: ['-자']},
        ],
    },
    {
        category: '하다',
        valid: true,
        tests: [
            {term: '하다', source: '하다',        rule: 'v', reasons: []},
            {term: '하다', source: '합니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '하다', source: '해요',        rule: 'v', reasons: ['-아/어요']},
            {term: '하다', source: '해',        rule: 'v', reasons: ['-아/어']},
            {term: '하다', source: '한다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '하다', source: '했습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '하다', source: '했어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '하다', source: '했어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '하다', source: '했다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '하다', source: '하겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '하다', source: '하겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '하다', source: '하겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '하다', source: '하겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '하다', source: '합니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '하다', source: '하냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '하다', source: '했습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '하다', source: '했냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '하다', source: '하겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '하다', source: '하겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '하다', source: '하네',        rule: 'v', reasons: ['-네']},
            {term: '하다', source: '하는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '하다', source: '함',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '하다', source: '한',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '하다', source: '하게',        rule: 'v', reasons: ['-게']},
            {term: '하다', source: '하고',        rule: 'v', reasons: ['-고']},
            {term: '하다', source: '하면',        rule: 'v', reasons: ['-(으)면']},
            {term: '하다', source: '하니',        rule: 'v', reasons: ['-(으)니']},
            {term: '하다', source: '하십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '하다', source: '하세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '하다', source: '해라',        rule: 'v', reasons: ['-아/어라']},
            {term: '하다', source: '합시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
            {term: '하다', source: '하자',        rule: 'v', reasons: ['-자']},

            {term: '공부하다', source: '공부하다',        rule: 'v', reasons: []},
            {term: '공부하다', source: '공부합니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '공부하다', source: '공부해요',        rule: 'v', reasons: ['-아/어요']},
            {term: '공부하다', source: '공부해',        rule: 'v', reasons: ['-아/어']},
            {term: '공부하다', source: '공부한다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '공부하다', source: '공부했습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '공부하다', source: '공부했어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '공부하다', source: '공부했어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '공부하다', source: '공부했다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '공부하다', source: '공부하겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '공부하다', source: '공부하겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '공부하다', source: '공부하겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '공부하다', source: '공부하겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '공부하다', source: '공부합니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '공부하다', source: '공부하냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '공부하다', source: '공부했습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '공부하다', source: '공부했냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '공부하다', source: '공부하겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '공부하다', source: '공부하겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '공부하다', source: '공부하네',        rule: 'v', reasons: ['-네']},
            {term: '공부하다', source: '공부하는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '공부하다', source: '공부함',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '공부하다', source: '공부한',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '공부하다', source: '공부하게',        rule: 'v', reasons: ['-게']},
            {term: '공부하다', source: '공부하고',        rule: 'v', reasons: ['-고']},
            {term: '공부하다', source: '공부하면',        rule: 'v', reasons: ['-(으)면']},
            {term: '공부하다', source: '공부하니',        rule: 'v', reasons: ['-(으)니']},
            {term: '공부하다', source: '공부하십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '공부하다', source: '공부하세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '공부하다', source: '공부해라',        rule: 'v', reasons: ['-아/어라']},
            {term: '공부하다', source: '공부합시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
            {term: '공부하다', source: '공부하자',        rule: 'v', reasons: ['-자']},
        ],
    },
    {
        category: 'ㅅ다 irregular',
        valid: true,
        tests: [
            {term: '짓다', source: '짓다',        rule: 'v', reasons: []},
            {term: '짓다', source: '짓습니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '짓다', source: '지어요',        rule: 'v', reasons: ['-아/어요']},
            {term: '짓다', source: '지어',        rule: 'v', reasons: ['-아/어']},
            {term: '짓다', source: '짓는다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '짓다', source: '지었습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '짓다', source: '지었어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '짓다', source: '지었어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '짓다', source: '지었다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '짓다', source: '짓겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '짓다', source: '짓겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '짓다', source: '짓겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '짓다', source: '짓겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '짓다', source: '짓습니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '짓다', source: '짓냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '짓다', source: '지었습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '짓다', source: '지었냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '짓다', source: '짓겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '짓다', source: '짓겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '짓다', source: '짓네',        rule: 'v', reasons: ['-네']},
            {term: '짓다', source: '짓는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '짓다', source: '지음',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '짓다', source: '지은',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '짓다', source: '짓게',        rule: 'v', reasons: ['-게']},
            {term: '짓다', source: '짓고',        rule: 'v', reasons: ['-고']},
            {term: '짓다', source: '지으면',        rule: 'v', reasons: ['-(으)면']},
            {term: '짓다', source: '지으니',        rule: 'v', reasons: ['-(으)니']},
            {term: '짓다', source: '지으십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '짓다', source: '지으세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '짓다', source: '지어라',        rule: 'v', reasons: ['-아/어라']},
            {term: '짓다', source: '지읍시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
            {term: '짓다', source: '짓자',        rule: 'v', reasons: ['-자']},
        ],
    },
    {
        category: 'ㄷ다 irregular',
        valid: true,
        tests: [
            {term: '걷다', source: '걷다',        rule: 'v', reasons: []},
            {term: '걷다', source: '걷습니다',        rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '걷다', source: '걸어',        rule: 'v', reasons: ['-아/어']},
            {term: '걷다', source: '걸어요',        rule: 'v', reasons: ['-아/어요']},
            {term: '걷다', source: '걷는다',        rule: 'v', reasons: ['-(느)ㄴ다']},
            {term: '걷다', source: '걸었다',        rule: 'v', reasons: ['-았/었', '-다']},
            {term: '걷다', source: '걸었습니다',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '걷다', source: '걸었어요',        rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '걷다', source: '걸었어',        rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '걷다', source: '걷겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '걷다', source: '걷겠다',        rule: 'v', reasons: ['-겠', '-다']},
            {term: '걷다', source: '걷겠습니다',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '걷다', source: '걷겠어',        rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '걷다', source: '걷겠어요',        rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '걷다', source: '걷습니까',        rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '걷다', source: '걷냐',        rule: 'v', reasons: ['-(으)냐']},
            {term: '걷다', source: '걸었냐',        rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '걷다', source: '걸었습니까',        rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '걷다', source: '걷겠냐',        rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '걷다', source: '걷겠습니까',        rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '걷다', source: '걷네',        rule: 'v', reasons: ['-네']},
            {term: '걷다', source: '걷는구나',        rule: 'v', reasons: ['-는구나']},
            {term: '걷다', source: '걸음',        rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '걷다', source: '걸은',        rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '걷다', source: '걷게',        rule: 'v', reasons: ['-게']},
            {term: '걷다', source: '걷고',        rule: 'v', reasons: ['-고']},
            {term: '걷다', source: '걸으니',        rule: 'v', reasons: ['-(으)니']},
            {term: '걷다', source: '걸으면',        rule: 'v', reasons: ['-(으)면']},
            {term: '걷다', source: '걸으세요',        rule: 'v', reasons: ['-(으)세요']},
            {term: '걷다', source: '걸어라',        rule: 'v', reasons: ['-아/어라']},
            {term: '걷다', source: '걸으십시오',        rule: 'v', reasons: ['-(으)십시오']},
            {term: '걷다', source: '걷자',        rule: 'v', reasons: ['-자']},
            {term: '걷다', source: '걸읍시다',        rule: 'v', reasons: ['-(으)ㅂ시다 1']},
        ],
    },
    {
        category: 'ㅂ다 irregular',
        valid: true,
        tests: [
            {term: '아름답다', source: '아름답다',        rule: 'adj', reasons: []},
            {term: '아름답다', source: '아름답습니다',    rule: 'adj', reasons: ['-(스)ㅂ니다']},
            {term: '아름답다', source: '아름다워요',      rule: 'adj', reasons: ['-아/어요']},
            {term: '아름답다', source: '아름다워',        rule: 'adj', reasons: ['-아/어']},
            {term: '아름답다', source: '아름다웠습니다',  rule: 'adj', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '아름답다', source: '아름다웠어요',    rule: 'adj', reasons: ['-았/었', '-아/어요']},
            {term: '아름답다', source: '아름다웠어',      rule: 'adj', reasons: ['-았/었', '-아/어']},
            {term: '아름답다', source: '아름다웠다',      rule: 'adj', reasons: ['-았/었', '-다']},
            {term: '아름답다', source: '아름답겠습니다',  rule: 'adj', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '아름답다', source: '아름답겠어요',    rule: 'adj', reasons: ['-겠', '-아/어요']},
            {term: '아름답다', source: '아름답겠어',      rule: 'adj', reasons: ['-겠', '-아/어']},
            {term: '아름답다', source: '아름답겠다',      rule: 'adj', reasons: ['-겠', '-다']},
            {term: '아름답다', source: '아름답습니까',    rule: 'adj', reasons: ['-(스)ㅂ니까']},
            {term: '아름답다', source: '아름답냐',        rule: 'adj', reasons: ['-(으)냐']},
            {term: '아름답다', source: '아름다웠습니까',   rule: 'adj', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '아름답다', source: '아름다웠을까',    rule: 'adj', reasons: ['-았/었', '-(으)ㄹ까']},
            {term: '아름답다', source: '아름다웠냐',      rule: 'adj', reasons: ['-았/었', '-(으)냐']},
            {term: '아름답다', source: '아름답겠습니까',  rule: 'adj', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '아름답다', source: '아름답겠냐',      rule: 'adj', reasons: ['-겠', '-(으)냐']},
            {term: '아름답다', source: '아름답네',        rule: 'adj', reasons: ['-네']},
            {term: '아름답다', source: '아름답구나',      rule: 'adj', reasons: ['-구나']},
            {term: '아름답다', source: '아름다움',       rule: 'adj', reasons: ['-(으)ㅁ']},
            {term: '아름답다', source: '아름다운',       rule: 'adj', reasons: ['-(으)ㄴ']},
            {term: '아름답다', source: '아름답게',       rule: 'adj', reasons: ['-게']},
            {term: '아름답다', source: '아름답고',       rule: 'adj', reasons: ['-고']},
            {term: '아름답다', source: '아름다우면',     rule: 'adj', reasons: ['-(으)면']},
            {term: '아름답다', source: '아름다우니',     rule: 'adj', reasons: ['-(으)니']},

            {term: '돕다', source: '돕다',     rule: 'v', reasons: []},
            {term: '돕다', source: '돕습니다',     rule: 'v', reasons: ['-(스)ㅂ니다']},
            {term: '돕다', source: '도와요',     rule: 'v', reasons: ['-아/어요']},
            {term: '돕다', source: '도와',     rule: 'v', reasons: ['-아/어']},
            {term: '돕다', source: '도왔습니다',     rule: 'v', reasons: ['-았/었', '-(스)ㅂ니다']},
            {term: '돕다', source: '도왔어요',     rule: 'v', reasons: ['-았/었', '-아/어요']},
            {term: '돕다', source: '도왔어',     rule: 'v', reasons: ['-았/었', '-아/어']},
            {term: '돕다', source: '도왔다',     rule: 'v', reasons: ['-았/었', '-다']},
            {term: '돕다', source: '돕겠습니다',     rule: 'v', reasons: ['-겠', '-(스)ㅂ니다']},
            {term: '돕다', source: '돕겠어요',     rule: 'v', reasons: ['-겠', '-아/어요']},
            {term: '돕다', source: '돕겠어',     rule: 'v', reasons: ['-겠', '-아/어']},
            {term: '돕다', source: '돕겠다',     rule: 'v', reasons: ['-겠', '-다']},
            {term: '돕다', source: '돕습니까',     rule: 'v', reasons: ['-(스)ㅂ니까']},
            {term: '돕다', source: '돕냐',     rule: 'v', reasons: ['-(으)냐']},
            {term: '돕다', source: '도왔습니까',     rule: 'v', reasons: ['-았/었', '-(스)ㅂ니까']},
            {term: '돕다', source: '도왔냐',     rule: 'v', reasons: ['-았/었', '-(으)냐']},
            {term: '돕다', source: '돕겠습니까',     rule: 'v', reasons: ['-겠', '-(스)ㅂ니까']},
            {term: '돕다', source: '돕겠냐',     rule: 'v', reasons: ['-겠', '-(으)냐']},
            {term: '돕다', source: '돕네',     rule: 'v', reasons: ['-네']},
            {term: '돕다', source: '돕는구나',     rule: 'v', reasons: ['-는구나']},
            {term: '돕다', source: '도움',     rule: 'v', reasons: ['-(으)ㅁ']},
            {term: '돕다', source: '도운',     rule: 'v', reasons: ['-(으)ㄴ']},
            {term: '돕다', source: '돕게',     rule: 'v', reasons: ['-게']},
            {term: '돕다', source: '돕고',     rule: 'v', reasons: ['-고']},
            {term: '돕다', source: '도우면',     rule: 'v', reasons: ['-(으)면']},
            {term: '돕다', source: '도우니',     rule: 'v', reasons: ['-(으)니']},
            {term: '돕다', source: '도우십시오',     rule: 'v', reasons: ['-(으)십시오']},
            {term: '돕다', source: '도우세요',     rule: 'v', reasons: ['-(으)세요']},
            {term: '돕다', source: '도와라',     rule: 'v', reasons: ['-아/어라']},
            {term: '돕다', source: '도웁시다',     rule: 'v', reasons: ['-(으)ㅂ시다 1']},
            {term: '돕다', source: '돕자',     rule: 'v', reasons: ['-자']},
        ],
    },
];
/* eslint-enable @stylistic/no-multi-spaces */

// Preprocessing
/**
 * @param {string} str
 * @returns {string}
 */
function disassemble(str) {
    return Hangul.disassemble(str, false).join('');
}

const languageTransformer = new LanguageTransformer();
languageTransformer.addDescriptor(koreanTransforms);
testLanguageTransformer(languageTransformer, tests, disassemble);