/* * Copyright 2000-2006 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.communicator.core.impl.users; import jetbrains.communicator.BaseTestCase; import jetbrains.communicator.core.IDEtalkEvent; import jetbrains.communicator.core.IDEtalkListener; import jetbrains.communicator.core.TestFactory; import jetbrains.communicator.core.transport.EventFactory; import jetbrains.communicator.core.users.GroupEvent; import jetbrains.communicator.core.users.User; import jetbrains.communicator.core.users.UserEvent; import jetbrains.communicator.core.users.UserModel; import jetbrains.communicator.mock.MockTransport; import jetbrains.communicator.mock.MockUser; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author Kir Maximov */ public class UserModelImplTest extends BaseTestCase { private UserModel myUserModel; private MyIDEtalkListener myListener; @Override protected void setUp() throws Exception { super.setUp(); myUserModel = TestFactory.createUserListWithUsers(this); myListener = new MyIDEtalkListener(); getBroadcaster().addListener(myListener); } @Override protected void tearDown() throws Exception { myListener.clear(); getBroadcaster().removeListener(myListener); super.tearDown(); } public void testAllUsers() throws Exception { User[] all = myUserModel.getAllUsers(); assertUser("group1", "aaa", all[0]); assertUser("group1", "ccc", all[1]); assertUser("group2", "zzz", all[2]); assertUser("group2", "aaaa", all[3]); assertUser("group2", "bbb", all[4]); assertSame(all, myUserModel.getAllUsers()); all[0].setDisplayName("another name", myUserModel); assertNotSame(all, myUserModel.getAllUsers()); all = myUserModel.getAllUsers(); getBroadcaster().fireEvent(new UserEvent.Offline(all[0])); assertNotSame(all, myUserModel.getAllUsers()); all = myUserModel.getAllUsers(); myUserModel.addUser(myUserModel.createUser("a", MockTransport.NAME)); assertNotSame(all, myUserModel.getAllUsers()); all = myUserModel.getAllUsers(); myUserModel.removeUser(all[0]); assertNotSame(all, myUserModel.getAllUsers()); } public void testReordering() throws Exception { User[] all = myUserModel.getAllUsers(); all[0].setDisplayName("zzz", myUserModel); all = myUserModel.getAllUsers(); assertUser("group1", "ccc", all[0]); assertUser("group1", "zzz", all[1]); } public void testGrouping() throws Exception { String[] groups = myUserModel.getGroups(); assertEquals("Wrong groups", Arrays.asList(new Object[]{"group1", "group2"}), Arrays.asList(groups)); } public void testAddGroupExplicitly() throws Exception { myUserModel.addGroup(null); myUserModel.addGroup(""); myUserModel.addGroup(" group15 "); assertEquals("group15", ((GroupEvent.Added) myListener.getEvents()[0]).getGroup()); myListener.assertLog("Group adding message expected", "BeforeAfter"); // add again myUserModel.addGroup(" group15 "); myListener.assertLog("No events expected - already in model", ""); String[] groups = myUserModel.getGroups(); assertEquals("Wrong groups", Arrays.asList(new Object[]{"group1", "group15", "group2"}), Arrays.asList(groups)); } public void testRemoveGroups() throws Exception { assertFalse(myUserModel.removeGroup("group")); myUserModel.addGroup("added1"); myUserModel.addGroup("added2"); final MockUser addedUser = new MockUser("some addedUser", "added2"); myUserModel.addUser(addedUser); assertTrue("Do not contain users, can be removed", myUserModel.removeGroup("added1")); assertTrue("Contains users, removed including users", myUserModel.removeGroup("group1")); assertEquals("Wrong groups after deletion", Arrays.asList(new Object[]{"added2", "group2"}), Arrays.asList(myUserModel.getGroups())); } public void testRemoveUserFromImplicitGroup() throws Exception { User[] users = myUserModel.getUsers("group1"); for (int i = 0; i < users.length; i++) { myUserModel.removeUser(users[i]); } assertEquals("Implicit group should remain", Arrays.asList(new Object[]{"group1", "group2"}), Arrays.asList(myUserModel.getGroups())); } public void testRemoveGroups_Event() throws Exception { myUserModel.addGroup("AGroup"); myListener.clear(); myUserModel.removeGroup("AGroup"); assertEquals("AGroup", ((GroupEvent.Removed) myListener.getEvents()[0]).getGroup()); myListener.assertLog("Group adding message expected", "BeforeAfter"); myUserModel.removeGroup("AGroup"); myListener.assertLog("Not in model - no event expected", ""); } public void testGroupMembers() throws Exception { assertEquals(0, myUserModel.getUsers("dfasdff").length); User[] group1 = myUserModel.getUsers("group1"); assertEquals(2, group1.length); assertEquals("aaa", group1[0].getName()); assertEquals("ccc", group1[1].getName()); User[] group2 = myUserModel.getUsers("group2"); assertEquals(3, group2.length); assertEquals("Online user should go first", "zzz", group2[0].getName()); assertEquals("aaaa", group2[1].getName()); assertEquals("bbb", group2[2].getName()); } public void testRenameGroup() throws Exception { myUserModel.renameGroup("group1", "new group"); assertTrue(myListener.getEvents()[0] instanceof GroupEvent.Updated); myListener.assertLog("1 event expected", "BeforeAfter"); } public void testRenameGroup_ExplicitlyAdded() throws Exception { myUserModel.addGroup("new group"); myUserModel.renameGroup("new group", "new group1"); assertEquals("Wrong groups after rename", Arrays.asList(new Object[]{"group1", "group2", "new group1"}), Arrays.asList(myUserModel.getGroups())); } public void testStacktrace() throws Exception { int hadUsers = myUserModel.getAllUsers().length; getBroadcaster().fireEvent(EventFactory.createStacktraceEvent(new MockTransport(), "aaaaaa", "statcktrace", "comment")); assertEquals("Another user should be added", hadUsers + 1, myUserModel.getAllUsers().length); User addedUser = myUserModel.getAllUsers()[0]; assertEquals("aaaaaa", addedUser.getName()); } public void testAddUser() throws Exception { MockUser user = new MockUser("user", null); myUserModel.addUser(user); assertTrue(myUserModel.hasUser(user)); myListener.assertLog("Expect messages", "BeforeAfter"); myUserModel.addUser(user); myListener.assertLog("Expect no messages when already in model", ""); } public void testRemoveUser() throws Exception { MockUser user = new MockUser("user", null); myUserModel.addUser(user); myListener.clear(); myUserModel.removeUser(user); myListener.assertLog("Expect messages", "BeforeAfter"); myUserModel.removeUser(user); myListener.assertLog("Expect no messages when not in model", ""); } private void assertUser(String group, String name, User user) { assertEquals(group, user.getGroup()); assertEquals(name, user.getDisplayName()); } public void testDeleteUserFromList() throws Exception { for (int i = 5; i > 0; i --) { assertEquals(i, myUserModel.getAllUsers().length); myUserModel.removeUser(myUserModel.getAllUsers()[0]); assertEquals(i - 1, myUserModel.getAllUsers().length); } } private static class MyIDEtalkListener implements IDEtalkListener { private String myLog; private final List<IDEtalkEvent> myEvents = new ArrayList<IDEtalkEvent>(); public MyIDEtalkListener() { clear(); } public void clear() { myLog = ""; myEvents.clear(); } public void assertLog(String msg, String expected) { assertEquals("Wrong event sequence: " + msg, expected, myLog); clear(); } public IDEtalkEvent[] getEvents() { return myEvents.toArray(new IDEtalkEvent[myEvents.size()]); } @Override public void beforeChange(IDEtalkEvent event) { myEvents.add(event); myLog += "Before"; } @Override public void afterChange(IDEtalkEvent event) { myLog += "After"; } } }