/*******************************************************************************
 * Copyright (c) 2016 Tasktop Technologies and others.
 * 
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * https://www.eclipse.org/legal/epl-2.0
 * 
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.internal.tasks.core.externalization;

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

import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.helpers.AttributesImpl;

public class SaxOrphanBuilderTest {

	private SaxOrphanBuilder builder;

	@Before
	public void setUp() throws Exception {
		builder = new SaxOrphanBuilder();
	}

	@Test
	public void parseWithNoCommit() {
		prepareTask("123");
		builder.endElement();

		prepareTask("456");
		builder.endElement();

		assertOrphans(0);
	}

	@Test
	public void parseWithCommit() {
		prepareTask("123");
		builder.endElement();

		prepareTask("456");
		builder.commitOrphan();
		builder.endElement();

		assertOrphans(1, "456");

	}

	@Test
	public void parseWithMiddleCommit() {
		prepareTask("123");
		builder.endElement();

		prepareTask("345");
		builder.commitOrphan();
		builder.endElement();

		prepareTask("567");
		builder.endElement();

		assertOrphans(1, "345");
	}

	@Test
	public void parseWithMultipleCommit() {
		prepareTask("123");
		builder.endElement();

		prepareTask("o1");
		builder.commitOrphan();
		builder.endElement();

		prepareTask("o2");
		builder.commitOrphan();
		builder.endElement();

		prepareTask("o3");
		builder.commitOrphan();
		builder.endElement();

		prepareTask("567");
		builder.endElement();

		prepareTask("o4");
		builder.commitOrphan();
		builder.endElement();

		prepareTask("o5");
		builder.commitOrphan();
		builder.endElement();

		assertOrphans(5, "o1", "o2", "o3", "o4", "o5");
	}

	private void prepareTask(String attributeValue) {
		start("task");
		start("attribute");
		text(attributeValue);
		builder.endElement();
	}

	private void start(String name) {
		builder.startElement(name, new AttributesImpl());
	}

	private void text(String text) {
		builder.acceptCharacters(text.toCharArray(), 0, text.length());
	}

	private void assertOrphans(int numOrphans, String... attributeValue) {
		Document document = builder.getOrphans();
		assertEquals(1, document.getChildNodes().getLength());
		NodeList orphans = document.getDocumentElement().getChildNodes();
		assertEquals(numOrphans, orphans.getLength());
		for (int i = 0; i < attributeValue.length; i++) {
			Node text = orphans.item(i).getFirstChild().getFirstChild();
			assertTrue(text instanceof Text);
			assertEquals(attributeValue[i], ((Text) text).getTextContent());
		}
	}

}
