/*
 * Copyright 2013-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.rules;

import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;

import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.util.ProjectFilesystem;
import com.google.common.collect.ImmutableList;

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

import java.io.IOException;
import java.nio.file.Paths;
import java.util.List;

public class OnDiskBuildInfoTest extends EasyMockSupport {

  @Test
  public void testGetOutputFileContentsByLine() throws IOException {
    String pathToOutputFile = "buck-out/gen/java/com/example/classes.txt";

    ProjectFilesystem projectFilesystem = createMock(ProjectFilesystem.class);
    List<String> lines = ImmutableList.of(
        "com/example/Bar.class 087b7707a5f8e0a2adf5652e3cd2072d89a197dc",
        "com/example/Foo.class e4fccb7520b7795e632651323c63217c9f59f72a");
    expect(projectFilesystem.readLines(Paths.get(pathToOutputFile))).andReturn(lines);

    Buildable buildable = new FakeBuildable().setPathToOutputFile(pathToOutputFile);

    replayAll();

    OnDiskBuildInfo onDiskBuildInfo = new OnDiskBuildInfo(
        new BuildTarget("//java/com/example", "ex"),
        projectFilesystem);
    List<String> observedLines = onDiskBuildInfo.getOutputFileContentsByLine(buildable);
    assertEquals(lines, observedLines);

    verifyAll();
  }

  @Test(expected = NullPointerException.class)
  public void testGetOutputFileContentsByLineRejectsNullBuildable() throws IOException {
    ProjectFilesystem projectFilesystem = createMock(ProjectFilesystem.class);
    OnDiskBuildInfo onDiskBuildInfo = new OnDiskBuildInfo(
        new BuildTarget("//java/com/example", "ex"),
        projectFilesystem);

    replayAll();

    onDiskBuildInfo.getOutputFileContentsByLine(null);
  }

  @Test(expected = NullPointerException.class)
  public void testGetOutputFileContentsByLineRejectsNullOutputPath() throws IOException {
    ProjectFilesystem projectFilesystem = createMock(ProjectFilesystem.class);
    OnDiskBuildInfo onDiskBuildInfo = new OnDiskBuildInfo(
        new BuildTarget("//java/com/example", "ex"),
        projectFilesystem);

    Buildable buildable = new FakeBuildable();
    onDiskBuildInfo.getOutputFileContentsByLine(buildable);
  }

}
