/*********************************************************************
 * Copyright (c) 2018 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.evl.engine.test.acceptance.equivalence;

import static org.eclipse.epsilon.test.util.EpsilonTestUtil.*;
import static org.eclipse.epsilon.evl.engine.test.acceptance.EvlAcceptanceTestUtil.*;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.eclipse.epsilon.eol.engine.test.acceptance.util.EolEquivalenceTests;
import org.eclipse.epsilon.evl.*;
import org.eclipse.epsilon.evl.launch.EvlRunConfiguration;
import org.eclipse.epsilon.evl.trace.ConstraintTraceItem;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
import org.junit.runners.MethodSorters;
import org.junit.runners.Parameterized.Parameters;

/**
 * 
 * @author Sina Madani
 * @since 1.6
 */
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class EvlModuleEquivalenceTests extends EolEquivalenceTests<EvlRunConfiguration> {
	
	public EvlModuleEquivalenceTests(EvlRunConfiguration configUnderTest) {
		super(configUnderTest);
	}
	
	static final Object TIMEOUT_LOCK = new Object();
	static final long TEST_TIMEOUT = 45_000L;
	static volatile boolean testInProgress;
	static EvlRunConfiguration currentTestConfig;
	
	static {
		Thread monitor = new Thread(() -> {
			while (true) try {
				if (!testInProgress) synchronized (TIMEOUT_LOCK) {
					TIMEOUT_LOCK.wait();
				}
				if (testInProgress) synchronized (TIMEOUT_LOCK) {
					long startTime = System.currentTimeMillis();
					TIMEOUT_LOCK.wait(TEST_TIMEOUT);
					if (System.currentTimeMillis() - startTime > TEST_TIMEOUT) {
						assert testInProgress;
						System.err.println(currentTestConfig + " got stuck!");
						System.exit(1);
					}
				}
			}
			catch (InterruptedException ie) {
				
			}
		});
		monitor.setName(EvlParallelOperationsTests.class.getSimpleName()+"-timer");
		monitor.setDaemon(true);
		monitor.start();
	}
	
	@Rule
	public TestWatcher testCounter = new TestWatcher() {

		@Override
		protected void starting(Description description) {
			super.starting(description);
			synchronized (TIMEOUT_LOCK) {
				currentTestConfig = testConfig;
				testInProgress = true;
				TIMEOUT_LOCK.notify();
			}
		}
		
		@Override
		protected void finished(Description description) {
			super.finished(description);
			synchronized (TIMEOUT_LOCK) {
				testInProgress = false;
				TIMEOUT_LOCK.notify();
			}
		}
	};
	
	
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		expectedConfigs = getScenarios(EvlModule::new);
		setUpEquivalenceTest();
	}
	
	/**
	 * @return A collection of pre-configured run configurations, each with their own IEvlModule.
	 */
	@Parameters//(name = "0")	// Don't use this as the Eclipse JUnit view won't show failures!
	public static Collection<EvlRunConfiguration> configurations() {
		// Used to specify which module configurations we'd like to test in our scenarios
		return getScenarios(
			allInputs,		// All scripts & models
			true,			// Include test.evl
			modules(false) 	// Exclude the standard EvlModule
		);
	}
	
	@Test
	@Override
	public void _test0() {
		super.beforeTests();
	}
	
	@Test
	public void testUnsatisfiedConstraints() {
		onFail(testCollectionsHaveSameElements(
			expectedConfig.getModule().getContext().getUnsatisfiedConstraints(),
			testConfig.getModule().getContext().getUnsatisfiedConstraints(),
			"UnsatisfiedConstraint"
		));
	}
	
	@Test
	public void testConstraintTraces() {
		// Uses Set instead of List for performance reasons when calling containsAll.
		Function<EvlRunConfiguration, Collection<ConstraintTraceItem>> ctContents = cfg ->
			cfg.getModule().getContext().getConstraintTrace().stream().collect(Collectors.toSet());
		
		onFail(testCollectionsHaveSameElements(
			ctContents.apply(expectedConfig),
			ctContents.apply(testConfig),
			"ConstraintTrace"
		));
	}
	
	@Test
	public void testConstraintsDependedOn() {
		onFail(testCollectionsHaveSameElements(
			expectedConfig.getModule().getContext().getConstraintsDependedOn(),
			testConfig.getModule().getContext().getConstraintsDependedOn(),
			"Constraints depended on"
		));
	}
}
