/*******************************************************************************
 * Copyright (c) 2005, 2020 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.junit.tests;

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

import org.junit.Ignore;
import org.junit.Test;

import org.eclipse.core.runtime.CoreException;

import org.eclipse.ui.PartInitException;

import org.eclipse.jdt.core.JavaModelException;

import org.eclipse.jdt.internal.junit.ui.ITraceDisplay;
import org.eclipse.jdt.internal.junit.ui.TextualTrace;

/**
 * Disabled unreliable tests driving the event loop in JUnitJUnitTests.
 */
public class WrappingUnitTest {
	@Test
	public void test00wrapSecondLine() throws Exception {
		TextualTrace trace = new TextualTrace("12345\n1234512345",
				new String[0]);
		trace.display(new ITraceDisplay() {
			@Override
			public void addTraceLine(int lineType, String label) {
				assertEquals("12345", label);
			}
		}, 5);
	}

	@Test
	public void test01wrappingSystemTestRunTestsWaitsForCorrectNumberOfLines()
			throws Exception {
		final boolean[] wasCalled = { false };
		WrappingSystemTest test = new WrappingSystemTest() {
			@Override
			protected void launchTests(String prefixForErrorMessage,
					int howManyNumbersInErrorString) throws CoreException,
					JavaModelException {
				// do nothing
			}

			@Override
			protected void waitForTableToFill(int numExpectedTableLines,
					int millisecondTimeout, boolean lastItemHasImage) throws PartInitException {
				wasCalled[0] = true;
				assertEquals(17, numExpectedTableLines);
			}
		};

		test.runTests(null, 0, 17, false);
		assertTrue(wasCalled[0]);
	}

	@Test
	public void test02waitForTableToFillWaitsForNumberOfLines()
			throws Exception {
		WrappingSystemTest test = new WrappingSystemTest() {
			@Override
			protected boolean stillWaiting(int numExpectedTableLines, boolean lastItemHasImage)
					throws PartInitException {
				assertEquals(17, numExpectedTableLines);
				return false;
			}
		};
		test.waitForTableToFill(17, 30000, false);
	}

	@Ignore("java.lang.AssertionError")
	@Test
	public void test03waitForTableToFillObeysTimeout() throws Exception {
		final WrappingSystemTest test = new WrappingSystemTest() {
			@Override
			protected void dispatchEvents() {
				// do nothing (avoid accessing display from non-UI thread)
			}

			@Override
			protected int getNumTableItems() throws PartInitException {
				return -1; // avoid accessing getActiveWorkbenchWindow() from non-UI thread
			}

			@Override
			protected boolean stillWaiting(int numExpectedTableLines, boolean lastItemHasImage)
					throws PartInitException {
				return true;
			}
		};

		final boolean[] done = { false };

		new Thread(new Runnable() {
			@Override
			public void run() {
				synchronized (done) {
					try {
						test.waitForTableToFill(17, 50, false);
						fail();
//					} catch (AssertionFailedError e) {
//						done[0] = true;
					} catch (PartInitException e) {
						fail();// bah.
					}
				}
			}
		}).start();

		Thread.sleep(1000);
		synchronized (done) {
			assertTrue(done[0]);
		}
	}

	@Test
	public void test04stillWaitingChecksForProperNumberOfLines()
			throws Exception {
		WrappingSystemTest test = new WrappingSystemTest() {
			@Override
			protected int getNumTableItems() throws PartInitException {
				return 2;
			}

			@Override
			protected synchronized boolean hasNotTerminated() {
				return false;
			}
		};

		assertTrue(test.stillWaiting(17, false));
	}
}
