package utils;
import com.github.masahitojp.botan.Botan;
import com.github.masahitojp.botan.message.BotanMessage;
import com.github.masahitojp.botan.message.BotanMessageSimple;
import mockit.Mock;
import mockit.MockUp;
import utils.pattern.RegexTestPattern;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
/**
* HandlersのUnitTest用のUtilityクラス
*/
public class HandlersTestUtils {
public HandlersTestUtils() {
}
/**
* Handlersで登録した正規表現文字列パターンで処理が反応することのテスト
* @param botan Botan本体
* @param list チェック対象
*/
public void regexTest(final Botan botan, final List<RegexTestPattern> list) {
Collections.unmodifiableList(list)
.stream()
.forEach(testPattern -> {
// before: set mock
final AtomicInteger times = new AtomicInteger();
MockUp<Consumer<BotanMessage>> spy = new MockUp<Consumer<BotanMessage>>() {
@Mock
@SuppressWarnings("unused")
public void accept(BotanMessage message) {
times.incrementAndGet();
}
};
botan.getHandlers()
.stream()
.filter(handler -> testPattern.getDescription().equals("") || handler.getDescription().equals(testPattern.getDescription()))
.forEach(handler -> handler.setHandle(spy.getMockInstance()));
// given: handlerが登録されている場合
// when: 規定のパターンのメッセージを受け取った時に
botan.receive(new BotanMessageSimple(testPattern.getMessage()));
// then: 想定の回数分処理が呼ばれる
assertThat(times.get(), is(testPattern.getInvocations()));
});
}
public void replyTest(final Botan botan, final String receivedMessage, final String replyMessage) {
// before: set mock for verify
final AtomicReference<String> replayMessage = new AtomicReference<>();
new MockUp<BotanMessage>() {
@Mock
@SuppressWarnings("unused")
public void reply(String message) {
replayMessage.set(message);
}
};
// given: handlerが登録されている場合
// when: 規定のパターンのメッセージを受け取った時に
botan.receive(new BotanMessageSimple(receivedMessage));
// then: 想定されたメッセージが返信される
assertThat(replayMessage.get(), is(replyMessage));
}
}