1
0
forked from mirror/misskey
mi.moris.day/packages/misskey-mahjong/test/fu.ts
Take-John bf818a6656
feature(mahjong): 搶槓/ドラ以外の麻雀の役を実装 (#14346)
* ビルドによる自動的なソース更新

* 麻雀関連のキーバリューペアを追加

* 役の定義をまとめてエクスポート

* タイポ修正

* Revert "麻雀関連のキーバリューペアを追加"

This reverts commit c349cdf70c.

* misskey-jsのビルドによる自動更新

* 型エラーに対処

* riichiがtrueの場合に門前であるかを確認

* EnvForCalcYakuのhouseプロパティを廃止

* 風牌の役の共通部分をクラスで定義

* タイポ修正

* 役牌をクラスで共通化

* 一盃口と二盃口のテストを通す

* 一盃口・二盃口判定関数の調整

* 一気通貫の判定にチーによる順子も考慮する

* 混全帯幺九の実装

* 純全帯幺九の実装

* 七対子の実装とテストの修正

* tsumoTileまたはronTileを必須に

* 待ちを確認して平和の判定を可能に

* 三暗刻と四暗刻、四暗刻単騎の実装

* 四暗刻であるために通常の役を判定できない牌姿のテストを修正

* 混老頭と清老頭を実装

* 三槓子と四槓子を実装

* 平和の実装とテストを修正

* 小三元のテストを修正

* 国士無双に対子の確認を追加

* 国士無双十三面待ちを実装し、テストを修正

* 一部の役の七対子形を認め、テストを追加

* 手牌の数を確認

* 役の定義をカプセル化して型エラーの対処

* ツモ・ロンの判定を修正

* calcYakusの引数のhandTilesを修正

* calcYakusに渡す風をseatWindに修正

* 嶺上開花の実装

* 海底摸月の実装

* FourMentsuOneJyantouWithWait型の作成

* 河底撈魚の実装

* ダブル立直の実装

* 天和・地和の実装

* エンジンのテストを作成

* エンジンによる地和のテストを追加

* 嶺上開花のテスト

* ライセンスの記述を追加

* ダブル立直一発ツモのテスト

* ダブル立直海底ツモのテスト

* ダブル立直河底のテスト

* 役満も処理できるように

* 点数のテスト

* 打牌時にrinshanFlags[house]をfalseに

* 七対子形の字一色を認める

* typo
2024-08-15 12:29:31 +09:00

71 lines
2.1 KiB
TypeScript

/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import assert from "node:assert"
import { calcWaitPatterns } from "../src/common.fu"
import { analyzeFourMentsuOneJyantou } from "../src/common"
describe('Fu', () => {
describe('Wait patterns', () => {
it('Ryanmen', () => {
const fourMentsuOneJyantou = analyzeFourMentsuOneJyantou(
['m2', 'm3', 'm4', 'p6', 'p7', 'p8', 'p5', 'p6', 'p7', 's1', 's1', 's7', 's8', 's9']
)[0];
assert.deepStrictEqual(calcWaitPatterns(fourMentsuOneJyantou, 's9'), [{
...fourMentsuOneJyantou,
waitedFor: 'mentsu',
agariTile: 's9',
waitedTaatsu: ['s7', 's8'],
}]);
});
it('Kanchan', () => {
const fourMentsuOneJyantou = analyzeFourMentsuOneJyantou(
['m2', 'm3', 'm4', 'p6', 'p7', 'p8', 'p5', 'p6', 'p7', 's1', 's1', 's7', 's8', 's9']
)[0];
assert.deepStrictEqual(calcWaitPatterns(fourMentsuOneJyantou, 's8'), [{
...fourMentsuOneJyantou,
waitedFor: 'mentsu',
agariTile: 's8',
waitedTaatsu: ['s7', 's9'],
}]);
})
it('Penchan', () => {
const fourMentsuOneJyantou = analyzeFourMentsuOneJyantou(
['m2', 'm3', 'm4', 'p6', 'p7', 'p8', 'p5', 'p6', 'p7', 's1', 's1', 's7', 's8', 's9']
)[0];
assert.deepStrictEqual(calcWaitPatterns(fourMentsuOneJyantou, 's7'), [{
...fourMentsuOneJyantou,
waitedFor: 'mentsu',
agariTile: 's7',
waitedTaatsu: ['s8', 's9'],
}]);
})
it('Tanki', () => {
const fourMentsuOneJyantou = analyzeFourMentsuOneJyantou(
['m1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm3', 'm3', 'haku', 'haku', 'haku', 'e', 'e']
)[0];
assert.deepStrictEqual(calcWaitPatterns(fourMentsuOneJyantou, 'e'), [{
...fourMentsuOneJyantou,
waitedFor: 'head',
agariTile: 'e',
}]);
});
it('Nobetan', () => {
const fourMentsuOneJyantou = analyzeFourMentsuOneJyantou(
['m1', 'm2', 'm3', 'm5', 'm6', 'm7', 'p2', 'p3', 'p4', 's3', 's4', 's5', 's6', 's6']
)[0];
assert.deepStrictEqual(calcWaitPatterns(fourMentsuOneJyantou, 's6'), [{
...fourMentsuOneJyantou,
waitedFor: 'head',
agariTile: 's6',
}]);
});
});
});