import models.Algo;
import org.junit.jupiter.api.Test;
import java.util.AbstractMap;
import static org.junit.jupiter.api.Assertions.*;
class AlgoTest {
@Test
void ゲーム開始時0から11のカードで構成されたデッキとそこから2枚引いて構成された各プレイヤーの手札が存在する() {
Algo algo = new Algo();
printState(algo);
assertEquals(2, algo.getHandsA().size());
assertEquals(2, algo.getHandsB().size());
}
@Test
void Aはデッキから引いたカードでアタックが成功してBのカードが1枚表になる() {
//初期化
Algo algo = new Algo();
var iniHandsANum = algo.getHandsA().size();
var initDeckNum=algo.getDeck().size();
//正解のカードを選択させるための変数
var guess = algo.getHandsB().get(0).getKey();
var target = 0;
//テスト対象メソッド
algo.drawA(guess, target);
printState(algo);
//Aはデッキから引いているので,実行前と比べて枚数が1枚増えているか
assertEquals(iniHandsANum+1,algo.getHandsA().size());
//Aによってアタックを成功されたBのカードが表になっているか
assertEquals(true, algo.getHandsB().get(0).getValue());
//Aがデッキから引いているので,デッキの枚数が1枚減っているか
assertEquals(initDeckNum-1,algo.getDeck().size());
}
@Test
void Aはデッキから引いたカードでアタックが失敗してAのデッキに表のカードが追加される() {
//初期化
Algo algo = new Algo();
var iniHandsANum = algo.getHandsA().size();
var initDeckNum=algo.getDeck().size();
//正解でないカードを選択させるための変数
var guess = algo.getHandsB().get(0).getKey()+1;
var target = 0;
var top = algo.getDeck().get(0);
//テスト対象メソッド
algo.drawA(guess, target);
printState(algo);
//Aはデッキから引いているので,実行前と比べて枚数が1枚増えている
assertEquals(iniHandsANum+1,algo.getHandsA().size());
//アタックの失敗でBのカードが表になっていない
assertEquals(false, algo.getHandsB().get(0).getValue());
//アタックが失敗したので,使用したカードが表になっている
assertTrue(algo.getHandsA().contains(new AbstractMap.SimpleEntry<>(top.getKey(),true)));
//Aがデッキから引いているので,デッキの枚数が1枚減っている
assertEquals(initDeckNum-1,algo.getDeck().size());
}
@Test
void Bはデッキから引いたカードでアタックが成功してAのカードが1枚表になる() {
//初期化
Algo algo = new Algo();
var iniHandsBNum = algo.getHandsB().size();
var initDeckNum=algo.getDeck().size();
//正解のカードを選択させるための変数
var guess = algo.getHandsA().get(0).getKey();
var target = 0;
//テスト対象メソッド
algo.drawB(guess, target);
printState(algo);
//Aはデッキから引いているので,実行前と比べて枚数が1枚増えているか
assertEquals(iniHandsBNum+1,algo.getHandsB().size());
//Aによってアタックを成功されたBのカードが表になっているか
assertEquals(true, algo.getHandsA().get(0).getValue());
//Aがデッキから引いているので,デッキの枚数が1枚減っているか
assertEquals(initDeckNum-1,algo.getDeck().size());
}
@Test
void Aは手札から選んだカードでアタックが成功してBのカードが1枚表になる() {
//初期化
Algo algo = new Algo();
//正解のカードを選択させるための変数
var guess = algo.getHandsB().get(0).getKey();
var target = 0;
var attacker = 0;
//テスト対象メソッド
algo.selectA(guess, attacker, target);
printState(algo);
//Aによってアタックを成功されたBのカードが表になっているか
assertEquals(true, algo.getHandsB().get(target).getValue());
//Aのアタックを成功しているので,使用したカードが表になっていないか
assertEquals(false, algo.getHandsA().get(attacker).getValue());
}
@Test
void Aは手札から選んだカードでのアタックが失敗し選んだカードが表になる() {
//初期化
Algo algo = new Algo();
//間違いのカードを選択させるための変数
var target = 0;
var attacker = 0;
var guess = algo.getHandsB().get(target).getKey()+1;
//テスト対象メソッド
algo.selectA(guess, attacker, target);
printState(algo);
//Aによってアタックを成功されたBのカードが表になっていないか
assertEquals(false, algo.getHandsB().get(target).getValue());
//Aのアタックが失敗しているので,使用したカードが表になっているか
assertEquals(true, algo.getHandsA().get(attacker).getValue());
}
@Test
void playA(){
Algo algo = new Algo();
//正解のカードを選択させるための変数
var guess = algo.getHandsB().get(0).getKey();
var target = 0;
var attacker = 0;
printViewA(algo);
//Aはカードを1枚引き,アタックを成功させる.
//Bはアタックされたカードを表にする.
algo.drawA(guess, target);
printViewA(algo);
//Bはカードを1枚引き,アタックが失敗する.
//Bはアタックに使用したカードを表にする.
algo.drawB(guess,target);
printViewA(algo);
int tar=0, gue=0;
for(int i=0;i<algo.getHandsB().size();i++){
if(algo.getHandsB().get(i).getValue()==false){
tar=i;
gue=algo.getHandsB().get(i).getKey();
break;
}
}
//Aはカードを1枚引き,アタックを成功させる.
//Bは全てのカードが表になるので,ゲームが終了する
algo.drawA(gue, tar);
printViewA(algo);
}
void printState(Algo algo){
String s="";
s+="deck:\n";
for(var i : algo.getDeck()){
s+="\t"+i.getKey()+"\t"+(i.getValue()?"open":"closed")+"\n";
}
s+="handsA:\n";
for(var i : algo.getHandsA()){
s+="\t"+i.getKey()+"\t"+(i.getValue()?"open":"closed")+"\n";
}
s+="handsB:\n";
for(var i : algo.getHandsB()){
s+="\t"+i.getKey()+"\t"+(i.getValue()?"open":"closed")+"\n";
}
s+="\n";
if(algo.getLoseA())s+="B win.\n";
else if(algo.getLoseB())s+="A win.\n";
System.out.println(s);
}
void printViewA(Algo algo){
String s="--------------\n";
s+="\thandsB:\t";
for(var b : algo.getHandsB()){
s+=(b.getValue()?"["+b.getKey()+"+]":"[ -]");
}
s+="\ndeck: "+algo.getDeck().size()+"\n";
s+="\thandsA:\t";
for(var a : algo.getHandsA()){
s+="["+a.getKey()+(a.getValue()?"+":"-")+"]";
}
s+="\n\n";
if(algo.getLoseA())s+="B win.\n";
else if(algo.getLoseB())s+="A win.\n";
System.out.println(s);
}
void printViewB(Algo algo){
String s="";
s+="\thandsA:\t";
for(var a : algo.getHandsA()){
s+=(a.getValue()?"["+a.getKey()+"+]":"[ -]");
}
s+="\n\t\t\t\t\tdeck: "+algo.getDeck().size()+"\n";
s+="\thandsB:\t";
for(var b : algo.getHandsB()){
s+="["+b.getKey()+(b.getValue()?"+":"-")+"]";
}
System.out.println(s);
}
}