package com.faforever.client.chat;
import com.faforever.client.fx.PlatformService;
import com.faforever.client.i18n.I18n;
import com.faforever.client.notification.NotificationService;
import com.faforever.client.player.PlayerService;
import com.faforever.client.preferences.ChatPrefs;
import com.faforever.client.preferences.Preferences;
import com.faforever.client.preferences.PreferencesService;
import com.faforever.client.test.AbstractPlainJavaFxTest;
import com.faforever.client.uploader.ImageUploadService;
import com.faforever.client.user.UserService;
import com.faforever.client.util.TimeService;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.scene.control.TabPane;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.mockito.Mock;
import org.testfx.util.WaitForAsyncUtils;
import java.util.concurrent.ThreadPoolExecutor;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class ChannelTabControllerTest extends AbstractPlainJavaFxTest {
public static final String USER_NAME = "junit";
private static final String CHANNEL_NAME = "#testChannel";
@Rule
public TemporaryFolder tempDir = new TemporaryFolder();
@Mock
private ChatService chatService;
@Mock
private UserService userService;
@Mock
private ImageUploadService imageUploadService;
@Mock
private PlayerService playerService;
@Mock
private TimeService timeService;
@Mock
private PreferencesService preferencesService;
@Mock
private PlatformService platformService;
@Mock
private Preferences preferences;
@Mock
private ChatPrefs chatPrefs;
@Mock
private I18n i18n;
@Mock
private NotificationService notificationService;
@Mock
private ThreadPoolExecutor threadPoolExecutor;
@Mock
private FilterUserController filterUserController;
@Mock
private Stage stage;
@Mock
private AutoCompletionHelper autoCompletionHelper;
private ChannelTabController instance;
@Before
public void setUp() throws Exception {
instance = loadController("channel_tab.fxml");
instance.chatService = chatService;
instance.userService = userService;
instance.imageUploadService = imageUploadService;
instance.playerService = playerService;
instance.timeService = timeService;
instance.notificationService = notificationService;
instance.preferencesService = preferencesService;
instance.platformService = platformService;
instance.i18n = i18n;
instance.threadPoolExecutor = threadPoolExecutor;
instance.filterUserController = filterUserController;
instance.autoCompletionHelper = autoCompletionHelper;
instance.stage = getStage();
ObjectProperty<ChatColorMode> chatColorModeProperty = new SimpleObjectProperty<>(ChatColorMode.DEFAULT);
when(preferencesService.getPreferences()).thenReturn(preferences);
when(preferencesService.getCacheDirectory()).thenReturn(tempDir.getRoot().toPath());
when(preferences.getThemeName()).thenReturn("default");
when(preferences.getChat()).thenReturn(chatPrefs);
when(chatPrefs.getZoom()).thenReturn(1d);
when(userService.getUsername()).thenReturn(USER_NAME);
when(chatPrefs.chatColorModeProperty()).thenReturn(chatColorModeProperty);
when(filterUserController.getRoot()).thenReturn(new Pane());
instance.postConstruct();
TabPane tabPane = new TabPane();
tabPane.getTabs().add(instance.getRoot());
WaitForAsyncUtils.waitForAsyncFx(5000, () -> getRoot().getChildren().add(tabPane));
}
@Test
public void testGetMessagesWebView() throws Exception {
assertNotNull(instance.getMessagesWebView());
}
@Test
public void testGetMessageTextField() throws Exception {
assertNotNull(instance.getMessageTextField());
}
@Test
public void testSetChannelName() throws Exception {
Channel channel = new Channel(CHANNEL_NAME);
instance.setChannel(channel);
verify(chatService).addUsersListener(eq(CHANNEL_NAME), any());
}
@Test
public void testGetMessageCssClassModerator() throws Exception {
Channel channel = new Channel(CHANNEL_NAME);
String playerName = "junit";
PlayerInfoBean playerInfoBean = new PlayerInfoBean(playerName);
playerInfoBean.moderatorForChannelsProperty().set(FXCollections.observableSet(CHANNEL_NAME));
instance.setChannel(channel);
when(playerService.getPlayerForUsername(playerName)).thenReturn(playerInfoBean);
assertEquals(instance.getMessageCssClass(playerName), ChannelTabController.CSS_CLASS_MODERATOR);
}
@Test
public void onSearchFieldCloseTest() throws Exception {
instance.onSearchFieldClose();
assertTrue(!instance.searchField.isVisible());
assertEquals("", instance.searchField.getText());
}
@Test
public void onKeyReleasedTestEscape() throws Exception {
KeyEvent keyEvent = new KeyEvent(null, null, null, null, null, KeyCode.ESCAPE, false, false, false, false);
assertTrue(!instance.searchField.isVisible());
instance.onKeyReleased(keyEvent);
assertTrue(!instance.searchField.isVisible());
assertEquals("", instance.searchField.getText());
}
@Test
public void onKeyReleasedTestCtrlF() throws Exception {
KeyEvent keyEvent = new KeyEvent(null, null, null, null, null, KeyCode.F, false, true, false, false);
assertTrue(!instance.searchField.isVisible());
instance.onKeyReleased(keyEvent);
assertTrue(instance.searchField.isVisible());
assertEquals("", instance.searchField.getText());
instance.onKeyReleased(keyEvent);
assertTrue(!instance.searchField.isVisible());
}
}