//
//  ========================================================================
//  Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
//  ------------------------------------------------------------------------
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================
//

package org.eclipse.jetty.util.log;

import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import org.junit.Assert;

public class StdErrCapture
{
    private ByteArrayOutputStream test;
    private PrintStream err;

    public StdErrCapture(StdErrLog log)
    {
        this();
        log.setStdErrStream(err);
    }

    public StdErrCapture()
    {
        test = new ByteArrayOutputStream();
        err = new PrintStream(test);
    }

    public void capture(StdErrLog log)
    {
        log.setStdErrStream(err);
    }

    public void assertContains(String expectedString)
    {
        err.flush();
        String output = new String(test.toByteArray());
        Assert.assertThat(output,containsString(expectedString));
    }

    public void assertNotContains(String unexpectedString)
    {
        err.flush();
        String output = new String(test.toByteArray());
        Assert.assertThat(output,not(containsString(unexpectedString)));
    }

    public String toString()
    {
        err.flush();
        return new String(test.toByteArray());
    }
}
