/*
 * Copyright 2000-2010 JetBrains s.r.o.
 *
 * 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.intellij.history.integration;

import com.intellij.history.core.changes.ChangeSet;
import com.intellij.history.core.changes.ChangeVisitor;
import com.intellij.history.core.changes.CreateEntryChange;
import com.intellij.history.core.changes.RenameChange;
import com.intellij.openapi.util.Clock;
import com.intellij.openapi.vfs.VirtualFile;
import org.junit.Test;

import java.io.IOException;

public class VisitingTest extends IntegrationTestCase {
  @Test
  public void testSimpleVisit() throws Exception {
    createFile("f.txt");
    createFile("dir");
    assertVisitorLog("begin create end begin create end finished ");
  }

  @Test
  public void testVisitChangeSet() throws Exception {
    getVcs().beginChangeSet();
    createFile("f.txt");
    createFile("dir");
    getVcs().endChangeSet(null);

    assertVisitorLog("begin create create end finished ");
  }

  @Test
  public void testVisitingChangesInNotFinishedChangeSet() throws Exception {
    getVcs().beginChangeSet();
    createFile("f.txt");
    createFile("dir");

    assertVisitorLog("begin create create end finished ");
  }

  @Test
  public void testVisitingAllChanges() throws Exception {
    createFile("f.txt");
    getVcs().beginChangeSet();
    VirtualFile dir = createFile("dir");
    getVcs().endChangeSet(null);
    getVcs().beginChangeSet();
    dir.rename(this, "newDir");

    assertVisitorLog("begin rename end begin create end begin create end finished ");
  }

  @Test
  public void testStop() throws Exception {
    createFile("f.txt");
    createFile("dir");

    TestVisitor visitor = new TestVisitor() {
      int count = 0;

      @Override
      public void begin(ChangeSet c) throws ChangeVisitor.StopVisitingException {
        if (++count == 2) stop();
        super.begin(c);
      }
    };

    assertVisitorLog("begin create end finished ", visitor);
  }

  @Test
  public void testAddingChangesWhileVisiting() throws Exception {
    getVcs().beginChangeSet();
    createFile("f.txt");
    createFile("dir");
    getVcs().endChangeSet(null);

    final int[] count = {0};
    TestVisitor visitor = new TestVisitor() {
      @Override
      public void visit(CreateEntryChange c) throws StopVisitingException {
        super.visit(c);
        count[0]++;
        try {
          createFile("f" + count[0]);
        }
        catch (IOException e) {
          throw new RuntimeException(e);
        }
      }
    };

    assertVisitorLog("begin create create end finished ", visitor);
    assertEquals(2, count[0]);
  }

  @Test
  public void testPurgingDuringVisit() throws Exception {
    Clock.setTime(10);
    getVcs().beginChangeSet();
    createFile("f.txt");
    getVcs().endChangeSet(null);

    Clock.setTime(20);
    getVcs().beginChangeSet();
    createFile("dir");
    getVcs().endChangeSet(null);

    TestVisitor visitor = new TestVisitor();
    getVcs().accept(visitor);
    assertEquals("begin create end begin create end finished ", visitor.log);

    visitor = new TestVisitor() {
      @Override
      public void visit(CreateEntryChange c) throws StopVisitingException {
        super.visit(c);
        getVcs().getChangeListInTests().purgeObsolete(5);
      }
    };

    // processing full list in spite of purging
    assertVisitorLog("begin create end begin create end finished ", visitor);

    visitor.log = "";
    getVcs().getChangeListInTests().purgeObsolete(5);
    assertVisitorLog("begin create end finished ", visitor);
  }

  private void assertVisitorLog(final String expected) throws Exception {
    TestVisitor visitor = new TestVisitor();
    assertVisitorLog(expected, visitor);
  }

  private void assertVisitorLog(String expected, TestVisitor visitor) {
    getVcs().accept(visitor);
    assertEquals(expected, visitor.log);
  }

  private class TestVisitor extends ChangeVisitor {
    public String log = "";

    @Override
    public void begin(ChangeSet c) throws StopVisitingException {
      log += "begin ";
    }

    @Override
    public void end(ChangeSet c) throws StopVisitingException {
      log += "end ";
    }

    @Override
    public void visit(CreateEntryChange c) throws StopVisitingException {
      log += "create ";
    }

    @Override
    public void visit(RenameChange c) throws StopVisitingException {
      log += "rename ";
    }

    @Override
    public void finished() {
      log += "finished ";
    }
  }
}