// Copyright (c) 2016, 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 static org.junit.Assert.assertTrue;

import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
import com.android.tools.r8.StringConsumer.FileConsumer;
import com.android.tools.r8.utils.AndroidApp;
import com.google.common.collect.ImmutableList;
import java.io.File;
import java.nio.file.Path;
import org.junit.Test;

public class YouTubeV1217TreeShakeJarVerificationTest extends YouTubeCompilationBase {

  public YouTubeV1217TreeShakeJarVerificationTest() {
    super(12, 17);
  }

  @Test
  public void buildAndTreeShakeFromDeployJar() throws Exception {
    Path proguardMapPath = File.createTempFile("mapping", ".txt", temp.getRoot()).toPath();
    int maxSize = 20000000;
    AndroidApp app =
        runAndCheckVerification(
            CompilerUnderTest.R8,
            CompilationMode.RELEASE,
            base + APK,
            ImmutableList.of(base + PG_CONF),
            options -> options.proguardMapConsumer = new FileConsumer(proguardMapPath),
            // Don't pass any inputs. The input will be read from the -injars in the Proguard
            // configuration file.
            ImmutableList.of());
    int bytes = applicationSize(app);
    assertTrue("Expected max size of " + maxSize + ", got " + bytes, bytes < maxSize);
  }
}
