/*********************************************************************
* Copyright (c) 2008 The University of York.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.epsilon.emc.bibtex;
/*******************************************************************************
 * Copyright (c) 2010 The University of York.
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * Contributors:
 *     Louis Rose - initial API and implementation
 ******************************************************************************/


import static org.eclipse.epsilon.egl.util.FileUtil.NEWLINE;

import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
import org.eclipse.epsilon.eol.exceptions.models.EolModelLoadingException;
import org.eclipse.epsilon.test.util.ModelWithEolAssertions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({BibtexModelTests.AllOfKindTests.class,
	                 BibtexModelTests.PropertyGetterTests.class,
	                 BibtexModelTests.PropertySetterTests.class,
                     BibtexModelTests.AllContentsTests.class})
public class BibtexModelTests {
	
	public static class AllOfKindTests {
		@Test
		public void twoArticles() throws EolModelLoadingException {
			final String bibtex = "@article{apostel60models, " + NEWLINE +
			                      "author    = {Apostel, Leo}," + NEWLINE +
			                      "title     = {Towards the formal study of models in the non-formal sciences},"  + NEWLINE +
			                      "journal   = {Synthese},"  + NEWLINE +
			                      "publisher = {Springer Netherlands}," + NEWLINE +
			                      "pages     = {125--161}," + NEWLINE +
			                      "volume    = {12}," + NEWLINE +
			                      "issue     = {2}," + NEWLINE +
			                      "year      = {1960}" + NEWLINE +
			                      "}" + NEWLINE +
			                      "" + NEWLINE +
			                      "@article{selic05uml2," + NEWLINE + 
			                      "author    = {Bran Selic}, " + NEWLINE +
			                      "title     = {WhatÕs new in UML 2.0?}, " + NEWLINE +
			                      "journal   = {IBM Rational software}," + NEWLINE +
			                      "year      = {2005}" + NEWLINE +
			                      "}";
		
			
			final ModelWithEolAssertions model = new ModelWithEolAssertions(createBibtexModel(bibtex));
			
			model.assertEquals(2, "Article.all.size()");
			
			model.assertEquals("Apostel, Leo",                                                  "Article.all.first.author");
			model.assertEquals("Towards the formal study of models in the non-formal sciences", "Article.all.first.title");
			model.assertEquals("Synthese",                                                      "Article.all.first.journal");
			model.assertEquals("Springer Netherlands",                                          "Article.all.first.publisher");
			model.assertEquals("125--161",                                                      "Article.all.first.pages");
			model.assertEquals("12",                                                            "Article.all.first.volume");
			model.assertEquals("2",                                                             "Article.all.first.issue");
			model.assertEquals("1960",                                                          "Article.all.first.year");
			
			model.assertEquals("Bran Selic",             "Article.all.second.author");
			model.assertEquals("WhatÕs new in UML 2.0?", "Article.all.second.title");
			model.assertEquals("IBM Rational software",  "Article.all.second.journal");
			model.assertEquals("2005",                   "Article.all.second.year");
		}
		
		@Test
		public void mixedTypes() throws EolModelLoadingException {
			final String bibtex = "@book{pool97society," + NEWLINE +
			                      "author    = {Pool, R.}," + NEWLINE +
			                      "title     = {Beyond Engineering: How Society Shapes Technology}," + NEWLINE +
			                      "year      = {1997}," + NEWLINE +
			                      "publisher = {Oxford University Press}," + NEWLINE +
			                      "}" +
			                      "" +
			                      "@book{gronback09emp," + NEWLINE +
			                      "title     = {Eclipse Modeling Project: A Domain-Specific Languages (DSL) Toolkit}," + NEWLINE +
			                      "publisher = {Addison-Wesley Professional}," + NEWLINE +
			                      "year      = {2009}," + NEWLINE +
			                      "author    = {Gronback, R.C.}" + NEWLINE +
			                      "}" +
			                      "@inproceedings{cicchetti08automating," + NEWLINE +
			                      "author    = {Antonio Cicchetti et al.}," + NEWLINE +
			                      "title     = {Automating Co-evolution in Model-Driven Engineering}," + NEWLINE +
			                      "booktitle = {Proc. EDOC}," + NEWLINE +
			                      "year      = {2008}," + NEWLINE +
			                      "pages     = {222--231}," + NEWLINE +
			                      "publisher = {IEEE Computer Society}" + NEWLINE +
			                      "}";
		
			
			final ModelWithEolAssertions model = new ModelWithEolAssertions(createBibtexModel(bibtex));
			
			model.assertEquals(2, "Book.all.size()");
			model.assertEquals(1, "Inproceedings.all.size()");
			
			model.assertEquals("Pool, R.",                 "Book.all.first.author");
			model.assertEquals("Gronback, R.C.",           "Book.all.second.author");
			model.assertEquals("Antonio Cicchetti et al.", "Inproceedings.all.first.author");
		}
		
		@Test(expected=EolRuntimeException.class)
		public void errorForUnknownType() throws Throwable {
			final String bibtex = "";
			
			final ModelWithEolAssertions model = new ModelWithEolAssertions(createBibtexModel(bibtex));
			
			model.evaluate("Book.all.size()");
		}
	}
	
	public static class PropertyGetterTests {
		@Test
		public void propertyContainingABracket() throws EolModelLoadingException {
			final String bibtex = "@article{selic," + NEWLINE +
			                      "title     = {What's new in {UML} 2.0?}," + NEWLINE +
			                      "}";
		
			final ModelWithEolAssertions model = new ModelWithEolAssertions(createBibtexModel(bibtex));
	
			model.assertEquals("What's new in {UML} 2.0?", "Article.all.first.title");
		}
		
		@Test
		public void propertyContainingSeveralBrackets() throws EolModelLoadingException {
			final String bibtex = "@article{kohler," + NEWLINE +
			                      "author     = {Christian K{\"o}hler and G{\"u}nter Kuhns}," + NEWLINE +
			                      "}";
		
			final ModelWithEolAssertions model = new ModelWithEolAssertions(createBibtexModel(bibtex));
	
			model.assertEquals("Christian K{\"o}hler and G{\"u}nter Kuhns", "Article.all.first.author");
		}
		
		@Test
		public void bibtexId() throws EolModelLoadingException {
			final String bibtex = "@article{kohler92models," + NEWLINE +
			                      "author     = {Christian K{\"o}hler and G{\"u}nter Kuhns}," + NEWLINE +
			                      "}";
		
			final ModelWithEolAssertions model = new ModelWithEolAssertions(createBibtexModel(bibtex));
	
			model.assertEquals("kohler92models", "Article.all.first.id");
		}
	}
	
	public static class AllContentsTests {
		@Test
		public void shouldContainElementsOfAllTypes() throws Throwable {
			final String bibtex = "@book{pool97society," + NEWLINE +
			                      "author    = {Pool, R.}," + NEWLINE +
			                      "title     = {Beyond Engineering: How Society Shapes Technology}," + NEWLINE +
			                      "year      = {1997}," + NEWLINE +
			                      "publisher = {Oxford University Press}," + NEWLINE +
			                      "}" +
			                      "" +
			                      "@book{gronback09emp," + NEWLINE +
                                  "title     = {Eclipse Modeling Project: A Domain-Specific Languages (DSL) Toolkit}," + NEWLINE +
                                  "publisher = {Addison-Wesley Professional}," + NEWLINE +
                                  "year      = {2009}," + NEWLINE +
                                  "author    = {Gronback, R.C.}" + NEWLINE +
                                  "}" +
                                  "@inproceedings{cicchetti08automating," + NEWLINE +
                                  "author    = {Antonio Cicchetti et al.}," + NEWLINE +
                                  "title     = {Automating Co-evolution in Model-Driven Engineering}," + NEWLINE +
                                  "booktitle = {Proc. EDOC}," + NEWLINE +
                                  "year      = {2008}," + NEWLINE +
                                  "pages     = {222--231}," + NEWLINE +
                                  "publisher = {IEEE Computer Society}" + NEWLINE +
                                  "}";


			final ModelWithEolAssertions model = new ModelWithEolAssertions(createBibtexModel(bibtex));

			model.assertEquals(3, "MyBib.allContents().size()");

			model.assertEquals("Pool, R.",                 "MyBib.allContents().first.author");
			model.assertEquals("Gronback, R.C.",           "MyBib.allContents().second.author");
			model.assertEquals("Antonio Cicchetti et al.", "MyBib.allContents().third.author");
		}
	}
	
	public static class PropertySetterTests {
		@Test
		public void changeAProperty() throws Throwable {
			final String bibtex = "@article{kohler," + NEWLINE +
			                      "author = {Christian K{\"o}hler and G{\"u}nter Kuhns}," + NEWLINE +
			                      "}";
		
			final ModelWithEolAssertions model = new ModelWithEolAssertions(createBibtexModel(bibtex));
	
			model.execute("Article.all.first.author = 'Joe Bloggs';");
			model.assertEquals("Joe Bloggs", "Article.all.first.author");
		}
		
		@Test
		public void addAProperty() throws Throwable {
			final String bibtex = "@article{kohler," + NEWLINE +
			                      "author = {Christian K{\"o}hler and G{\"u}nter Kuhns}," + NEWLINE +
			                      "}";
		
			final ModelWithEolAssertions model = new ModelWithEolAssertions(createBibtexModel(bibtex));
	
			model.execute("Article.all.first.title = 'A paper';");
			model.assertEquals("A paper", "Article.all.first.title");
		}
	}
	
	private static BibtexModel createBibtexModel(final String bibtex) throws EolModelLoadingException {
		final BibtexModel model = new BibtexModel();
		model.setName("MyBib");
		model.setBibtex(bibtex);
		model.load();
		return model;
	}	
}
