// Copyright 2012 Google Inc. All Rights Reserved. // // 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 com.google.collide.shared.util; import com.google.collide.dto.WorkspaceInfo; import com.google.collide.dto.server.DtoServerImpls.MockWorkspaceInfoImpl; import com.google.collide.dto.server.DtoServerImpls.WorkspaceInfoImpl; import com.google.collide.json.shared.JsonArray; import com.google.collide.shared.util.WorkspaceUtils.WorkspaceNode; import junit.framework.TestCase; import java.util.Comparator; /** * Tests for {@link WorkspaceUtils}. * */ public class WorkspaceUtilsTests extends TestCase { public void testGetWorkspaceHierarchy() { // Create a list of workspaces. JsonArray<WorkspaceInfo> workspaces = JsonCollections.createArray(); WorkspaceInfo a = makeWorkspace("a", null); WorkspaceInfo b = makeWorkspace("b", null); WorkspaceInfo aa = makeWorkspace("aa", a); WorkspaceInfo ab = makeWorkspace("ab", a); WorkspaceInfo ac = makeWorkspace("ac", a); WorkspaceInfo aaa = makeWorkspace("aaa", aa); WorkspaceInfo aab = makeWorkspace("aab", aa); WorkspaceInfo aac = makeWorkspace("aac", aa); workspaces.add(aa); workspaces.add(ab); workspaces.add(aab); workspaces.add(ac); workspaces.add(aac); workspaces.add(b); workspaces.add(aaa); workspaces.add(a); // Add an element with a parent that is not mapped. WorkspaceInfo zaa = makeWorkspace("zaa", makeWorkspace("unmapped", null)); workspaces.add(zaa); // Create an unsorted hierarchy. JsonArray<WorkspaceNode> roots = WorkspaceUtils.getWorkspaceHierarchy(workspaces, new Comparator<WorkspaceInfo>() { @Override public int compare(WorkspaceInfo o1, WorkspaceInfo o2) { return o1.getId().compareTo(o2.getId()); } }); assertEquals(3, roots.size()); assertEquals(a, roots.get(0).getWorkspace()); assertEquals(b, roots.get(1).getWorkspace()); assertEquals(zaa, roots.get(2).getWorkspace()); // b and daa are empty parents. assertEquals(0, roots.get(1).getChildCount()); assertEquals(0, roots.get(2).getChildCount()); // a contains unsorted children. assertChildrenUnordered(roots.get(0), aa, ab, ac); // aa contains unsorted children. assertChildrenUnordered(roots.get(0).getChild(0), aaa, aab, aac); } /** * Test {@link WorkspaceUtils#getWorkspaceHierarchy} with a map * of root workspaces. */ public void testGetWorkspaceHierarchyAllRoots() { JsonArray<WorkspaceInfo> workspaces = JsonCollections.createArray(); workspaces.add(makeWorkspace("b", null)); workspaces.add(makeWorkspace("a", null)); workspaces.add(makeWorkspace("c", null)); JsonArray<WorkspaceNode> roots = WorkspaceUtils.getWorkspaceHierarchy(workspaces); assertEquals(3, roots.size()); for (int i = 0; i < 3; i++) { assertEquals(0, roots.get(i).getChildCount()); } // Due to the nature of maps, the nodes are not in a specified order. } /** * Test {@link WorkspaceUtils#getWorkspaceHierarchy} if one of * the workspaces refers to a parent that is not mapped. */ public void testGetWorkspaceHierarchyNonExistentParent() { JsonArray<WorkspaceInfo> workspaces = JsonCollections.createArray(); WorkspaceInfo unmapped = makeWorkspace("unmapped", null); workspaces.add(makeWorkspace("b", unmapped)); workspaces.add(makeWorkspace("a", null)); workspaces.add(makeWorkspace("c", null)); JsonArray<WorkspaceNode> roots = WorkspaceUtils.getWorkspaceHierarchy(workspaces); assertEquals(3, roots.size()); for (int i = 0; i < 3; i++) { assertEquals(0, roots.get(i).getChildCount()); } // Due to the nature of maps, the nodes are not in a specified order. } public void testGetWorkspaceHierarchySorted() { // Create a list of workspaces. JsonArray<WorkspaceInfo> workspaces = JsonCollections.createArray(); WorkspaceInfo a = makeWorkspace("a", null); WorkspaceInfo b = makeWorkspace("b", null); WorkspaceInfo aa = makeWorkspace("aa", a); WorkspaceInfo ab = makeWorkspace("ab", a); WorkspaceInfo ac = makeWorkspace("ac", a); WorkspaceInfo aaa = makeWorkspace("aaa", aa); WorkspaceInfo aab = makeWorkspace("aab", aa); WorkspaceInfo aac = makeWorkspace("aac", aa); workspaces.add(aa); workspaces.add(ab); workspaces.add(aab); workspaces.add(ac); workspaces.add(aac); workspaces.add(b); workspaces.add(aaa); workspaces.add(a); // Add an element with a parent that is not mapped. WorkspaceInfo zaa = makeWorkspace("zaa", makeWorkspace("unmapped", null)); workspaces.add(zaa); // Create a sorted hierarchy. JsonArray<WorkspaceNode> roots = WorkspaceUtils.getWorkspaceHierarchy(workspaces, new Comparator<WorkspaceInfo>() { @Override public int compare(WorkspaceInfo o1, WorkspaceInfo o2) { return o1.getId().compareTo(o2.getId()); } }); assertEquals(3, roots.size()); assertEquals(a, roots.get(0).getWorkspace()); assertEquals(b, roots.get(1).getWorkspace()); assertEquals(zaa, roots.get(2).getWorkspace()); // b and daa are empty parents. assertEquals(0, roots.get(1).getChildCount()); assertEquals(0, roots.get(2).getChildCount()); // a contains sorted children. assertChildren(roots.get(0), aa, ab, ac); // aa contains sorted children. assertChildren(roots.get(0).getChild(0), aaa, aab, aac); } /** * Test that * {@link WorkspaceUtils#getWorkspaceHierarchy} * sorts the root nodes. */ public void testGetWorkspaceHierarchySortedRoots() { // Create a list of workspaces. JsonArray<WorkspaceInfo> workspaces = JsonCollections.createArray(); WorkspaceInfo a = makeWorkspace("a", null); WorkspaceInfo b = makeWorkspace("b", null); WorkspaceInfo c = makeWorkspace("c", null); workspaces.add(b); workspaces.add(a); workspaces.add(c); // Create a sorted hierarchy. JsonArray<WorkspaceNode> roots = WorkspaceUtils.getWorkspaceHierarchy(workspaces, new Comparator<WorkspaceInfo>() { @Override public int compare(WorkspaceInfo o1, WorkspaceInfo o2) { return o1.getId().compareTo(o2.getId()); } }); assertEquals(3, roots.size()); assertEquals(a, roots.get(0).getWorkspace()); assertEquals(b, roots.get(1).getWorkspace()); assertEquals(c, roots.get(2).getWorkspace()); } public void testWorkspaceNodeAddChild() { WorkspaceNode parentNode = makeWorkspaceNode("parent", null); assertEquals(0, parentNode.getChildCount()); WorkspaceInfo child0 = makeWorkspace("child0", parentNode.getWorkspace()); WorkspaceNode childNode0 = new WorkspaceNode(child0); parentNode.addChild(childNode0); assertEquals(1, parentNode.getChildCount()); assertEquals(childNode0, parentNode.getChild(0)); WorkspaceInfo child1 = makeWorkspace("child1", parentNode.getWorkspace()); WorkspaceNode childNode1 = new WorkspaceNode(child1); parentNode.addChild(childNode1); assertEquals(2, parentNode.getChildCount()); assertEquals(childNode0, parentNode.getChild(0)); assertEquals(childNode1, parentNode.getChild(1)); } public void testWorkspaceNodeSortChildren() { // Create a hierarchy. WorkspaceNode a = makeWorkspaceNode("a", null); WorkspaceNode ab = makeWorkspaceNode("ab", a); WorkspaceNode aa = makeWorkspaceNode("aa", a); WorkspaceNode ac = makeWorkspaceNode("ac", a); WorkspaceNode aaa = makeWorkspaceNode("aaa", aa); WorkspaceNode aac = makeWorkspaceNode("aac", aa); WorkspaceNode aab = makeWorkspaceNode("aab", aa); // Sort non-recursively. a.sortChildren(new Comparator<WorkspaceNode>() { @Override public int compare(WorkspaceNode o1, WorkspaceNode o2) { return o1.getWorkspace().getId().compareTo(o2.getWorkspace().getId()); } }); // Assert the children sorted. assertEquals(aa, a.getChild(0)); assertEquals(ab, a.getChild(1)); assertEquals(ac, a.getChild(2)); // Assert the grandchildren are NOT sorted. assertEquals(aaa, aa.getChild(0)); assertEquals(aac, aa.getChild(1)); assertEquals(aab, aa.getChild(2)); } public void testWorkspaceNodeSortChildrenRecursive() { // Create a hierarchy. WorkspaceNode a = makeWorkspaceNode("a", null); WorkspaceNode ab = makeWorkspaceNode("ab", a); WorkspaceNode aa = makeWorkspaceNode("aa", a); WorkspaceNode ac = makeWorkspaceNode("ac", a); WorkspaceNode aaa = makeWorkspaceNode("aaa", aa); WorkspaceNode aac = makeWorkspaceNode("aac", aa); WorkspaceNode aab = makeWorkspaceNode("aab", aa); // Sort non-recursively. a.sortChildren(new Comparator<WorkspaceNode>() { @Override public int compare(WorkspaceNode o1, WorkspaceNode o2) { return o1.getWorkspace().getId().compareTo(o2.getWorkspace().getId()); } }, true); // Assert the children sorted. assertEquals(aa, a.getChild(0)); assertEquals(ab, a.getChild(1)); assertEquals(ac, a.getChild(2)); // Assert the grandchildren are also sorted. assertEquals(aaa, aa.getChild(0)); assertEquals(aab, aa.getChild(1)); assertEquals(aac, aa.getChild(2)); } /** * Assert that a {@link WorkspaceNode} contains exactly the expected children * workspaces, in order. * * @param node the node to check * @param expected the expected values, in order */ private void assertChildren(WorkspaceNode node, WorkspaceInfo... expected) { // Check the size. int size = expected.length; assertEquals("Size mismatch", size, node.getChildCount()); // Check the values. for (int i = 0; i < size; i++) { assertEquals(expected[i], node.getChild(i).getWorkspace()); } } /** * Assert that a {@link WorkspaceNode} contains exactly the expected children * workspaces, in any order. Does not handle duplicate expected values. * * @param node the node to check * @param expected the expected values, in order */ private void assertChildrenUnordered(WorkspaceNode node, WorkspaceInfo... expected) { // Check the size. int size = expected.length; assertEquals("Size mismatch", size, node.getChildCount()); // Check the values. for (int i = 0; i < size; i++) { WorkspaceInfo toFind = expected[i]; boolean found = false; for (int j = 0; j < size; j++) { if (node.getChild(i).getWorkspace() == toFind) { found = true; break; } } if (!found) { fail("Node does not contain expected value " + expected); } } } private WorkspaceInfo makeWorkspace(String id, WorkspaceInfo parent) { WorkspaceInfoImpl ws = MockWorkspaceInfoImpl.make(); ws.setId(id); if (parent != null) { ws.setParentId(parent.getId()); } return ws; } private WorkspaceNode makeWorkspaceNode(String id, WorkspaceNode parent) { WorkspaceInfo parentWs = (parent == null) ? null : parent.getWorkspace(); WorkspaceInfo ws = makeWorkspace(id, parentWs); WorkspaceNode node = new WorkspaceNode(ws); if (parent != null) { parent.addChild(node); } return node; } }