|  | // Copyright (c) 2018, 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.smali; | 
|  |  | 
|  | import static org.junit.Assert.assertEquals; | 
|  | import static org.junit.Assert.assertTrue; | 
|  |  | 
|  | import com.android.tools.r8.ToolHelper.ProcessResult; | 
|  | import com.android.tools.r8.utils.StringUtils; | 
|  | import java.util.ArrayList; | 
|  | import java.util.Arrays; | 
|  | import java.util.Collections; | 
|  | import java.util.List; | 
|  | import org.junit.Test; | 
|  |  | 
|  | public class IfZeroObjectTest extends SmaliTestBase { | 
|  |  | 
|  | public static final String CLASS = "Test"; | 
|  |  | 
|  | @Test | 
|  | public void testObjectIfs() throws Throwable { | 
|  | ProcessResult result = testIfs("ExpectedToPass", Arrays.asList( | 
|  | "eqz", | 
|  | "nez")); | 
|  | assertEquals(result.toString(), 0, result.exitCode); | 
|  | } | 
|  |  | 
|  | @Test | 
|  | public void testNumericIfs() throws Throwable { | 
|  | ProcessResult result = testIfs("ExpectedToFail", Arrays.asList( | 
|  | "ltz", | 
|  | "gez", | 
|  | "gtz", | 
|  | "lez")); | 
|  | assertEquals(result.toString(), 1, result.exitCode); | 
|  | assertTrue("Did not find 'Verification error' in " + result.stderr, | 
|  | result.stderr.contains("Verification error") || result.stderr.contains("VerifyError")); | 
|  | } | 
|  |  | 
|  | private ProcessResult testIfs(String clazz, List<String> ifZeroOps) throws Throwable { | 
|  |  | 
|  | SmaliBuilder builder = new SmaliBuilder(clazz); | 
|  | for (String ifZeroOp : ifZeroOps) { | 
|  | builder.addStaticMethod("int", "if" + ifZeroOp, Collections.singletonList("java.lang.Object"), | 
|  | 1, | 
|  | "    if-" + ifZeroOp + " p0, :L", | 
|  | "    const v0, 0", | 
|  | "    return v0", | 
|  | "  :L", | 
|  | "    const v0, 1", | 
|  | "    return v0" | 
|  | ); | 
|  | } | 
|  |  | 
|  | List<String> main = new ArrayList<>(); | 
|  | main.add("  sget-object         v0, Ljava/lang/System;->out:Ljava/io/PrintStream;"); | 
|  | for (String ifZeroOp : ifZeroOps) { | 
|  | main.add("  invoke-static { p0 }, L" + clazz + ";->if" + ifZeroOp + "(Ljava/lang/Object;)I"); | 
|  | main.add("  move-result v1"); | 
|  | main.add("  invoke-virtual { v0, v1 }, Ljava/io/PrintStream;->print(I)V"); | 
|  | } | 
|  | main.add("  return-void"); | 
|  | builder.addMainMethod(2, main.toArray(StringUtils.EMPTY_ARRAY)); | 
|  |  | 
|  | return runOnArtRaw(builder.build(), clazz); | 
|  | } | 
|  | } |