/*
 * 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.build.gradle.integration.application;

import com.android.build.gradle.integration.common.fixture.GradleTestProject;
import com.android.build.gradle.integration.common.fixture.app.HelloWorldApp;
import com.android.builder.model.AndroidProject;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

/** Test things fail in the correct way when trying to sync from Studio before 3.0 */
public class OlderStudioModel {

    public static final String THIS_GRADLE_PLUGIN_REQUIRES_STUDIO_3_0_MINIMUM =
            "This Gradle plugin requires a newer IDE able to request IDE model level 3. For Android Studio this means version 3.0+";

    @Rule
    public GradleTestProject project =
            GradleTestProject.builder()
                    .fromTestApp(HelloWorldApp.forPlugin("com.android.application"))
                    .create();

    @Rule public ExpectedException thrown = ExpectedException.none();

    @Test
    public void testModelQueryFromOlderBuild() throws Exception {
        // create the actual cause since the tooling API wraps the thrown exception into
        // something else.
        thrown.expectCause(
                new BaseMatcher<Throwable>() {
                    @Override
                    public boolean matches(Object item) {
                        return item instanceof RuntimeException
                                && ((RuntimeException) item)
                                        .getMessage()
                                        .equals(THIS_GRADLE_PLUGIN_REQUIRES_STUDIO_3_0_MINIMUM);
                    }

                    @Override
                    public void describeMismatch(Object item, Description mismatchDescription) {
                        if (!(item instanceof RuntimeException)) {
                            mismatchDescription
                                    .appendText("class was ")
                                    .appendValue(item.getClass().getName());
                        }

                        final String message = ((RuntimeException) item).getMessage();
                        if (!message.equals(THIS_GRADLE_PLUGIN_REQUIRES_STUDIO_3_0_MINIMUM)) {
                            mismatchDescription.appendText("msg was ").appendValue(message);
                        }
                    }

                    @Override
                    public void describeTo(Description description) {
                        description.appendValue(
                                "RuntimeException("
                                        + THIS_GRADLE_PLUGIN_REQUIRES_STUDIO_3_0_MINIMUM
                                        + ")");
                    }
                });


        // now call the method that will throw
        project.model()
                .level(AndroidProject.MODEL_LEVEL_1_SYNC_ISSUE)
                .fetchAndroidProjects()
                .getOnlyModel();
    }
}
