1 /*******************************************************************************
2  * Copyright (c) 2007, 2016 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 
15 package org.eclipse.ua.tests.help.other;
16 
17 import static org.junit.Assert.assertEquals;
18 import static org.junit.Assert.assertFalse;
19 import static org.junit.Assert.assertNull;
20 import static org.junit.Assert.assertTrue;
21 import static org.junit.Assert.fail;
22 
23 import org.eclipse.help.IHelpResource;
24 import org.eclipse.help.IUAElement;
25 import org.eclipse.help.internal.Topic;
26 import org.eclipse.help.internal.UAElement;
27 import org.eclipse.help.internal.base.BaseHelpSystem;
28 import org.eclipse.help.internal.base.HelpEvaluationContext;
29 import org.eclipse.help.internal.context.Context;
30 import org.eclipse.ua.tests.help.util.DocumentCreator;
31 import org.junit.Before;
32 import org.junit.Test;
33 import org.w3c.dom.Document;
34 import org.w3c.dom.Element;
35 
36 public class ContextTest {
37 
38 	private static final String ENABLEMENT_CHEATSHEETS = "<enablement><with variable=\"platform\">" +
39 	"<test property=\"org.eclipse.core.runtime.isBundleInstalled\" args=\"org.eclipse.ui.cheatsheets\"/>" +
40 	 "</with></enablement>";
41 	private static final String ENABLEMENT_INVALID = "<enablement><with variable=\"platform\">" +
42 		"<test property=\"org.eclipse.core.runtime.isBundleInstalled\" args=\"org.eclipse.ui.invalid\"/>" +
43 		 "</with></enablement>";
44 	private static final String FILTER_OUT = "<filter name = \"plugin\" value = \"org.eclipse.ua.invalid\"/>";
45 	private static final String TOPIC_END = "</topic>";
46 	private static final String TOPIC_HEAD_ECLIPSE = "<topic href=\"http://www.eclipse.org\" label=\"enabled\">";
47 	private final String TOPIC_OLD_FILTER_DISABLED = "<topic filter=\"plugin=org.eclipse.ua.invalid\" href=\"www.eclipse.org\""
48 		+ " label=\"Transformations and transformation configurations\"/>";
49 	private static final String CONTEXT_DESCRIPTION = "<description>Context Description</description>";
50 	private static final String EMPTY_DESCRIPTION = "<description></description>";
51 	private static final String CONTEXT_HEAD = "<context id=\"viewer\" title=\"Sample View\">";
52 	private static final String CONTEXT_HEAD_WITH_ATTRIBUTE = "<context id=\"viewer\" title=\"Sample View\" att=\"abc\">";
53 	private final String TOPIC_ECLIPSE = "<topic href=\"http://www.eclipse.org\" label=\"eclipse\"/>";
54 	private final String TOPIC_WITH_ENABLEMENT = TOPIC_HEAD_ECLIPSE + ENABLEMENT_CHEATSHEETS + TOPIC_END;
55 	private final String TOPIC_DISABLED = TOPIC_HEAD_ECLIPSE + ENABLEMENT_INVALID + TOPIC_END;
56 	private final String TOPIC_FILTER_OUT = TOPIC_HEAD_ECLIPSE + FILTER_OUT + TOPIC_END;
57 	private final String END_CONTEXT = "</context>";
58 
59 	@Before
setUp()60 	public void setUp() throws Exception {
61 		// Required for isEnabled() to work correctly
62 		BaseHelpSystem.setMode(BaseHelpSystem.MODE_WORKBENCH);
63 	}
64 
createContext(final String contextSource)65 	private Context createContext(final String contextSource) {
66 		Context context;
67 		Document doc;
68 		try {
69 			doc = DocumentCreator.createDocument(contextSource);
70 		} catch (Exception e) {
71 			fail("Caught Exception");
72 			doc = null;
73 		}
74 		context = new Context((Element) doc.getFirstChild());
75 		return context;
76 	}
77 
78 	@Test
testSimpleContext()79 	public void testSimpleContext() {
80 		final String contextSource = CONTEXT_HEAD +
81 			CONTEXT_DESCRIPTION +
82 			TOPIC_ECLIPSE +
83 			END_CONTEXT;
84 		Context context;
85 		context = createContext(contextSource);
86 		assertEquals("Sample View", context.getTitle());
87 		assertEquals("Context Description", context.getText());
88 		IHelpResource[] related = context.getRelatedTopics();
89 		assertEquals(1, related.length);
90 		assertEquals("eclipse", related[0].getLabel());
91 	}
92 
93 	@Test
testContextWithEnablement()94 	public void testContextWithEnablement() {
95 		final String contextSource = CONTEXT_HEAD +
96 			CONTEXT_DESCRIPTION +
97 			TOPIC_WITH_ENABLEMENT +
98 			END_CONTEXT;
99 		Context context;
100 		context = createContext(contextSource);
101 		assertEquals("Sample View", context.getTitle());
102 		assertEquals("Context Description", context.getText());
103 		assertEquals("viewer", context.getId());
104 		IHelpResource[] related = context.getRelatedTopics();
105 		assertEquals(1, related.length);
106 		assertEquals("enabled", related[0].getLabel());
107 		assertTrue(related[0] instanceof IUAElement);
108 		IUAElement topic = (IUAElement)related[0];
109 		IUAElement[] topicChildren = topic.getChildren();
110 		assertEquals(1, topicChildren.length);
111 	}
112 
113 	@Test
testCopyContext()114 	public void testCopyContext() {
115 		final String contextSource = CONTEXT_HEAD +
116 			CONTEXT_DESCRIPTION +
117 			TOPIC_WITH_ENABLEMENT +
118 			END_CONTEXT;
119 		Context context  = createContext(contextSource);
120 		Context context2 = new Context(context, "new id");
121 		Context context3 = new Context(context2, "new id2");
122 		assertEquals("Sample View", context.getTitle());
123 		assertEquals("Sample View", context2.getTitle());
124 		assertEquals("Context Description", context.getText());
125 		assertEquals("Context Description", context2.getText());
126 		assertEquals("viewer", context.getId());
127 		assertEquals("new id", context2.getId());
128 		assertEquals("new id2", context3.getId());
129 
130 		IHelpResource[] related = context.getRelatedTopics();
131 		assertEquals(1, related.length);
132 		assertEquals("enabled", related[0].getLabel());
133 		assertTrue(related[0] instanceof IUAElement);
134 		Topic topic = (Topic)related[0];
135 		assertEquals("http://www.eclipse.org", topic.getHref());
136 
137 		related = context2.getRelatedTopics();
138 		assertEquals(1, related.length);
139 		assertEquals("enabled", related[0].getLabel());
140 		assertTrue(related[0] instanceof IUAElement);
141 		topic = (Topic)related[0];
142 		assertEquals("http://www.eclipse.org", topic.getHref());
143 
144 		related = context3.getRelatedTopics();
145 		assertEquals(1, related.length);
146 		assertEquals("enabled", related[0].getLabel());
147 		assertTrue(related[0] instanceof IUAElement);
148 		topic = (Topic)related[0];
149 		assertEquals("http://www.eclipse.org", topic.getHref());
150 	}
151 
152 	@Test
testEnablement()153 	public void testEnablement() {
154 		final String contextSource = CONTEXT_HEAD +
155 			CONTEXT_DESCRIPTION +
156 			TOPIC_WITH_ENABLEMENT +
157 			TOPIC_DISABLED +
158 			TOPIC_OLD_FILTER_DISABLED +
159 			END_CONTEXT;
160 		Context context  = createContext(contextSource);
161 		IHelpResource[] related = context.getRelatedTopics();
162 		assertEquals(3, related.length);
163 		assertTrue(((Topic)related[0]).isEnabled(HelpEvaluationContext.getContext()));
164 		assertFalse(((Topic)related[1]).isEnabled(HelpEvaluationContext.getContext()));
165 		assertFalse(((Topic)related[2]).isEnabled(HelpEvaluationContext.getContext()));
166 	}
167 
168 	@Test
testOldStyleFilteringOfCopies()169 	public void testOldStyleFilteringOfCopies() {
170 		final String contextSource = CONTEXT_HEAD +
171 			CONTEXT_DESCRIPTION +
172 			TOPIC_WITH_ENABLEMENT +
173 			TOPIC_OLD_FILTER_DISABLED +
174 			END_CONTEXT;
175 		Context context1  = createContext(contextSource);
176 		Context context2 = new Context(context1, "id");
177 		Context context3 = new Context(context2, "id2");
178 
179 		IHelpResource[] related1 = context1.getRelatedTopics();
180 		assertEquals(2, related1.length);
181 		assertTrue(((Topic)related1[0]).isEnabled(HelpEvaluationContext.getContext()));
182 		assertFalse(((Topic)related1[1]).isEnabled(HelpEvaluationContext.getContext()));
183 
184 		IHelpResource[] related2 = context2.getRelatedTopics();
185 		assertEquals(2, related2.length);
186 		assertTrue(((Topic)related2[0]).isEnabled(HelpEvaluationContext.getContext()));
187 		assertFalse(((Topic)related2[1]).isEnabled(HelpEvaluationContext.getContext()));
188 
189 		IHelpResource[] related3 = context3.getRelatedTopics();
190 		assertEquals(2, related3.length);
191 		assertTrue(((Topic)related3[0]).isEnabled(HelpEvaluationContext.getContext()));
192 		assertFalse(((Topic)related3[1]).isEnabled(HelpEvaluationContext.getContext()));
193 	}
194 
195 	@Test
testOldStyleFilteringOfCopies2()196 	public void testOldStyleFilteringOfCopies2() {
197 		final String contextSource = CONTEXT_HEAD +
198 			CONTEXT_DESCRIPTION +
199 			TOPIC_WITH_ENABLEMENT +
200 			TOPIC_OLD_FILTER_DISABLED +
201 			END_CONTEXT;
202 		Context context1  = createContext(contextSource);
203 		Context context2 = new Context(context1, "id");
204 		Context context3 = new Context(context1, "id2");
205 
206 		IHelpResource[] related1 = context1.getRelatedTopics();
207 		assertEquals(2, related1.length);
208 		assertTrue(((Topic)related1[0]).isEnabled(HelpEvaluationContext.getContext()));
209 		assertFalse(((Topic)related1[1]).isEnabled(HelpEvaluationContext.getContext()));
210 
211 		IHelpResource[] related2 = context2.getRelatedTopics();
212 		assertEquals(2, related2.length);
213 		assertTrue(((Topic)related2[0]).isEnabled(HelpEvaluationContext.getContext()));
214 		assertFalse(((Topic)related2[1]).isEnabled(HelpEvaluationContext.getContext()));
215 
216 		IHelpResource[] related3 = context3.getRelatedTopics();
217 		assertEquals(2, related3.length);
218 		assertTrue(((Topic)related3[0]).isEnabled(HelpEvaluationContext.getContext()));
219 		assertFalse(((Topic)related3[1]).isEnabled(HelpEvaluationContext.getContext()));
220 	}
221 
222 	@Test
testFilteringOfCopies()223 	public void testFilteringOfCopies() {
224 		final String contextSource = CONTEXT_HEAD +
225 			CONTEXT_DESCRIPTION +
226 			TOPIC_WITH_ENABLEMENT +
227 			TOPIC_FILTER_OUT +
228 			END_CONTEXT;
229 		Context context1  = createContext(contextSource);
230 		Context context2 = new Context(context1, "id");
231 		Context context3 = new Context(context2, "id2");
232 		IHelpResource[] related1 = context1.getRelatedTopics();
233 		assertEquals(2, related1.length);
234 		assertTrue(((Topic)related1[0]).isEnabled(HelpEvaluationContext.getContext()));
235 		assertFalse(((Topic)related1[1]).isEnabled(HelpEvaluationContext.getContext()));
236 
237 		IHelpResource[] related2 = context2.getRelatedTopics();
238 		assertEquals(2, related2.length);
239 		assertTrue(((Topic)related2[0]).isEnabled(HelpEvaluationContext.getContext()));
240 		assertFalse(((Topic)related2[1]).isEnabled(HelpEvaluationContext.getContext()));
241 
242 		IHelpResource[] related3 = context3.getRelatedTopics();
243 		assertEquals(2, related3.length);
244 		assertTrue(((Topic)related3[0]).isEnabled(HelpEvaluationContext.getContext()));
245 		assertFalse(((Topic)related3[1]).isEnabled(HelpEvaluationContext.getContext()));
246 	}
247 
248 	@Test
testFilteringOfCopies2()249 	public void testFilteringOfCopies2() {
250 		final String contextSource = CONTEXT_HEAD +
251 			CONTEXT_DESCRIPTION +
252 			TOPIC_WITH_ENABLEMENT +
253 			TOPIC_FILTER_OUT +
254 			END_CONTEXT;
255 		Context context1  = createContext(contextSource);
256 		Context context2 = new Context(context1, "id");
257 		Context context3 = new Context(context1, "id2");
258 
259 		IHelpResource[] related1 = context1.getRelatedTopics();
260 		assertEquals(2, related1.length);
261 		assertTrue(((Topic)related1[0]).isEnabled(HelpEvaluationContext.getContext()));
262 		assertFalse(((Topic)related1[1]).isEnabled(HelpEvaluationContext.getContext()));
263 
264 		IHelpResource[] related2 = context2.getRelatedTopics();
265 		assertEquals(2, related2.length);
266 		assertTrue(((Topic)related2[0]).isEnabled(HelpEvaluationContext.getContext()));
267 		assertFalse(((Topic)related2[1]).isEnabled(HelpEvaluationContext.getContext()));
268 
269 		IHelpResource[] related3 = context3.getRelatedTopics();
270 		assertEquals(2, related3.length);
271 		assertTrue(((Topic)related3[0]).isEnabled(HelpEvaluationContext.getContext()));
272 		assertFalse(((Topic)related3[1]).isEnabled(HelpEvaluationContext.getContext()));
273 	}
274 
275 	@Test
testEnablementOfCopies()276 	public void testEnablementOfCopies() {
277 		final String contextSource = CONTEXT_HEAD +
278 			CONTEXT_DESCRIPTION +
279 			TOPIC_WITH_ENABLEMENT +
280 			TOPIC_DISABLED +
281 			END_CONTEXT;
282 		Context context1  = createContext(contextSource);
283 		Context context2 = new Context(context1, "id");
284 		Context context3 = new Context(context2, "id2");
285 		IHelpResource[] related1 = context1.getRelatedTopics();
286 		assertEquals(2, related1.length);
287 		assertTrue(((Topic)related1[0]).isEnabled(HelpEvaluationContext.getContext()));
288 		assertFalse(((Topic)related1[1]).isEnabled(HelpEvaluationContext.getContext()));
289 
290 		IHelpResource[] related2 = context2.getRelatedTopics();
291 		assertEquals(2, related2.length);
292 		assertTrue(((Topic)related2[0]).isEnabled(HelpEvaluationContext.getContext()));
293 		assertFalse(((Topic)related2[1]).isEnabled(HelpEvaluationContext.getContext()));
294 
295 		IHelpResource[] related3 = context3.getRelatedTopics();
296 		assertEquals(2, related3.length);
297 		assertTrue(((Topic)related3[0]).isEnabled(HelpEvaluationContext.getContext()));
298 		assertFalse(((Topic)related3[1]).isEnabled(HelpEvaluationContext.getContext()));
299 	}
300 
301 	@Test
testEnablementOfCopies2()302 	public void testEnablementOfCopies2() {
303 		final String contextSource = CONTEXT_HEAD +
304 			CONTEXT_DESCRIPTION +
305 			TOPIC_WITH_ENABLEMENT +
306 			TOPIC_DISABLED +
307 			END_CONTEXT;
308 		Context context1  = createContext(contextSource);
309 		Context context2 = new Context(context1, "id");
310 		Context context3 = new Context(context1, "id2");
311 
312 		IHelpResource[] related1 = context1.getRelatedTopics();
313 		assertEquals(2, related1.length);
314 		assertTrue(((Topic)related1[0]).isEnabled(HelpEvaluationContext.getContext()));
315 		assertFalse(((Topic)related1[1]).isEnabled(HelpEvaluationContext.getContext()));
316 
317 		IHelpResource[] related2 = context2.getRelatedTopics();
318 		assertEquals(2, related2.length);
319 		assertTrue(((Topic)related2[0]).isEnabled(HelpEvaluationContext.getContext()));
320 		assertFalse(((Topic)related2[1]).isEnabled(HelpEvaluationContext.getContext()));
321 
322 		IHelpResource[] related3 = context3.getRelatedTopics();
323 		assertEquals(2, related3.length);
324 		assertTrue(((Topic)related3[0]).isEnabled(HelpEvaluationContext.getContext()));
325 		assertFalse(((Topic)related3[1]).isEnabled(HelpEvaluationContext.getContext()));
326 	}
327 
328 	@Test
testEnablementOfCopies3()329 	public void testEnablementOfCopies3() {
330 		final String contextSource = CONTEXT_HEAD +
331 			CONTEXT_DESCRIPTION +
332 			TOPIC_WITH_ENABLEMENT +
333 			TOPIC_DISABLED +
334 			END_CONTEXT;
335 		Context context1  = createContext(contextSource);
336 		Context context2 = new Context(context1, "id");
337 		Context context3 = new Context(context1, "id2");
338 
339 		deleteAndInsert(context1);
340 		deleteAndInsert(context2);
341 		deleteAndInsert(context3);
342 	}
343 
deleteAndInsert(Context context)344 	private void deleteAndInsert(Context context) {
345 		IHelpResource[] related = context.getRelatedTopics();
346 		assertEquals(2, related.length);
347 		IHelpResource enabled= related[0];
348 		context.removeChild((UAElement) enabled);
349 		related = context.getRelatedTopics();
350 		assertEquals(1, related.length);
351 		Topic disabled = (Topic)related[0];
352 		assertFalse(disabled.isEnabled(HelpEvaluationContext.getContext()));
353 		context.insertBefore((UAElement) enabled, disabled);
354 		related = context.getRelatedTopics();
355 		assertEquals(2, related.length);
356 		assertTrue(((Topic)related[0]).isEnabled(HelpEvaluationContext.getContext()));
357 		assertFalse(((Topic)related[1]).isEnabled(HelpEvaluationContext.getContext()));
358 	}
359 
360 	@Test
testContextWithAttribute()361 	public void testContextWithAttribute() {
362 		final String contextSource = CONTEXT_HEAD_WITH_ATTRIBUTE +
363 			CONTEXT_DESCRIPTION +
364 			TOPIC_ECLIPSE +
365 			END_CONTEXT;
366 		Context context;
367 		context = createContext(contextSource);
368 		assertEquals("abc", context.getAttribute("att"));
369 	}
370 
371 	@Test
testContextWithoutDescription()372 	public void testContextWithoutDescription() {
373 		final String contextSource = CONTEXT_HEAD +
374 			TOPIC_ECLIPSE +
375 			END_CONTEXT;
376 		Context context;
377 		context = createContext(contextSource);
378 		assertNull(context.getText());
379 	}
380 
381 	@Test
testContextWithEmptyDescription()382 	public void testContextWithEmptyDescription() {
383 		final String contextSource = CONTEXT_HEAD +
384 			EMPTY_DESCRIPTION +
385 			TOPIC_ECLIPSE +
386 			END_CONTEXT;
387 		Context context;
388 		context = createContext(contextSource);
389 		assertEquals("", context.getText());
390 	}
391 
392 	@Test
testContextWithoutDescriptionSelfCatenation()393 	public void testContextWithoutDescriptionSelfCatenation() {
394 		final String contextSource = CONTEXT_HEAD +
395 			TOPIC_ECLIPSE +
396 			END_CONTEXT;
397 		Context context1 = createContext(contextSource);
398 		Context context2 = createContext(contextSource);
399 		context1.mergeContext(context2);
400 		assertNull(context1.getText());
401 	}
402 
403 	@Test
testContextWithoutDescriptionMixedCatenation()404 	public void testContextWithoutDescriptionMixedCatenation() {
405 		final String contextSourceEmpty = CONTEXT_HEAD +
406 			TOPIC_ECLIPSE +
407 			END_CONTEXT;
408 		final String contextSourceWithDesc = CONTEXT_HEAD +
409 			CONTEXT_DESCRIPTION +
410 			TOPIC_ECLIPSE +
411 			END_CONTEXT;
412 		Context context1 = createContext(contextSourceEmpty);
413 		Context context2 = createContext(contextSourceWithDesc);
414 		context1.mergeContext(context2);
415 		assertEquals("Context Description", context1.getText());
416 		Context context3 = createContext(contextSourceWithDesc);
417 		Context context4 = createContext(contextSourceEmpty);
418 		context3.mergeContext(context4);
419 		assertEquals("Context Description", context3.getText());
420 	}
421 
422 	/*
423 	public void testCopyContextWithAttribute() {
424 		final String contextSource = CONTEXT_HEAD_WITH_ATTRIBUTE +
425 			CONTEXT_DESCRIPTION +
426 			TOPIC_ECLIPSE +
427 			END_CONTEXT;
428 		Context context1;
429 		context1 = createContext(contextSource);
430 		Context context2 = new Context(context1, "id");
431 		assertEquals("abc", context1.getAttribute("att"));
432 		assertEquals("abc", context2.getAttribute("att"));
433 	}
434 	*/
435 
436 }
437