diff --git a/packages/misskey-mahjong/test/yaku.ts b/packages/misskey-mahjong/test/yaku.ts
index a7e2b8ffd9..0eb92893b9 100644
--- a/packages/misskey-mahjong/test/yaku.ts
+++ b/packages/misskey-mahjong/test/yaku.ts
@@ -22,11 +22,12 @@ describe('Yaku', () => {
 		it('valid', () => {
 			assert.deepStrictEqual(calcYakus({
 				house: 'e',
-				handTiles: ['m1', 'm9', 's1', 's9', 'p1', 'p9', 'haku', 'hatsu', 'chun', 'n', 'w', 's', 'e'] ,
+			        handTiles: ['m1', 'm1', 's1', 's9', 'p1', 'p9', 'haku', 'hatsu', 'chun', 'n', 'w', 's', 'e', 'm9'] ,
 				huros: [],
-			        tumoTiles: 'm1',
+			        tumoTiles: 'm9',
 			}), ['kokushi']);
 		});
+
 		it('invalid', () => {
 			assert.deepStrictEqual(calcYakus({
 				house: 'e',
@@ -37,6 +38,294 @@ describe('Yaku', () => {
 		});
 	});
 
+	describe('kokushi-13', () => {
+		it('valid', () => {
+			assert.deepStrictEqual(calcYakus({
+				house: 'e',
+			        handTiles: ['m1', 'm9', 's1', 's9', 'p1', 'p9', 'haku', 'hatsu', 'chun', 'n', 'w', 's', 'e', 'm1'] ,
+				huros: [],
+			        tumoTiles: 'm1',
+			}), ['kokushi-13']);
+		});
+
+		it('invalid', () => {
+			assert.deepStrictEqual(calcYakus({
+				house: 'e',
+			        handTiles: ['m1', 'm1', 's1', 's9', 'p1', 'p9', 'haku', 'hatsu', 'chun', 'n', 'w', 's', 'e', 'm9'] ,
+				huros: [],
+			        tumoTiles: 'm1',
+			}).includes('kokushi-13'), false);
+		});
+	});
+
+	describe('suanko', () => {
+		it('valid',() => {
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m1', 'm1', 'm1', 'm2', 'm2', 'm2', 'hatsu', 'hatsu', 'hatsu', 'chun', 'chun', 'chun', 'e', 'e'],
+			 	huros: [],
+				tsumoTile: 'chun',
+			}), ['suanko']);
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m2', 'm2', 'm2', 'hatsu', 'hatsu', 'hatsu', 'chun', 'chun', 'chun', 'e', 'e'],
+			 	huros: [{type: 'ankan', :tile: 'm1'}],
+				tsumoTile: 'chun',
+			}), ['suanko']);
+		});
+
+		it('invalid',() => {
+		      	assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['hatsu', 'hatsu', 'hatsu', 'chun', 'chun', 'chun', 'm2', 'm2', 'e', 'e', 'e'],
+				huros: [{type: 'pom', tile: 'm1'}],
+				ronTile: 'e',
+			}).includes('suanko'), false);
+
+		      	assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m1', 'm1', 'm1', 'hatsu', 'hatsu', 'hatsu', 'chun', 'chun', 'chun', 'm2', 'm2', 'e', 'e', 'e'],
+				huros: [],
+				ronTile: 'e',
+			}).includes('suanko'), false);
+
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m1', 'm1', 'm1', 'hatsu', 'hatsu', 'hatsu', 'chun', 'chun', 'chun', 'm2', 'm2', 'e', 'e', 'e'],
+				huros: [],
+				ronTile: 'e',
+			}).includes('suanko'), false);
+		});
+	});
+
+	describe('suanko-tanki', () => {
+		it('valid', () =>{
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm3', 'm3', 'haku', 'haku', 'haku', 'e', 'e'],
+				huros: [],
+				tsumoTile: 'e',
+			}), ['suanko-tanki']);
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m2', 'm2', 'm2', 'm3', 'm3', 'm3', 'haku', 'haku', 'haku', 'e', 'e'],
+				huros: [{type: 'ankan', tile: 'm1'}],
+				tsumoTile: 'e',
+			}), ['suanko-tanki']);
+		});
+
+		it('invalid', () => {
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m1', 'm1', 'm1', 'm2', 'm2', 'm2', 'hatsu', 'hatsu', 'hatsu', 'chun', 'chun', 'chun', 'e', 'e'],
+			 	huros: [],
+				tsumoTile: 'chun',
+			}).includes('suanko-tanki'), false);
+		});
+	})
+
+	describe('daisangen', () => {
+		it('valid', () => {
+			assert.deepStrictEqual(calcYakus({
+				house: 'e',
+				handTiles: ['haku', 'haku', 'haku', 'hatsu', 'hatsu', 'hatsu', 'chun', 'chun', 'chun', 'p2', 'p2', 'p2', 's2', 's2'],
+				huros: [],
+				tsumoTile: 's2',
+			}), ['daisangen']);
+
+			assert.deepStrictEqual(calcYakus({
+				house: 'e',
+				handTiles: ['hatsu', 'hatsu', 'hatsu', 'chun', 'chun', 'chun', 'p2', 'p2', 'p2', 's2', 's2'],
+				huros: [{type: 'pon', tile: 'haku'}],
+				tsumoTile: 's2',
+ 			}), ['daisangen']);
+		});
+
+		it('invalid', () => {
+			assert.deepStrictEqual(calcYakus({
+			      	house: 'e',
+				handTiles: ['haku', 'haku', 'haku', 'chun', 'chun', 'hatsu', 'hatsu', 'hatsu', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2'] ,
+				huros: [],
+				tumoTiles: 'm2',
+			}).includes('daisangen'), false);
+		});
+	});
+
+	describe('tsuiso', () => {
+		it('valid', () =>{
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['haku', 'haku', 'haku', 'hatsu', 'hatsu', 'hatsu', 'e', 'e', 'e', 'w', 'w', 'w', 's', 's'],
+				huros: [],
+				tsumoTile: 's',
+			}), ['tsuiso']);
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['hatsu', 'hatsu', 'hatsu', 'e', 'e', 'e', 'w', 'w', 'w', 's', 's'],
+				huros: [{type: 'pon', tile: 'haku'}],
+				tsumoTile: 's',
+			}), ['tsuiso']);
+		});
+
+		it('invalid', () => {
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m1', 'm1', 'm1', 'hatsu', 'hatsu', 'hatsu', 'e', 'e', 'e', 'w', 'w', 'w', 's', 's'],
+				huros: [],
+				tsumoTile: 's',
+			}).includes('tsuiso'), false);
+
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['hatsu', 'hatsu', 'hatsu', 'e', 'e', 'e', 'w', 'w', 'w', 's', 's'],
+				huros: [{type: 'pon', tile: 'm1'}],
+				tsumoTile: 's',
+			}).includes('tuiso'), false);
+		});
+	})
+
+	describe('shosushi', () => {
+		it('valid', () =>{
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m1', 'm1', 'm1', 'n', 'n', 'n', 'e', 'e', 'e', 'w', 'w', 'w', 's', 's'],
+				huros: [],
+				tsumoTile: 's',
+			}), ['shosushi']);
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m1', 'm1', 'm1', 'n', 'n', 'n', 'w', 'w', 'w', 's', 's'],
+				huros: [{type: 'pon', tile: 'e'}],
+				tsumoTile: 's',
+			}), ['shosushi']);
+		});
+
+		it('invalid', () => {
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m1', 'm1', 'm1', 'hatsu', 'hatsu', 'hatsu', 'e', 'e', 'e', 'w', 'w', 'w', 's', 's'],
+				huros: [],
+				tsumoTile: 's',
+			}).includes('shosushi'), false);
+
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['hatsu', 'hatsu', 'hatsu', 'e', 'e', 'e', 'w', 'w', 'w', 's', 's'],
+				huros: [{type: 'pon', tile: 'm1'}],
+				tsumoTile: 's',
+			}).includes('shosushi'), false);
+		});
+	})
+
+	describe('daisushi', () => {
+		it('valid', () =>{
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m1', 'm1', 'n', 'n', 'n', 'e', 'e', 'e', 'w', 'w', 'w', 's', 's', 's'],
+				huros: [],
+				tsumoTile: 's',
+			}), ['daisushi']);
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m1', 'm1', 'n', 'n', 'n', 'w', 'w', 'w', 's', 's', 's'],
+				huros: [{type: 'pon', tile: 'e'}],
+				tsumoTile: 'e',
+			}), ['daisushi']);
+		});
+
+		it('invalid', () => {
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m1', 'm1', 'm1', 'n', 'n', 'n', 'e', 'e', 'e', 'w', 'w', 'w', 's', 's'],
+				huros: [],
+				tsumoTile: 's',
+			}).includes('daisushi'), false);
+
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['hatsu', 'hatsu', 'hatsu', 'e', 'e', 'e', 'w', 'w', 'w', 's', 's'],
+				huros: [{type: 'pon', tile: 'm1'}],
+				tsumoTile: 'e',
+			}).includes('daisushi'), false);
+		});
+	})
+
+	describe('ryuiso', () => {
+		it('valid', () =>{
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['s2', 's2', 's2', 's2', 's3', 's4', 's6', 's6', 's6', 's8', 's8', 's8', 'hatsu', 'hatsu'],
+				huros: [],
+				tsumoTile: 'hatsu',
+			}), ['ryuiso']);
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['s2', 's2', 's2', 's2', 's3', 's3', 's3', 's3', 's4', 's8', 's8'],
+				huros: [{type: 'pon', tile: 'hatsu'}],
+				tsumoTile: 's8',
+			}), ['ryuiso']);
+		});
+
+		it('invalid', () => {
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+			        handTiles: ['s2', 's2', 's2', 's2', 's3', 's3', 's3', 's3', 's4', 's8', 's8','haku','haku','haku'],
+			        huros: [],
+				tsumoTile: 's',
+			}).includes('ryuiso'), false);
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['s2', 's2', 's2', 's2', 's3', 's3', 's3', 's3', 's4', 's8', 's8'],
+				huros: [{type: 'pon', tile: 'haku'}],
+				tsumoTile: 's',
+			}).includes('ryuiso'), false);
+		});
+	})
+
+	describe('chinroto', () => {
+		it('valid', () =>{
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+			        handTiles: ['m1','m1','m1''m9', 'm9', 'm9', 's1', 's1', 's1', 's9', 's9', 's9', 'p1', 'p1'],
+				huros: [],
+				tsumoTile: 'p1',
+			}), ['chinroto']);
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['m9', 'm9', 'm9', 's1', 's1', 's1', 's9', 's9', 's9', 'p1', 'p1'],
+				huros: [{type: 'pon', tile: 'm1'}],
+				tsumoTile: 'p1',
+			}), ['chinroto']);
+		});
+
+		it('invalid', () => {
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+			        handTiles: ['s2', 's2', 's2', 's2', 's3', 's3', 's3', 's3', 's4', 's8', 's8','haku','haku','haku'],
+			        huros: [],
+				tsumoTile: 's',
+			}).includes('chinroto'), false);
+		});
+	})
+
+	describe('sukantsu', () => {
+		it('valid', () =>{
+			assert.deepStrictEqual(calcYakus({
+				house: '',
+				handTiles: ['p1', 'p1'],
+			        huros: [{type: 'ankan', tile: 'm1'}, {type: 'ankan', tile: 'm2'}, {type: 'minkan', tile: 'm3'}, {type: 'minkan', tile: 'chun'}],
+				tsumoTile: 'p1',
+			}), ['sukantsu']);
+		});
+		it('invalid', () => {
+			assert.deepStrictEqual(calcYakus({
+				house: 'e',
+				handTiles: ['m1', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'm7', 'm8', 'm9', 'm9', 'm9', 'm2'],
+				huros: [],
+				tsumoTile: 'm2',
+			}).includes('sukantsu'), false);
+		});
+	})
 
 	describe('churen', () => {
 		it('valid', () => {