// 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.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

public class R8CodeCanonicalizationTest {

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

  @Rule
  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();

  @Test
  public void testNumberOfCodeItemsUnchanged() throws Exception {
    int numberOfCodes = readNumberOfCodes(SOURCE_DEX);
    R8Command.Builder builder = R8Command.builder()
        .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);
  }

}
