package org.jabref.logic.bibtex;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.List;
import org.jabref.logic.importer.ImportFormatPreferences;
import org.jabref.logic.importer.Importer;
import org.jabref.logic.importer.ParserResult;
import org.jabref.logic.importer.fileformat.BibtexParser;
import org.jabref.model.entry.BibEntry;
import org.junit.Assert;
import org.mockito.Answers;
import static org.mockito.Mockito.mock;
public class BibEntryAssert {
/**
* Reads a single entry from the resource using `getResourceAsStream` from the given class. The resource has to
* contain a single entry
*
* @param clazz the class where to call `getResourceAsStream`
* @param resourceName the resource to read
* @param entry the entry to compare with
*/
public static void assertEquals(Class<?> clazz, String resourceName, BibEntry entry)
throws IOException {
Assert.assertNotNull(clazz);
Assert.assertNotNull(resourceName);
Assert.assertNotNull(entry);
try (InputStream shouldBeIs = clazz.getResourceAsStream(resourceName)) {
BibEntryAssert.assertEquals(shouldBeIs, entry);
}
}
/**
* Reads a single entry from the resource using `getResourceAsStream` from the given class. The resource has to
* contain a single entry
*
* @param clazz the class where to call `getResourceAsStream`
* @param resourceName the resource to read
* @param asIsEntries a list containing a single entry to compare with
*/
public static void assertEquals(Class<?> clazz, String resourceName, List<BibEntry> asIsEntries)
throws IOException {
Assert.assertNotNull(clazz);
Assert.assertNotNull(resourceName);
Assert.assertNotNull(asIsEntries);
try (InputStream shouldBeIs = clazz.getResourceAsStream(resourceName)) {
BibEntryAssert.assertEquals(shouldBeIs, asIsEntries);
}
}
private static List<BibEntry> getListFromInputStream(InputStream is) throws IOException {
ParserResult result;
try (Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
BibtexParser parser = new BibtexParser(mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS));
result = parser.parse(reader);
}
Assert.assertNotNull(result);
Assert.assertFalse(result.isEmpty());
return result.getDatabase().getEntries();
}
/**
* Reads a bibtex database from the given InputStream. The list is compared with the given list.
*
* @param expectedInputStream the inputStream reading the entry from
* @param actualEntries a list containing a single entry to compare with
*/
public static void assertEquals(InputStream expectedInputStream, List<BibEntry> actualEntries)
throws IOException {
Assert.assertNotNull(expectedInputStream);
Assert.assertNotNull(actualEntries);
Assert.assertEquals(getListFromInputStream(expectedInputStream), actualEntries);
}
public static void assertEquals(List<BibEntry> expectedEntries, InputStream actualInputStream)
throws IOException {
Assert.assertNotNull(actualInputStream);
Assert.assertNotNull(expectedEntries);
Assert.assertEquals(expectedEntries, getListFromInputStream(actualInputStream));
}
/**
* Reads a bibtex database from the given InputStream. The result has to contain a single BibEntry. This entry is
* compared to the given entry
*
* @param expected the inputStream reading the entry from
* @param actual the entry to compare with
*/
public static void assertEquals(InputStream expected, BibEntry actual)
throws IOException {
assertEquals(expected, Collections.singletonList(actual));
}
/**
* Compares two InputStreams. For each InputStream a list will be created. expectedIs is read directly, actualIs is filtered through importer to convert to a list of BibEntries.
* @param expectedIs A BibtexImporter InputStream.
* @param fileToImport The path to the file to be imported.
* @param importer The fileformat you want to use to read the passed file to get the list of expected BibEntries
* @throws IOException
*/
public static void assertEquals(InputStream expectedIs, Path fileToImport, Importer importer)
throws IOException {
assertEquals(getListFromInputStream(expectedIs), fileToImport, importer);
}
public static void assertEquals(InputStream expectedIs, URL fileToImport, Importer importer)
throws URISyntaxException, IOException {
assertEquals(expectedIs, Paths.get(fileToImport.toURI()), importer);
}
/**
* Compares a list of BibEntries to an InputStream. actualIs is filtered through importerForActualIs to convert to a list of BibEntries.
* @param expected A BibtexImporter InputStream.
* @param fileToImport The path to the file to be imported.
* @param importer The fileformat you want to use to read the passed file to get the list of expected BibEntries
* @throws IOException
*/
public static void assertEquals(List<BibEntry> expected, Path fileToImport, Importer importer)
throws IOException {
List<BibEntry> actualEntries = importer.importDatabase(fileToImport, StandardCharsets.UTF_8)
.getDatabase().getEntries();
Assert.assertEquals(expected, actualEntries);
}
public static void assertEquals(List<BibEntry> expected, URL fileToImport, Importer importer)
throws URISyntaxException, IOException {
assertEquals(expected, Paths.get(fileToImport.toURI()), importer);
}
}