// Copyright 2013 Michel Kraemer
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package de.undercouch.citeproc.bibtex;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;

import java.util.Map;

import org.jbibtex.BibTeXDatabase;
import org.jbibtex.BibTeXEntry;
import org.jbibtex.Key;
import org.junit.Test;

import de.undercouch.citeproc.csl.CSLItemData;
import de.undercouch.citeproc.csl.CSLType;

/**
 * Tests the BibTeX converter
 * @author Michel Kraemer
 */
public class BibTeXConverterTest extends AbstractBibTeXTest {
	/**
	 * Tests if a single bibliography entry can be converted
	 * @throws Exception if something goes wrong
	 */
	@Test
	public void singleEntry() throws Exception {
		BibTeXDatabase db = loadUnixDatabase();
		
		BibTeXEntry e = db.resolveEntry(new Key("Ritchie:1974:UTS"));
		
		BibTeXConverter conv = new BibTeXConverter();
		CSLItemData cid = conv.toItemData(e);
		assertEquals("Ritchie:1974:UTS", cid.getId());
		assertEquals(CSLType.ARTICLE_JOURNAL, cid.getType());
		assertEquals(2, cid.getAuthor().length);
		assertEquals("Ritchie", cid.getAuthor()[0].getFamily());
		assertEquals("Dennis W.", cid.getAuthor()[0].getGiven());
		assertEquals("Thompson", cid.getAuthor()[1].getFamily());
		assertEquals("Ken", cid.getAuthor()[1].getGiven());
		assertEquals("Communications of the Association for Computing Machinery", cid.getCollectionTitle());
		assertEquals("Communications of the Association for Computing Machinery", cid.getContainerTitle());
		assertEquals("17", cid.getVolume());
		assertEquals("7", cid.getIssue());
		assertEquals("7", cid.getNumber());
		assertEquals("11", cid.getNumberOfPages());
		assertEquals("365-375", cid.getPage());
		assertEquals("365", cid.getPageFirst());
		assertEquals("The UNIX Time-Sharing System", cid.getTitle());
		assertArrayEquals(new int[][] { new int[] { 1974, 7 } }, cid.getIssued().getDateParts());
	}
	
	/**
	 * Tests if a bibliography entry with a date range can be converted
	 * @throws Exception if something goes wrong
	 */
	@Test
	public void singleEntryWithDateRange() throws Exception {
		BibTeXDatabase db = loadUnixDatabase();
		
		BibTeXEntry e = db.resolveEntry(new Key("Lycklama:1978:UTSb"));
		
		BibTeXConverter conv = new BibTeXConverter();
		CSLItemData cid = conv.toItemData(e);
		assertEquals("Lycklama:1978:UTSb", cid.getId());
		assertEquals(CSLType.ARTICLE_JOURNAL, cid.getType());
		assertEquals(1, cid.getAuthor().length);
		assertEquals("Lycklama", cid.getAuthor()[0].getFamily());
		assertEquals("H.", cid.getAuthor()[0].getGiven());
		assertEquals("The Bell System Technical Journal", cid.getCollectionTitle());
		assertEquals("The Bell System Technical Journal", cid.getContainerTitle());
		assertEquals("57", cid.getVolume());
		assertEquals("6", cid.getIssue());
		assertEquals("6", cid.getNumber());
		assertEquals("15", cid.getNumberOfPages());
		assertEquals("2087-2101", cid.getPage());
		assertEquals("2087", cid.getPageFirst());
		assertEquals("UNIX Time-Sharing System: UNIX on a Microprocessor", cid.getTitle());
		assertArrayEquals(new int[][] { new int[] { 1978, 7 }, new int[] { 1978, 8 } }, cid.getIssued().getDateParts());
	}
	
	/**
	 * Tests if a while bibliography database can be converted. Loads the
	 * database and then checks a sample item.
	 * @throws Exception if something goes wrong
	 */
	@Test
	public void allEntries() throws Exception {
		BibTeXDatabase db = loadUnixDatabase();
		BibTeXConverter conv = new BibTeXConverter();
		Map<String, CSLItemData> cids = conv.toItemData(db);
		
		CSLItemData cid = cids.get("Ritchie:1974:UTS");
		assertEquals("Ritchie:1974:UTS", cid.getId());
		assertEquals(CSLType.ARTICLE_JOURNAL, cid.getType());
		assertEquals(2, cid.getAuthor().length);
		assertEquals("Ritchie", cid.getAuthor()[0].getFamily());
		assertEquals("Dennis W.", cid.getAuthor()[0].getGiven());
		assertEquals("Thompson", cid.getAuthor()[1].getFamily());
		assertEquals("Ken", cid.getAuthor()[1].getGiven());
		assertEquals("Communications of the Association for Computing Machinery", cid.getCollectionTitle());
		assertEquals("Communications of the Association for Computing Machinery", cid.getContainerTitle());
		assertEquals("17", cid.getVolume());
		assertEquals("7", cid.getIssue());
		assertEquals("7", cid.getNumber());
		assertEquals("11", cid.getNumberOfPages());
		assertEquals("365-375", cid.getPage());
		assertEquals("365", cid.getPageFirst());
		assertEquals("The UNIX Time-Sharing System", cid.getTitle());
		assertArrayEquals(new int[][] { new int[] { 1974, 7 } }, cid.getIssued().getDateParts());
	}
}
