/*
 * Copyright (c) 2013, the Dart project authors.
 * 
 * Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
 * 
 * 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.google.dart.engine.services.correction;

import junit.framework.TestCase;

import java.io.File;

public class CreateFileCorrectionProposalTest extends TestCase {
  private final File file = new File("/Test.dart");
  private final String content = "test file content";

  public void test_access() throws Exception {
    CreateFileCorrectionProposal proposal = new CreateFileCorrectionProposal(
        file,
        content,
        CorrectionKind.QF_CREATE_PART,
        file);
    assertSame(CorrectionKind.QF_CREATE_PART, proposal.getKind());
    assertEquals(file, proposal.getFile());
    assertEquals(content, proposal.getContent());
  }
}
