/*
 * Copyright (C) 2014 The Guava Authors
 *
 * 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.google.common.graph;

import static com.google.common.truth.Truth.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/** Tests for {@link ImmutableGraph} and {@link ImmutableValueGraph} . */
@RunWith(JUnit4.class)
public class ImmutableGraphTest {

  @Test
  public void immutableGraph() {
    MutableGraph<String> mutableGraph = GraphBuilder.directed().build();
    mutableGraph.addNode("A");
    Graph<String> immutableGraph = ImmutableGraph.copyOf(mutableGraph);

    assertThat(immutableGraph).isNotInstanceOf(MutableGraph.class);
    assertThat(Graphs.equivalent(immutableGraph, mutableGraph)).isTrue();

    mutableGraph.addNode("B");
    assertThat(Graphs.equivalent(immutableGraph, mutableGraph)).isFalse();
  }

  @Test
  public void immutableValueGraph() {
    MutableValueGraph<String, Integer> mutableGraph = ValueGraphBuilder.directed().build();
    mutableGraph.addNode("A");
    ValueGraph<String, Integer> immutableGraph = ImmutableValueGraph.copyOf(mutableGraph);

    assertThat(immutableGraph).isInstanceOf(ImmutableGraph.class);
    assertThat(immutableGraph).isNotInstanceOf(MutableValueGraph.class);
    assertThat(Graphs.equivalent(immutableGraph, mutableGraph)).isTrue();

    mutableGraph.addNode("B");
    assertThat(Graphs.equivalent(immutableGraph, mutableGraph)).isFalse();
  }

  @Test
  public void copyOfImmutableGraph_optimized() {
    Graph<String> graph1 = ImmutableGraph.copyOf(GraphBuilder.directed().<String>build());
    Graph<String> graph2 = ImmutableGraph.copyOf(graph1);

    assertThat(graph2).isSameAs(graph1);
  }

  @Test
  public void copyOfImmutableValueGraph_optimized() {
    ValueGraph<String, Integer> graph1 =
        ImmutableValueGraph.copyOf(ValueGraphBuilder.directed().<String, Integer>build());
    ValueGraph<String, Integer> graph2 = ImmutableValueGraph.copyOf(graph1);

    assertThat(graph2).isSameAs(graph1);
  }
}
