import resources.Algo;
import org.junit.jupiter.api.Test;
import java.util.AbstractMap;
import static controls.ConstantMethods.printAlgoState;
import static org.junit.jupiter.api.Assertions.*;
public class AlgoTest {
@Test
void testAlgo(){
Algo algo = new Algo();
}
/**
* ゲーム開始時0から10のカードで構成されたデッキとそこから2枚引いて構成された各プレイヤーの手札が存在する
*/
@Test
void testInitialize() {
Algo algo = new Algo();
printAlgoState(algo);
assertEquals(2, algo.getHandsA().size());
assertEquals(2, algo.getHandsB().size());
}
/**
* Aはデッキから引いたカードでアタックが成功してBのカードが1枚表になる
*/
@Test
void testAttack() {
//初期化
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);
algo.drawAndAttackA(target, guess);
printAlgoState(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());
}
/**
* Aはデッキから引いたカードでアタックが失敗してAのデッキに表のカードが追加される
*/
@Test
void tes() {
//初期化
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);
algo.drawAndAttackA(target, guess);
printAlgoState(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());
}
/**
* Bはデッキから引いたカードでアタックが成功してAのカードが1枚表になる
*/
@Test
void testAtk() {
//初期化
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);
algo.drawAndAttackB(target, guess);
printAlgoState(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());
}
/**
* Aは手札から選んだカードでアタックが成功してBのカードが1枚表になる
*/
@Test
void testAtk2() {
//初期化
Algo algo = new Algo();
//正解のカードを選択させるための変数
var guess = algo.getHandsB().get(0).getKey();
var target = 0;
var attacker = 0;
//テスト対象メソッド
//algo.selectA(guess, attacker, target);
algo.selectAndAttackA(attacker, target, guess);
printAlgoState(algo);
//Aによってアタックを成功されたBのカードが表になっているか
assertEquals(true, algo.getHandsB().get(target).getValue());
//Aのアタックを成功しているので,使用したカードが表になっていないか
assertEquals(false, algo.getHandsA().get(attacker).getValue());
}
/**
* Aは手札から選んだカードでのアタックが失敗し選んだカードが表になる
*/
@Test
void testAtk3() {
//初期化
Algo algo = new Algo();
//間違いのカードを選択させるための変数
var target = 0;
var attacker = 0;
var guess = algo.getHandsB().get(target).getKey()+1;
//テスト対象メソッド
// algo.selectA(guess, attacker, target);
algo.selectAndAttackA(attacker, target, guess);
printAlgoState(algo);
//Aによってアタックを成功されたBのカードが表になっていないか
assertEquals(false, algo.getHandsB().get(target).getValue());
//Aのアタックが失敗しているので,使用したカードが表になっているか
assertEquals(true, algo.getHandsA().get(attacker).getValue());
}
@Test
void playB() {
Algo algo = new Algo();
algo.setDeck(0, 1, 2, 3, 4, 5, 6);
algo.distributeHands();
printAlgoState(algo);
}
@Test
void playA() {
Algo algo = new Algo();
algo.distributeHands();
var guess = algo.getHandsB().get(0).getKey();
var target = 0;
var attacker = 0;
printViewA(algo);
//Aはカードを1枚引き,アタックを成功させる.
//Bはアタックされたカードを表にする.
algo.drawAndAttackA(target, guess);
printViewA(algo);
//Bはカードを1枚引き,アタックが失敗する.
//Bはアタックに使用したカードを表にする.
algo.drawAndAttackB(target, guess);
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.drawAndAttackA(tar, gue);
printViewA(algo);
}
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);
}
}