Browse Source

Add tests

Thomas Dy 3 years ago
parent
commit
19c4380d13
4 changed files with 269 additions and 26 deletions
  1. 6 1
      .github/workflows/build.yaml
  2. 181 22
      package-lock.json
  3. 7 3
      package.json
  4. 75 0
      tests/kana.ts

+ 6 - 1
.github/workflows/build.yaml

@@ -13,7 +13,12 @@ jobs:
         with:
           node-version: '14'
       - run: npm install
-      - run: npm run build
+
+      - name: Typecheck
+        run: npm run typecheck
+
+      - name: Test
+        run: npm test
 
       - name: Make Release
         if: startsWith(github.ref, 'refs/tags/')

+ 181 - 22
package-lock.json

@@ -9,9 +9,12 @@
       "license": "ISC",
       "devDependencies": {
         "@snowpack/plugin-typescript": "^1.2.1",
+        "esbuild-register": "^2.3.0",
+        "esm": "^3.2.25",
         "prettier": "2.2.1",
         "snowpack": "^3.2.2",
-        "typescript": "^4.0.0"
+        "typescript": "^4.0.0",
+        "uvu": "^0.5.1"
       }
     },
     "node_modules/@snowpack/plugin-typescript": {
@@ -85,6 +88,15 @@
         "node": ">=4"
       }
     },
+    "node_modules/dequal": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz",
+      "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/esbuild": {
       "version": "0.9.7",
       "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.9.7.tgz",
@@ -95,6 +107,25 @@
         "esbuild": "bin/esbuild"
       }
     },
+    "node_modules/esbuild-register": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-2.3.0.tgz",
+      "integrity": "sha512-uT3WXEQGAqzrI0SLy1Jz39BzIBiLWd5La9zFZ+FUSCPGqJbE+ZJHUTE8yHP1GVfyHKrrAFCZqLieaHkSprIRDQ==",
+      "dev": true,
+      "dependencies": {
+        "esbuild": "^0.9.2",
+        "jsonc-parser": "^3.0.0"
+      }
+    },
+    "node_modules/esm": {
+      "version": "3.2.25",
+      "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+      "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/execa": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
@@ -124,20 +155,6 @@
       "integrity": "sha512-cteqwWMA43lEmgwOg5HSdvhVFD39vHjQDhZkRMlKmeoNPtSSgUw1nUypydiY2upMdGiBFBZvNBDbnoBh0yCzaQ==",
       "dev": true
     },
-    "node_modules/fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-      "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
     "node_modules/function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -231,6 +248,21 @@
       "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
       "dev": true
     },
+    "node_modules/jsonc-parser": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz",
+      "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==",
+      "dev": true
+    },
+    "node_modules/kleur": {
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz",
+      "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/merge-stream": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -246,6 +278,15 @@
         "node": ">=6"
       }
     },
+    "node_modules/mri": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz",
+      "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/npm-run-path": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
@@ -374,6 +415,18 @@
         "fsevents": "~2.3.1"
       }
     },
+    "node_modules/sade": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz",
+      "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==",
+      "dev": true,
+      "dependencies": {
+        "mri": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -436,6 +489,15 @@
         "node": ">=6"
       }
     },
+    "node_modules/totalist": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/totalist/-/totalist-2.0.0.tgz",
+      "integrity": "sha512-+Y17F0YzxfACxTyjfhnJQEe7afPA0GSpYlFkl2VFMxYP7jshQf9gXV7cH47EfToBumFThfKBvfAcoUn6fdNeRQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/typescript": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
@@ -461,6 +523,34 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/uvu": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.1.tgz",
+      "integrity": "sha512-JGxttnOGDFs77FaZ0yMUHIzczzQ5R1IlDeNW6Wymw6gAscwMdAffVOP6TlxLIfReZyK8tahoGwWZaTCJzNFDkg==",
+      "dev": true,
+      "dependencies": {
+        "dequal": "^2.0.0",
+        "diff": "^5.0.0",
+        "kleur": "^4.0.3",
+        "sade": "^1.7.3",
+        "totalist": "^2.0.0"
+      },
+      "bin": {
+        "uvu": "bin.js"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/uvu/node_modules/diff": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+      "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.3.1"
+      }
+    },
     "node_modules/which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -531,12 +621,34 @@
         "untildify": "^2.0.0"
       }
     },
+    "dequal": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz",
+      "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==",
+      "dev": true
+    },
     "esbuild": {
       "version": "0.9.7",
       "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.9.7.tgz",
       "integrity": "sha512-VtUf6aQ89VTmMLKrWHYG50uByMF4JQlVysb8dmg6cOgW8JnFCipmz7p+HNBl+RR3LLCuBxFGVauAe2wfnF9bLg==",
       "dev": true
     },
+    "esbuild-register": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-2.3.0.tgz",
+      "integrity": "sha512-uT3WXEQGAqzrI0SLy1Jz39BzIBiLWd5La9zFZ+FUSCPGqJbE+ZJHUTE8yHP1GVfyHKrrAFCZqLieaHkSprIRDQ==",
+      "dev": true,
+      "requires": {
+        "esbuild": "^0.9.2",
+        "jsonc-parser": "^3.0.0"
+      }
+    },
+    "esm": {
+      "version": "3.2.25",
+      "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+      "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+      "dev": true
+    },
     "execa": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
@@ -560,13 +672,6 @@
       "integrity": "sha512-cteqwWMA43lEmgwOg5HSdvhVFD39vHjQDhZkRMlKmeoNPtSSgUw1nUypydiY2upMdGiBFBZvNBDbnoBh0yCzaQ==",
       "dev": true
     },
-    "fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-      "dev": true,
-      "optional": true
-    },
     "function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -630,6 +735,18 @@
       "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
       "dev": true
     },
+    "jsonc-parser": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz",
+      "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==",
+      "dev": true
+    },
+    "kleur": {
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz",
+      "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==",
+      "dev": true
+    },
     "merge-stream": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -642,6 +759,12 @@
       "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
       "dev": true
     },
+    "mri": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz",
+      "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==",
+      "dev": true
+    },
     "npm-run-path": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
@@ -725,6 +848,15 @@
         "fsevents": "~2.3.1"
       }
     },
+    "sade": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz",
+      "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==",
+      "dev": true,
+      "requires": {
+        "mri": "^1.1.0"
+      }
+    },
     "shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -769,6 +901,12 @@
       "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
       "dev": true
     },
+    "totalist": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/totalist/-/totalist-2.0.0.tgz",
+      "integrity": "sha512-+Y17F0YzxfACxTyjfhnJQEe7afPA0GSpYlFkl2VFMxYP7jshQf9gXV7cH47EfToBumFThfKBvfAcoUn6fdNeRQ==",
+      "dev": true
+    },
     "typescript": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
@@ -784,6 +922,27 @@
         "os-homedir": "^1.0.0"
       }
     },
+    "uvu": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.1.tgz",
+      "integrity": "sha512-JGxttnOGDFs77FaZ0yMUHIzczzQ5R1IlDeNW6Wymw6gAscwMdAffVOP6TlxLIfReZyK8tahoGwWZaTCJzNFDkg==",
+      "dev": true,
+      "requires": {
+        "dequal": "^2.0.0",
+        "diff": "^5.0.0",
+        "kleur": "^4.0.3",
+        "sade": "^1.7.3",
+        "totalist": "^2.0.0"
+      },
+      "dependencies": {
+        "diff": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+          "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+          "dev": true
+        }
+      }
+    },
     "which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",

+ 7 - 3
package.json

@@ -5,15 +5,19 @@
   "scripts": {
     "build": "snowpack build",
     "dev": "snowpack dev",
-    "prettier": "prettier --write src",
-    "test": "echo \"Error: no test specified\" && exit 1"
+    "prettier": "prettier --write src tests",
+    "typecheck": "tsc --noEmit",
+    "test": "uvu -r esm -r esbuild-register tests"
   },
   "author": "Thomas Dy <thatsmydoing@gmail.com",
   "license": "ISC",
   "devDependencies": {
     "@snowpack/plugin-typescript": "^1.2.1",
+    "esbuild-register": "^2.3.0",
+    "esm": "^3.2.25",
     "prettier": "2.2.1",
     "snowpack": "^3.2.2",
-    "typescript": "^4.0.0"
+    "typescript": "^4.0.0",
+    "uvu": "^0.5.1"
   }
 }

+ 75 - 0
tests/kana.ts

@@ -0,0 +1,75 @@
+import { test } from 'uvu';
+import * as assert from 'uvu/assert';
+
+import { normalizeInput, KanaInputState } from '../src/kana';
+import { TransitionResult } from '../src/state';
+
+function testInput(input: string, line: string) {
+  const inputState = new KanaInputState(line);
+  inputState.map((_, m) => {
+    m.addObserver((result, _boundary) => {
+      assert.is(
+        result,
+        TransitionResult.SUCCESS,
+        `Expected ${input} to match ${line}`
+      );
+    });
+  });
+  for (const c of input.split('')) {
+    inputState.handleInput(c);
+  }
+}
+
+test('normalizeInput', () => {
+  assert.is(normalizeInput('ABCdef'), 'abcdef');
+  assert.is(normalizeInput('フェスティバル'), 'ふぇすてぃばる');
+  assert.is(normalizeInput('  '), '  ');
+});
+
+test('multiple romanization single kana', () => {
+  testInput('si', 'し');
+  testInput('shi', 'し');
+  testInput('ji', 'じ');
+  testInput('zi', 'じ');
+  testInput('ti', 'ち');
+  testInput('chi', 'ち');
+  testInput('tu', 'つ');
+  testInput('tsu', 'つ');
+  testInput('fu', 'ふ');
+  testInput('hu', 'ふ');
+});
+
+test('multiple romanization double kana', () => {
+  testInput('sha', 'しゃ');
+  testInput('sya', 'しゃ');
+  // testInput('shilya', 'しゃ');
+  // testInput('silya', 'しゃ');
+  testInput('cha', 'ちゃ');
+  testInput('tya', 'ちゃ');
+  // testInput('chilya', 'ちゃ');
+  // testInput('tilya', 'ちゃ');
+  testInput('ja', 'じゃ');
+  testInput('jya', 'じゃ');
+  testInput('zya', 'じゃ');
+  // testInput('jilya', 'じゃ');
+  // testInput('zilya', 'じゃ');
+
+  testInput('fe', 'ふぇ');
+  // testInput('fule', 'ふぇ');
+});
+
+test('small tsu', () => {
+  testInput('katto', 'カット');
+  // testInput('kaltsuto', 'かっと');
+  // testInput('kaltuto', 'かっと');
+  testInput('ejji', 'エッジ');
+  testInput('ezzi', 'エッジ');
+  // testInput('extuji', 'エッジ');
+  // testInput('extsuzi', 'エッジ');
+  testInput('hassha', 'はっしゃ');
+  testInput('hassya', 'はっしゃ');
+  // testInput('haltusha', 'はっしゃ');
+  // testInput('haltusya', 'はっしゃ');
+});
+
+test.run();