/* * eXist Open Source Native XML Database * Copyright (C) 2001-2017 The eXist Project * http://exist-db.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package org.exist.dom.persistent; import org.exist.collections.Collection; import org.junit.Test; import java.util.Iterator; import static junit.framework.TestCase.assertFalse; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertTrue; /** * @author Adam Retter <adam@evolvedbinary.com> */ public class DefaultDocumentSetTest { @Test public void contains_leftRight() { final Collection col = mockCollection(1); final DocumentImpl doc1 = mockDoc(col, 1); final DocumentImpl doc6 = mockDoc(col, 6); final DocumentImpl doc9 = mockDoc(col, 9); final DocumentImpl doc15 = mockDoc(col, 15); final DocumentImpl doc34 = mockDoc(col, 34); replay(col, doc1, doc6, doc9, doc15, doc34); final DefaultDocumentSet set1 = new DefaultDocumentSet(); set1.add(doc1); set1.add(doc6); set1.add(doc9); final DefaultDocumentSet set2 = new DefaultDocumentSet(); set2.add(doc1); set2.add(doc6); set2.add(doc9); set2.add(doc15); set2.add(doc34); // functions under test assertTrue(set2.contains(set1)); assertFalse(set1.contains(set2)); verify(col, doc1, doc6, doc9, doc15, doc34); } @Test public void contains_nonOptimized_leftRight() { final Collection col = mockCollection(1); final DocumentImpl doc1 = mockDoc(col, 1); final DocumentImpl doc6 = mockDoc(col, 6); final DocumentImpl doc9 = mockDoc(col, 9); final DocumentImpl doc15 = mockDoc(col, 15); final DocumentImpl doc34 = mockDoc(col, 34); final DefaultDocumentSet set1 = new DefaultDocumentSet(); final DocumentSet set2 = testableDocumentSet(doc1, doc6, doc9, doc15, doc34); replay(col, set2, doc1, doc6, doc9, doc15, doc34); set1.add(doc1); set1.add(doc6); set1.add(doc9); // functions under test assertFalse(set1.contains(set2)); verify(col, set2, doc1, doc6, doc9, doc15, doc34); } @Test public void contains_nonOptimized_rightLeft() { final Collection col = mockCollection(1); final DocumentImpl doc1 = mockDoc(col, 1); final DocumentImpl doc6 = mockDoc(col, 6); final DocumentImpl doc9 = mockDoc(col, 9); final DocumentImpl doc15 = mockDoc(col, 15); final DocumentImpl doc34 = mockDoc(col, 34); final DefaultDocumentSet set1 = new DefaultDocumentSet(); final DocumentSet set2 = testableDocumentSet(doc1, doc6, doc9); replay(col, set2, doc1, doc6, doc9, doc15, doc34); set1.add(doc1); set1.add(doc6); set1.add(doc9); set1.add(doc15); set1.add(doc34); // functions under test assertTrue(set1.contains(set2)); verify(col, set2, doc1, doc6, doc9, doc15, doc34); } @Test public void contains_noMatch() { final Collection col = mockCollection(1); final DocumentImpl doc1 = mockDoc(col, 1); final DocumentImpl doc6 = mockDoc(col, 6); final DocumentImpl doc9 = mockDoc(col, 9); final DocumentImpl doc15 = mockDoc(col, 15); final DocumentImpl doc34 = mockDoc(col, 34); replay(col, doc1, doc6, doc9, doc15, doc34); final DefaultDocumentSet set1 = new DefaultDocumentSet(); set1.add(doc1); set1.add(doc6); set1.add(doc9); final DefaultDocumentSet set2 = new DefaultDocumentSet(); set2.add(doc15); set2.add(doc34); // functions under test assertFalse(set2.contains(set1)); assertFalse(set1.contains(set2)); verify(col, doc1, doc6, doc9, doc15, doc34); } @Test public void contains_nonOptimized_noMatch_leftRight() { final Collection col = mockCollection(1); final DocumentImpl doc1 = mockDoc(col, 1); final DocumentImpl doc6 = mockDoc(col, 6); final DocumentImpl doc9 = mockDoc(col, 9); final DocumentImpl doc15 = mockDoc(col, 15); final DocumentImpl doc34 = mockDoc(col, 34); final DefaultDocumentSet set1 = new DefaultDocumentSet(); final DocumentSet set2 = testableDocumentSet(doc15, doc34); replay(col, set2, doc1, doc6, doc9, doc15, doc34); set1.add(doc1); set1.add(doc6); set1.add(doc9); // functions under test assertFalse(set1.contains(set2)); verify(col, set2, doc1, doc6, doc9, doc15, doc34); } @Test public void contains_nonOptimized_noMatch_rightLeft() { final Collection col = mockCollection(1); final DocumentImpl doc1 = mockDoc(col, 1); final DocumentImpl doc6 = mockDoc(col, 6); final DocumentImpl doc9 = mockDoc(col, 9); final DocumentImpl doc15 = mockDoc(col, 15); final DocumentImpl doc34 = mockDoc(col, 34); final DefaultDocumentSet set1 = new DefaultDocumentSet(); final DocumentSet set2 = testableDocumentSet(doc1, doc6, doc9); replay(col, set2, doc1, doc6, doc9, doc15, doc34); set1.add(doc15); set1.add(doc34); // functions under test assertFalse(set1.contains(set2)); verify(col, set2, doc1, doc6, doc9, doc15, doc34); } @Test public void contains_emptySet() { final Collection col = mockCollection(1); final DocumentImpl doc1 = mockDoc(col, 1); final DocumentImpl doc6 = mockDoc(col, 6); final DocumentImpl doc9 = mockDoc(col, 9); final DocumentImpl doc15 = mockDoc(col, 15); final DocumentImpl doc34 = mockDoc(col, 34); replay(col, doc1, doc6, doc9, doc15, doc34); final DocumentSet set1 = DocumentSet.EMPTY_DOCUMENT_SET; final DefaultDocumentSet set2 = new DefaultDocumentSet(); set2.add(doc15); set2.add(doc34); // functions under test assertTrue(set2.contains(set1)); assertFalse(set1.contains(set2)); verify(col, doc1, doc6, doc9, doc15, doc34); } @Test public void equalDocs() { final Collection col = mockCollection(1); final DocumentImpl doc1 = mockDoc(col, 1); final DocumentImpl doc6 = mockDoc(col, 6); final DocumentImpl doc9 = mockDoc(col, 9); final DocumentImpl doc15 = mockDoc(col, 15); final DocumentImpl doc34 = mockDoc(col, 34); replay(col, doc1, doc6, doc9, doc15, doc34); final DefaultDocumentSet set1 = new DefaultDocumentSet(); set1.add(doc1); set1.add(doc6); set1.add(doc9); set1.add(doc15); set1.add(doc34); final DefaultDocumentSet set2 = new DefaultDocumentSet(); set2.add(doc1); set2.add(doc6); set2.add(doc9); set2.add(doc15); set2.add(doc34); // functions under test assertTrue(set1.equalDocs(set2)); assertTrue(set2.equalDocs(set1)); verify(col, doc1, doc6, doc9, doc15, doc34); } @Test public void equalDocs_noMatch() { final Collection col = mockCollection(1); final DocumentImpl doc1 = mockDoc(col, 1); final DocumentImpl doc6 = mockDoc(col, 6); final DocumentImpl doc9 = mockDoc(col, 9); final DocumentImpl doc15 = mockDoc(col, 15); final DocumentImpl doc34 = mockDoc(col, 34); replay(col, doc1, doc6, doc9, doc15, doc34); final DefaultDocumentSet set1 = new DefaultDocumentSet(); set1.add(doc1); set1.add(doc6); set1.add(doc9); set1.add(doc15); set1.add(doc34); final DefaultDocumentSet set2 = new DefaultDocumentSet(); set2.add(doc1); set2.add(doc6); set2.add(doc9); // functions under test assertFalse(set1.equalDocs(set2)); assertFalse(set2.equalDocs(set1)); verify(col, doc1, doc6, doc9, doc15, doc34); } @Test public void equalDocs_nonOptimized() { final Collection col = mockCollection(1); final DocumentImpl doc1 = mockDoc(col, 1); final DocumentImpl doc6 = mockDoc(col, 6); final DocumentImpl doc9 = mockDoc(col, 9); final DocumentImpl doc15 = mockDoc(col, 15); final DocumentImpl doc34 = mockDoc(col, 34); final DefaultDocumentSet set1 = new DefaultDocumentSet(); final DocumentSet set2 = testableDocumentSet(doc1, doc6, doc9, doc15, doc34); replay(col, set2, doc1, doc6, doc9, doc15, doc34); set1.add(doc1); set1.add(doc6); set1.add(doc9); set1.add(doc15); set1.add(doc34); // functions under test assertTrue(set1.equalDocs(set2)); verify(col, set2, doc1, doc6, doc9, doc15, doc34); } @Test public void equalDocs_nonOptimized_noMatch() { final Collection col = mockCollection(1); final DocumentImpl doc1 = mockDoc(col, 1); final DocumentImpl doc6 = mockDoc(col, 6); final DocumentImpl doc9 = mockDoc(col, 9); final DocumentImpl doc15 = mockDoc(col, 15); final DocumentImpl doc34 = mockDoc(col, 34); final DefaultDocumentSet set1 = new DefaultDocumentSet(); final DocumentSet set2 = testableDocumentSet(doc1, doc6, doc9, doc15, doc34); replay(col, set2, doc1, doc6, doc9, doc15, doc34); set1.add(doc1); set1.add(doc6); set1.add(doc9); // functions under test assertFalse(set1.equalDocs(set2)); verify(col, set2, doc1, doc6, doc9, doc15, doc34); } @Test public void equalDocs_emptySet() { final Collection col = mockCollection(1); final DocumentImpl doc1 = mockDoc(col, 1); final DocumentImpl doc6 = mockDoc(col, 6); final DocumentImpl doc9 = mockDoc(col, 9); final DocumentImpl doc15 = mockDoc(col, 15); final DocumentImpl doc34 = mockDoc(col, 34); replay(col, doc1, doc6, doc9, doc15, doc34); final DocumentSet set1 = DocumentSet.EMPTY_DOCUMENT_SET; final DefaultDocumentSet set2 = new DefaultDocumentSet(); set2.add(doc15); set2.add(doc34); // functions under test assertFalse(set2.equalDocs(set1)); assertFalse(set1.equalDocs(set2)); verify(col, doc1, doc6, doc9, doc15, doc34); } private final Collection mockCollection(final int colId) { final Collection col = createMock(Collection.class); expect(col.compareTo(col)).andReturn(0).anyTimes(); expect(col.getId()).andReturn(colId).anyTimes(); return col; } private final DocumentImpl mockDoc(final Collection collection, final int docId) { final DocumentImpl doc = createMock(DocumentImpl.class); expect(doc.getCollection()).andReturn(collection).anyTimes(); expect(doc.getDocId()).andReturn(docId).anyTimes(); return doc; } private final DocumentSet testableDocumentSet(final DocumentImpl... docs) { final DocumentSet documentSet = createMock(DocumentSet.class); expect(documentSet.getDocumentCount()).andReturn(docs.length); expect(documentSet.getDocumentIterator()).andReturn(new Iterator<DocumentImpl>(){ private int idx = 0; @Override public boolean hasNext() { return idx < docs.length; } @Override public DocumentImpl next() { return docs[idx++]; } }).anyTimes(); return documentSet; } }