content: package net.sf.expectit;
  
  /*
   * #%L
   * ExpectIt
   * %%
   * Copyright (C) 2014 Alexey Gavrilov and contributors
   * %%
   * 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.
   * #L%
   */
  
  import static net.sf.expectit.TestUtils.LONG_TIMEOUT;
  import static net.sf.expectit.TestUtils.SMALL_TIMEOUT;
  import static net.sf.expectit.filter.Filters.removeNonPrintable;
  import static net.sf.expectit.matcher.Matchers.contains;
  import static net.sf.expectit.matcher.Matchers.eof;
  import static org.junit.Assert.assertFalse;
  import static org.junit.Assert.assertTrue;
  import static org.junit.Assume.assumeTrue;
  
  import java.io.File;
  import java.io.IOException;
  import java.nio.charset.Charset;
  import java.util.concurrent.TimeUnit;
  import org.junit.After;
  import org.junit.Assume;
  import org.junit.Before;
  import org.junit.BeforeClass;
  import org.junit.Test;
  
  /**
   * A test for interacting with Windows OS shell.
   */
  public class WinProcessTest {
  
      public static final String WIN_CMD = System.getenv("COMSPEC");
      private Expect expect;
      private Process process;
  
      @BeforeClass
      public static void ignoreOnWindows() {
          assumeTrue(WIN_CMD != null && new File(WIN_CMD).canExecute());
      }
  
      @Before
      public void setup() throws IOException {
          ProcessBuilder builder = new ProcessBuilder(WIN_CMD, "/Q");
          process = builder.start();
          expect = new ExpectBuilder()
                  .withTimeout(LONG_TIMEOUT, TimeUnit.MILLISECONDS)
                  .withInputs(process.getInputStream(), process.getErrorStream())
                  .withOutput(process.getOutputStream())
                  .withInputFilters(removeNonPrintable())
                  .withEchoInput(System.out)
                  .withEchoOutput(System.err)
                          // sets cyrillic DOS encoding to verify that
                  .withCharset(Charset.forName("cp866"))
                  .build();
      }
  
      @After
      public void cleanup() throws IOException, InterruptedException {
          process.destroy();
          process.waitFor();
          expect.close();
      }
  
      @Test
      public void test() throws IOException, InterruptedException {
          Thread.sleep(SMALL_TIMEOUT);
          try {
              Assume.assumeTrue(process.exitValue() != Integer.MAX_VALUE);
          } catch (IllegalThreadStateException ignore) {
          }
          System.out.println(expect.expect(contains(">")).getBefore());
          expect.sendLine("echo test-123");
          Result res = expect.expect(contains("test-123"));
          assertTrue(res.isSuccessful());
          assertFalse(res.getBefore().contains("echo"));
          assertTrue(expect.expect(contains(">")).isSuccessful());
          expect.sendLine("echo %cd%");
          System.err.println("pwd: " + expect.expect(contains("\n")).getBefore());
          expect.sendLine("exit");
          assertTrue(expect.expect(eof()).isSuccessful());
      }
  
  }
  