/* * Copyright 2010, Andrew M Gibson * * www.andygibson.net * * This file is part of DataValve. * * DataValve 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 3 of the License, or * (at your option) any later version. * * DataValve 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 DataValve. If not, see <http://www.gnu.org/licenses/>. * */ package org.fluttercode.datavalve.provider.file; import java.io.File; import java.io.FileOutputStream; import java.util.Comparator; import java.util.List; import java.util.Random; import org.fluttercode.datavalve.dataset.Dataset; import org.fluttercode.datavalve.dataset.ObjectDataset; import org.fluttercode.datavalve.provider.file.FileDataProvider; import org.fluttercode.datavalve.testing.junit.AbstractObjectDatasetJUnitTest; /** * @author Andy Gibson * */ public class FileQueryTest extends AbstractObjectDatasetJUnitTest<File> { private static final long serialVersionUID = 1L; private String baseDir; private static final int FILE_COUNT = 20; private static final int DIR_COUNT = 20; private static final Random random = new Random(); private int getRandomValue(int min, int max) { return min + random.nextInt(max - min); } private class FileDataset extends Dataset<File, FileDataProvider> { private static final long serialVersionUID = 1L; public FileDataset(FileDataProvider provider) { super(provider); } @Override public void invalidateResultInfo() { super.invalidateResultInfo(); getProvider().invalidateData(); } } @Override protected void setUp() throws Exception { super.setUp(); baseDir = System.getProperty("java.io.tmpdir") + "/FileDsTest/"; File base = new File(baseDir); base.mkdir(); FileOutputStream fs = null; for (int i = 0; i < FILE_COUNT; i++) { fs = new FileOutputStream(new File(baseDir + "file" + i + ".txt")); int count = getRandomValue(5, 100); for (int s = 0; s < count; s++) { fs.write(123); } fs.close(); } // create directories for (int i = 0; i < DIR_COUNT; i++) { File file = new File(baseDir + "dir" + i); file.mkdir(); } } @Override protected void tearDown() throws Exception { super.tearDown(); deleteDir(baseDir); } protected void deleteDir(String path) { File dir = new File(path); for (File file : dir.listFiles()) { if (file.isDirectory()) { deleteDir(file.getAbsolutePath()); } file.delete(); } dir.delete(); } public void testFileDataQueryStringIncludingDirs() { FileDataset qry = buildFileDataset(true); List<File> res = qry.getResultList(); assertEquals(40, res.size()); } public void testFileDataQueryRecordCountIncludingDirs() { FileDataset qry = buildFileDataset(true); long count = qry.getResultCount(); assertEquals(40, count); } public void testFileDataQueryStringExcludingDirs() { FileDataset qry = buildFileDataset(false); List<File> res = qry.getResultList(); assertEquals(20, res.size()); } public void testFileDataQueryRecordCountExcludingDirs() { FileDataset qry = buildFileDataset(false); long count = qry.getResultCount(); assertEquals(20, count); } public void testIncDirChange() { // test changing include dirs invalidates the results FileDataset qry = buildFileDataset(false); assertEquals(20, qry.getResultCount().intValue()); qry.getProvider().setIncludeDirectories(true); qry.invalidateResultInfo(); assertEquals(40, qry.getResultCount().intValue()); qry.getProvider().setIncludeDirectories(false); qry.invalidateResultInfo(); assertEquals(20, qry.getResultCount().intValue()); } public void testPagination() { FileDataset qry = buildFileDataset(false); qry.setMaxRows(10); assertEquals(1, qry.getPage()); qry.getProvider().setIncludeDirectories(true); assertEquals(40, qry.getResultCount().intValue()); assertEquals(true, qry.isNextAvailable()); assertEquals(false, qry.isPreviousAvailable()); qry.next(); assertEquals(2, qry.getPage()); assertEquals(true, qry.isNextAvailable()); assertEquals(true, qry.isPreviousAvailable()); qry.next(); assertEquals(3, qry.getPage()); assertEquals(true, qry.isNextAvailable()); assertEquals(true, qry.isPreviousAvailable()); qry.next(); assertEquals(4, qry.getPage()); assertEquals(false, qry.isNextAvailable()); assertEquals(true, qry.isPreviousAvailable()); qry.next(); assertEquals(4, qry.getPage()); assertEquals(false, qry.isNextAvailable()); assertEquals(true, qry.isPreviousAvailable()); qry.previous(); assertEquals(3, qry.getPage()); assertEquals(true, qry.isNextAvailable()); assertEquals(true, qry.isPreviousAvailable()); } public void testPageCount() { FileDataset qry = buildFileDataset(false); assertEquals(20, qry.getResultCount().intValue()); qry.setMaxRows(10); assertEquals(2, qry.getPageCount()); qry.setMaxRows(13); assertEquals(2, qry.getPageCount()); qry.setMaxRows(7); assertEquals(3, qry.getPageCount()); qry.setMaxRows(5); assertEquals(4, qry.getPageCount()); qry.setMaxRows(4); assertEquals(5, qry.getPageCount()); qry.setMaxRows(2); assertEquals(10, qry.getPageCount()); qry.setMaxRows(1); assertEquals(20, qry.getPageCount()); qry.setMaxRows(null); assertEquals(1, qry.getPageCount()); try { qry.setMaxRows(-1); fail("setMaxRows(-1) should have thrown an exception!"); } catch (IllegalArgumentException expected) { // no problem } } @Override public ObjectDataset<File> buildObjectDataset() { return buildFileDataset(true); } public FileDataset buildFileDataset(boolean includeDirs) { FileDataset ds = new FileDataset(new FileDataProvider(baseDir)); ds.getProvider().setIncludeDirectories(includeDirs); ds.getProvider().getOrderKeyMap().put("name", new Comparator<File>() { public int compare(File o1, File o2) { return o1.getName().compareToIgnoreCase(o2.getName()); } }); ds.getProvider().getOrderKeyMap().put("size", new Comparator<File>() { public int compare(File o1, File o2) { return (int) (o1.length() - o2.length()); } }); return ds; } @Override public int getDataRowCount() { return FILE_COUNT + DIR_COUNT; } public void testOrderingSizeAsc() { FileDataset qry = buildFileDataset(false); qry.setOrderKey("size"); qry.setOrderAscending(true); List<File> results = qry.getResultList(); long size = 0; for (File f : results) { assertTrue(size <= f.length()); size = f.length(); } } public void checkListOrderedNameAsc(List<File> list) { String value = null; for (File f : list) { if (value != null) { assertTrue(value.compareToIgnoreCase(f.getName()) < 0); } value = f.getName(); } } public void checkListOrderedNameDesc(List<File> list) { String value = null; for (File f : list) { if (value != null) { assertTrue(value.compareToIgnoreCase(f.getName()) > 0); } value = f.getName(); } } public void checkListOrderedSizeDesc(List<File> list) { long size = 999999; for (File f : list) { assertTrue(size >= f.length()); size = f.length(); } } public void checkListOrderedSizeAsc(List<File> list) { long size = 0; for (File f : list) { assertTrue(size <= f.length()); size = f.length(); } } public void testOrdering() { FileDataset qry = buildFileDataset(false); qry.setOrderKey("size"); qry.setOrderAscending(false); List<File> results = qry.getResultList(); checkListOrderedSizeDesc(results); qry.setOrderAscending(true); results = qry.getResultList(); checkListOrderedSizeAsc(results); // qry.setOrderAscending(false); qry.setOrderKey("name"); results = qry.getResultList(); checkListOrderedNameDesc(results); // check that order is correct when we change the key qry.setOrderKey("size"); results = qry.getResultList(); checkListOrderedSizeDesc(results); } @Override public boolean includeSerializationTest() { return false; } }