521 lines
16 KiB
TypeScript
521 lines
16 KiB
TypeScript
import { Client } from './Client';
|
||
import 'mocha';
|
||
import { PinusWSClient } from 'pinus-robot-plugin';
|
||
import { expect } from 'chai';
|
||
import { addItemsIfNotEnough, checkDisplayItems, checkSuccessResponse, checkTimeStamp, checkWarJson } from './CheckPatten';
|
||
import { PVP } from '../app/pubUtils/dicParam';
|
||
import { DEBUG_MAGIC_WORD } from '../app/consts';
|
||
import { getRandSingleEelm } from '../app/pubUtils/util';
|
||
|
||
describe('pvp测试', function () {
|
||
let pinusClient: PinusWSClient;
|
||
let roleInfo;
|
||
let oppPlayers = [];
|
||
let setAttackCnt = 0;
|
||
let buyAttackCnt = 0;
|
||
let refOppCnt = 0;
|
||
let challengeCnt = 0;
|
||
let attack;
|
||
let receivedBox = [];
|
||
let hisScore = 0;
|
||
|
||
before(function (done) {
|
||
const c = new Client();
|
||
const timer = setInterval(() => {
|
||
if (c.client) {
|
||
pinusClient = c.client;
|
||
roleInfo = c.roleInfo;
|
||
clearInterval(timer);
|
||
done();
|
||
}
|
||
}, 500);
|
||
});
|
||
|
||
after(function (done) {
|
||
pinusClient.disconnect();
|
||
// disconnect 后等待 500ms,供服务器清理环境、退出频道等
|
||
setTimeout(() => {
|
||
done();
|
||
}, 500);
|
||
});
|
||
|
||
it('获得主界面信息', function (done) {
|
||
getData(pinusClient, false, function (data) {
|
||
oppPlayers = data.oppPlayers;
|
||
setAttackCnt = data.setAttackCnt;
|
||
buyAttackCnt = data.buyAttackCnt;
|
||
refOppCnt = data.refOppCnt;
|
||
challengeCnt = data.challengeCnt;
|
||
attack = data.attack;
|
||
done();
|
||
}); // 先不结算赛季
|
||
});
|
||
|
||
it('保存防守阵容', function (done) {
|
||
let myHeroes = roleInfo.heros || [];
|
||
let heroes = [];
|
||
for (let i = 0; i < 6; i++) {
|
||
if (myHeroes.length - 1 < i) break;
|
||
heroes.push({
|
||
actorId: myHeroes[i].hid,
|
||
ai: Math.floor(Math.random() * 2),
|
||
dataId: 2001 + i,
|
||
order: i + 1
|
||
});
|
||
}
|
||
pinusClient.request('battle.pvpHandler.saveDefense', { warId: 4501, buff: 50101, heroes }, (res) => {
|
||
checkSuccessResponse(res);
|
||
checkDefense(res.data.defense);
|
||
done();
|
||
});
|
||
});
|
||
|
||
function debugResetAttackCnt(cb) {
|
||
pinusClient.request('battle.pvpHandler.debugResetAttackCnt', { magicWord: DEBUG_MAGIC_WORD }, (res) => {
|
||
setAttackCnt = 0;
|
||
buyAttackCnt = 0;
|
||
cb();
|
||
})
|
||
}
|
||
|
||
it('购买保存挑战阵容次数', function (done) {
|
||
if (buyAttackCnt >= PVP.PVP_BUY_SET_ATTACK_CNT) {
|
||
debugResetAttackCnt(() => {
|
||
buyAttackCount();
|
||
});
|
||
} else {
|
||
buyAttackCount();
|
||
}
|
||
|
||
function buyAttackCount() {
|
||
pinusClient.request('battle.pvpHandler.buyAttackCnt', { count: 1 }, res => {
|
||
checkSuccessResponse(res);
|
||
expect(res.data.refOppCnt).to.be.a('number');
|
||
expect(res.data.setAttackCnt).to.be.a('number');
|
||
expect(res.data.buyAttackCnt).to.be.a('number');
|
||
refOppCnt = res.data.refOppCnt;
|
||
setAttackCnt = res.data.setAttackCnt;
|
||
buyAttackCnt = res.data.buyAttackCnt;
|
||
if (res.data.oppPlayers) {
|
||
checkOppPlayers(res.data.oppPlayers);
|
||
oppPlayers = res.data.oppPlayers;
|
||
}
|
||
done();
|
||
})
|
||
}
|
||
});
|
||
|
||
it('保存挑战阵容', function (done) {
|
||
if (setAttackCnt >= buyAttackCnt + PVP.PVP_SET_ATTACK_FREE_CNT) { // 次数不足
|
||
debugResetAttackCnt(() => {
|
||
saveAttack();
|
||
});
|
||
} else {
|
||
saveAttack();
|
||
}
|
||
function saveAttack() {
|
||
let myHeroes = roleInfo.heros || [];
|
||
let heroes = [];
|
||
for (let i = 0; i < 6; i++) {
|
||
if (myHeroes.length - 1 < i) break;
|
||
heroes.push({
|
||
actorId: myHeroes[i].hid,
|
||
order: i + 1
|
||
});
|
||
}
|
||
pinusClient.request('battle.pvpHandler.saveAttack', { heroes }, (res) => {
|
||
checkSuccessResponse(res);
|
||
checkAttack(res.data.attack);
|
||
attack = res.data.attack;
|
||
checkOppPlayers(res.data.oppPlayers);
|
||
expect(res.data.setAttackCnt).to.equal(setAttackCnt + 1);
|
||
setAttackCnt = res.data.setAttackCnt;
|
||
oppPlayers = res.data.oppPlayers;
|
||
done();
|
||
});
|
||
}
|
||
});
|
||
|
||
function debugResetRefOppCnt(cb) {
|
||
pinusClient.request('battle.pvpHandler.debugResetRefOppCnt', { magicWord: DEBUG_MAGIC_WORD }, (res) => {
|
||
refOppCnt = 0
|
||
cb();
|
||
})
|
||
}
|
||
it('刷新匹配对手', function (done) {
|
||
if (refOppCnt >= 8) { // 次数不足
|
||
debugResetRefOppCnt(() => {
|
||
refreshOppPlayer();
|
||
});
|
||
} else {
|
||
refreshOppPlayer();
|
||
}
|
||
function refreshOppPlayer() {
|
||
addItemsIfNotEnough(roleInfo, pinusClient, 31002, 50, () => {
|
||
pinusClient.request('battle.pvpHandler.refreshOppPlayer', {}, (res) => {
|
||
checkSuccessResponse(res);
|
||
checkOppPlayers(res.data.oppPlayers);
|
||
expect(res.data.refOppCnt).to.equal(refOppCnt + 1);
|
||
expect(res.data.setAttackCnt).to.equal(setAttackCnt);
|
||
setAttackCnt = res.data.setAttackCnt;
|
||
refOppCnt = res.data.refOppCnt;
|
||
oppPlayers = res.data.oppPlayers;
|
||
done();
|
||
});
|
||
});
|
||
}
|
||
});
|
||
|
||
let chosenOpp;
|
||
let curWarId;
|
||
let battleCode;
|
||
let chosenOppHeroes;
|
||
|
||
it('获取对手阵容具体信息', function (done) {
|
||
chosenOpp = getRandSingleEelm(oppPlayers);
|
||
pinusClient.request('battle.pvpHandler.getOppPlayer', { roleId: chosenOpp.roleId }, (res) => {
|
||
checkSuccessResponse(res);
|
||
expect(res.data.roleId).to.equal(chosenOpp.roleId);
|
||
expect(res.data.pos).to.equal(chosenOpp.pos);
|
||
expect(res.data.warId).to.be.a('number');
|
||
curWarId = res.data.warId
|
||
expect(res.data.buff).to.be.a('number');
|
||
checkWarJson(res.data.heroes);
|
||
chosenOppHeroes = res.data.heroes;
|
||
done();
|
||
});
|
||
});
|
||
|
||
it('获取对手详细信息', function(done) {
|
||
pinusClient.request('battle.pvpHandler.getPlayerDetail', { roleId: chosenOpp.roleId }, (res) => {
|
||
checkSuccessResponse(res);
|
||
expect(res.data.roleId).to.be.a('string');
|
||
expect(res.data.roleName).to.be.a('string');
|
||
expect(res.data.lv).to.be.a('number');
|
||
expect(res.data.title).to.be.a('number');
|
||
expect(res.data.head).to.be.a('number');
|
||
expect(res.data.frame).to.be.a('number');
|
||
expect(res.data.spine).to.be.a('number');
|
||
expect(res.data.defCe).to.be.a('number');
|
||
expect(res.data.score).to.be.a('number');
|
||
expect(res.data.rank).to.be.a('number');
|
||
expect(res.data.pLv).to.be.a('number');
|
||
expect(res.data.heroes).to.be.a('array');
|
||
res.data.heroes.forEach(hero => {
|
||
expect(hero.actorId).to.be.a('number');
|
||
expect(hero.isDefense).to.be.a('boolean');
|
||
expect(hero.skinId).to.be.a('number');
|
||
expect(hero.lv).to.be.a('number');
|
||
expect(hero.star).to.be.a('number');
|
||
expect(hero.colorStar).to.be.a('number');
|
||
expect(hero.quality).to.be.a('number');
|
||
expect(hero.score).to.be.a('number');
|
||
});
|
||
done();
|
||
});
|
||
});
|
||
|
||
function debugAddChallengeCnt(cb) {
|
||
pinusClient.request('battle.pvpHandler.debugAddChallengeCnt', { magicWord: DEBUG_MAGIC_WORD, challengeCnt: 10 }, (res) => {
|
||
checkSuccessResponse(res);
|
||
expect(res.data.challengeCnt).to.be.a('number');
|
||
challengeCnt = res.data.challengeCnt;
|
||
cb();
|
||
})
|
||
}
|
||
|
||
it('开始挑战', function (done) {
|
||
if(challengeCnt <= 0) {
|
||
debugAddChallengeCnt(() => {
|
||
pvpStart();
|
||
})
|
||
} else {
|
||
pvpStart();
|
||
}
|
||
|
||
function pvpStart() {
|
||
chosenOpp = getRandSingleEelm(oppPlayers);
|
||
pinusClient.request('battle.pvpHandler.pvpStart', { warId: curWarId, roleId: chosenOpp.roleId }, (res) => {
|
||
checkSuccessResponse(res);
|
||
expect(res.data.battleCode).to.a('string');
|
||
battleCode = res.data.battleCode;
|
||
done();
|
||
});
|
||
}
|
||
});
|
||
|
||
it('结束挑战', function (done) {
|
||
if(!attack || !attack.heroes) {
|
||
console.error('没有挑战阵容'); return;
|
||
}
|
||
function ranDamage() {
|
||
return Math.floor(Math.random() * 1000)
|
||
}
|
||
let myHeroes = attack.heroes.map(cur => {
|
||
return { hid: cur.actorId, damage: ranDamage(), heal: ranDamage(), underDamage: ranDamage()}
|
||
});
|
||
let oppHeroes = chosenOppHeroes.filter(cur => cur.actorId > 0).map(cur => {
|
||
return { hid: cur.actorId, damage: ranDamage(), heal: ranDamage(), underDamage: ranDamage() }
|
||
})
|
||
pinusClient.request('battle.pvpHandler.pvpEnd', { battleCode, isSuccess: true, myHeroes, oppHeroes }, (res) => {
|
||
checkSuccessResponse(res);
|
||
expect(res.data.score).to.a('number');
|
||
expect(res.data.myRank).to.a('number');
|
||
expect(res.data.winStreakNum).to.a('number');
|
||
|
||
expect(res.data.heroScores).to.be.a('array');
|
||
res.data.heroScores.forEach(heroScore => {
|
||
expect(heroScore.hid).to.be.a('number');
|
||
expect(heroScore.addScore).to.be.a('number');
|
||
expect(heroScore.plusScore).to.be.a('number');
|
||
expect(heroScore.score).to.be.a('number');
|
||
});
|
||
|
||
checkAttack(res.data.attack);
|
||
checkOppPlayers(res.data.oppPlayers);
|
||
oppPlayers = res.data.oppPlayers;
|
||
expect(res.data.challengeCnt).to.equal(challengeCnt - 1);
|
||
checkTimeStamp(res.data.challengeRefTime, 10, true);
|
||
|
||
done();
|
||
});
|
||
});
|
||
|
||
it('获得排行榜', function(done) {
|
||
pinusClient.request('battle.pvpHandler.getRank', { }, (res) => {
|
||
checkSuccessResponse(res);
|
||
expect(res.data.ranks).to.be.a('array');
|
||
res.data.ranks.forEach(rank => {
|
||
checkRank(rank);
|
||
});
|
||
checkRank(res.data.myRank);
|
||
done();
|
||
});
|
||
});
|
||
|
||
function debugResetBox(cb) {
|
||
pinusClient.request('battle.pvpHandler.debugResetBox', { magicWord: DEBUG_MAGIC_WORD }, (res) => {
|
||
receivedBox = [];
|
||
hisScore = 5000;
|
||
cb();
|
||
})
|
||
}
|
||
|
||
it('领取巅峰之路奖励', function(done) {
|
||
let id = Math.floor(Math.random() * 10);
|
||
if(receivedBox.includes(id) || hisScore < 5000) {
|
||
debugResetBox(() => {
|
||
receiveBox();
|
||
})
|
||
} else {
|
||
receiveBox();
|
||
}
|
||
|
||
function receiveBox() {
|
||
receiveSingleBox(id, 1, () => {
|
||
receiveSingleBox(id, 2, () => {
|
||
done();
|
||
});
|
||
})
|
||
}
|
||
|
||
function receiveSingleBox(id, count, cb) {
|
||
pinusClient.request('battle.pvpHandler.receiveBox', { id }, (res) => {
|
||
if(count == 1) {
|
||
checkSuccessResponse(res);
|
||
checkDisplayItems(res.data.goods);
|
||
expect(res.data.receivedBox).to.be.a('array');
|
||
res.data.receivedBox.forEach(box => {
|
||
expect(box).to.be.a('number');
|
||
});
|
||
} else {
|
||
expect(res.code).to.equal(20804)
|
||
}
|
||
cb()
|
||
});
|
||
}
|
||
});
|
||
|
||
|
||
it('获得战报', function(done) {
|
||
pinusClient.request('battle.pvpHandler.getRec', { }, (res) => {
|
||
checkSuccessResponse(res);
|
||
expect(res.data.list).to.be.a('array');
|
||
res.data.list.forEach(rec => {
|
||
expect(rec.roleId1).to.be.a('string');
|
||
expect(rec.roleId2).to.be.a('string');
|
||
expect(rec.warId).to.be.a('number');
|
||
checkRecInfo(rec.attackInfo);
|
||
checkRecInfo(rec.defenseInfo);
|
||
});
|
||
done();
|
||
});
|
||
});
|
||
|
||
});
|
||
|
||
function checkRank(rank) {
|
||
expect(rank.rank).to.be.a('number');
|
||
expect(rank.roleId).to.be.a('string');
|
||
expect(rank.roleName).to.be.a('string');
|
||
expect(rank.head).to.be.a('number');
|
||
expect(rank.frame).to.be.a('number');
|
||
expect(rank.spine).to.be.a('number');
|
||
expect(rank.num).to.be.a('number');
|
||
expect(rank.title).to.be.a('number');
|
||
expect(rank.lv).to.be.a('number');
|
||
expect(rank.ce).to.be.a('number');
|
||
}
|
||
|
||
function getData(pinusClient, seasonEnd: boolean, cb) {
|
||
|
||
pinusClient.request('battle.pvpHandler.getData', {}, (res) => {
|
||
checkSuccessResponse(res);
|
||
expect(res.data.seasonNum).to.be.a('number');
|
||
expect(res.data.seasonEndTime).to.be.a('number');
|
||
expect(res.data.myRank).to.be.a('number');
|
||
|
||
checkOppPlayers(res.data.oppPlayers);
|
||
checkDefense(res.data.defense);
|
||
checkAttack(res.data.attack);
|
||
|
||
expect(res.data.score).to.be.a('number');
|
||
expect(res.data.winStreakNum).to.be.a('number');
|
||
|
||
expect(res.data.refOppCnt).to.be.a('number');
|
||
expect(res.data.setAttackCnt).to.be.a('number');
|
||
expect(res.data.buyAttackCnt).to.be.a('number');
|
||
expect(res.data.challengeCnt).to.be.a('number');
|
||
checkTimeStamp(res.data.challengeRefTime, 10, true);
|
||
|
||
expect(res.data.receivedBox).to.be.a('array');
|
||
res.data.receivedBox.forEach(box => {
|
||
expect(box).to.be.a('number');
|
||
});
|
||
expect(res.data.hisScore).to.be.a('number');
|
||
expect(res.data.heroScores).to.be.a('array');
|
||
res.data.heroScores.forEach(heroScore => {
|
||
expect(heroScore.isDefense).to.be.a('boolean');
|
||
expect(heroScore.hid).to.be.a('number');
|
||
expect(heroScore.score).to.be.a('number');
|
||
});
|
||
expect(res.data.isFirstEntry).to.be.a('boolean');
|
||
if (seasonEnd) {
|
||
checkSeasonResult(res.data.seasonResult);
|
||
}
|
||
cb(res.data);
|
||
});
|
||
}
|
||
|
||
function checkOppPlayers(oppPlayers) {
|
||
expect(oppPlayers).to.be.a('array');
|
||
oppPlayers.forEach(player => {
|
||
expect(player.pos).to.be.a('number');
|
||
expect(player.roleId).to.be.a('string');
|
||
expect(player.roleName).to.be.a('string');
|
||
expect(player.head).to.be.a('number');
|
||
expect(player.frame).to.be.a('number');
|
||
expect(player.spine).to.be.a('number');
|
||
expect(player.lv).to.be.a('number');
|
||
expect(player.pLv).to.be.a('number');
|
||
expect(player.defCe).to.be.a('number');
|
||
expect(player.addScore).to.be.a('number');
|
||
expect(player.plusScore).to.be.a('number');
|
||
expect(player.rankLv).to.be.a('number');
|
||
});
|
||
}
|
||
|
||
function checkDefense(defense) {
|
||
if (!!defense) {
|
||
expect(defense).to.be.an('object');
|
||
expect(defense.warId).to.be.a('number');
|
||
expect(defense.buff).to.be.a('number');
|
||
expect(defense.heroes).to.be.an('array');
|
||
defense.heroes.forEach(hero => {
|
||
expect(hero.actorId).to.be.a('number');
|
||
expect(hero.ai).to.be.a('number');
|
||
expect(hero.dataId).to.be.a('number');
|
||
expect(hero.order).to.be.a('number');
|
||
});
|
||
expect(defense.score).to.be.a('number');
|
||
expect(defense.pLv).to.be.a('number');
|
||
expect(defense.ce).to.be.a('number');
|
||
if (defense.heroes.length > 0) {
|
||
expect(defense.ce).not.equal(0);
|
||
}
|
||
}
|
||
}
|
||
|
||
function checkAttack(attack) {
|
||
if (!!attack) {
|
||
expect(attack).to.be.an('object');
|
||
expect(attack.heroes).to.be.an('array');
|
||
attack.heroes.forEach(hero => {
|
||
expect(hero.actorId).to.be.a('number');
|
||
if (!!hero.order) {
|
||
expect(hero.order).to.be.a('number');
|
||
}
|
||
});
|
||
expect(attack.score).to.be.a('number');
|
||
|
||
}
|
||
}
|
||
|
||
function checkSeasonResult(resultRecord) {
|
||
expect(resultRecord).to.be.a('object');
|
||
checkOldSeasonData(resultRecord.oldSeasonData);
|
||
expect(resultRecord.heroGoods).to.be.an('array');
|
||
resultRecord.heroGoods.forEach(obj => {
|
||
expect(obj.hid).to.be.a('number');
|
||
expect(obj.id).to.be.a('number');
|
||
expect(obj.count).to.be.a('number');
|
||
})
|
||
expect(resultRecord.rankGoods).to.be.an('array');
|
||
resultRecord.rankGoods.forEach(obj => {
|
||
expect(obj.id).to.be.a('number');
|
||
expect(obj.count).to.be.a('number');
|
||
})
|
||
}
|
||
|
||
function checkOldSeasonData(oldSeasonData) {
|
||
expect(oldSeasonData).to.be.an('object');
|
||
expect(oldSeasonData.score).to.be.a('number');
|
||
expect(oldSeasonData.heroScores).to.be.an('array');
|
||
oldSeasonData.heroScores.forEach(heroScore => {
|
||
expect(heroScore.hid).to.be.a('number');
|
||
expect(heroScore.score).to.be.a('number');
|
||
});
|
||
expect(oldSeasonData.seasonNum).to.be.a('number');
|
||
checkTimeStamp(oldSeasonData.seasonEndTime, 10, true);
|
||
expect(oldSeasonData.rankLv).to.be.a('number');
|
||
}
|
||
|
||
|
||
function checkRecInfo(info) {
|
||
expect(info.roleId).to.be.a('string');
|
||
expect(info.roleName).to.be.a('string');
|
||
expect(info.lv).to.be.a('number');
|
||
expect(info.spine).to.be.a('number');
|
||
expect(info.head).to.be.a('number');
|
||
expect(info.frame).to.be.a('number');
|
||
expect(info.title).to.be.a('number');
|
||
expect(info.ce).to.be.a('number');
|
||
expect(info.isSuccess).to.be.a('boolean');
|
||
expect(info.score).to.be.a('number');
|
||
checkRecHero(info.heroes);
|
||
}
|
||
|
||
function checkRecHero(heroes) {
|
||
expect(heroes).to.be.an('array');
|
||
heroes.forEach(hero => {
|
||
expect(hero.hid).to.be.a('number');
|
||
expect(hero.skinId).to.be.a('number');
|
||
expect(hero.quality).to.be.a('number');
|
||
expect(hero.star).to.be.a('number');
|
||
expect(hero.colorStar).to.be.a('number');
|
||
expect(hero.lv).to.be.a('number');
|
||
expect(hero.damage).to.be.a('number');
|
||
expect(hero.heal).to.be.a('number');
|
||
expect(hero.underDamage).to.be.a('number');
|
||
})
|
||
} |