/*******************************************************************************
 * Copyright (c) 2009, 2015 Xored Software Inc and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Xored Software Inc - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.rcptt.core.search.test;

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;

import org.eclipse.rcptt.core.search.tags.TagsContentAssist;
import org.eclipse.rcptt.core.tags.Tag;
import org.eclipse.rcptt.core.tags.TagsFactory;
import org.junit.Test;

public class TagsContentAssistTest {

	@Test
	public void testEmpty() {
		ArrayList<String> offers = TagsContentAssist.getOffers("", getTags());

		assertEquals(4, offers.size());
		assertEquals("tag1", offers.get(0));
		assertEquals("\"tag with spaces\"", offers.get(1));
		assertEquals("\"!tag\"", offers.get(2));
		assertEquals("Tag&Tag", offers.get(3));
	}

	@Test
	public void testTag() {
		ArrayList<String> offers = TagsContentAssist.getOffers("tag", getTags());

		assertEquals(4, offers.size());
		assertEquals("tag1", offers.get(0));
		assertEquals("tag1/tag2", offers.get(1));
		assertEquals("\"tag with spaces\"", offers.get(2));
		assertEquals("Tag&Tag", offers.get(3));
	}

	@Test
	public void testTagWithOpenParenthesis() {
		ArrayList<String> offers = TagsContentAssist.getOffers("(tag", getTags());

		assertEquals(4, offers.size());
		assertEquals("(tag1", offers.get(0));
		assertEquals("(tag1/tag2", offers.get(1));
		assertEquals("(\"tag with spaces\"", offers.get(2));
		assertEquals("(Tag&Tag", offers.get(3));
	}

	@Test
	public void testTagWithCloseParenthesis() {
		ArrayList<String> offers = TagsContentAssist.getOffers("(tag) ", getTags());

		assertEquals(2, offers.size());
		assertEquals("(tag) OR", offers.get(0));
		assertEquals("(tag) AND", offers.get(1));
	}

	@Test
	public void testTag1() {
		ArrayList<String> offers = TagsContentAssist.getOffers("tag1", getTags());

		assertEquals(2, offers.size());
		assertEquals("tag1", offers.get(0));
		assertEquals("tag1/tag2", offers.get(1));
	}

	@Test
	public void testTag1Space() {
		ArrayList<String> offers = TagsContentAssist.getOffers("tag1 ", getTags());

		assertEquals(2, offers.size());
		assertEquals("tag1 OR", offers.get(0));
		assertEquals("tag1 AND", offers.get(1));
	}

	@Test
	public void testTag2() {
		ArrayList<String> offers = TagsContentAssist.getOffers("tag1/", getTags());

		assertEquals(1, offers.size());
		assertEquals("tag1/tag2", offers.get(0));
	}

	@Test
	public void testTagSpace() {
		ArrayList<String> offers = TagsContentAssist.getOffers("tag ", getTags());

		assertEquals(3, offers.size());
		assertEquals("\"tag with spaces\"", offers.get(0));
		assertEquals("tag OR", offers.get(1));
		assertEquals("tag AND", offers.get(2));
	}

	@Test
	public void testTag1And() {
		ArrayList<String> offers = TagsContentAssist.getOffers("tag1 AND ", getTags());

		assertEquals(4, offers.size());
		assertEquals("tag1 AND tag1", offers.get(0));
		assertEquals("tag1 AND \"tag with spaces\"", offers.get(1));
		assertEquals("tag1 AND \"!tag\"", offers.get(2));
		assertEquals("tag1 AND Tag&Tag", offers.get(3));
	}

	@Test
	public void testTag1AndNot() {
		ArrayList<String> offers = TagsContentAssist.getOffers("tag1 AND !", getTags());

		assertEquals(4, offers.size());
		assertEquals("tag1 AND !tag1", offers.get(0));
		assertEquals("tag1 AND !\"tag with spaces\"", offers.get(1));
		assertEquals("tag1 AND !\"!tag\"", offers.get(2));
		assertEquals("tag1 AND !Tag&Tag", offers.get(3));
	}

	/**
	 * Fills tags.
	 * 
	 * tag1
	 * tag1/tag2
	 * tag with spaces
	 * !tag
	 * Tag&Tag
	 * 
	 * @return ArrayList<Tag>
	 */
	private ArrayList<Tag> getTags() {
		ArrayList<Tag> tags = new ArrayList<Tag>();
		Tag tag1 = TagsFactory.eINSTANCE.createTag();
		Tag tag2 = TagsFactory.eINSTANCE.createTag();
		Tag tagWs = TagsFactory.eINSTANCE.createTag();
		Tag tagNot = TagsFactory.eINSTANCE.createTag();
		Tag tagAnd = TagsFactory.eINSTANCE.createTag();

		tag1.setValue("tag1");
		tag2.setValue("tag2");
		tagWs.setValue("tag with spaces");
		tagNot.setValue("!tag");
		tagAnd.setValue("Tag&Tag");

		tag1.getTags().add(tag2);

		tags.add(tag1);
		tags.add(tagWs);
		tags.add(tagNot);
		tags.add(tagAnd);

		return tags;
	}
}
