/*******************************************************************************
* Copyright (c) 2013, 2015 QNX Software Systems 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:
* Andrew Eidsness - Initial implementation
*******************************************************************************/
package org.eclipse.cdt.internal.pdom.tests;
import java.io.File;
import java.util.Arrays;
import org.eclipse.cdt.core.dom.ast.tag.ITag;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IIndexLocationConverter;
import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.internal.core.dom.ast.tag.Tag;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.WritablePDOM;
import org.eclipse.cdt.internal.core.pdom.tag.PDOMTag;
import org.eclipse.cdt.internal.core.pdom.tag.PDOMTagIndex;
import junit.framework.Test;
// copy/pasted from BTreeTests
public class PDOMTagIndexTests extends BaseTestCase {
private File pdomFile;
private PDOM pdom;
public static Test suite() {
return suite(PDOMTagIndexTests.class);
}
private static class MockIndexLocationConverter implements
IIndexLocationConverter {
@Override
public IIndexFileLocation fromInternalFormat(String raw) {
return null;
}
@Override
public String toInternalFormat(IIndexFileLocation location) {
return null;
}
}
@Override
protected void setUp() throws Exception {
super.setUp();
pdomFile = File.createTempFile(getClass().getSimpleName() + '.'
+ Double.toString(Math.random()).substring(2), null);
pdom = new WritablePDOM(pdomFile, new MockIndexLocationConverter(),
LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
pdom.acquireWriteLock(null);
}
@Override
protected void tearDown() throws Exception {
pdom.close();
pdomFile.delete();
super.tearDown();
}
// return the nearest valid record that is less than the specified base
private static long lastRecordBase = 1000;
private static long computeValidRecord() {
lastRecordBase += 1000;
return (lastRecordBase & ~7L) | 2;
}
// A quick sanity test to confirm basic functionality.
public void testSimple() throws Exception {
String tagger = "tagger_a";
long rec = computeValidRecord();
assertNotNull(PDOMTagIndex.createTag(pdom, rec, tagger, 1));
assertNotNull(PDOMTagIndex.getTag(pdom, rec, tagger));
}
public void testMultipleTaggers() throws Exception {
String tagger_a = "tagger_a";
String tagger_b = "tagger_b";
long rec1 = computeValidRecord();
long rec2 = computeValidRecord();
assertNotNull(PDOMTagIndex.createTag(pdom, rec1, tagger_a, 1));
assertNotNull(PDOMTagIndex.createTag(pdom, rec1, tagger_b, 1));
assertNotNull(PDOMTagIndex.createTag(pdom, rec2, tagger_a, 1));
assertNotNull(PDOMTagIndex.getTag(pdom, rec2, tagger_a));
assertNull(PDOMTagIndex.getTag(pdom, rec2, tagger_b));
Iterable<ITag> tags1 = PDOMTagIndex.getTags(pdom, rec1);
int tag_count = 0;
for (ITag tag : tags1) {
++tag_count;
assertTrue(tag.getTaggerId().equals(tagger_a)
|| tag.getTaggerId().equals(tagger_b));
assertEquals(1, tag.getDataLen());
}
assertEquals(2, tag_count);
}
public void testReplaceTags() throws Exception {
String tagger_a = "tagger_a";
String tagger_b = "tagger_b";
long rec = computeValidRecord();
ITag taga = PDOMTagIndex.createTag(pdom, rec, tagger_a, 2);
assertNotNull(taga);
assertTrue(taga instanceof PDOMTag);
PDOMTag taga_pdom = (PDOMTag) taga;
ITag tagb = PDOMTagIndex.createTag(pdom, rec, tagger_a, 2);
assertNotNull(tagb);
// replacement should delete tags for taggers that are no longer present
// and shorter tags
// should be modified in place
PDOMTagIndex.setTags(pdom, rec,
Arrays.<ITag> asList(new Tag(tagger_a, 1)));
assertNull(PDOMTagIndex.getTag(pdom, rec, tagger_b));
ITag shorter_ = PDOMTagIndex.getTag(pdom, rec, tagger_a);
assertNotNull(shorter_);
assertTrue(shorter_ instanceof PDOMTag);
PDOMTag shorter_pdom = (PDOMTag) shorter_;
assertEquals(taga_pdom.getRecord(), shorter_pdom.getRecord());
// longer tags should create a new record
PDOMTagIndex.setTags(pdom, rec,
Arrays.<ITag> asList(new Tag(tagger_a, 4)));
ITag longer_ = PDOMTagIndex.getTag(pdom, rec, tagger_a);
assertNotNull(longer_);
assertTrue(longer_ instanceof PDOMTag);
PDOMTag longer_pdom = (PDOMTag) longer_;
assertTrue(taga_pdom.getRecord() != longer_pdom.getRecord());
// TODO figure out how to confirm that the original tag was free'd
}
}