// 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;

import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.DexParser;
import com.android.tools.r8.dex.DexSection;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.junit.Assert;
import org.junit.Test;

public class R8CodeCanonicalizationTest extends TestBase {

  private static final Path SOURCE_DEX = Paths.get(
      ToolHelper.EXAMPLES_BUILD_DIR, "invokeempty", "classes.dex");

  private int readNumberOfCodes(Path file) throws IOException {
    DexSection[] dexSections = DexParser.parseMapFrom(file);
    for (DexSection dexSection : dexSections) {
      if (dexSection.type == Constants.TYPE_CODE_ITEM) {
        return dexSection.length;
      }
    }
    return 0;
  }

  @Test
  public void testNumberOfCodeItemsUnchanged() throws Exception {
    int numberOfCodes = readNumberOfCodes(SOURCE_DEX);
    R8Command.Builder builder = R8Command.builder()
        .setDisableTreeShaking(true)
        .setDisableMinification(true)
        .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
        .setOutput(temp.getRoot().toPath(), OutputMode.DexIndexed);
    ToolHelper.getAppBuilder(builder).addProgramFiles(SOURCE_DEX);
    R8.run(builder.build());

    int newNumberOfCodes = readNumberOfCodes(
        Paths.get(temp.getRoot().getCanonicalPath(), "classes.dex"));
    Assert.assertEquals("Number of codeitems does not change.", numberOfCodes, newNumberOfCodes);
  }

}
