/*******************************************************************************
* Copyright (c) 2011 Arapiki Solutions Inc.
* 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:
* "Peter Smith <psmith@arapiki.com>" - initial API and
* implementation and/or initial documentation
*******************************************************************************/
package com.buildml.model;
import static org.junit.Assert.*;
import java.util.Random;
import org.junit.Before;
import org.junit.Test;
/**
* @author "Peter Smith <psmith@arapiki.com>"
*
*/
public class TestFileIncludeMgr {
/*-------------------------------------------------------------------------------------*/
/** our BuildStore, used for testing */
private IBuildStore bs;
/** our FileDependencies object, used for testing */
private IFileIncludeMgr fileIncludeMgr;
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
/* get a new empty BuildStore */
bs = CommonTestUtils.getEmptyBuildStore();
/* fetch the associated FileDependencies */
fileIncludeMgr = bs.getFileIncludeMgr();
}
/*-------------------------------------------------------------------------------------*/
/**
* Test method for {@link com.buildml.model.IFileIncludeMgr#addFileIncludes(int, int)}.
*/
@Test
public void testAddFileIncludes() {
/* without adding anything, check that the count is 0 */
assertEquals(0, fileIncludeMgr.getFileIncludesCount(1, 2));
/* add something once */
fileIncludeMgr.addFileIncludes(1, 2);
assertEquals(1, fileIncludeMgr.getFileIncludesCount(1, 2));
/* add something again */
fileIncludeMgr.addFileIncludes(1, 2);
assertEquals(2, fileIncludeMgr.getFileIncludesCount(1, 2));
/* add something different */
fileIncludeMgr.addFileIncludes(1, 3);
assertEquals(1, fileIncludeMgr.getFileIncludesCount(1, 3));
assertEquals(2, fileIncludeMgr.getFileIncludesCount(1, 2));
assertEquals(0, fileIncludeMgr.getFileIncludesCount(1, 4));
/* add another different one */
fileIncludeMgr.addFileIncludes(2, 2);
assertEquals(1, fileIncludeMgr.getFileIncludesCount(1, 3));
assertEquals(2, fileIncludeMgr.getFileIncludesCount(1, 2));
assertEquals(0, fileIncludeMgr.getFileIncludesCount(1, 4));
assertEquals(1, fileIncludeMgr.getFileIncludesCount(2, 2));
}
/*-------------------------------------------------------------------------------------*/
/**
* Test method for {@link com.buildml.model.IFileIncludeMgr#getTotalFileIncludedCount(int)}.
*/
@Test
public void testGetTotalFileIncludesCount() {
/* before ever being accessed, the count should be 0 */
assertEquals(0, fileIncludeMgr.getTotalFileIncludedCount(2));
/* access it once */
fileIncludeMgr.addFileIncludes(1, 2);
assertEquals(1, fileIncludeMgr.getTotalFileIncludedCount(2));
/* and again, from the same parent file */
fileIncludeMgr.addFileIncludes(1, 2);
assertEquals(2, fileIncludeMgr.getTotalFileIncludedCount(2));
/* now again from a different parent file */
fileIncludeMgr.addFileIncludes(3, 2);
assertEquals(3, fileIncludeMgr.getTotalFileIncludedCount(2));
/* accessing a different file shouldn't change the count */
fileIncludeMgr.addFileIncludes(1, 3);
assertEquals(3, fileIncludeMgr.getTotalFileIncludedCount(2));
}
/*-------------------------------------------------------------------------------------*/
/**
* Test method for {@link com.buildml.model.IFileIncludeMgr#getFilesThatInclude(int)}.
*/
@Test
public void testGetFilesThatInclude() {
/* add a number of file relationships */
fileIncludeMgr.addFileIncludes(2, 1);
fileIncludeMgr.addFileIncludes(3, 1);
fileIncludeMgr.addFileIncludes(4, 1);
fileIncludeMgr.addFileIncludes(5, 2);
fileIncludeMgr.addFileIncludes(6, 2);
fileIncludeMgr.addFileIncludes(7, 1);
fileIncludeMgr.addFileIncludes(8, 3);
fileIncludeMgr.addFileIncludes(9, 3);
fileIncludeMgr.addFileIncludes(10, 1);
/* search for the files that include file 1 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] {2, 3, 4, 7, 10}, fileIncludeMgr.getFilesThatInclude(1)));
/* search for the files that include file 2 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] {5, 6}, fileIncludeMgr.getFilesThatInclude(2)));
/* search for the files that include file 3 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] {8, 9}, fileIncludeMgr.getFilesThatInclude(3)));
}
/*-------------------------------------------------------------------------------------*/
/**
* Test method for {@link com.buildml.model.IFileIncludeMgr#getFilesIncludedBy(int)}.
*/
@Test
public void testGetFilesIncludedBy() {
/* add a number of file relationships */
fileIncludeMgr.addFileIncludes(2, 1);
fileIncludeMgr.addFileIncludes(2, 3);
fileIncludeMgr.addFileIncludes(2, 4);
fileIncludeMgr.addFileIncludes(2, 10);
fileIncludeMgr.addFileIncludes(3, 2);
fileIncludeMgr.addFileIncludes(3, 3);
fileIncludeMgr.addFileIncludes(3, 9);
fileIncludeMgr.addFileIncludes(3, 10);
fileIncludeMgr.addFileIncludes(10, 1);
/* search for the files that are included by file 10 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { 1 }, fileIncludeMgr.getFilesIncludedBy(10)));
/* search for the files that are included by 3 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { 2, 3, 9, 10 }, fileIncludeMgr.getFilesIncludedBy(3)));
/* search for the files that are include by 2 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { 1, 3, 4, 10 }, fileIncludeMgr.getFilesIncludedBy(2)));
/* search for the files that are include by 11 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { }, fileIncludeMgr.getFilesIncludedBy(11)));
}
/*-------------------------------------------------------------------------------------*/
/**
* Test method for {@link com.buildml.model.IFileIncludeMgr#removeFileIncludes(int, int)}.
*/
@Test
public void removeFileIncludes() {
/* add a number of file relationships */
fileIncludeMgr.addFileIncludes(2, 1);
fileIncludeMgr.addFileIncludes(2, 3);
fileIncludeMgr.addFileIncludes(2, 4);
fileIncludeMgr.addFileIncludes(2, 10);
fileIncludeMgr.addFileIncludes(3, 2);
fileIncludeMgr.addFileIncludes(3, 3);
fileIncludeMgr.addFileIncludes(3, 9);
fileIncludeMgr.addFileIncludes(3, 10);
fileIncludeMgr.addFileIncludes(10, 1);
/* delete the files-include relationship for files 10 and 1 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { 1 }, fileIncludeMgr.getFilesIncludedBy(10)));
fileIncludeMgr.removeFileIncludes(10, 1);
assertEquals(0, fileIncludeMgr.getFilesIncludedBy(10).length);
/* the same for 3 and 2 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { 2, 3, 9, 10 }, fileIncludeMgr.getFilesIncludedBy(3)));
fileIncludeMgr.removeFileIncludes(3, 2);
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { 3, 9, 10 }, fileIncludeMgr.getFilesIncludedBy(3)));
/* the same for 2 and 4 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { 1, 3, 4, 10 }, fileIncludeMgr.getFilesIncludedBy(2)));
fileIncludeMgr.removeFileIncludes(2, 4);
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { 1, 3, 10 }, fileIncludeMgr.getFilesIncludedBy(2)));
}
/*-------------------------------------------------------------------------------------*/
/**
* Test method for {@link com.buildml.model.IFileIncludeMgr#removeFilesIncludedBy(int)}.
*/
@Test
public void removeFilesIncludedBy() {
/* add a number of file relationships */
fileIncludeMgr.addFileIncludes(2, 1);
fileIncludeMgr.addFileIncludes(2, 3);
fileIncludeMgr.addFileIncludes(2, 4);
fileIncludeMgr.addFileIncludes(2, 10);
fileIncludeMgr.addFileIncludes(3, 2);
fileIncludeMgr.addFileIncludes(3, 3);
fileIncludeMgr.addFileIncludes(3, 9);
fileIncludeMgr.addFileIncludes(3, 10);
fileIncludeMgr.addFileIncludes(10, 1);
/* delete the files-include relationship for files that are included by file 10 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { 1 }, fileIncludeMgr.getFilesIncludedBy(10)));
fileIncludeMgr.removeFilesIncludedBy(10);
assertEquals(0, fileIncludeMgr.getFilesIncludedBy(10).length);
/* the same for 3 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { 2, 3, 9, 10 }, fileIncludeMgr.getFilesIncludedBy(3)));
fileIncludeMgr.removeFilesIncludedBy(3);
assertEquals(0, fileIncludeMgr.getFilesIncludedBy(3).length);
/* the same for 2 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { 1, 3, 4, 10 }, fileIncludeMgr.getFilesIncludedBy(2)));
fileIncludeMgr.removeFilesIncludedBy(2);
assertEquals(0, fileIncludeMgr.getFilesIncludedBy(2).length);
/* the same for 11 */
assertTrue(CommonTestUtils.sortedArraysEqual(new Integer[] { }, fileIncludeMgr.getFilesIncludedBy(11)));
fileIncludeMgr.removeFilesIncludedBy(11);
assertEquals(0, fileIncludeMgr.getFilesIncludedBy(11).length);
}
/*-------------------------------------------------------------------------------------*/
/**
* Test method for {@link com.buildml.model.IFileIncludeMgr#getTotalFileIncludedCount(int)}.
*/
@Test
public void testScalability() {
boolean prevState = bs.setFastAccessMode(true);
/* create a large number of randomly-generated file relationships */
Random r = new Random();
for (int i = 0; i != 50000; i++) {
fileIncludeMgr.addFileIncludes(r.nextInt(100), r.nextInt(100));
}
bs.setFastAccessMode(prevState);
/*
* Now, fetch them in various ways.
*/
for (int i = 0; i != 20000; i++) {
fileIncludeMgr.getFileIncludesCount(r.nextInt(100), r.nextInt(100));
fileIncludeMgr.getFilesIncludedBy(r.nextInt(100));
fileIncludeMgr.getFilesThatInclude(r.nextInt(100));
fileIncludeMgr.getTotalFileIncludedCount(r.nextInt());
}
}
/*-------------------------------------------------------------------------------------*/
}