package com.gmail.dpierron.calibre; import com.gmail.dpierron.calibre.configuration.Configuration; import com.gmail.dpierron.calibre.configuration.ReadOnlyConfigurationInterface; import com.gmail.dpierron.calibre.datamodel.Book; import com.gmail.dpierron.calibre.datamodel.DataModel; import com.gmail.dpierron.calibre.datamodel.filter.BookFilter; import com.gmail.dpierron.calibre.datamodel.filter.CalibreQueryInterpreter; import com.gmail.dpierron.calibre.datamodel.filter.FilterHelper; import com.gmail.dpierron.calibre.datamodel.filter.PassthroughFilter; import com.gmail.dpierron.calibre.error.CalibreSavedSearchInterpretException; // import org.apache.logging.log4j.ConsoleAppender; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; // import org.apache.logging.log4j.PatternLayout; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import java.io.File; import java.util.List; public class TestCalibreQueryInterpreter { @BeforeClass public static void setUp() { Logger rootLogger = LogManager.getRootLogger(); /* if (!rootLogger.getAllAppenders().hasMoreElements()) { rootLogger.setLevel(Level.INFO); rootLogger.addAppender(new ConsoleAppender(new PatternLayout("%-5p [%t]: %m%n"))); // The TTCC_CONVERSION_PATTERN contains more info than // the pattern we used for the root logger Logger logger = rootLogManager.getLoggerRepository().getLogger(TestCalibreQueryInterpreter.class.getCanonicalName()); // logger.setLevel(Level.TRACE); logger.setLevel(Level.DEBUG); logger.addAppender(new ConsoleAppender(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN))); // The TTCC_CONVERSION_PATTERN contains more info than // the pattern we used for the root logger logger = rootLogManager.getLoggerRepository().getLogger(CalibreQueryInterpreter.class.getCanonicalName()); // logger.setLevel(Level.TRACE); logger.setLevel(Level.DEBUG); logger.addAppender(new ConsoleAppender(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN))); } */ ReadOnlyConfigurationInterface conf = new ReadOnlyConfigurationInterface() { public File getDatabaseFolder() { String fileName = TestCalibreQueryInterpreter.class.getResource("metadata.db").getFile(); File file = new File(fileName).getParentFile(); System.out.println("DataModelTest.testDataModel using database folder : " + file); return file; } }; Configuration.setConfiguration(conf); } @Test public void testInterpret() throws Exception { { // Base test BookFilter bf = new PassthroughFilter(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(945, books.size()); } /* crash on unknown filter */ { final String CALIBRE_QUERY = "tags:\"=State:ToRead\" and not (soussisson:\"=moncopain\")"; try { BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); Assert.fail("should have catched an exception here"); } catch (CalibreSavedSearchInterpretException e) { // it's ok } } /* Multiple filters tests */ { final String CALIBRE_QUERY = "tags:\"=State:ToRead\" and not (tags:\"=Length:SHORT\")"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(725, books.size()); } { final String CALIBRE_QUERY = "tags:\"=Temp:AddToDemoCatalog\" and rating:\">2\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(5, books.size()); } { final String CALIBRE_QUERY = "rating:\">2\" and tags:\"=Temp:AddToDemoCatalog\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(5, books.size()); } { final String CALIBRE_QUERY = "rating:>2 and tags:\"=Temp:AddToDemoCatalog\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(5, books.size()); } { final String CALIBRE_QUERY = "not tags:\"=Interest:1\" and not tags:\"=Interest:2\" and tags:\"=State:ToRead\" and not tags:\"=Length:SHORT\" and languages:\"=French\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(170, books.size()); } } @Test public void testPublisher() throws CalibreSavedSearchInterpretException {/* Publisher */ { // test publisher:true final String CALIBRE_QUERY = "publisher:true"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(866, books.size()); } { // test publisher:false final String CALIBRE_QUERY = "publisher:false"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(79, books.size()); } { // "equals" query final String CALIBRE_QUERY = "publisher:\"=Editions Flammarion\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(2, books.size()); } { // mix case final String CALIBRE_QUERY = "puBLiSher:\"=Editions Flammarion\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(2, books.size()); } { // "contains" query final String CALIBRE_QUERY = "publisher:\"Flammarion\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(3, books.size()); } } @Test public void testFormats() throws CalibreSavedSearchInterpretException {/* Formats */ { // test formats:true final String CALIBRE_QUERY = "formats:true"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(945, books.size()); } { // test formats:false final String CALIBRE_QUERY = "formats:false"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(0, books.size()); } { // "equals" query final String CALIBRE_QUERY = "formats:\"=TXT\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(5, books.size()); } { // mix case final String CALIBRE_QUERY = "foRMats:\"=EPUB\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(940, books.size()); } { // "contains" query final String CALIBRE_QUERY = "formats:\"PUB\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(940, books.size()); } } @Test public void testSeries() throws CalibreSavedSearchInterpretException {/* Series */ { // test series:true final String CALIBRE_QUERY = "series:true"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(470, books.size()); } { // test series:false final String CALIBRE_QUERY = "series:false"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(475, books.size()); } { // "equals" query final String CALIBRE_QUERY = "series:\"=The Lost Fleet\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(5, books.size()); } { // mix case final String CALIBRE_QUERY = "sERiEs:\"=The Lost Fleet\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(5, books.size()); } { // "contains" query final String CALIBRE_QUERY = "series:\"Fleet\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(6, books.size()); } } @Test public void testAuthors() throws CalibreSavedSearchInterpretException {/* Authors */ { // test authors:true final String CALIBRE_QUERY = "authors:true"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(945, books.size()); } { // test authors:false final String CALIBRE_QUERY = "authors:false"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(0, books.size()); } { // "equals" query final String CALIBRE_QUERY = "authors:\"=Isaac Asimov\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(29, books.size()); } { // "equals" query with author sort final String CALIBRE_QUERY = "authors:\"=Asimov, Isaac\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(29, books.size()); } { // mix case final String CALIBRE_QUERY = "AUTHors:\"=Isaac Asimov\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(29, books.size()); } { // "contains" query final String CALIBRE_QUERY = "authors:\"Isaac\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(29, books.size()); } { // "contains" query with author sort final String CALIBRE_QUERY = "authors:\"Asimov\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(29, books.size()); } } @Test public void testRatings() throws CalibreSavedSearchInterpretException {/* Ratings */ { // test rating:true final String CALIBRE_QUERY = "rating:true"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(127, books.size()); } { // test rating:false final String CALIBRE_QUERY = "rating:false"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(818, books.size()); } { // test rating:4 final String CALIBRE_QUERY = "rating:4"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(50, books.size()); } { // test rating:=4 final String CALIBRE_QUERY = "rating:=4"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(50, books.size()); } { // test rating:"=4" final String CALIBRE_QUERY = "rating:\"=4\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(50, books.size()); } { // test rating:>4 final String CALIBRE_QUERY = "rating:>4"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(6, books.size()); } { // test rating:">4" final String CALIBRE_QUERY = "rating:\">4\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(6, books.size()); } { // test rating:"<4" final String CALIBRE_QUERY = "rating:\"<4\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(889, books.size()); } { // mix case final String CALIBRE_QUERY = "rATiNg:<4"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(889, books.size()); } } @Test public void testLanguages() throws CalibreSavedSearchInterpretException {/* Languages */ { // test languages:true final String CALIBRE_QUERY = "languages:true"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(937, books.size()); } { // test languages:false final String CALIBRE_QUERY = "languages:false"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(8, books.size()); } { // test iso2 language query final String CALIBRE_QUERY = "languages:\"=Fr\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(708, books.size()); } { // test iso3 language query final String CALIBRE_QUERY = "languages:\"=Eng\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(229, books.size()); } { // test english name language query final String CALIBRE_QUERY = "languages:\"=French\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(708, books.size()); } { // mix case final String CALIBRE_QUERY = "lAngUAGes:\"=French\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(708, books.size()); } // no "contains" query for languages ! } @Test public void testTags() throws CalibreSavedSearchInterpretException {/* Tags */ { // test tags:true final String CALIBRE_QUERY = "tags:true"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(945, books.size()); } { // test tags:false final String CALIBRE_QUERY = "tags:false"; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(0, books.size()); } { // "equals" query final String CALIBRE_QUERY = "tags:\"=State:ToRead\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(746, books.size()); } { // mix case final String CALIBRE_QUERY = "tAGs:\"=State:ToRead\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(746, books.size()); } { // "contains" query final String CALIBRE_QUERY = "tags:\"State:\""; BookFilter bf = new CalibreQueryInterpreter(CALIBRE_QUERY).interpret(); List<Book> books = FilterHelper.filter(bf, DataModel.getListOfBooks()); Assert.assertEquals(929, books.size()); } } }