/*
 * Copyright (c) 2011 Google Inc.
 *
 * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
 * Public License v1.0 which accompanies this distribution, and is available at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 */
package com.google.eclipse.protobuf.ui.builder.protoc;

import static com.google.eclipse.protobuf.junit.stubs.resources.MarkerStub.error;
import static com.google.eclipse.protobuf.ui.validation.ProtobufResourceUIValidatorExtension.EDITOR_CHECK;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertThat;

import java.util.List;

import org.eclipse.core.runtime.*;
import org.junit.*;

import com.google.eclipse.protobuf.junit.stubs.resources.*;

/**
 * Tests for <code>{@link ProtocMarkerFactory#createErrorIfNecessary(String, String, int)}</code>.
 *
 * @author alruiz@google.com (Alex Ruiz)
 */
public class ProtocMarkerFactory_createErrorIfNecessary_Test {
  private static final String PROTOC = "com.google.eclipse.protobuf.ui.protocMarker";

  private FileStub file;
  private MarkerStub marker;
  private ProtocMarkerFactory markerFactory;

  @Before public void setUp() throws CoreException {
    file = new FileStub();
    file.setLocation(new Path("home/alex/protos/test1.proto"));
    file.createMarker(PROTOC);
    marker = error(EDITOR_CHECK, "Expected field name.", 68);
    file.addMarker(marker);
    markerFactory = new ProtocMarkerFactory(file);
  }

  @Test public void should_create_marker_if_file_paths_match_and_a_similar_marker_does_not_exist() throws CoreException {
    String message = "File not found.";
    int lineNumber = 8;
    markerFactory.createErrorIfNecessary("test1.proto", message, lineNumber);
    List<MarkerStub> markers = file.markersOfType(PROTOC);
    assertThat(markers.size(), equalTo(1));
    assertThat(markers.get(0), equalTo(error(PROTOC, message, lineNumber)));
  }

  @Test public void should_not_create_marker_if_given_path_does_not_match_path_in_file() throws CoreException {
    markerFactory.createErrorIfNecessary("test2.proto", "File not found.", 8);
    assertThat(file.markerCount(PROTOC), equalTo(0));
  }

  @Test public void should_not_create_marker_if_a_similar_one_exists() throws CoreException {
    markerFactory.createErrorIfNecessary("test1.proto", marker.message(),
        marker.lineNumber());
    assertThat(file.markerCount(PROTOC), equalTo(0));
  }
}
