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

import static com.android.tools.r8.TestBase.getTestParameters;

import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexDebugEvent;
import com.android.tools.r8.graph.DexDebugInfo;
import com.android.tools.r8.graph.DexDebugInfo.EventBasedDebugInfo;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.Reporter;
import com.android.tools.r8.utils.Timing;
import java.util.Collections;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class DebugByteCodeWriterTest {

  @Parameters(name = "{0}")
  public static TestParametersCollection data() {
    return getTestParameters().withNoneRuntime().build();
  }

  public DebugByteCodeWriterTest(TestParameters parameters) {
    parameters.assertNoneRuntime();
  }

  private ObjectToOffsetMapping emptyObjectTObjectMapping() {
    AppView<AppInfo> appView =
        AppView.createForD8(
            AppInfo.createInitialAppInfo(
                DexApplication.builder(
                        new InternalOptions(new DexItemFactory(), new Reporter()), null)
                    .build()));
    return new ObjectToOffsetMapping(
        appView,
        NamingLens.getIdentityLens(),
        new LensCodeRewriterUtils(appView),
        Collections.emptyList(),
        Collections.emptyList(),
        Collections.emptyList(),
        Collections.emptyList(),
        Collections.emptyList(),
        Collections.emptyList(),
        Collections.emptyList(),
        Collections.emptyList(),
        0,
        Timing.empty());
  }

  @Test
  public void testEmptyDebugInfo() {
    DexDebugInfo debugInfo =
        new EventBasedDebugInfo(1, DexString.EMPTY_ARRAY, DexDebugEvent.EMPTY_ARRAY);
    DebugBytecodeWriter writer =
        new DebugBytecodeWriter(
            DexDebugInfo.convertToWritable(debugInfo),
            emptyObjectTObjectMapping(),
            GraphLens.getIdentityLens());
    Assert.assertEquals(3, writer.generate().length);
  }
}
