package eu.dnetlib.data.cleaner;

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

import java.util.HashMap;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;

import com.google.common.collect.Lists;

import eu.dnetlib.data.cleaner.CleaningRule;
import eu.dnetlib.data.cleaner.XPATHCleaningRule;
import eu.dnetlib.rmi.data.CleanerException;

@RunWith(MockitoJUnitRunner.class)
public class XMLCleaningRuleTest {

	private static final String INPUT_VALID = "<record>" + "	<header />" + "	<metadata>" + "		<a>HELLO</a>" + "	</metadata>" + "</record>";

	private static final String INPUT_INVALID = "<record>" + "	<header />" + "	<metadata>" + "		<a>GOOD BYE</a>" + "	</metadata>" + "</record>";

	/**
	 * Class under test.
	 */
	private CleaningRule xmlRule;
	private final XPATHCleaningRule mockXpathRule = new XPATHCleaningRule() {

		@Override
		protected Map<String, String> verifyValue(final String value) throws CleanerException {
			if (value.equals("CIAO")) { return null; }

			final Map<String, String> err = new HashMap<String, String>();
			err.put("term", value);
			return err;
		}

		@Override
		protected String calculateNewValue(final String oldValue) throws CleanerException {
			if (oldValue.equals("HELLO")) { return "CIAO"; }
			return oldValue;
		}
	};;

	@Before
	public void setUp() throws Exception {
		this.xmlRule = new CleaningRule();

		this.mockXpathRule.setStrict(true);
		this.mockXpathRule.setXpath("//a");

		this.xmlRule.setXpathRules(Lists.newArrayList(this.mockXpathRule));
	}

	@Test
	public void testEvaluate_valid() {
		final String s = this.xmlRule.apply(INPUT_VALID);
		assertTrue(s.contains("CIAO"));
		assertFalse(s.contains("invalid"));
	}

	@Test
	public void testEvaluate_invalid() {
		final String s = this.xmlRule.apply(INPUT_INVALID);
		System.out.println(s);
		assertFalse(s.contains("CIAO"));
		assertTrue(s.contains("invalid"));
	}

}
