/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * 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.android.tools.idea.gradle.project;

import com.android.ide.common.repository.GradleVersion;
import com.android.tools.idea.gradle.project.ProjectStructure.AndroidPluginVersionsInProject;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.*;

public class AndroidPluginVersionsInProjectTest {
  private AndroidPluginVersionsInProject myAgpVersions;

  @Before
  public void setUp() {
    myAgpVersions = new AndroidPluginVersionsInProject();
    myAgpVersions.add(":app", GradleVersion.parse("3.0.0"));
    myAgpVersions.add(":lib1", GradleVersion.parse("2.3.0"));
    myAgpVersions.add(":lib2", GradleVersion.parse("2.3.0"));
  }

  @Test
  public void haveVersionsChangedWithVersionChange() {
    AndroidPluginVersionsInProject other = new AndroidPluginVersionsInProject();
    other.add(":app", GradleVersion.parse("3.0.0"));
    other.add(":lib1", GradleVersion.parse("3.0.0"));
    other.add(":lib2", GradleVersion.parse("3.0.0"));
    assertTrue(myAgpVersions.haveVersionsChanged(other));
  }

  @Test
  public void haveVersionsChangedWithDifferentModuleCount() {
    AndroidPluginVersionsInProject other = new AndroidPluginVersionsInProject();
    other.add(":app", GradleVersion.parse("3.0.0"));
    other.add(":lib2", GradleVersion.parse("2.3.0"));
    assertTrue(myAgpVersions.haveVersionsChanged(other));
  }

  @Test
  public void haveVersionsChangedWithEmpty() {
    AndroidPluginVersionsInProject other = new AndroidPluginVersionsInProject();
    assertFalse(myAgpVersions.haveVersionsChanged(other));
  }

  @Test
  public void haveVersionsChangedWithNoVersionChange() {
    AndroidPluginVersionsInProject other = new AndroidPluginVersionsInProject();
    other.add(":app", GradleVersion.parse("3.0.0"));
    other.add(":lib1", GradleVersion.parse("2.3.0"));
    other.add(":lib2", GradleVersion.parse("2.3.0"));
    assertFalse(myAgpVersions.haveVersionsChanged(other));
  }
}