/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package vogar.target.junit4;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import vogar.target.AbstractTestRunnerTest;
import vogar.target.TestRunner;
import vogar.target.TestRunnerProperties;

/**
 * Tests for using TestRunner to run JUnit 4 classes.
 */
@RunWith(JUnit4.class)
public class TestRunnerJUnit4Test extends AbstractTestRunnerTest {

    @TestRunnerProperties(testClass = ChangeDefaultLocaleTest.class)
    @Test
    public void testRunner_ChangeDefaultLocaleTest() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        // Note, that this doesn't complete normally. That's correct behavior as that will trigger
        // the vogar process to restart the VM and run the tests from after this one.
        expectedResults()
                .success("testDefault_Locale_CANADA")
                .success("testDefault_Locale_CHINA")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = SimpleTest2.class)
    @Test
    public void testRunner_SimpleTest2() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        expectedResults()
                .success("Simple3")
                .success("simple1")
                .success("simple2")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = SimpleTest2.class, profile = true)
    @Test
    public void testRunner_SimpleTest2_Profile() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        expectedResults()
                .ensureProfilingWasRequested()
                .success("Simple3")
                .success("simple1")
                .success("simple2")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = SimpleTest2.class)
    @Test
    public void testRunner_SkipPast() throws Exception {
        Class<?> testClass = testRunnerRule.testClass();
        String failingTestName = testClass.getName() + "#simple1";
        TestRunner runner = testRunnerRule.createTestRunner("--skipPast", failingTestName);

        runner.run();

        expectedResults()
                .success("simple2")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = SimpleTest2.class)
    @Test
    public void testRunner_SkipPastAll() throws Exception {
        Class<?> testClass = testRunnerRule.testClass();
        String failingTestName = testClass.getName() + "#other";
        TestRunner runner = testRunnerRule.createTestRunner("--skipPast", failingTestName);

        runner.run();
        expectedResults().completedNormally();
    }

    @TestRunnerProperties(testClass = SimpleTest2.class)
    @Test
    public void testRunner_SimpleTest2_OneMethod() throws Exception {
        String[] args = {"simple2"};
        TestRunner runner = testRunnerRule.createTestRunner(args);
        runner.run();

        expectedResults()
                .success("simple2")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = SimpleTest2.class)
    @Test
    public void testRunner_SimpleTest2_TwoMethod() throws Exception {
        String[] args = {"simple1", "Simple3"};
        TestRunner runner = testRunnerRule.createTestRunner(args);
        runner.run();

        expectedResults()
                .success("Simple3")
                .success("simple1")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = SimpleTest2.class)
    @Test
    public void testRunner_SimpleTest2_WrongMethod() throws Exception {
        String args = "testSimple5";
        TestRunner runner = testRunnerRule.createTestRunner(args);
        runner.run();

        expectedResults()
                .failure("testSimple5",
                        "junit.framework.AssertionFailedError: Method \"" + args
                                + "\" not found\n")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = ExtendedSimpleTest2.class)
    @Test
    public void testRunner_ExtendedSimple2() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        expectedResults()
                .success("Simple3")
                .success("simple1")
                .success("simple2")
                .success("simple4")
                .completedNormally();
    }

    @TestRunnerProperties(
            testClass = ExtendedSimpleTest2.class,
            testClassOrPackage = "vogar.target.junit4.ExtendedSimpleTest2#simple2")
    @Test
    public void testRunner_ExtendedSimple2_QualifiedAndMethodNames() throws Exception {
        String[] args = {"simple1", "simple4"};
        TestRunner runner = testRunnerRule.createTestRunner(args);
        runner.run();

        expectedResults()
                .success("simple1")
                .success("simple2")
                .success("simple4")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = SimpleTest.class)
    @Test
    public void testRunner_SimpleTest() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        expectedResults()
                .forTestClass(SimpleTest3.class)
                .success("simple")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = FailTest.class)
    @Test
    public void testRunner_FailTest() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        expectedResults()
                .failure("failure",
                        "java.lang.AssertionError: failed.\n")
                .success("success")
                .success("throwAnotherExpectedException")
                .failure("throwException", "java.lang.RuntimeException: exception\n")
                .success("throwExpectedException")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = FailConstructorTest.class)
    @Test
    public void testRunner_FailConstructorTest() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        expectedResults()
                .failure("testSuccess", ""
                        + "java.lang.IllegalStateException: Constructor failed\n")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = SuiteTest.class)
    @Test
    public void testRunner_SuiteTest() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        expectedResults()
                .forTestClass(SimpleTest2.class)
                .success("Simple3")
                .success("simple1")
                .success("simple2")
                .forTestClass(SimpleTest3.class)
                .success("simple")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = LongTest.class, timeout = 1)
    @Test
    public void testRunner_LongTest_WithTimeout() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        // Note, that this doesn't complete normally. That's correct behavior as that will trigger
        // the vogar process to restart the VM and run the tests from after this one.
        expectedResults()
                .failure("test", "java.util.concurrent.TimeoutException\n")
                .aborted();
    }

    @TestRunnerProperties(testClass = LongTest2.class)
    @Test
    public void testRunner_LongTest2_WithoutTimeout() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        expectedResults()
                .success("test1")
                .success("test2")
                .success("test3")
                .success("test4")
                .success("test5")
                .success("test6")
                .success("test7")
                .success("test8")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = TestMethodWithParameterTest.class)
    @Test
    public void testRunner_TestMethodWithParameterTest() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        String methodName = "parameterized";
        expectedResults()
                .failure(methodName,
                        "java.lang.Exception: Method " + methodName
                                + " should have no parameters\n")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = TestMethodWithParameterTest.class)
    @Test
    public void testRunner_TestMethodWithParameterTest_Requested() throws Exception {
        String methodName = "parameterized";
        TestRunner runner = testRunnerRule.createTestRunner(methodName);
        runner.run();

        // Ignores tests with no parameters.
        expectedResults()
                .failure(methodName,
                        "java.lang.Exception: Method " + methodName
                                + " should have no parameters\n")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = NoMethodTest.class)
    @Test
    public void testRunner_NoMethodTest() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        // Ignores tests with no parameters.
        expectedResults()
                .unsupported()
                .completedNormally();
    }

    @TestRunnerProperties(testClass = AnnotatedTestMethodsTest.class)
    @Test
    public void testRunner_AnnotatedTestMethodsTest() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        expectedResults()
                .success("test1", "Before\nTest 1\nAfter\n")
                .completedNormally();
    }

    @TestRunnerProperties(testClass = LazyTestCreationTest.class)
    @Test
    public void testRunner_LazyTestCreationTest() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        expectedResults()
                .success("test1", "Creating\n")
                .success("test2", "Creating\n")
                .completedNormally();
    }

    // =========================================================================================
    // Place all JUnit4 specific test methods after this one.
    // =========================================================================================

    @TestRunnerProperties(testClass = HasIgnoredTest.class)
    @Test
    public void testRunner_HasIgnoredTest() throws Exception {
        TestRunner runner = testRunnerRule.createTestRunner();
        runner.run();

        expectedResults()
                .success("working")
                .completedNormally();
    }
}
