/*
 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * @test
 * @summary Test the OutputAnalyzer utility class
 */

import jdk.testlibrary.OutputAnalyzer;

public class OutputAnalyzerTest {

    public static void main(String args[]) throws Exception {

        String stdout = "aaaaaa";
        String stderr = "bbbbbb";
        String nonExistingString = "cccc";

        OutputAnalyzer output = new OutputAnalyzer(stdout, stderr);

        if (!stdout.equals(output.getStdout())) {
            throw new Exception("getStdout() returned '" + output.getStdout()
                    + "', expected '" + stdout + "'");
        }

        if (!stderr.equals(output.getStderr())) {
            throw new Exception("getStderr() returned '" + output.getStderr()
                    + "', expected '" + stderr + "'");
        }

        try {
            output.shouldContain(stdout);
            output.stdoutShouldContain(stdout);
            output.shouldContain(stderr);
            output.stderrShouldContain(stderr);
        } catch (RuntimeException e) {
            throw new Exception("shouldContain() failed", e);
        }

        try {
            output.shouldContain(nonExistingString);
            throw new Exception("shouldContain() failed to throw exception");
        } catch (RuntimeException e) {
            // expected
        }

        try {
            output.stdoutShouldContain(stderr);
            throw new Exception(
                    "stdoutShouldContain() failed to throw exception");
        } catch (RuntimeException e) {
            // expected
        }

        try {
            output.stderrShouldContain(stdout);
            throw new Exception(
                    "stdoutShouldContain() failed to throw exception");
        } catch (RuntimeException e) {
            // expected
        }

        try {
            output.shouldNotContain(nonExistingString);
            output.stdoutShouldNotContain(nonExistingString);
            output.stderrShouldNotContain(nonExistingString);
        } catch (RuntimeException e) {
            throw new Exception("shouldNotContain() failed", e);
        }

        try {
            output.shouldNotContain(stdout);
            throw new Exception("shouldContain() failed to throw exception");
        } catch (RuntimeException e) {
            // expected
        }

        try {
            output.stdoutShouldNotContain(stdout);
            throw new Exception("shouldContain() failed to throw exception");
        } catch (RuntimeException e) {
            // expected
        }

        try {
            output.stderrShouldNotContain(stderr);
            throw new Exception("shouldContain() failed to throw exception");
        } catch (RuntimeException e) {
            // expected
        }

        String stdoutPattern = "[a]";
        String stderrPattern = "[b]";
        String nonExistingPattern = "[c]";

        // Should match
        try {
            output.shouldMatch(stdoutPattern);
            output.stdoutShouldMatch(stdoutPattern);
            output.shouldMatch(stderrPattern);
            output.stderrShouldMatch(stderrPattern);
        } catch (RuntimeException e) {
            throw new Exception("shouldMatch() failed", e);
        }

        try {
            output.shouldMatch(nonExistingPattern);
            throw new Exception("shouldMatch() failed to throw exception");
        } catch (RuntimeException e) {
            // expected
        }

        try {
            output.stdoutShouldMatch(stderrPattern);
            throw new Exception(
                    "stdoutShouldMatch() failed to throw exception");
        } catch (RuntimeException e) {
            // expected
        }

        try {
            output.stderrShouldMatch(stdoutPattern);
            throw new Exception(
                    "stderrShouldMatch() failed to throw exception");
        } catch (RuntimeException e) {
            // expected
        }

        // Should not match
        try {
            output.shouldNotMatch(nonExistingPattern);
            output.stdoutShouldNotMatch(nonExistingPattern);
            output.stderrShouldNotMatch(nonExistingPattern);
        } catch (RuntimeException e) {
            throw new Exception("shouldNotMatch() failed", e);
        }

        try {
            output.shouldNotMatch(stdoutPattern);
            throw new Exception("shouldNotMatch() failed to throw exception");
        } catch (RuntimeException e) {
            // expected
        }

        try {
            output.stdoutShouldNotMatch(stdoutPattern);
            throw new Exception("shouldNotMatch() failed to throw exception");
        } catch (RuntimeException e) {
            // expected
        }

        try {
            output.stderrShouldNotMatch(stderrPattern);
            throw new Exception("shouldNotMatch() failed to throw exception");
        } catch (RuntimeException e) {
            // expected
        }
    }

}
