| /******************************************************************************* |
| * Copyright (c) 2009 EclipseSource and others. All rights reserved. This |
| * program and the accompanying materials are made available under the terms of |
| * the Eclipse Public License v1.0 which accompanies this distribution, and is |
| * available at http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * EclipseSource - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.equinox.p2.tests.core; |
| |
| import org.eclipse.equinox.p2.query.MatchQuery; |
| |
| import java.util.Arrays; |
| import java.util.Iterator; |
| import junit.framework.TestCase; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.tests.harness.TestProgressMonitor; |
| import org.eclipse.equinox.p2.query.*; |
| import org.eclipse.equinox.p2.tests.AbstractProvisioningTest; |
| |
| /** |
| * Tests the compound queryable |
| */ |
| public class CompoundQueryableTest extends TestCase { |
| |
| public static class CompoundQueryTestProgressMonitor extends TestProgressMonitor { |
| |
| private boolean isDone; |
| private int assignedWork = 0; |
| private int amountWorked = 0; |
| |
| public void beginTask(String name, int totalWork) { |
| super.beginTask(name, totalWork); |
| this.assignedWork += totalWork; |
| } |
| |
| public void worked(int work) { |
| amountWorked += work; |
| } |
| |
| public boolean isWorkDone() { |
| return amountWorked > 0 && (assignedWork == IProgressMonitor.UNKNOWN || amountWorked == assignedWork); |
| } |
| |
| public boolean isDone() { |
| return this.isDone; |
| } |
| |
| public void done() { |
| super.done(); |
| this.isDone = true; |
| } |
| } |
| |
| static Iterator createIterator(Object[] array) { |
| return Arrays.asList(array).iterator(); |
| } |
| |
| IQueryable<Integer> queryable1 = new IQueryable<Integer>() { |
| Integer[] elements = new Integer[] {1, 2, 3, 4, 5}; |
| |
| public IQueryResult<Integer> query(IQuery<Integer> query, IProgressMonitor monitor) { |
| IQueryResult<Integer> collector; |
| try { |
| monitor.beginTask("", 10); |
| collector = query.perform(createIterator(elements)); |
| monitor.worked(10); |
| } finally { |
| monitor.done(); |
| } |
| return collector; |
| } |
| }; |
| |
| IQueryable<Integer> queryable2 = new IQueryable<Integer>() { |
| Integer[] elements = new Integer[] {4, 6, 8, 10, 12}; |
| |
| public IQueryResult<Integer> query(IQuery<Integer> query, IProgressMonitor monitor) { |
| IQueryResult<Integer> collector; |
| try { |
| monitor.beginTask("", 10); |
| collector = query.perform(createIterator(elements)); |
| monitor.worked(10); |
| } finally { |
| monitor.done(); |
| } |
| return collector; |
| } |
| }; |
| |
| IQueryable queryable3 = new IQueryable() { |
| Integer[] elements = new Integer[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; |
| |
| public IQueryResult query(IQuery query, IProgressMonitor monitor) { |
| IQueryResult collector; |
| try { |
| monitor.beginTask("", 10); |
| collector = query.perform(createIterator(elements)); |
| monitor.worked(10); |
| } finally { |
| monitor.done(); |
| } |
| return collector; |
| } |
| }; |
| |
| IQuery matchQuery = new MatchQuery() { |
| |
| public boolean isMatch(Object candidate) { |
| if (candidate instanceof Integer) { |
| int x = ((Integer) candidate).intValue(); |
| if (x % 2 == 0) |
| return true; |
| } |
| return false; |
| } |
| }; |
| |
| IQuery matchMod4query = new MatchQuery() { |
| public boolean isMatch(Object candidate) { |
| if (candidate instanceof Integer) { |
| int x = ((Integer) candidate).intValue(); |
| if (x % 4 == 0) |
| return true; |
| } |
| return false; |
| } |
| }; |
| |
| IQuery contextQuery = new ContextQuery() { |
| |
| public Collector perform(Iterator iterator) { |
| Collector result = new Collector(); |
| while (iterator.hasNext()) { |
| Object o = iterator.next(); |
| if (o instanceof Integer && ((Integer) o).intValue() % 2 == 0) { |
| result.accept(o); |
| } |
| } |
| return result; |
| } |
| |
| }; |
| |
| IQuery greatestNumberQuery = new ContextQuery() { |
| public Collector perform(Iterator iterator) { |
| Collector result = new Collector(); |
| int greatest = Integer.MIN_VALUE; |
| while (iterator.hasNext()) { |
| int item = ((Integer) iterator.next()).intValue(); |
| if (item > greatest) |
| greatest = item; |
| } |
| if (greatest == Integer.MIN_VALUE) |
| return result; |
| result.accept(greatest); |
| return result; |
| } |
| }; |
| |
| public void testMatchQuery() { |
| IQueryable cQueryable = QueryUtil.compoundQueryable(queryable1, queryable2); |
| CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); |
| IQueryResult queryResult = cQueryable.query(matchQuery, monitor); |
| assertEquals("1.0", 6, AbstractProvisioningTest.queryResultSize(queryResult)); |
| AbstractProvisioningTest.assertContains("1.1", queryResult, 2); |
| AbstractProvisioningTest.assertContains("1.2", queryResult, 4); |
| AbstractProvisioningTest.assertContains("1.3", queryResult, 6); |
| AbstractProvisioningTest.assertContains("1.4", queryResult, 8); |
| AbstractProvisioningTest.assertContains("1.5", queryResult, 10); |
| AbstractProvisioningTest.assertContains("1.6", queryResult, 12); |
| } |
| |
| public void testSingleQueryable() { |
| IQueryable cQueryable = QueryUtil.compoundQueryable(Arrays.asList(queryable1)); |
| CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); |
| IQueryResult queryResult = cQueryable.query(matchQuery, monitor); |
| assertEquals("1.0", 2, AbstractProvisioningTest.queryResultSize(queryResult)); |
| AbstractProvisioningTest.assertContains("1.1", queryResult, 2); |
| AbstractProvisioningTest.assertContains("1.2", queryResult, 4); |
| } |
| |
| public void testSingleContextQuery() { |
| IQueryable cQueryable = QueryUtil.compoundQueryable(Arrays.asList(queryable1)); |
| CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); |
| IQueryResult queryResult = cQueryable.query(greatestNumberQuery, monitor); |
| assertEquals("1.0", 1, AbstractProvisioningTest.queryResultSize(queryResult)); |
| AbstractProvisioningTest.assertContains("1.1", queryResult, 5); |
| } |
| |
| public void testMultipleContextQueries() { |
| IQueryable cQueryable = QueryUtil.compoundQueryable(queryable1, queryable2); |
| CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); |
| IQueryResult queryResult = cQueryable.query(greatestNumberQuery, monitor); |
| assertEquals("1.0", 1, AbstractProvisioningTest.queryResultSize(queryResult)); |
| AbstractProvisioningTest.assertContains("1.1", queryResult, 12); |
| } |
| |
| public void testCompoundMatchAndQuery() { |
| IQueryable cQueryable = QueryUtil.compoundQueryable(queryable1, queryable2); |
| CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); |
| IQueryResult queryResult = cQueryable.query(QueryUtil.createCompoundQuery(matchQuery, matchMod4query, true), monitor); |
| assertEquals("1.0", 3, AbstractProvisioningTest.queryResultSize(queryResult)); |
| AbstractProvisioningTest.assertContains("1.2", queryResult, 4); |
| AbstractProvisioningTest.assertContains("1.4", queryResult, 8); |
| AbstractProvisioningTest.assertContains("1.6", queryResult, 12); |
| } |
| |
| public void testCompoundMatchOrQuery() { |
| IQueryable cQueryable = QueryUtil.compoundQueryable(queryable1, queryable2); |
| CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); |
| IQueryResult queryResult = cQueryable.query(QueryUtil.createCompoundQuery(matchQuery, matchMod4query, false), monitor); |
| assertEquals("1.0", 6, AbstractProvisioningTest.queryResultSize(queryResult)); |
| AbstractProvisioningTest.assertContains("1.2", queryResult, 2); |
| AbstractProvisioningTest.assertContains("1.2", queryResult, 4); |
| AbstractProvisioningTest.assertContains("1.2", queryResult, 6); |
| AbstractProvisioningTest.assertContains("1.4", queryResult, 8); |
| AbstractProvisioningTest.assertContains("1.2", queryResult, 10); |
| AbstractProvisioningTest.assertContains("1.6", queryResult, 12); |
| } |
| |
| public void testMatchQueryProgressMonitor() { |
| IQueryable cQueryable = QueryUtil.compoundQueryable(queryable1, queryable2); |
| CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); |
| cQueryable.query(matchQuery, monitor); |
| assertTrue("1.0", monitor.isDone()); |
| assertTrue("1.1", monitor.isWorkDone()); |
| } |
| |
| public void testSingleQueryableProgressMonitor() { |
| IQueryable cQueryable = QueryUtil.compoundQueryable(Arrays.asList(queryable1)); |
| CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); |
| cQueryable.query(matchQuery, monitor); |
| assertTrue("1.0", monitor.isDone()); |
| assertTrue("1.1", monitor.isWorkDone()); |
| } |
| |
| public void testSingleContextQueryProgressMonitor() { |
| IQueryable cQueryable = QueryUtil.compoundQueryable(Arrays.asList(queryable1)); |
| CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); |
| cQueryable.query(greatestNumberQuery, monitor); |
| assertTrue("1.0", monitor.isDone()); |
| assertTrue("1.1", monitor.isWorkDone()); |
| } |
| |
| public void testMultipleContextQueriesProgressMonitor() { |
| IQueryable cQueryable = QueryUtil.compoundQueryable(queryable1, queryable2); |
| CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); |
| cQueryable.query(greatestNumberQuery, monitor); |
| assertTrue("1.0", monitor.isDone()); |
| assertTrue("1.1", monitor.isWorkDone()); |
| } |
| |
| public void testNullProgressMonitor() { |
| IQueryable cQueryable = QueryUtil.compoundQueryable(queryable1, queryable2); |
| cQueryable.query(greatestNumberQuery, null); |
| // this is the same as above will null passed in, this should not throw any exceptions |
| |
| } |
| |
| public void testDoubleCompoundContextOrQuery() { |
| IQueryable cQueryable1 = QueryUtil.compoundQueryable(queryable3, queryable2); |
| IQueryable cQueryable = QueryUtil.compoundQueryable(cQueryable1, queryable1); |
| CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); |
| IQueryResult queryResult = cQueryable.query(QueryUtil.createCompoundQuery(contextQuery, greatestNumberQuery, false), monitor); |
| assertEquals("1.0", 7, AbstractProvisioningTest.queryResultSize(queryResult)); |
| AbstractProvisioningTest.assertContains("1.2", queryResult, 2); |
| AbstractProvisioningTest.assertContains("1.2", queryResult, 4); |
| AbstractProvisioningTest.assertContains("1.2", queryResult, 6); |
| AbstractProvisioningTest.assertContains("1.4", queryResult, 8); |
| AbstractProvisioningTest.assertContains("1.2", queryResult, 10); |
| AbstractProvisioningTest.assertContains("1.6", queryResult, 12); |
| AbstractProvisioningTest.assertContains("1.6", queryResult, 13); |
| assertTrue("1.0", monitor.isDone()); |
| assertTrue("1.1", monitor.isWorkDone()); |
| } |
| |
| public void testDoubleCompositeQuery() { |
| IQueryable cQueryable1 = QueryUtil.compoundQueryable(queryable3, queryable2); |
| IQueryable cQueryable = QueryUtil.compoundQueryable(cQueryable1, queryable1); |
| CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); |
| IQueryResult queryResult = cQueryable.query(QueryUtil.createPipeQuery(contextQuery, greatestNumberQuery), monitor); |
| assertEquals("1.0", 1, AbstractProvisioningTest.queryResultSize(queryResult)); |
| AbstractProvisioningTest.assertContains("1.2", queryResult, 12); |
| assertTrue("1.0", monitor.isDone()); |
| assertTrue("1.1", monitor.isWorkDone()); |
| } |
| } |