1 /*******************************************************************************
2  * Copyright (c) 2007, 2013 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.debug.tests.viewer.model;
15 
16 import static org.junit.Assert.assertArrayEquals;
17 import static org.junit.Assert.assertEquals;
18 import static org.junit.Assert.assertFalse;
19 import static org.junit.Assert.assertTrue;
20 import static org.junit.Assert.fail;
21 
22 import org.eclipse.debug.internal.ui.viewers.model.FilterTransform;
23 import org.eclipse.debug.tests.AbstractDebugTest;
24 import org.eclipse.jface.viewers.TreePath;
25 import org.junit.Before;
26 import org.junit.Test;
27 
28 /**
29  * Tests the virtual viewer's filter transform
30  * @since 3.3
31  */
32 public class FilterTransformTests extends AbstractDebugTest {
33 
34 	public Object root;
35 	public Object element0;
36 	public Object element1;
37 	public Object element2;
38 	public Object element3;
39 	public Object element4;
40 	public Object element5;
41 	public Object element6;
42 	public Object element7;
43 
44 	public FilterTransform transform;
45 
46 	/**
47 	 * Builds a filter transform. Model has 8 elements,
48 	 * and elements 0, 2, 3, 6, 7 are filtered. Elements
49 	 * 1, 4, 5 are visible.
50 	 */
51 	@Override
52 	@Before
setUp()53 	public void setUp() throws Exception {
54 		super.setUp();
55 		transform = new FilterTransform();
56 		root = new Object();
57 		element0 = new Object();
58 		element1 = new Object();
59 		element2 = new Object();
60 		element3 = new Object();
61 		element4 = new Object();
62 		element5 = new Object();
63 		element6 = new Object();
64 		element7 = new Object();
65 		assertTrue(transform.addFilteredIndex(TreePath.EMPTY, 0, element0));
66 		assertTrue(transform.addFilteredIndex(TreePath.EMPTY, 2, element2));
67 		assertTrue(transform.addFilteredIndex(TreePath.EMPTY, 3, element3));
68 		assertTrue(transform.addFilteredIndex(TreePath.EMPTY, 6, element6));
69 		assertTrue(transform.addFilteredIndex(TreePath.EMPTY, 7, element7));
70 	}
71 
72 	@Test
testRemoveMiddleElementFromFilters()73 	public void testRemoveMiddleElementFromFilters() {
74 		assertTrue("Element should be filtered", transform.isFiltered(TreePath.EMPTY, 3)); //$NON-NLS-1$
75 		transform.removeElementFromFilters(TreePath.EMPTY, element3);
76 		assertFalse("Element should be unfiltered", transform.isFiltered(TreePath.EMPTY, 3)); //$NON-NLS-1$
77 		assertArrayEquals("Wrong filter state", transform.getFilteredChildren(TreePath.EMPTY), new int[] { //$NON-NLS-1$
78 				0, 2, 5, 6 });
79 	}
80 
81 	@Test
testRemoveFirstElementFromFilters()82 	public void testRemoveFirstElementFromFilters() {
83 		assertTrue("Element should be filtered", transform.isFiltered(TreePath.EMPTY, 0)); //$NON-NLS-1$
84 		transform.removeElementFromFilters(TreePath.EMPTY, element0);
85 		assertFalse("Element should be unfiltered", transform.isFiltered(TreePath.EMPTY, 0)); //$NON-NLS-1$
86 		assertArrayEquals("Wrong filter state", transform.getFilteredChildren(TreePath.EMPTY), new int[] { //$NON-NLS-1$
87 				1, 2, 5, 6 });
88 	}
89 
90 	@Test
testRemoveLastFromFilters()91 	public void testRemoveLastFromFilters() {
92 		assertTrue("Element should be filtered", transform.isFiltered(TreePath.EMPTY, 7)); //$NON-NLS-1$
93 		transform.removeElementFromFilters(TreePath.EMPTY, element7);
94 		assertFalse("Element should be unfiltered", transform.isFiltered(TreePath.EMPTY, 7)); //$NON-NLS-1$
95 		assertArrayEquals("Wrong filter state", transform.getFilteredChildren(TreePath.EMPTY), new int[] { //$NON-NLS-1$
96 				0, 2, 3, 6 });
97 	}
98 
99 	@Test
testClearMiddleElementFromFilters()100 	public void testClearMiddleElementFromFilters() {
101 		assertTrue("Element should be filtered", transform.isFiltered(TreePath.EMPTY, 3)); //$NON-NLS-1$
102 		transform.clear(TreePath.EMPTY, 3);
103 		assertFalse("Element should be unfiltered", transform.isFiltered(TreePath.EMPTY, 3)); //$NON-NLS-1$
104 		assertArrayEquals("Wrong filter state", transform.getFilteredChildren(TreePath.EMPTY), new int[] { //$NON-NLS-1$
105 				0, 2, 6, 7 });
106 	}
107 
108 	@Test
testClearFirstElementFromFilters()109 	public void testClearFirstElementFromFilters() {
110 		assertTrue("Element should be filtered", transform.isFiltered(TreePath.EMPTY, 0)); //$NON-NLS-1$
111 		transform.clear(TreePath.EMPTY, 0);
112 		assertFalse("Element should be unfiltered", transform.isFiltered(TreePath.EMPTY, 0)); //$NON-NLS-1$
113 		assertArrayEquals("Wrong filter state", transform.getFilteredChildren(TreePath.EMPTY), new int[] { //$NON-NLS-1$
114 				2, 3, 6, 7 });
115 	}
116 
117 	@Test
testClearLastFromFilters()118 	public void testClearLastFromFilters() {
119 		assertTrue("Element should be filtered", transform.isFiltered(TreePath.EMPTY, 7)); //$NON-NLS-1$
120 		transform.clear(TreePath.EMPTY, 7);
121 		assertFalse("Element should be unfiltered", transform.isFiltered(TreePath.EMPTY, 7)); //$NON-NLS-1$
122 		assertArrayEquals("Wrong filter state", transform.getFilteredChildren(TreePath.EMPTY), new int[] { //$NON-NLS-1$
123 				0, 2, 3, 6 });
124 	}
125 
126 	@Test
testViewToModelCount()127 	public void testViewToModelCount() {
128 		assertEquals("Wrong model count", 8, transform.viewToModelCount(TreePath.EMPTY, 3)); //$NON-NLS-1$
129 	}
130 
131 	@Test
testViewToModelIndex()132 	public void testViewToModelIndex() {
133 		assertEquals("Wrong model index", 1, transform.viewToModelIndex(TreePath.EMPTY, 0)); //$NON-NLS-1$
134 		assertEquals("Wrong model index", 4, transform.viewToModelIndex(TreePath.EMPTY, 1)); //$NON-NLS-1$
135 		assertEquals("Wrong model index", 5, transform.viewToModelIndex(TreePath.EMPTY, 2)); //$NON-NLS-1$
136 	}
137 
138 	@Test
testAddAlreadyFiltered()139 	public void testAddAlreadyFiltered() {
140 		assertTrue("Element should be filtered", transform.isFiltered(TreePath.EMPTY, 0)); //$NON-NLS-1$
141 		boolean added = transform.addFilteredIndex(TreePath.EMPTY, 0, element0);
142 		assertFalse("Filter should not be added - should already have been there", added); //$NON-NLS-1$
143 	}
144 
145 
146 	/**
147 	 * Test to make sure that setModelChildCount() updates internal arrays
148 	 * appropriately. See bug 200325.
149 	 */
150 	@Test
testRegression200325()151 	public void testRegression200325() {
152 		transform.setModelChildCount(TreePath.EMPTY, 2);
153 		try {
154 			transform.addFilteredIndex(TreePath.EMPTY, 3, new Object());
155 		} catch (ArrayIndexOutOfBoundsException e) {
156 			fail("AIOOBE Exception should not be thrown here, " + //$NON-NLS-1$
157 			"setModelChildCount should leave " + //$NON-NLS-1$
158 			"FilterTransform$Node in a consistent state"); //$NON-NLS-1$
159 		}
160 	}
161 }
162