// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.internal;

import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
import com.android.tools.r8.shaking.ProguardRuleParserException;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import org.junit.Test;

public class D8PhotosVerificationTest extends CompilationTestBase {
  public static final String PHOTOS =
      "third_party/photos/2017-06-06/PhotosEnglishOnlyLegacy_proguard.jar";

  public void runD8AndCheckVerification(CompilationMode mode, String version)
      throws ProguardRuleParserException, ExecutionException, IOException,
      CompilationFailedException {
    runAndCheckVerification(CompilerUnderTest.D8, mode, version, null, version);
  }

  @Test
  public void verify() throws Exception {
    runD8AndCheckVerification(CompilationMode.RELEASE, PHOTOS);
  }
}
