package org.junit.tests.experimental.parallel;

import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.ParallelComputer;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;

public class ParallelClassTest {
    private static final long TIMEOUT = 15;
    private static volatile Thread fExample1One = null;
    private static volatile Thread fExample1Two = null;
    private static volatile Thread fExample2One = null;
    private static volatile Thread fExample2Two = null;
    private static volatile CountDownLatch fSynchronizer;

    public static class Example1 {
        @Test
        public void one() throws InterruptedException {
            fSynchronizer.countDown();
            assertTrue(fSynchronizer.await(TIMEOUT, TimeUnit.SECONDS));
            fExample1One = Thread.currentThread();
        }

        @Test
        public void two() throws InterruptedException {
            fSynchronizer.countDown();
            assertTrue(fSynchronizer.await(TIMEOUT, TimeUnit.SECONDS));
            fExample1Two = Thread.currentThread();
        }
    }

    public static class Example2 {
        @Test
        public void one() throws InterruptedException {
            fSynchronizer.countDown();
            assertTrue(fSynchronizer.await(TIMEOUT, TimeUnit.SECONDS));
            fExample2One = Thread.currentThread();
        }

        @Test
        public void two() throws InterruptedException {
            fSynchronizer.countDown();
            assertTrue(fSynchronizer.await(TIMEOUT, TimeUnit.SECONDS));
            fExample2Two = Thread.currentThread();
        }
    }

    @Before
    public void init() {
        fExample1One = null;
        fExample1Two = null;
        fExample2One = null;
        fExample2Two = null;
        fSynchronizer = new CountDownLatch(2);
    }

    @Test
    public void testsRunInParallel() {
        Result result = JUnitCore.runClasses(ParallelComputer.classes(), Example1.class, Example2.class);
        assertTrue(result.wasSuccessful());
        assertNotNull(fExample1One);
        assertNotNull(fExample1Two);
        assertNotNull(fExample2One);
        assertNotNull(fExample2Two);
        assertThat(fExample1One, is(fExample1Two));
        assertThat(fExample2One, is(fExample2Two));
        assertThat(fExample1One, is(not(fExample2One)));
    }
}
