mahjong_engine 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/.github/workflows/qlty-coverage.yml +36 -0
  2. package/dist/BlockDivider.d.ts +11 -0
  3. package/dist/BlockDivider.d.ts.map +1 -0
  4. package/dist/BlockDivider.js +114 -0
  5. package/dist/BlockDivider.js.map +1 -0
  6. package/dist/BlockHais.d.ts +26 -0
  7. package/dist/BlockHais.d.ts.map +1 -0
  8. package/dist/BlockHais.js +77 -0
  9. package/dist/BlockHais.js.map +1 -0
  10. package/dist/BlockHaisList.d.ts +19 -0
  11. package/dist/BlockHaisList.d.ts.map +1 -0
  12. package/dist/BlockHaisList.js +85 -0
  13. package/dist/BlockHaisList.js.map +1 -0
  14. package/dist/Hai.d.ts +16 -0
  15. package/dist/Hai.d.ts.map +1 -0
  16. package/dist/Hai.js +71 -0
  17. package/dist/Hai.js.map +1 -0
  18. package/dist/Hais.d.ts +15 -0
  19. package/dist/Hais.d.ts.map +1 -0
  20. package/dist/Hais.js +44 -0
  21. package/dist/Hais.js.map +1 -0
  22. package/dist/IMentsu.d.ts +20 -0
  23. package/dist/IMentsu.d.ts.map +1 -0
  24. package/dist/IMentsu.js +3 -0
  25. package/dist/IMentsu.js.map +1 -0
  26. package/dist/MachiCalculator.d.ts +7 -0
  27. package/dist/MachiCalculator.d.ts.map +1 -0
  28. package/dist/MachiCalculator.js +25 -0
  29. package/dist/MachiCalculator.js.map +1 -0
  30. package/dist/MahjongConsts.d.ts +39 -0
  31. package/dist/MahjongConsts.d.ts.map +1 -0
  32. package/dist/MahjongConsts.js +54 -0
  33. package/dist/MahjongConsts.js.map +1 -0
  34. package/dist/Meld.d.ts +25 -0
  35. package/dist/Meld.d.ts.map +1 -0
  36. package/dist/Meld.js +72 -0
  37. package/dist/Meld.js.map +1 -0
  38. package/dist/Melds.d.ts +9 -0
  39. package/dist/Melds.d.ts.map +1 -0
  40. package/dist/Melds.js +18 -0
  41. package/dist/Melds.js.map +1 -0
  42. package/dist/MentsuAnalyzer.d.ts +11 -0
  43. package/dist/MentsuAnalyzer.d.ts.map +1 -0
  44. package/dist/MentsuAnalyzer.js +23 -0
  45. package/dist/MentsuAnalyzer.js.map +1 -0
  46. package/dist/PlayerContext.d.ts +28 -0
  47. package/dist/PlayerContext.d.ts.map +1 -0
  48. package/dist/PlayerContext.js +28 -0
  49. package/dist/PlayerContext.js.map +1 -0
  50. package/dist/PlayerHand.d.ts +12 -0
  51. package/dist/PlayerHand.d.ts.map +1 -0
  52. package/dist/PlayerHand.js +28 -0
  53. package/dist/PlayerHand.js.map +1 -0
  54. package/dist/index.d.ts +12 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +26 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/tensuu/FuCalculator.d.ts +15 -0
  59. package/dist/tensuu/FuCalculator.d.ts.map +1 -0
  60. package/dist/tensuu/FuCalculator.js +104 -0
  61. package/dist/tensuu/FuCalculator.js.map +1 -0
  62. package/dist/tensuu/FuDetail.d.ts +8 -0
  63. package/dist/tensuu/FuDetail.d.ts.map +1 -0
  64. package/dist/tensuu/FuDetail.js +15 -0
  65. package/dist/tensuu/FuDetail.js.map +1 -0
  66. package/dist/tensuu/ScoreResolver.d.ts +12 -0
  67. package/dist/tensuu/ScoreResolver.d.ts.map +1 -0
  68. package/dist/tensuu/ScoreResolver.js +33 -0
  69. package/dist/tensuu/ScoreResolver.js.map +1 -0
  70. package/dist/tensuu/ScoreResult.d.ts +11 -0
  71. package/dist/tensuu/ScoreResult.d.ts.map +1 -0
  72. package/dist/tensuu/ScoreResult.js +19 -0
  73. package/dist/tensuu/ScoreResult.js.map +1 -0
  74. package/dist/tensuu/TensuuCalculator.d.ts +13 -0
  75. package/dist/tensuu/TensuuCalculator.d.ts.map +1 -0
  76. package/dist/tensuu/TensuuCalculator.js +39 -0
  77. package/dist/tensuu/TensuuCalculator.js.map +1 -0
  78. package/dist/tensuu/TensuuResult.d.ts +15 -0
  79. package/dist/tensuu/TensuuResult.d.ts.map +1 -0
  80. package/dist/tensuu/TensuuResult.js +19 -0
  81. package/dist/tensuu/TensuuResult.js.map +1 -0
  82. package/dist/tileDefs.d.ts +42 -0
  83. package/dist/tileDefs.d.ts.map +1 -0
  84. package/dist/tileDefs.js +23 -0
  85. package/dist/tileDefs.js.map +1 -0
  86. package/dist/yaku/NormalYakuChecker.d.ts +7 -0
  87. package/dist/yaku/NormalYakuChecker.d.ts.map +1 -0
  88. package/dist/yaku/NormalYakuChecker.js +37 -0
  89. package/dist/yaku/NormalYakuChecker.js.map +1 -0
  90. package/dist/yaku/YakuChecker.d.ts +7 -0
  91. package/dist/yaku/YakuChecker.d.ts.map +1 -0
  92. package/dist/yaku/YakuChecker.js +27 -0
  93. package/dist/yaku/YakuChecker.js.map +1 -0
  94. package/dist/yaku/YakuCheckerBase.d.ts +33 -0
  95. package/dist/yaku/YakuCheckerBase.d.ts.map +1 -0
  96. package/dist/yaku/YakuCheckerBase.js +154 -0
  97. package/dist/yaku/YakuCheckerBase.js.map +1 -0
  98. package/dist/yaku/YakuContext.d.ts +14 -0
  99. package/dist/yaku/YakuContext.d.ts.map +1 -0
  100. package/dist/yaku/YakuContext.js +21 -0
  101. package/dist/yaku/YakuContext.js.map +1 -0
  102. package/dist/yaku/YakumanChecker.d.ts +7 -0
  103. package/dist/yaku/YakumanChecker.d.ts.map +1 -0
  104. package/dist/yaku/YakumanChecker.js +36 -0
  105. package/dist/yaku/YakumanChecker.js.map +1 -0
  106. package/dist/yaku/index.d.ts +6 -0
  107. package/dist/yaku/index.d.ts.map +1 -0
  108. package/dist/yaku/index.js +79 -0
  109. package/dist/yaku/index.js.map +1 -0
  110. package/dist/yaku/normal/ChinitsuChecker.d.ts +9 -0
  111. package/dist/yaku/normal/ChinitsuChecker.d.ts.map +1 -0
  112. package/dist/yaku/normal/ChinitsuChecker.js +24 -0
  113. package/dist/yaku/normal/ChinitsuChecker.js.map +1 -0
  114. package/dist/yaku/normal/ChitoitsuChecker.d.ts +8 -0
  115. package/dist/yaku/normal/ChitoitsuChecker.d.ts.map +1 -0
  116. package/dist/yaku/normal/ChitoitsuChecker.js +20 -0
  117. package/dist/yaku/normal/ChitoitsuChecker.js.map +1 -0
  118. package/dist/yaku/normal/DoukouChecker.d.ts +8 -0
  119. package/dist/yaku/normal/DoukouChecker.d.ts.map +1 -0
  120. package/dist/yaku/normal/DoukouChecker.js +17 -0
  121. package/dist/yaku/normal/DoukouChecker.js.map +1 -0
  122. package/dist/yaku/normal/HonchanChecker.d.ts +8 -0
  123. package/dist/yaku/normal/HonchanChecker.d.ts.map +1 -0
  124. package/dist/yaku/normal/HonchanChecker.js +22 -0
  125. package/dist/yaku/normal/HonchanChecker.js.map +1 -0
  126. package/dist/yaku/normal/HonitsuChecker.d.ts +8 -0
  127. package/dist/yaku/normal/HonitsuChecker.d.ts.map +1 -0
  128. package/dist/yaku/normal/HonitsuChecker.js +20 -0
  129. package/dist/yaku/normal/HonitsuChecker.js.map +1 -0
  130. package/dist/yaku/normal/HonrotoChecker.d.ts +8 -0
  131. package/dist/yaku/normal/HonrotoChecker.d.ts.map +1 -0
  132. package/dist/yaku/normal/HonrotoChecker.js +21 -0
  133. package/dist/yaku/normal/HonrotoChecker.js.map +1 -0
  134. package/dist/yaku/normal/IipekoChecker.d.ts +8 -0
  135. package/dist/yaku/normal/IipekoChecker.d.ts.map +1 -0
  136. package/dist/yaku/normal/IipekoChecker.js +18 -0
  137. package/dist/yaku/normal/IipekoChecker.js.map +1 -0
  138. package/dist/yaku/normal/IttsuuChecker.d.ts +8 -0
  139. package/dist/yaku/normal/IttsuuChecker.d.ts.map +1 -0
  140. package/dist/yaku/normal/IttsuuChecker.js +25 -0
  141. package/dist/yaku/normal/IttsuuChecker.js.map +1 -0
  142. package/dist/yaku/normal/JunchanChecker.d.ts +8 -0
  143. package/dist/yaku/normal/JunchanChecker.d.ts.map +1 -0
  144. package/dist/yaku/normal/JunchanChecker.js +19 -0
  145. package/dist/yaku/normal/JunchanChecker.js.map +1 -0
  146. package/dist/yaku/normal/KazehaiChecker.d.ts +11 -0
  147. package/dist/yaku/normal/KazehaiChecker.d.ts.map +1 -0
  148. package/dist/yaku/normal/KazehaiChecker.js +24 -0
  149. package/dist/yaku/normal/KazehaiChecker.js.map +1 -0
  150. package/dist/yaku/normal/MenzenTsumoChecker.d.ts +8 -0
  151. package/dist/yaku/normal/MenzenTsumoChecker.d.ts.map +1 -0
  152. package/dist/yaku/normal/MenzenTsumoChecker.js +16 -0
  153. package/dist/yaku/normal/MenzenTsumoChecker.js.map +1 -0
  154. package/dist/yaku/normal/PinfuChecker.d.ts +8 -0
  155. package/dist/yaku/normal/PinfuChecker.d.ts.map +1 -0
  156. package/dist/yaku/normal/PinfuChecker.js +30 -0
  157. package/dist/yaku/normal/PinfuChecker.js.map +1 -0
  158. package/dist/yaku/normal/RenpuuhaiChecker.d.ts +8 -0
  159. package/dist/yaku/normal/RenpuuhaiChecker.d.ts.map +1 -0
  160. package/dist/yaku/normal/RenpuuhaiChecker.js +22 -0
  161. package/dist/yaku/normal/RenpuuhaiChecker.js.map +1 -0
  162. package/dist/yaku/normal/RyanpekoChecker.d.ts +8 -0
  163. package/dist/yaku/normal/RyanpekoChecker.d.ts.map +1 -0
  164. package/dist/yaku/normal/RyanpekoChecker.js +18 -0
  165. package/dist/yaku/normal/RyanpekoChecker.js.map +1 -0
  166. package/dist/yaku/normal/SanankoChecker.d.ts +8 -0
  167. package/dist/yaku/normal/SanankoChecker.d.ts.map +1 -0
  168. package/dist/yaku/normal/SanankoChecker.js +17 -0
  169. package/dist/yaku/normal/SanankoChecker.js.map +1 -0
  170. package/dist/yaku/normal/SankantsuChecker.d.ts +8 -0
  171. package/dist/yaku/normal/SankantsuChecker.d.ts.map +1 -0
  172. package/dist/yaku/normal/SankantsuChecker.js +17 -0
  173. package/dist/yaku/normal/SankantsuChecker.js.map +1 -0
  174. package/dist/yaku/normal/SanshokuChecker.d.ts +8 -0
  175. package/dist/yaku/normal/SanshokuChecker.d.ts.map +1 -0
  176. package/dist/yaku/normal/SanshokuChecker.js +17 -0
  177. package/dist/yaku/normal/SanshokuChecker.js.map +1 -0
  178. package/dist/yaku/normal/ShosangenChecker.d.ts +8 -0
  179. package/dist/yaku/normal/ShosangenChecker.d.ts.map +1 -0
  180. package/dist/yaku/normal/ShosangenChecker.js +20 -0
  181. package/dist/yaku/normal/ShosangenChecker.js.map +1 -0
  182. package/dist/yaku/normal/TanyaoChecker.d.ts +8 -0
  183. package/dist/yaku/normal/TanyaoChecker.d.ts.map +1 -0
  184. package/dist/yaku/normal/TanyaoChecker.js +18 -0
  185. package/dist/yaku/normal/TanyaoChecker.js.map +1 -0
  186. package/dist/yaku/normal/ToitoiChecker.d.ts +8 -0
  187. package/dist/yaku/normal/ToitoiChecker.d.ts.map +1 -0
  188. package/dist/yaku/normal/ToitoiChecker.js +17 -0
  189. package/dist/yaku/normal/ToitoiChecker.js.map +1 -0
  190. package/dist/yaku/normal/YakuhaiChecker.d.ts +9 -0
  191. package/dist/yaku/normal/YakuhaiChecker.d.ts.map +1 -0
  192. package/dist/yaku/normal/YakuhaiChecker.js +22 -0
  193. package/dist/yaku/normal/YakuhaiChecker.js.map +1 -0
  194. package/dist/yaku/yakuman/ChinrotoChecker.d.ts +6 -0
  195. package/dist/yaku/yakuman/ChinrotoChecker.d.ts.map +1 -0
  196. package/dist/yaku/yakuman/ChinrotoChecker.js +13 -0
  197. package/dist/yaku/yakuman/ChinrotoChecker.js.map +1 -0
  198. package/dist/yaku/yakuman/Churen9Checker.d.ts +10 -0
  199. package/dist/yaku/yakuman/Churen9Checker.d.ts.map +1 -0
  200. package/dist/yaku/yakuman/Churen9Checker.js +17 -0
  201. package/dist/yaku/yakuman/Churen9Checker.js.map +1 -0
  202. package/dist/yaku/yakuman/ChurenChecker.d.ts +7 -0
  203. package/dist/yaku/yakuman/ChurenChecker.d.ts.map +1 -0
  204. package/dist/yaku/yakuman/ChurenChecker.js +33 -0
  205. package/dist/yaku/yakuman/ChurenChecker.js.map +1 -0
  206. package/dist/yaku/yakuman/DaisangenChecker.d.ts +6 -0
  207. package/dist/yaku/yakuman/DaisangenChecker.d.ts.map +1 -0
  208. package/dist/yaku/yakuman/DaisangenChecker.js +15 -0
  209. package/dist/yaku/yakuman/DaisangenChecker.js.map +1 -0
  210. package/dist/yaku/yakuman/DaisushiChecker.d.ts +8 -0
  211. package/dist/yaku/yakuman/DaisushiChecker.d.ts.map +1 -0
  212. package/dist/yaku/yakuman/DaisushiChecker.js +20 -0
  213. package/dist/yaku/yakuman/DaisushiChecker.js.map +1 -0
  214. package/dist/yaku/yakuman/ExtendedYakumanChecker.d.ts +9 -0
  215. package/dist/yaku/yakuman/ExtendedYakumanChecker.d.ts.map +1 -0
  216. package/dist/yaku/yakuman/ExtendedYakumanChecker.js +18 -0
  217. package/dist/yaku/yakuman/ExtendedYakumanChecker.js.map +1 -0
  218. package/dist/yaku/yakuman/Kokushi13Checker.d.ts +10 -0
  219. package/dist/yaku/yakuman/Kokushi13Checker.d.ts.map +1 -0
  220. package/dist/yaku/yakuman/Kokushi13Checker.js +17 -0
  221. package/dist/yaku/yakuman/Kokushi13Checker.js.map +1 -0
  222. package/dist/yaku/yakuman/KokushiChecker.d.ts +7 -0
  223. package/dist/yaku/yakuman/KokushiChecker.d.ts.map +1 -0
  224. package/dist/yaku/yakuman/KokushiChecker.js +18 -0
  225. package/dist/yaku/yakuman/KokushiChecker.js.map +1 -0
  226. package/dist/yaku/yakuman/RyuisoChecker.d.ts +6 -0
  227. package/dist/yaku/yakuman/RyuisoChecker.d.ts.map +1 -0
  228. package/dist/yaku/yakuman/RyuisoChecker.js +17 -0
  229. package/dist/yaku/yakuman/RyuisoChecker.js.map +1 -0
  230. package/dist/yaku/yakuman/ShosushiChecker.d.ts +6 -0
  231. package/dist/yaku/yakuman/ShosushiChecker.d.ts.map +1 -0
  232. package/dist/yaku/yakuman/ShosushiChecker.js +15 -0
  233. package/dist/yaku/yakuman/ShosushiChecker.js.map +1 -0
  234. package/dist/yaku/yakuman/SuankoChecker.d.ts +7 -0
  235. package/dist/yaku/yakuman/SuankoChecker.d.ts.map +1 -0
  236. package/dist/yaku/yakuman/SuankoChecker.js +17 -0
  237. package/dist/yaku/yakuman/SuankoChecker.js.map +1 -0
  238. package/dist/yaku/yakuman/SuankoTankiChecker.d.ts +8 -0
  239. package/dist/yaku/yakuman/SuankoTankiChecker.d.ts.map +1 -0
  240. package/dist/yaku/yakuman/SuankoTankiChecker.js +28 -0
  241. package/dist/yaku/yakuman/SuankoTankiChecker.js.map +1 -0
  242. package/dist/yaku/yakuman/SukantsuChecker.d.ts +6 -0
  243. package/dist/yaku/yakuman/SukantsuChecker.d.ts.map +1 -0
  244. package/dist/yaku/yakuman/SukantsuChecker.js +12 -0
  245. package/dist/yaku/yakuman/SukantsuChecker.js.map +1 -0
  246. package/dist/yaku/yakuman/TsuisoChecker.d.ts +6 -0
  247. package/dist/yaku/yakuman/TsuisoChecker.d.ts.map +1 -0
  248. package/dist/yaku/yakuman/TsuisoChecker.js +13 -0
  249. package/dist/yaku/yakuman/TsuisoChecker.js.map +1 -0
  250. package/jest.config.js +8 -0
  251. package/modules/BlockDivider.ts +129 -0
  252. package/modules/BlockHais.ts +92 -0
  253. package/modules/BlockHaisList.ts +96 -0
  254. package/modules/Hai.ts +67 -0
  255. package/modules/Hais.ts +49 -0
  256. package/modules/IMentsu.ts +20 -0
  257. package/modules/MachiCalculator.ts +25 -0
  258. package/modules/MahjongConsts.ts +46 -0
  259. package/modules/Meld.ts +85 -0
  260. package/modules/Melds.ts +19 -0
  261. package/modules/MentsuAnalyzer.ts +37 -0
  262. package/modules/PlayerContext.ts +39 -0
  263. package/modules/PlayerHand.ts +32 -0
  264. package/modules/index.ts +11 -0
  265. package/modules/tensuu/FuCalculator.ts +118 -0
  266. package/modules/tensuu/FuDetail.ts +13 -0
  267. package/modules/tensuu/ScoreResolver.ts +35 -0
  268. package/modules/tensuu/ScoreResult.ts +24 -0
  269. package/modules/tensuu/TensuuCalculator.ts +40 -0
  270. package/modules/tensuu/TensuuResult.ts +21 -0
  271. package/modules/tileDefs.ts +24 -0
  272. package/modules/yaku/NormalYakuChecker.ts +31 -0
  273. package/modules/yaku/YakuChecker.ts +29 -0
  274. package/modules/yaku/YakuCheckerBase.ts +180 -0
  275. package/modules/yaku/YakuContext.ts +25 -0
  276. package/modules/yaku/YakumanChecker.ts +34 -0
  277. package/modules/yaku/index.ts +83 -0
  278. package/modules/yaku/normal/ChinitsuChecker.ts +25 -0
  279. package/modules/yaku/normal/ChitoitsuChecker.ts +20 -0
  280. package/modules/yaku/normal/DoukouChecker.ts +16 -0
  281. package/modules/yaku/normal/HonchanChecker.ts +24 -0
  282. package/modules/yaku/normal/HonitsuChecker.ts +20 -0
  283. package/modules/yaku/normal/HonrotoChecker.ts +23 -0
  284. package/modules/yaku/normal/IipekoChecker.ts +17 -0
  285. package/modules/yaku/normal/IttsuuChecker.ts +32 -0
  286. package/modules/yaku/normal/JunchanChecker.ts +20 -0
  287. package/modules/yaku/normal/KazehaiChecker.ts +25 -0
  288. package/modules/yaku/normal/MenzenTsumoChecker.ts +15 -0
  289. package/modules/yaku/normal/PinfuChecker.ts +26 -0
  290. package/modules/yaku/normal/RenpuuhaiChecker.ts +21 -0
  291. package/modules/yaku/normal/RyanpekoChecker.ts +17 -0
  292. package/modules/yaku/normal/SanankoChecker.ts +17 -0
  293. package/modules/yaku/normal/SankantsuChecker.ts +16 -0
  294. package/modules/yaku/normal/SanshokuChecker.ts +16 -0
  295. package/modules/yaku/normal/ShosangenChecker.ts +21 -0
  296. package/modules/yaku/normal/TanyaoChecker.ts +18 -0
  297. package/modules/yaku/normal/ToitoiChecker.ts +17 -0
  298. package/modules/yaku/normal/YakuhaiChecker.ts +22 -0
  299. package/modules/yaku/yakuman/ChinrotoChecker.ts +11 -0
  300. package/modules/yaku/yakuman/Churen9Checker.ts +16 -0
  301. package/modules/yaku/yakuman/ChurenChecker.ts +31 -0
  302. package/modules/yaku/yakuman/DaisangenChecker.ts +14 -0
  303. package/modules/yaku/yakuman/DaisushiChecker.ts +21 -0
  304. package/modules/yaku/yakuman/ExtendedYakumanChecker.ts +18 -0
  305. package/modules/yaku/yakuman/Kokushi13Checker.ts +16 -0
  306. package/modules/yaku/yakuman/KokushiChecker.ts +15 -0
  307. package/modules/yaku/yakuman/RyuisoChecker.ts +16 -0
  308. package/modules/yaku/yakuman/ShosushiChecker.ts +13 -0
  309. package/modules/yaku/yakuman/SuankoChecker.ts +14 -0
  310. package/modules/yaku/yakuman/SuankoTankiChecker.ts +28 -0
  311. package/modules/yaku/yakuman/SukantsuChecker.ts +9 -0
  312. package/modules/yaku/yakuman/TsuisoChecker.ts +10 -0
  313. package/package.json +28 -0
  314. package/tests/fu.test.ts +44 -0
  315. package/tests/machi/chinitsu.ts +137 -0
  316. package/tests/machi/chitoitsu.ts +12 -0
  317. package/tests/machi/kokushi.ts +22 -0
  318. package/tests/machi/maisuu.ts +77 -0
  319. package/tests/machi.test.ts +100 -0
  320. package/tests/machiType.test.ts +93 -0
  321. package/tests/score.test.ts +27 -0
  322. package/tests/tehaiCaseRunner.ts +57 -0
  323. package/tests/tensuu/fu.ts +272 -0
  324. package/tests/tensuu/score.ts +46 -0
  325. package/tests/tensuu/tensuuNum.ts +292 -0
  326. package/tests/tensuuFromNum.test.ts +15 -0
  327. package/tests/testConsts.ts +42 -0
  328. package/tests/toBlock.test.ts +155 -0
  329. package/tests/yaku/normal.ts +1046 -0
  330. package/tests/yaku/yakuman.ts +367 -0
  331. package/tests/yaku.test.ts +28 -0
  332. package/tsconfig.json +23 -0
@@ -0,0 +1,1046 @@
1
+ import { MeldSpec, TehaiCase } from '../testConsts';
2
+ import { MeldType, WinEvent } from "../../modules/MahjongConsts";
3
+ import { TILE } from "../../modules/tileDefs"
4
+
5
+ export const casesNormal: TehaiCase<Map<number, Map<string, number>>>[] = [
6
+ {
7
+ name: "chinitsu_1",
8
+ desc: "清一色",
9
+ agariHai: 1,
10
+ isTsumo: false,
11
+ melds: [] as MeldSpec[],
12
+ hais: [1,1,1,2,2,2,3,4,5,6,7,8,9,9],
13
+ expected: new Map([[0, new Map([["清一色", 6]])]])
14
+ },
15
+ {
16
+ name: "chinitsu_2",
17
+ desc: "清一色",
18
+ agariHai: 2,
19
+ isTsumo: true,
20
+ melds: [
21
+ {hai: 1, type: MeldType.CHI},
22
+ {hai: 8, type: MeldType.PON},
23
+ ] as MeldSpec[],
24
+ hais: [2,3,4,5,5,5,6,6],
25
+ expected: new Map([[0, new Map([["清一色", 5]])]])
26
+ },
27
+ {
28
+ name: "chinitsu_3",
29
+ desc: "清一色",
30
+ agariHai: 1,
31
+ isTsumo: false,
32
+ melds: [
33
+ {hai: 8, type: MeldType.ANKAN},
34
+ ] as MeldSpec[],
35
+ hais: [1,2,2,3,3,4,5,5,5,6,6],
36
+ expected: new Map([[0, new Map([["清一色", 6]])]])
37
+ },
38
+ {
39
+ name: "honitsu_1",
40
+ desc: "混一色",
41
+ agariHai: 1,
42
+ isTsumo: false,
43
+ melds: [] as MeldSpec[],
44
+ hais: [1,1,1,2,2,2,3,4,5,6,7,8,28,28],
45
+ expected: new Map([[0, new Map([["混一色", 3]])]])
46
+ },
47
+ {
48
+ name: "honitsu_2",
49
+ desc: "混一色",
50
+ agariHai: 28,
51
+ isTsumo: true,
52
+ melds: [
53
+ {hai: 10, type: MeldType.CHI},
54
+ {hai: 15, type: MeldType.PON},
55
+ ] as MeldSpec[],
56
+ hais: [29,29,29,30,30,30,31,31],
57
+ expected: new Map([[0, new Map([["混一色", 2]])]])
58
+ },
59
+ {
60
+ name: "honitsu_3",
61
+ desc: "混一色",
62
+ agariHai: 28,
63
+ isTsumo: true,
64
+ melds: [
65
+ {hai: 19, type: MeldType.CHI},
66
+ {hai: 22, type: MeldType.CHI},
67
+ {hai: 25, type: MeldType.PON},
68
+ ] as MeldSpec[],
69
+ hais: [19,19,29,29,29],
70
+ expected: new Map([[0, new Map([["混一色", 2]])]])
71
+ },
72
+ {
73
+ name: "junchan_1",
74
+ desc: "純全帯么九",
75
+ agariHai: 1,
76
+ isTsumo: false,
77
+ melds: [] as MeldSpec[],
78
+ hais: [1,1,1,9,9,9,10,11,12,16,17,18,27,27],
79
+ expected: new Map([[0, new Map([["純全帯么九", 3]])]])
80
+ },
81
+ {
82
+ name: "junchan_2",
83
+ desc: "純全帯么九",
84
+ agariHai: 9,
85
+ isTsumo: true,
86
+ melds: [
87
+ {hai: 1, type: MeldType.CHI},
88
+ {hai: 10, type: MeldType.PON},
89
+ ] as MeldSpec[],
90
+ hais: [9,9,9,18,18,18,27,27],
91
+ expected: new Map([[0, new Map([["純全帯么九", 2]])]])
92
+ },
93
+ {
94
+ name: "honchan_1",
95
+ desc: "混全帯么九",
96
+ agariHai: 1,
97
+ isTsumo: false,
98
+ melds: [] as MeldSpec[],
99
+ hais: [1,1,1,9,9,9,10,11,12,29,29,29,30,30],
100
+ expected: new Map([[0, new Map([["混全帯么九", 2]])]])
101
+ },
102
+ {
103
+ name: "honchan_2",
104
+ desc: "混全帯么九",
105
+ agariHai: 28,
106
+ isTsumo: true,
107
+ melds: [
108
+ {hai: 1, type: MeldType.CHI},
109
+ {hai: 9, type: MeldType.PON},
110
+ ] as MeldSpec[],
111
+ hais: [25,26,27,29,29,29,30,30],
112
+ expected: new Map([[0, new Map([["混全帯么九", 1]])]])
113
+ },
114
+ {
115
+ name: "honroto_1",
116
+ desc: "混老頭",
117
+ agariHai: 1,
118
+ isTsumo: false,
119
+ melds: [] as MeldSpec[],
120
+ hais: [1,1,1,10,10,10,19,19,19,29,29,29,30,30],
121
+ expected: new Map([[0, new Map([["混老頭", 2],["三暗刻", 2], ["対々和", 2],["三色同刻", 2]])]])
122
+ },
123
+ {
124
+ name: "honroto_2",
125
+ desc: "混老頭",
126
+ agariHai: 31,
127
+ isTsumo: true,
128
+ melds: [
129
+ {hai: 1, type: MeldType.PON},
130
+ {hai: 9, type: MeldType.PON},
131
+ {hai: 30, type: MeldType.PON},
132
+ ] as MeldSpec[],
133
+ hais: [10,10,31,31,31],
134
+ expected: new Map([[0, new Map([["混老頭", 2],["対々和", 2]])]])
135
+ },
136
+ {
137
+ name: "honroto_3",
138
+ desc: "混老頭",
139
+ agariHai: 1,
140
+ isTsumo: false,
141
+ melds: [
142
+ {hai: 1, type: MeldType.PON},
143
+ {hai: 10, type: MeldType.PON},
144
+ {hai: 30, type: MeldType.MINKAN},
145
+ {hai: 31, type: MeldType.ANKAN},
146
+ ] as MeldSpec[],
147
+ hais: [29,29],
148
+ expected: new Map([[0, new Map([["混老頭", 2],["対々和", 2]])]])
149
+ },
150
+ {
151
+ name: "ryanpeko_1",
152
+ desc: "二盃口",
153
+ agariHai: 2,
154
+ isTsumo: false,
155
+ melds: [] as MeldSpec[],
156
+ hais: [1,1,2,2,3,3,12,12,13,13,14,14,17,17],
157
+ expected: new Map([[0, new Map([["二盃口", 3]])],[1, new Map([["七対子", 2]])]])
158
+ },
159
+ {
160
+ name: "ryanpeko_2",
161
+ desc: "二盃口",
162
+ agariHai: 11,
163
+ isTsumo: false,
164
+ melds: [] as MeldSpec[],
165
+ hais: [1,1,1,1,2,2,2,2,3,3,3,3,11,11],
166
+ expected: new Map([[0, new Map([["三暗刻", 2]])],[1, new Map([["二盃口", 3]])]])
167
+ },
168
+ {
169
+ name: "ryanpeko_3",
170
+ desc: "二盃口",
171
+ agariHai: 2,
172
+ isTsumo: false,
173
+ melds: [] as MeldSpec[],
174
+ hais: [1,1,2,2,3,3,4,4,5,5,6,6,7,7],
175
+ expected: new Map([[0, new Map([["清一色", 6],["二盃口", 3],["平和", 1]])],
176
+ [1, new Map([["清一色", 6],["二盃口", 3]])],
177
+ [2, new Map([["清一色", 6],["二盃口", 3]])],
178
+ [3, new Map([["清一色", 6],["七対子", 2]])]
179
+ ])
180
+ },
181
+ {
182
+ name: "ryanpeko_4",
183
+ desc: "二盃口",
184
+ agariHai: 3,
185
+ isTsumo: true,
186
+ melds: [] as MeldSpec[],
187
+ hais: [1,1,1,1,2,2,2,2,3,3,3,3,4,4],
188
+ expected: new Map([[0, new Map([["清一色", 6],["二盃口", 3],["門前清自摸和", 1]])],
189
+ [1, new Map([["清一色", 6],["三暗刻", 2],["門前清自摸和", 1]])],
190
+ [2, new Map([["清一色", 6],["二盃口", 3],["門前清自摸和", 1]])],
191
+ ])
192
+ },
193
+ {
194
+ name: "chitoitsu_1",
195
+ desc: "七対子",
196
+ agariHai: 1,
197
+ isTsumo: false,
198
+ melds: [] as MeldSpec[],
199
+ hais: [1,1,5,5,11,11,17,17,21,21,28,28,31,31],
200
+ expected: new Map([[0, new Map([["七対子", 2]])]])
201
+ },
202
+ {
203
+ name: "chitoitsu_2",
204
+ desc: "七対子",
205
+ agariHai: 1,
206
+ isTsumo: false,
207
+ melds: [] as MeldSpec[],
208
+ hais: [1,1,2,2,3,3,4,4,5,5,28,28,31,31],
209
+ expected: new Map([[0, new Map([["混一色", 3],["七対子", 2]])]])
210
+ },
211
+ {
212
+ name: "chitoitsu_3",
213
+ desc: "七対子",
214
+ agariHai: 1,
215
+ isTsumo: false,
216
+ melds: [] as MeldSpec[],
217
+ hais: [1,1,2,2,4,4,5,5,6,6,8,8,9,9],
218
+ expected: new Map([[0, new Map([["清一色", 6],["七対子", 2]])]])
219
+ },
220
+ {
221
+ name: "chitoitsu_4",
222
+ desc: "七対子",
223
+ agariHai: 1,
224
+ isTsumo: false,
225
+ melds: [] as MeldSpec[],
226
+ hais: [1,1,9,9,18,18,27,27,28,28,29,29,32,32],
227
+ expected: new Map([[0, new Map([["混老頭", 2],["七対子", 2]])]])
228
+ },
229
+ {
230
+ name: "sananko_1",
231
+ desc: "三暗刻",
232
+ agariHai: 1,
233
+ isTsumo: true,
234
+ melds: [] as MeldSpec[],
235
+ hais: [1,1,1,5,5,5,12,12,12,16,17,18,28,28],
236
+ expected: new Map([[0, new Map([["三暗刻", 2],["門前清自摸和", 1]])]])
237
+ },
238
+ {
239
+ name: "sananko_2",
240
+ desc: "三暗刻",
241
+ agariHai: 1,
242
+ isTsumo: false,
243
+ melds: [] as MeldSpec[],
244
+ hais: [1,1,1,5,5,5,12,12,12,16,16,16,28,28],
245
+ expected: new Map([[0, new Map([["三暗刻", 2],["対々和", 2]])]])
246
+ },
247
+ {
248
+ name: "sananko_3",
249
+ desc: "三暗刻",
250
+ agariHai: 5,
251
+ isTsumo: true,
252
+ melds: [
253
+ {hai: 1, type: MeldType.PON}
254
+ ] as MeldSpec[],
255
+ hais: [5,5,5,12,12,12,16,16,16,28,28],
256
+ expected: new Map([[0, new Map([["三暗刻", 2],["対々和", 2]])]])
257
+ },
258
+ {
259
+ name: "sananko_4",
260
+ desc: "三暗刻",
261
+ agariHai: 1,
262
+ isTsumo: true,
263
+ melds: [
264
+ {hai: 1, type: MeldType.ANKAN},
265
+ {hai: 5, type: MeldType.ANKAN},
266
+ ] as MeldSpec[],
267
+ hais: [12,13,14,16,16,16,28,28],
268
+ expected: new Map([[0, new Map([["三暗刻", 2],["門前清自摸和", 1]])]])
269
+ },
270
+ {
271
+ name: "toitoi_1",
272
+ desc: "対々和",
273
+ agariHai: 1,
274
+ isTsumo: false,
275
+ melds: [
276
+ {hai: 4, type: MeldType.PON},
277
+ ] as MeldSpec[],
278
+ hais: [1,1,1,5,5,5,12,12,12,28,28],
279
+ expected: new Map([[0, new Map([["対々和", 2]])]])
280
+ },
281
+ {
282
+ name: "toitoi_2",
283
+ desc: "対々和",
284
+ agariHai: 1,
285
+ isTsumo: false,
286
+ melds: [
287
+ {hai: 4, type: MeldType.PON},
288
+ {hai: 5, type: MeldType.PON},
289
+ {hai: 12, type: MeldType.PON},
290
+ {hai: 29, type: MeldType.PON},
291
+ ] as MeldSpec[],
292
+ hais: [1,1],
293
+ expected: new Map([[0, new Map([["対々和", 2]])]])
294
+ },
295
+ {
296
+ name: "iipeko_1",
297
+ desc: "一盃口",
298
+ agariHai: 3,
299
+ isTsumo: false,
300
+ melds: [] as MeldSpec[],
301
+ hais: [1,1,2,2,3,3,12,13,13,14,14,15,17,17],
302
+ expected: new Map([[0, new Map([["一盃口", 1]])]])
303
+ },
304
+ {
305
+ name: "iipeko_2",
306
+ desc: "一盃口",
307
+ agariHai: 2,
308
+ isTsumo: false,
309
+ melds: [] as MeldSpec[],
310
+ hais: [2,2,3,3,4,4,5,5,5,6,6,6,9,9],
311
+ expected: new Map([[0, new Map([["清一色", 6],["一盃口", 1]])]])
312
+ },
313
+ {
314
+ name: "iipeko_3",
315
+ desc: "一盃口",
316
+ agariHai: 1,
317
+ isTsumo: false,
318
+ melds: [
319
+ {hai: 4, type: MeldType.CHI},
320
+ {hai: 5, type: MeldType.CHI},
321
+ ] as MeldSpec[],
322
+ hais: [2,2,3,3,4,4,6,6],
323
+ expected: new Map([[0, new Map([["清一色", 5]])]])
324
+ },
325
+ {
326
+ name: "shosangen_1",
327
+ desc: "小三元",
328
+ agariHai: 1,
329
+ isTsumo: false,
330
+ melds: [
331
+ {hai: 32, type: MeldType.PON},
332
+ {hai: 33, type: MeldType.PON},
333
+ ] as MeldSpec[],
334
+ hais: [34,34,1,1,1,12,13,14],
335
+ expected: new Map([[0, new Map([["小三元", 2],["白", 1],["發", 1]])]])
336
+ },
337
+ {
338
+ name: "shosangen_2",
339
+ desc: "小三元",
340
+ agariHai: 34,
341
+ isTsumo: false,
342
+ melds: [] as MeldSpec[],
343
+ hais: [32,32,33,33,33,34,34,34,1,1,1,9,9,9],
344
+ expected: new Map([[0, new Map([["混一色", 3],["混老頭", 2],["三暗刻", 2],["対々和", 2],["小三元", 2],["發", 1],["中", 1]])]])
345
+ },
346
+ {
347
+ name: "sanshoku_1",
348
+ desc: "三色同順",
349
+ agariHai: 2,
350
+ isTsumo: false,
351
+ melds: [] as MeldSpec[],
352
+ hais: [1,2,3,10,11,12,19,19,20,20,21,21,23,23],
353
+ expected: new Map([[0, new Map([["三色同順", 2],["一盃口", 1]])]])
354
+ },
355
+ {
356
+ name: "sanshoku_2",
357
+ desc: "三色同順",
358
+ agariHai: 1,
359
+ isTsumo: false,
360
+ melds: [
361
+ {hai: 2, type: MeldType.CHI},
362
+ {hai: 11, type: MeldType.CHI},
363
+ {hai: 20, type: MeldType.CHI},
364
+ ] as MeldSpec[],
365
+ hais: [2,3,4,23,23],
366
+ expected: new Map([[0, new Map([["三色同順", 1]])]])
367
+ },
368
+ {
369
+ name: "sanshoku_3",
370
+ desc: "三色同順",
371
+ agariHai: 1,
372
+ isTsumo: false,
373
+ melds: [
374
+ {hai: 7, type: MeldType.CHI},
375
+ ] as MeldSpec[],
376
+ hais: [16,17,18,25,26,27,28,28,32,32,32],
377
+ expected: new Map([[0, new Map([["三色同順", 1],["混全帯么九", 1],["白", 1]])]])
378
+ },
379
+ {
380
+ name: "sanshoku_4",
381
+ desc: "三色同順",
382
+ agariHai: 1,
383
+ isTsumo: false,
384
+ melds: [] as MeldSpec[],
385
+ hais: [1,2,3,10,11,12,19,20,21,26,26,29,29,29],
386
+ expected: new Map([[0, new Map([["三色同順", 2]])]])
387
+ },
388
+ {
389
+ name: "doukou_1",
390
+ desc: "三色同刻",
391
+ agariHai: 2,
392
+ isTsumo: false,
393
+ melds: [] as MeldSpec[],
394
+ hais: [2,2,2,11,11,11,20,20,20,22,23,24,29,29],
395
+ expected: new Map([[0, new Map([["三色同刻", 2]])]])
396
+ },
397
+ {
398
+ name: "doukou_2",
399
+ desc: "三色同刻",
400
+ agariHai: 2,
401
+ isTsumo: false,
402
+ melds: [
403
+ {hai: 14, type: MeldType.PON},
404
+ ] as MeldSpec[],
405
+ hais: [5,5,5,23,23,23,22,23,24,29,29],
406
+ expected: new Map([[0, new Map([["三色同刻", 2]])]])
407
+ },
408
+ {
409
+ name: "doukou_3",
410
+ desc: "三色同刻",
411
+ agariHai: 2,
412
+ isTsumo: false,
413
+ melds: [
414
+ {hai: 9, type: MeldType.PON},
415
+ {hai: 18, type: MeldType.PON},
416
+ {hai: 27, type: MeldType.MINKAN},
417
+ ] as MeldSpec[],
418
+ hais: [23,24,25,29,29],
419
+ expected: new Map([[0, new Map([["三色同刻", 2]])]])
420
+ },
421
+ {
422
+ name: "ittsuu_1",
423
+ desc: "一気通貫",
424
+ agariHai: 14,
425
+ isTsumo: false,
426
+ melds: [] as MeldSpec[],
427
+ hais: [1,2,3,4,5,6,7,8,9,14,14,14,23,23],
428
+ expected: new Map([[0, new Map([["一気通貫", 2]])]])
429
+ },
430
+ {
431
+ name: "ittsuu_2",
432
+ desc: "一気通貫",
433
+ agariHai: 20,
434
+ isTsumo: false,
435
+ melds: [] as MeldSpec[],
436
+ hais: [10,11,12,13,14,15,16,17,18,20,20,20,23,23],
437
+ expected: new Map([[0, new Map([["一気通貫", 2]])]])
438
+ },
439
+ {
440
+ name: "ittsuu_3",
441
+ desc: "一気通貫",
442
+ agariHai: 1,
443
+ isTsumo: false,
444
+ melds: [] as MeldSpec[],
445
+ hais: [1,1,1,19,20,21,22,23,24,25,26,27,29,29],
446
+ expected: new Map([[0, new Map([["一気通貫", 2]])]])
447
+ },
448
+ {
449
+ name: "ittsuu_4",
450
+ desc: "一気通貫",
451
+ agariHai: 1,
452
+ isTsumo: false,
453
+ melds: [
454
+ {hai: 4, type: MeldType.CHI},
455
+ ] as MeldSpec[],
456
+ hais: [1,2,3,7,8,9,14,14,14,23,23],
457
+ expected: new Map([[0, new Map([["一気通貫", 1]])]])
458
+ },
459
+ {
460
+ name: "ittsuu_5",
461
+ desc: "一気通貫",
462
+ agariHai: 14,
463
+ isTsumo: false,
464
+ melds: [
465
+ {hai: 1, type: MeldType.CHI},
466
+ {hai: 7, type: MeldType.CHI},
467
+ ] as MeldSpec[],
468
+ hais: [4,5,6,14,14,14,23,23],
469
+ expected: new Map([[0, new Map([["一気通貫", 1]])]])
470
+ },
471
+ {
472
+ name: "ittsuu_6",
473
+ desc: "一気通貫",
474
+ agariHai: 14,
475
+ isTsumo: false,
476
+ melds: [
477
+ {hai: 1, type: MeldType.CHI},
478
+ {hai: 4, type: MeldType.CHI},
479
+ {hai: 7, type: MeldType.CHI},
480
+ ] as MeldSpec[],
481
+ hais: [14,14,14,23,23],
482
+ expected: new Map([[0, new Map([["一気通貫", 1]])]])
483
+ },
484
+ {
485
+ name: "ittsuu_7",
486
+ desc: "一気通貫",
487
+ agariHai: 28,
488
+ isTsumo: false,
489
+ melds: [] as MeldSpec[],
490
+ playerWind: TILE.WIND.SOUTH,
491
+ roundWind: TILE.WIND.SOUTH,
492
+ hais: [1,2,3,12,12,28,28,28,31,31,31,34,34,34],
493
+ expected: new Map([[0, new Map([["中", 1]])]])
494
+ },
495
+ {
496
+ name: "tanyao_1",
497
+ desc: "断么九",
498
+ agariHai: 14,
499
+ isTsumo: false,
500
+ kuitan: false,
501
+ melds: [] as MeldSpec[],
502
+ hais: [2,3,4,5,6,7,12,12,12,21,21,24,25,26],
503
+ expected: new Map([[0, new Map([["断么九", 1]])]])
504
+ },
505
+ {
506
+ name: "tanyao_2",
507
+ desc: "断么九",
508
+ agariHai: 14,
509
+ isTsumo: false,
510
+ kuitan: true,
511
+ melds: [
512
+ {hai: 5, type: MeldType.CHI},
513
+ {hai: 12, type: MeldType.PON},
514
+ ] as MeldSpec[],
515
+ hais: [2,3,4,21,21,24,25,26],
516
+ expected: new Map([[0, new Map([["断么九", 1]])]])
517
+ },
518
+ {
519
+ name: "tanyao_3",
520
+ desc: "断么九",
521
+ agariHai: 14,
522
+ isTsumo: false,
523
+ kuitan: false,
524
+ melds: [
525
+ {hai: 5, type: MeldType.CHI},
526
+ {hai: 12, type: MeldType.PON},
527
+ ] as MeldSpec[],
528
+ hais: [2,3,4,21,21,24,25,26],
529
+ expected: new Map()
530
+ },
531
+ {
532
+ name: "tanyao_aa",
533
+ desc: "断么九",
534
+ agariHai: 5,
535
+ isTsumo: true,
536
+ kuitan: false,
537
+ melds: [] as MeldSpec[],
538
+ hais: [2,3,4,2,3,4,2,3,4,11,11,11,5,5],
539
+ expected: new Map([[0, new Map([["断么九", 1],["一盃口", 1],["門前清自摸和", 1]])],
540
+ [1, new Map([["四暗刻単騎", 26]])],
541
+ [2, new Map([["断么九", 1],["一盃口", 1],["門前清自摸和", 1]])]
542
+ ])
543
+ },
544
+ {
545
+ name: "sankantsu_1",
546
+ desc: "三槓子",
547
+ agariHai: 14,
548
+ isTsumo: false,
549
+ melds: [
550
+ {hai: 1, type: MeldType.MINKAN},
551
+ {hai: 2, type: MeldType.ANKAN},
552
+ {hai: 3, type: MeldType.ANKAN},
553
+ ] as MeldSpec[],
554
+ hais: [14,15,16,23,23],
555
+ expected: new Map([[0, new Map([["三槓子", 2]])]])
556
+ },
557
+ {
558
+ name: "sankantsu_2",
559
+ desc: "三槓子",
560
+ agariHai: 14,
561
+ isTsumo: false,
562
+ melds: [
563
+ {hai: 1, type: MeldType.ANKAN},
564
+ {hai: 2, type: MeldType.ANKAN},
565
+ {hai: 3, type: MeldType.ANKAN},
566
+ ] as MeldSpec[],
567
+ hais: [14,14,14,23,23],
568
+ expected: new Map([[0, new Map([["三槓子", 2],["三暗刻", 2],["対々和", 2]])]])
569
+ },
570
+ {
571
+ name: "sankantsu_3",
572
+ desc: "三槓子",
573
+ agariHai: 5,
574
+ isTsumo: false,
575
+ melds: [
576
+ {hai: 1, type: MeldType.ANKAN},
577
+ {hai: 2, type: MeldType.ANKAN},
578
+ {hai: 4, type: MeldType.PON},
579
+ ] as MeldSpec[],
580
+ hais: [5,5,5,23,23],
581
+ expected: new Map([[0, new Map([["対々和", 2]])]])
582
+ },
583
+ {
584
+ name: "menzentsumo_1",
585
+ desc: "門前清自摸和",
586
+ agariHai: 1,
587
+ isTsumo: true,
588
+ melds: [] as MeldSpec[],
589
+ hais: [1,2,3,3,4,5,11,12,13,15,15,15,22,22],
590
+ expected: new Map([[0, new Map([["門前清自摸和", 1]])]])
591
+ },
592
+ {
593
+ name: "menzentsumo_2",
594
+ desc: "門前清自摸和",
595
+ agariHai: 1,
596
+ isTsumo: true,
597
+ melds: [
598
+ {hai: 1, type: MeldType.ANKAN},
599
+ ] as MeldSpec[],
600
+ hais: [1,2,3,3,4,5,11,12,13,22,22],
601
+ expected: new Map([[0, new Map([["門前清自摸和", 1]])]])
602
+ },
603
+ {
604
+ name: "menzentsumo_3",
605
+ desc: "門前清自摸和",
606
+ agariHai: 1,
607
+ isTsumo: true,
608
+ melds: [
609
+ {hai: 1, type: MeldType.CHI},
610
+ ] as MeldSpec[],
611
+ hais: [1,2,3,3,4,5,11,12,13,22,22],
612
+ expected: new Map()
613
+ },
614
+ {
615
+ name: "pinfu_success",
616
+ desc: "平和",
617
+ agariHai: 1,
618
+ isTsumo: false,
619
+ melds: [] as MeldSpec[],
620
+ hais: [1,2,3,3,4,5,11,12,13,15,16,17,22,22],
621
+ expected: new Map([[0, new Map([["平和", 1]])]])
622
+ },
623
+ {
624
+ name: "pinfu_tsumo",
625
+ desc: "平和",
626
+ agariHai: 1,
627
+ isTsumo: true,
628
+ melds: [] as MeldSpec[],
629
+ hais: [1,2,3,3,4,5,11,12,13,15,16,17,22,22],
630
+ expected: new Map([[0, new Map([["平和", 1],["門前清自摸和", 1]])]])
631
+ },
632
+ {
633
+ name: "pinfu_kanchan",
634
+ desc: "平和",
635
+ agariHai: 2,
636
+ isTsumo: false,
637
+ melds: [] as MeldSpec[],
638
+ hais: [1,2,3,3,4,5,11,12,13,15,16,17,22,22],
639
+ expected: new Map()
640
+ },
641
+ {
642
+ name: "pinfu_penchan",
643
+ desc: "平和",
644
+ agariHai: 3,
645
+ isTsumo: false,
646
+ melds: [] as MeldSpec[],
647
+ hais: [1,2,3,4,5,6,11,12,13,15,16,17,22,22],
648
+ expected: new Map()
649
+ },
650
+ {
651
+ name: "pinfu_tanki",
652
+ desc: "平和",
653
+ agariHai: 22,
654
+ isTsumo: false,
655
+ melds: [] as MeldSpec[],
656
+ hais: [1,2,3,3,4,5,11,12,13,15,16,17,22,22],
657
+ expected: new Map()
658
+ },
659
+ {
660
+ name: "pinfu_shanpon",
661
+ desc: "平和",
662
+ agariHai: 15,
663
+ isTsumo: false,
664
+ melds: [] as MeldSpec[],
665
+ hais: [1,2,3,3,4,5,11,12,13,15,15,15,22,22],
666
+ expected: new Map()
667
+ },
668
+ {
669
+ name: "pinfu_naki",
670
+ desc: "平和",
671
+ agariHai: 3,
672
+ isTsumo: false,
673
+ melds: [
674
+ {hai: 1, type: MeldType.CHI},
675
+ ] as MeldSpec[],
676
+ hais: [3,4,5,11,12,13,15,16,17,22,22],
677
+ expected: new Map()
678
+ },
679
+ {
680
+ name: "pinfu_haku",
681
+ desc: "平和",
682
+ agariHai: 1,
683
+ isTsumo: false,
684
+ melds: [] as MeldSpec[],
685
+ hais: [1,2,3,3,4,5,11,12,13,15,16,17,32,32],
686
+ expected: new Map()
687
+ },
688
+ {
689
+ name: "pinfu_hatsu",
690
+ desc: "平和",
691
+ agariHai: 1,
692
+ isTsumo: false,
693
+ melds: [] as MeldSpec[],
694
+ hais: [1,2,3,3,4,5,11,12,13,15,16,17,33,33],
695
+ expected: new Map()
696
+ },
697
+ {
698
+ name: "pinfu_chun",
699
+ desc: "平和",
700
+ agariHai: 1,
701
+ isTsumo: false,
702
+ melds: [] as MeldSpec[],
703
+ hais: [1,2,3,3,4,5,11,12,13,15,16,17,34,34],
704
+ expected: new Map()
705
+ },
706
+ {
707
+ name: "pinfu_dabuton",
708
+ desc: "平和",
709
+ agariHai: 1,
710
+ isTsumo: false,
711
+ melds: [] as MeldSpec[],
712
+ playerWind: TILE.WIND.EAST,
713
+ roundWind: TILE.WIND.EAST,
714
+ hais: [1,2,3,3,4,5,11,12,13,15,16,17,28,28],
715
+ expected: new Map()
716
+ },
717
+ {
718
+ name: "pinfu_jikaze",
719
+ desc: "平和",
720
+ agariHai: 1,
721
+ isTsumo: false,
722
+ melds: [] as MeldSpec[],
723
+ playerWind: TILE.WIND.SOUTH,
724
+ roundWind: TILE.WIND.EAST,
725
+ hais: [1,2,3,3,4,5,11,12,13,15,16,17,29,29],
726
+ expected: new Map()
727
+ },
728
+ {
729
+ name: "pinfu_bakaze",
730
+ desc: "平和",
731
+ agariHai: 1,
732
+ isTsumo: false,
733
+ melds: [] as MeldSpec[],
734
+ playerWind: TILE.WIND.EAST,
735
+ roundWind: TILE.WIND.NORTH,
736
+ hais: [1,2,3,3,4,5,11,12,13,15,16,17,31,31],
737
+ expected: new Map()
738
+ },
739
+ {
740
+ name: "pinfu_kazenasi",
741
+ desc: "平和",
742
+ agariHai: 1,
743
+ isTsumo: false,
744
+ melds: [] as MeldSpec[],
745
+ playerWind: TILE.WIND.SOUTH,
746
+ roundWind: TILE.WIND.SOUTH,
747
+ hais: [1,2,3,3,4,5,11,12,13,15,16,17,28,28],
748
+ expected: new Map([[0, new Map([["平和", 1]])]])
749
+ },
750
+ {
751
+ name: "renpuuhai_1",
752
+ desc: "連風牌",
753
+ agariHai: 28,
754
+ isTsumo: false,
755
+ melds: [] as MeldSpec[],
756
+ playerWind: TILE.WIND.EAST,
757
+ roundWind: TILE.WIND.EAST,
758
+ hais: [1,2,3,5,6,7,12,13,14,28,28,28,29,29],
759
+ expected: new Map([[0, new Map([["連風牌:東", 2]])]])
760
+ },
761
+ {
762
+ name: "renpuuhai_2",
763
+ desc: "連風牌",
764
+ agariHai: 29,
765
+ isTsumo: false,
766
+ melds: [] as MeldSpec[],
767
+ playerWind: TILE.WIND.SOUTH,
768
+ roundWind: TILE.WIND.SOUTH,
769
+ hais: [1,2,3,5,6,7,12,13,14,28,28,29,29,29],
770
+ expected: new Map([[0, new Map([["連風牌:南", 2]])]])
771
+ },
772
+ {
773
+ name: "renpuuhai_3",
774
+ desc: "連風牌",
775
+ agariHai: 28,
776
+ isTsumo: false,
777
+ melds: [] as MeldSpec[],
778
+ playerWind: TILE.WIND.WEST,
779
+ roundWind: TILE.WIND.WEST,
780
+ hais: [1,2,3,5,6,7,12,13,14,28,28,30,30,30],
781
+ expected: new Map([[0, new Map([["連風牌:西", 2]])]])
782
+ },
783
+ {
784
+ name: "renpuuhai_4",
785
+ desc: "連風牌",
786
+ agariHai: 31,
787
+ isTsumo: false,
788
+ melds: [] as MeldSpec[],
789
+ playerWind: TILE.WIND.NORTH,
790
+ roundWind: TILE.WIND.NORTH,
791
+ hais: [1,2,3,5,6,7,12,13,14,28,28,31,31,31],
792
+ expected: new Map([[0, new Map([["連風牌:北", 2]])]])
793
+ },
794
+ {
795
+ name: "renpuuhai_5",
796
+ desc: "連風牌",
797
+ agariHai: 1,
798
+ isTsumo: false,
799
+ melds: [
800
+ {hai: 28, type: MeldType.PON},
801
+ ] as MeldSpec[],
802
+ playerWind: TILE.WIND.EAST,
803
+ roundWind: TILE.WIND.EAST,
804
+ hais: [1,2,3,5,6,7,12,13,14,17,17],
805
+ expected: new Map([[0, new Map([["連風牌:東", 2]])]])
806
+ },
807
+ {
808
+ name: "jifuuhai_1",
809
+ desc: "自風牌",
810
+ agariHai: 28,
811
+ isTsumo: false,
812
+ melds: [] as MeldSpec[],
813
+ playerWind: TILE.WIND.EAST,
814
+ roundWind: TILE.WIND.SOUTH,
815
+ hais: [1,2,3,5,6,7,12,13,14,28,28,28,29,29],
816
+ expected: new Map([[0, new Map([["自風牌:東", 1]])]])
817
+ },
818
+ {
819
+ name: "jifuuhai_2",
820
+ desc: "自風牌",
821
+ agariHai: 29,
822
+ isTsumo: false,
823
+ melds: [] as MeldSpec[],
824
+ playerWind: TILE.WIND.SOUTH,
825
+ roundWind: TILE.WIND.EAST,
826
+ hais: [1,2,3,5,6,7,12,13,14,28,28,29,29,29],
827
+ expected: new Map([[0, new Map([["自風牌:南", 1]])]])
828
+ },
829
+ {
830
+ name: "jifuuhai_3",
831
+ desc: "自風牌",
832
+ agariHai: 30,
833
+ isTsumo: false,
834
+ melds: [] as MeldSpec[],
835
+ playerWind: TILE.WIND.WEST,
836
+ roundWind: TILE.WIND.EAST,
837
+ hais: [1,2,3,5,6,7,12,13,14,28,28,30,30,30],
838
+ expected: new Map([[0, new Map([["自風牌:西", 1]])]])
839
+ },
840
+ {
841
+ name: "jifuuhai_4",
842
+ desc: "自風牌",
843
+ agariHai: 31,
844
+ isTsumo: false,
845
+ melds: [] as MeldSpec[],
846
+ playerWind: TILE.WIND.NORTH,
847
+ roundWind: TILE.WIND.EAST,
848
+ hais: [1,2,3,5,6,7,12,13,14,28,28,31,31,31],
849
+ expected: new Map([[0, new Map([["自風牌:北", 1]])]])
850
+ },
851
+ {
852
+ name: "jifuuhai_5",
853
+ desc: "自風牌",
854
+ agariHai: 1,
855
+ isTsumo: false,
856
+ melds: [
857
+ {hai: 28, type: MeldType.PON},
858
+ ] as MeldSpec[],
859
+ playerWind: TILE.WIND.EAST,
860
+ roundWind: TILE.WIND.SOUTH,
861
+ hais: [1,2,3,5,6,7,12,13,14,17,17],
862
+ expected: new Map([[0, new Map([["自風牌:東", 1]])]])
863
+ },
864
+ {
865
+ name: "bafuuhai_1",
866
+ desc: "場風牌",
867
+ agariHai: 28,
868
+ isTsumo: false,
869
+ melds: [] as MeldSpec[],
870
+ playerWind: TILE.WIND.SOUTH,
871
+ roundWind: TILE.WIND.EAST,
872
+ hais: [1,2,3,5,6,7,12,13,14,28,28,28,29,29],
873
+ expected: new Map([[0, new Map([["場風牌:東", 1]])]])
874
+ },
875
+ {
876
+ name: "bafuuhai_2",
877
+ desc: "場風牌",
878
+ agariHai: 29,
879
+ isTsumo: false,
880
+ melds: [] as MeldSpec[],
881
+ playerWind: TILE.WIND.EAST,
882
+ roundWind: TILE.WIND.SOUTH,
883
+ hais: [1,2,3,5,6,7,12,13,14,28,28,29,29,29],
884
+ expected: new Map([[0, new Map([["場風牌:南", 1]])]])
885
+ },
886
+ {
887
+ name: "bafuuhai_3",
888
+ desc: "場風牌",
889
+ agariHai: 30,
890
+ isTsumo: false,
891
+ melds: [] as MeldSpec[],
892
+ playerWind: TILE.WIND.EAST,
893
+ roundWind: TILE.WIND.WEST,
894
+ hais: [1,2,3,5,6,7,12,13,14,28,28,30,30,30],
895
+ expected: new Map([[0, new Map([["場風牌:西", 1]])]])
896
+ },
897
+ {
898
+ name: "bafuuhai_4",
899
+ desc: "場風牌",
900
+ agariHai: 28,
901
+ isTsumo: false,
902
+ melds: [] as MeldSpec[],
903
+ playerWind: TILE.WIND.EAST,
904
+ roundWind: TILE.WIND.NORTH,
905
+ hais: [1,2,3,5,6,7,12,13,14,28,28,31,31,31],
906
+ expected: new Map([[0, new Map([["場風牌:北", 1]])]])
907
+ },
908
+ {
909
+ name: "bafuuhai_5",
910
+ desc: "場風牌",
911
+ agariHai: 1,
912
+ isTsumo: false,
913
+ melds: [
914
+ {hai: 29, type: MeldType.PON},
915
+ ] as MeldSpec[],
916
+ playerWind: TILE.WIND.EAST,
917
+ roundWind: TILE.WIND.SOUTH,
918
+ hais: [1,2,3,5,6,7,12,13,14,17,17],
919
+ expected: new Map([[0, new Map([["場風牌:南", 1]])]])
920
+ },
921
+ {
922
+ name: "yakuhai_1",
923
+ desc: "役牌",
924
+ agariHai: 1,
925
+ isTsumo: false,
926
+ melds: [] as MeldSpec[],
927
+ hais: [1,2,3,4,5,6,10,11,12,32,32,32,33,33],
928
+ expected: new Map([[0, new Map([["白", 1]])]])
929
+ },
930
+ {
931
+ name: "yakuhai_2",
932
+ desc: "役牌",
933
+ agariHai: 32,
934
+ isTsumo: false,
935
+ melds: [] as MeldSpec[],
936
+ hais: [1,2,3,4,5,6,10,10,33,33,33,34,34,34],
937
+ expected: new Map([[0, new Map([["發", 1],["中", 1]])]])
938
+ },
939
+ {
940
+ name: "yakuhai_3",
941
+ desc: "役牌",
942
+ agariHai: 10,
943
+ isTsumo: false,
944
+ melds: [
945
+ {hai: 32, type: MeldType.PON},
946
+ {hai: 33, type: MeldType.PON},
947
+ ] as MeldSpec[],
948
+ hais: [1,2,3,4,5,6,10,10],
949
+ expected: new Map([[0, new Map([["白", 1],["發", 1]])]])
950
+ },
951
+ {
952
+ name: "riichi_1",
953
+ desc: "立直",
954
+ agariHai: 1,
955
+ isTsumo: false,
956
+ riichi: true,
957
+ melds: [] as MeldSpec[],
958
+ hais: [1,2,3,5,5,5,12,13,14,16,16,16,22,22],
959
+ expected: new Map([[0, new Map([["立直", 1]])]])
960
+ },
961
+ {
962
+ name: "riichi_2",
963
+ desc: "立直",
964
+ agariHai: 1,
965
+ isTsumo: true,
966
+ riichi: true,
967
+ melds: [] as MeldSpec[],
968
+ hais: [1,2,3,5,5,5,12,13,14,16,16,16,22,22],
969
+ expected: new Map([[0, new Map([["立直", 1],["門前清自摸和", 1]])]])
970
+ },
971
+ {
972
+ name: "daburii_1",
973
+ desc: "ダブル立直",
974
+ agariHai: 1,
975
+ isTsumo: false,
976
+ daburii: true,
977
+ melds: [] as MeldSpec[],
978
+ hais: [1,2,3,5,5,5,12,13,14,16,16,16,22,22],
979
+ expected: new Map([[0, new Map([["ダブル立直", 2]])]])
980
+ },
981
+ {
982
+ name: "ippatsu_1",
983
+ desc: "一発",
984
+ agariHai: 1,
985
+ isTsumo: false,
986
+ riichi: true,
987
+ ippatsu: true,
988
+ melds: [] as MeldSpec[],
989
+ hais: [1,2,3,5,5,5,12,13,14,16,16,16,22,22],
990
+ expected: new Map([[0, new Map([["立直", 1],["一発", 1]])]])
991
+ },
992
+ {
993
+ name: "rinshan_1",
994
+ desc: "嶺上開花",
995
+ agariHai: 1,
996
+ isTsumo: true,
997
+ event: WinEvent.RINSHAN,
998
+ melds: [
999
+ {hai: 16, type: MeldType.MINKAN},
1000
+ ] as MeldSpec[],
1001
+ hais: [1,2,3,5,5,5,12,13,14,22,22],
1002
+ expected: new Map([[0, new Map([["嶺上開花", 1]])]])
1003
+ },
1004
+ {
1005
+ name: "rinshan_2",
1006
+ desc: "嶺上開花",
1007
+ agariHai: 1,
1008
+ isTsumo: true,
1009
+ event: WinEvent.RINSHAN,
1010
+ melds: [
1011
+ {hai: 16, type: MeldType.ANKAN},
1012
+ ] as MeldSpec[],
1013
+ hais: [1,2,3,5,5,5,12,13,14,22,22],
1014
+ expected: new Map([[0, new Map([["嶺上開花", 1],["門前清自摸和", 1]])]])
1015
+ },
1016
+ {
1017
+ name: "chankan_1",
1018
+ desc: "槍槓",
1019
+ agariHai: 1,
1020
+ isTsumo: false,
1021
+ event: WinEvent.CHANKAN,
1022
+ melds: [] as MeldSpec[],
1023
+ hais: [1,2,3,5,5,5,12,13,14,16,16,16,22,22],
1024
+ expected: new Map([[0, new Map([["槍槓", 1]])]])
1025
+ },
1026
+ {
1027
+ name: "haitei_1",
1028
+ desc: "海底摸月",
1029
+ agariHai: 1,
1030
+ isTsumo: true,
1031
+ event: WinEvent.HAITEI,
1032
+ melds: [] as MeldSpec[],
1033
+ hais: [1,2,3,5,5,5,12,13,14,16,16,16,22,22],
1034
+ expected: new Map([[0, new Map([["海底摸月", 1],["門前清自摸和", 1]])]])
1035
+ },
1036
+ {
1037
+ name: "houtei_1",
1038
+ desc: "河底撈魚",
1039
+ agariHai: 1,
1040
+ isTsumo: false,
1041
+ event: WinEvent.HOUTEI,
1042
+ melds: [] as MeldSpec[],
1043
+ hais: [1,2,3,5,5,5,12,13,14,16,16,16,22,22],
1044
+ expected: new Map([[0, new Map([["河底撈魚", 1]])]])
1045
+ },
1046
+ ];