/*
 * Copyright 2012-present Facebook, Inc.
 *
 * 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 com.facebook.buck.shell;

import static org.junit.Assert.assertTrue;

import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.rules.FakeBuildRuleParams;
import com.facebook.buck.step.ExecutionContext;
import com.facebook.buck.util.ProjectFilesystem;
import com.google.common.collect.ImmutableSet;

import org.easymock.EasyMock;
import org.easymock.EasyMockSupport;
import org.junit.After;
import org.junit.Test;

public class ShTestRuleTest extends EasyMockSupport {

  @After
  public void tearDown() {
    // I don't understand why EasyMockSupport doesn't do this by default.
    verifyAll();
  }

  @Test
  public void testHasTestResultFiles() {
    ShTestRule shTest = new ShTestRule(
        new FakeBuildRuleParams(new BuildTarget("//test/com/example", "my_sh_test")),
        "run_test.sh",
        /* labels */ ImmutableSet.<String>of());

    ProjectFilesystem filesystem = createMock(ProjectFilesystem.class);
    EasyMock.expect(filesystem.isFile(shTest.getPathToTestOutputResult())).andReturn(true);
    ExecutionContext executionContext = createMock(ExecutionContext.class);
    EasyMock.expect(executionContext.getProjectFilesystem()).andReturn(filesystem);

    replayAll();

    assertTrue("hasTestResultFiles() should return true if result.json exists.",
        shTest.hasTestResultFiles(executionContext));
  }
}
