tyme4ts
Version:
Tyme是一个非常强大的日历工具库,可以看作 Lunar 的升级版,拥有更优的设计和扩展性,支持公历和农历、星座、干支、生肖、节气、法定假日等。
606 lines (544 loc) • 21.2 kB
text/typescript
import {suite, test} from '@testdeck/mocha';
import {
ChildLimit, China95ChildLimitProvider, DecadeFortune,
DefaultChildLimitProvider, DefaultEightCharProvider,
EightChar, Fortune,
Gender,
HeavenStem,
LunarHour, LunarSect1ChildLimitProvider, LunarSect2ChildLimitProvider, LunarSect2EightCharProvider,
SixtyCycle,
SolarTime
} from '../lib';
import {equal, ifError, ok, deepStrictEqual} from 'assert';
class EightCharTest {
/**
* 十神
*/
test1() {
// 八字
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('丙寅'),
SixtyCycle.fromName('癸巳'),
SixtyCycle.fromName('癸酉'),
SixtyCycle.fromName('己未')
);
// 年柱
const year: SixtyCycle = eightChar.getYear();
// 月柱
const month: SixtyCycle = eightChar.getMonth();
// 日柱
const day: SixtyCycle = eightChar.getDay();
// 时柱
const hour: SixtyCycle = eightChar.getHour();
// 日元(日主、日干)
const me: HeavenStem = day.getHeavenStem();
// 年柱天干十神
equal(me.getTenStar(year.getHeavenStem()).getName(), '正财');
// 月柱天干十神
equal(me.getTenStar(month.getHeavenStem()).getName(), '比肩');
// 时柱天干十神
equal(me.getTenStar(hour.getHeavenStem()).getName(), '七杀');
// 年柱地支十神(本气)
equal(me.getTenStar(year.getEarthBranch().getHideHeavenStemMain()).getName(), '伤官');
// 年柱地支十神(中气)
ok(year.getEarthBranch().getHideHeavenStemMiddle());
equal(me.getTenStar(<HeavenStem>year.getEarthBranch().getHideHeavenStemMiddle()).getName(), '正财');
// 年柱地支十神(余气)
ok(year.getEarthBranch().getHideHeavenStemResidual());
equal(me.getTenStar(<HeavenStem>year.getEarthBranch().getHideHeavenStemResidual()).getName(), '正官');
// 日柱地支十神(本气)
equal(me.getTenStar(day.getEarthBranch().getHideHeavenStemMain()).getName(), '偏印');
// 日柱地支藏干(中气)
ifError(day.getEarthBranch().getHideHeavenStemMiddle());
// 日柱地支藏干(余气)
ifError(day.getEarthBranch().getHideHeavenStemResidual());
// 指定任意天干的十神
equal(me.getTenStar(HeavenStem.fromName('丙')).getName(), '正财');
}
/**
* 地势(长生十二神)
*/
test2() {
// 八字
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('丙寅'),
SixtyCycle.fromName('癸巳'),
SixtyCycle.fromName('癸酉'),
SixtyCycle.fromName('己未')
);
// 年柱
const year: SixtyCycle = eightChar.getYear();
// 月柱
const month: SixtyCycle = eightChar.getMonth();
// 日柱
const day: SixtyCycle = eightChar.getDay();
// 时柱
const hour: SixtyCycle = eightChar.getHour();
// 日元(日主、日干)
const me: HeavenStem = day.getHeavenStem();
// 年柱地势
equal(me.getTerrain(year.getEarthBranch()).getName(), '沐浴');
// 月柱地势
equal(me.getTerrain(month.getEarthBranch()).getName(), '胎');
// 日柱地势
equal(me.getTerrain(day.getEarthBranch()).getName(), '病');
// 时柱地势
equal(me.getTerrain(hour.getEarthBranch()).getName(), '墓');
}
/**
* 胎元/胎息/命宫
*/
test3() {
// 八字
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('癸卯'),
SixtyCycle.fromName('辛酉'),
SixtyCycle.fromName('己亥'),
SixtyCycle.fromName('癸酉')
);
// 胎元
const taiYuan: SixtyCycle = eightChar.getFetalOrigin();
equal(taiYuan.getName(), '壬子');
// 胎元纳音
equal(taiYuan.getSound().getName(), '桑柘木');
}
/**
* 胎息
*/
test4() {
// 八字
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('癸卯'),
SixtyCycle.fromName('辛酉'),
SixtyCycle.fromName('己亥'),
SixtyCycle.fromName('癸酉')
);
// 胎息
const taiXi: SixtyCycle = eightChar.getFetalBreath();
equal(taiXi.getName(), '甲寅');
// 胎息纳音
equal(taiXi.getSound().getName(), '大溪水');
}
/**
* 命宫
*/
test5() {
// 八字
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('癸卯'),
SixtyCycle.fromName('辛酉'),
SixtyCycle.fromName('己亥'),
SixtyCycle.fromName('癸酉')
);
// 命宫
const mingGong: SixtyCycle = eightChar.getOwnSign();
equal(mingGong.getName(), '癸亥');
// 命宫纳音
equal(mingGong.getSound().getName(), '大海水');
}
/**
* 身宫
*/
test6() {
// 八字
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('癸卯'),
SixtyCycle.fromName('辛酉'),
SixtyCycle.fromName('己亥'),
SixtyCycle.fromName('癸酉')
);
// 身宫
const shenGong: SixtyCycle = eightChar.getBodySign();
equal(shenGong.getName(), '己未');
// 身宫纳音
equal(shenGong.getSound().getName(), '天上火');
}
/**
* 地势(长生十二神)
*/
test7() {
// 八字
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('乙酉'),
SixtyCycle.fromName('戊子'),
SixtyCycle.fromName('辛巳'),
SixtyCycle.fromName('壬辰')
);
// 日干
const me: HeavenStem = eightChar.getDay().getHeavenStem();
// 年柱地势
equal(me.getTerrain(eightChar.getYear().getEarthBranch()).getName(), '临官');
// 月柱地势
equal(me.getTerrain(eightChar.getMonth().getEarthBranch()).getName(), '长生');
// 日柱地势
equal(me.getTerrain(eightChar.getDay().getEarthBranch()).getName(), '死');
// 时柱地势
equal(me.getTerrain(eightChar.getHour().getEarthBranch()).getName(), '墓');
}
/**
* 公历时刻转八字
*/
test8() {
const eightChar: EightChar = SolarTime.fromYmdHms(2005, 12, 23, 8, 37, 0).getLunarHour().getEightChar();
equal(eightChar.getYear().getName(), '乙酉');
equal(eightChar.getMonth().getName(), '戊子');
equal(eightChar.getDay().getName(), '辛巳');
equal(eightChar.getHour().getName(), '壬辰');
}
test9() {
const eightChar: EightChar = SolarTime.fromYmdHms(1988, 2, 15, 23, 30, 0).getLunarHour().getEightChar();
equal(eightChar.getYear().getName(), '戊辰');
equal(eightChar.getMonth().getName(), '甲寅');
equal(eightChar.getDay().getName(), '辛丑');
equal(eightChar.getHour().getName(), '戊子');
}
/**
* 童限测试
*/
test11() {
const childLimit: ChildLimit = ChildLimit.fromSolarTime(SolarTime.fromYmdHms(2022, 3, 9, 20, 51, 0), Gender.MAN);
equal(childLimit.getYearCount(), 8);
equal(childLimit.getMonthCount(), 9);
equal(childLimit.getDayCount(), 2);
equal(childLimit.getHourCount(), 10);
equal(childLimit.getMinuteCount(), 26);
equal(childLimit.getEndTime().toString(), '2030年12月12日 07:17:00');
}
/**
* 童限测试
*/
test12() {
const childLimit: ChildLimit = ChildLimit.fromSolarTime(SolarTime.fromYmdHms(2018, 6, 11, 9, 30, 0), Gender.WOMAN);
equal(childLimit.getYearCount(), 1);
equal(childLimit.getMonthCount(), 9);
equal(childLimit.getDayCount(), 10);
equal(childLimit.getHourCount(), 1);
equal(childLimit.getMinuteCount(), 42);
equal(childLimit.getEndTime().toString(), '2020年3月21日 11:12:00');
}
/**
* 大运测试
*/
test13() {
// 童限
const childLimit: ChildLimit = ChildLimit.fromSolarTime(SolarTime.fromYmdHms(1983, 2, 15, 20, 0, 0), Gender.WOMAN);
// 八字
equal(childLimit.getEightChar().toString(), '癸亥 甲寅 甲戌 甲戌');
// 童限年数
equal(childLimit.getYearCount(), 6);
// 童限月数
equal(childLimit.getMonthCount(), 2);
// 童限日数
equal(childLimit.getDayCount(), 18);
// 童限结束(即开始起运)的公历时刻
equal(childLimit.getEndTime().toString(), '1989年5月4日 18:24:00');
// 童限开始(即出生)的农历年干支
equal(childLimit.getStartTime().getLunarHour().getLunarDay().getLunarMonth().getLunarYear().getSixtyCycle().getName(), '癸亥');
// 童限结束(即开始起运)的农历年干支
equal(childLimit.getEndTime().getLunarHour().getLunarDay().getLunarMonth().getLunarYear().getSixtyCycle().getName(), '己巳');
// 第1轮大运
const decadeFortune: DecadeFortune = childLimit.getStartDecadeFortune();
// 开始年龄
equal(decadeFortune.getStartAge(), 7);
// 结束年龄
equal(decadeFortune.getEndAge(), 16);
// 开始年
equal(decadeFortune.getStartSixtyCycleYear().getYear(), 1989);
// 结束年
equal(decadeFortune.getEndSixtyCycleYear().getYear(), 1998);
// 干支
equal(decadeFortune.getName(), '乙卯');
// 下一大运
equal(decadeFortune.next(1).getName(), '丙辰');
// 上一大运
equal(decadeFortune.next(-1).getName(), '甲寅');
// 第9轮大运
equal(decadeFortune.next(8).getName(), '癸亥');
// 小运
const fortune: Fortune = childLimit.getStartFortune();
// 年龄
equal(fortune.getAge(), 7);
// 干支年
equal(fortune.getSixtyCycleYear().getYear(), 1989);
// 干支
equal(fortune.getName(), '辛巳');
// 流年
equal(fortune.getSixtyCycleYear().getSixtyCycle().getName(), '己巳');
}
test14() {
// 童限
const childLimit: ChildLimit = ChildLimit.fromSolarTime(SolarTime.fromYmdHms(1992, 2, 2, 12, 0, 0), Gender.MAN);
// 八字
equal(childLimit.getEightChar().toString(), '辛未 辛丑 戊申 戊午');
// 童限年数
equal(childLimit.getYearCount(), 9);
// 童限月数
equal(childLimit.getMonthCount(), 0);
// 童限日数
equal(childLimit.getDayCount(), 9);
// 童限结束(即开始起运)的公历时刻
equal(childLimit.getEndTime().toString(), '2001年2月11日 18:58:00');
// 童限开始(即出生)的农历年干支
equal(childLimit.getStartTime().getLunarHour().getLunarDay().getLunarMonth().getLunarYear().getSixtyCycle().getName(), '辛未');
// 童限结束(即开始起运)的农历年干支
equal(childLimit.getEndTime().getLunarHour().getLunarDay().getLunarMonth().getLunarYear().getSixtyCycle().getName(), '辛巳');
// 第1轮大运
const decadeFortune: DecadeFortune = childLimit.getStartDecadeFortune();
// 开始年龄
equal(decadeFortune.getStartAge(), 10);
// 结束年龄
equal(decadeFortune.getEndAge(), 19);
// 开始年
equal(decadeFortune.getStartSixtyCycleYear().getYear(), 2001);
// 结束年
equal(decadeFortune.getEndSixtyCycleYear().getYear(), 2010);
// 干支
equal(decadeFortune.getName(), '庚子');
// 下一大运
equal(decadeFortune.next(1).getName(), '己亥');
// 小运
const fortune: Fortune = childLimit.getStartFortune();
// 年龄
equal(fortune.getAge(), 10);
// 干支年
equal(fortune.getSixtyCycleYear().getYear(), 2001);
// 干支
equal(fortune.getName(), '戊申');
// 小运推移
equal(fortune.next(2).getName(), '丙午');
equal(fortune.next(-2).getName(), '庚戌');
// 流年
equal(fortune.getSixtyCycleYear().getSixtyCycle().getName(), '辛巳');
}
test15() {
equal(SolarTime.fromYmdHms(2018, 8, 8, 8, 8, 0).getLunarHour().getEightChar().toString(), '戊戌 庚申 壬申 甲辰');
}
test16() {
// 童限
const childLimit: ChildLimit = ChildLimit.fromSolarTime(SolarTime.fromYmdHms(1990, 3, 15, 10, 30, 0), Gender.MAN);
// 八字
equal(childLimit.getEightChar().toString(), '庚午 己卯 己卯 己巳');
// 童限年数
equal(childLimit.getYearCount(), 6);
// 童限月数
equal(childLimit.getMonthCount(), 11);
// 童限日数
equal(childLimit.getDayCount(), 23);
// 童限结束(即开始起运)的公历时刻
equal(childLimit.getEndTime().toString(), '1997年3月11日 00:22:00');
// 小运
const fortune: Fortune = childLimit.getStartFortune();
// 年龄
equal(fortune.getAge(), 8);
}
test17() {
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('己丑'),
SixtyCycle.fromName('戊辰'),
SixtyCycle.fromName('戊辰'),
SixtyCycle.fromName('甲子')
);
equal(eightChar.getOwnSign().getName(), '丁丑');
}
test18() {
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('戊戌'),
SixtyCycle.fromName('庚申'),
SixtyCycle.fromName('丁亥'),
SixtyCycle.fromName('丙午')
);
equal(eightChar.getOwnSign().getName(), '乙卯');
}
test19() {
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('甲子'),
SixtyCycle.fromName('壬申'),
SixtyCycle.fromName('庚子'),
SixtyCycle.fromName('乙亥')
);
equal(eightChar.getOwnSign().getName(), '甲戌');
}
test20() {
const eightChar: EightChar = ChildLimit.fromSolarTime(SolarTime.fromYmdHms(2024, 1, 29, 9, 33, 0), Gender.MAN).getEightChar();
equal(eightChar.getOwnSign().getName(), '癸亥');
equal(eightChar.getBodySign().getName(), '己未');
}
test21() {
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('辛亥'),
SixtyCycle.fromName('乙未'),
SixtyCycle.fromName('庚子'),
SixtyCycle.fromName('甲辰')
);
equal(eightChar.getBodySign().getName(), '庚子');
}
test22() {
equal(ChildLimit.fromSolarTime(SolarTime.fromYmdHms(1990, 1, 27, 0, 0, 0), Gender.MAN).getEightChar().getBodySign().getName(), '丙寅');
}
test23() {
equal(ChildLimit.fromSolarTime(SolarTime.fromYmdHms(2019, 3, 7, 8, 0, 0), Gender.MAN).getEightChar().getOwnSign().getName(), '甲戌');
}
test24() {
equal(ChildLimit.fromSolarTime(SolarTime.fromYmdHms(2019, 3, 27, 2, 0, 0), Gender.MAN).getEightChar().getOwnSign().getName(), '丁丑');
}
test25() {
equal(LunarHour.fromYmdHms(1994, 5, 20, 18, 0, 0).getEightChar().getOwnSign().getName(), '丙寅');
}
test26() {
equal(SolarTime.fromYmdHms(1986, 5, 29, 13, 37, 0).getLunarHour().getEightChar().getBodySign().getName(), '辛丑');
}
test27() {
equal(SolarTime.fromYmdHms(1994, 12, 6, 2, 0, 0).getLunarHour().getEightChar().getBodySign().getName(), '丁丑');
}
test28() {
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('辛亥'),
SixtyCycle.fromName('丁酉'),
SixtyCycle.fromName('丙午'),
SixtyCycle.fromName('癸巳')
);
equal(eightChar.getOwnSign().getName(), '辛卯');
}
test29() {
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('丙寅'),
SixtyCycle.fromName('庚寅'),
SixtyCycle.fromName('辛卯'),
SixtyCycle.fromName('壬辰')
);
equal(eightChar.getOwnSign().getName(), '己亥');
equal(eightChar.getBodySign().getName(), '乙未');
}
test30() {
equal(new EightChar('壬子', '辛亥', '壬戌', '乙巳').getBodySign().getName(), '乙巳');
}
test31() {
// 采用元亨利贞的起运算法
ChildLimit.provider = new China95ChildLimitProvider();
// 童限
const childLimit: ChildLimit = ChildLimit.fromSolarTime(SolarTime.fromYmdHms(1986, 5, 29, 13, 37, 0), Gender.MAN);
// 童限年数
equal(childLimit.getYearCount(), 2);
// 童限月数
equal(childLimit.getMonthCount(), 7);
// 童限日数
equal(childLimit.getDayCount(), 0);
// 童限时数
equal(childLimit.getHourCount(), 0);
// 童限分数
equal(childLimit.getMinuteCount(), 0);
// 童限结束(即开始起运)的公历时刻
equal(childLimit.getEndTime().toString(), '1988年12月29日 13:37:00');
// 为了不影响其他测试用例,恢复默认起运算法
ChildLimit.provider = new DefaultChildLimitProvider();
}
test46() {
LunarHour.provider = new LunarSect2EightCharProvider();
const eightChar: EightChar = new EightChar(
SixtyCycle.fromName('壬寅'),
SixtyCycle.fromName('丙午'),
SixtyCycle.fromName('己亥'),
SixtyCycle.fromName('丙子')
);
const timeList: string[] = [];
eightChar.getSolarTimes(1900, 2024).forEach(time => {
timeList.push(time.toString());
})
deepStrictEqual(timeList, ['1962年6月30日 23:00:00', '2022年6月15日 23:00:00']);
LunarHour.provider = new DefaultEightCharProvider();
}
test47() {
// 采用Lunar流派1的起运算法
ChildLimit.provider = new LunarSect1ChildLimitProvider();
// 童限
const childLimit: ChildLimit = ChildLimit.fromSolarTime(SolarTime.fromYmdHms(1986, 5, 29, 13, 37, 0), Gender.MAN);
// 童限年数
equal(childLimit.getYearCount(), 2);
// 童限月数
equal(childLimit.getMonthCount(), 7);
// 童限日数
equal(childLimit.getDayCount(), 0);
// 童限时数
equal(childLimit.getHourCount(), 0);
// 童限分数
equal(childLimit.getMinuteCount(), 0);
// 童限结束(即开始起运)的公历时刻
equal(childLimit.getEndTime().toString(), '1988年12月29日 13:37:00');
// 为了不影响其他测试用例,恢复默认起运算法
ChildLimit.provider = new DefaultChildLimitProvider();
}
test48() {
// 采用Lunar流派2的起运算法
ChildLimit.provider = new LunarSect2ChildLimitProvider();
// 童限
const childLimit: ChildLimit = ChildLimit.fromSolarTime(SolarTime.fromYmdHms(1986, 5, 29, 13, 37, 0), Gender.MAN);
// 童限年数
equal(childLimit.getYearCount(), 2);
// 童限月数
equal(childLimit.getMonthCount(), 7);
// 童限日数
equal(childLimit.getDayCount(), 0);
// 童限时数
equal(childLimit.getHourCount(), 14);
// 童限分数
equal(childLimit.getMinuteCount(), 0);
// 童限结束(即开始起运)的公历时刻
equal(childLimit.getEndTime().toString(), '1988年12月30日 03:37:00');
// 为了不影响其他测试用例,恢复默认起运算法
ChildLimit.provider = new DefaultChildLimitProvider();
}
test49() {
// 采用Lunar流派2的八字算法
LunarHour.provider = new LunarSect2EightCharProvider();
// 童限
const eightChar: EightChar = LunarHour.fromYmdHms(2001, 10, 18, 18, 0, 0).getEightChar();
equal(eightChar.getName(), '辛巳 己亥 己亥 癸酉');
// 为了不影响其他测试用例,恢复默认八字算法
LunarHour.provider = new DefaultEightCharProvider();
}
test50() {
// 采用Lunar流派2的八字算法
LunarHour.provider = new LunarSect2EightCharProvider();
// 童限
const eightChar: EightChar = LunarHour.fromYmdHms('2001', '10', '18', '18', '0', '0').getEightChar();
equal(eightChar.getName(), '辛巳 己亥 己亥 癸酉');
// 为了不影响其他测试用例,恢复默认八字算法
LunarHour.provider = new DefaultEightCharProvider();
}
}