/* * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jetbrains.kotlin.codegen; import org.jetbrains.kotlin.test.ConfigurationKind; import java.lang.reflect.Method; import static org.jetbrains.kotlin.codegen.CodegenTestUtil.assertThrows; public class ControlStructuresTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); } public void testCondJumpOnStack() throws Exception { loadText("import java.lang.Boolean as jlBoolean; fun foo(a: String): Int = if (jlBoolean.parseBoolean(a)) 5 else 10"); Method main = generateFunction(); assertEquals(5, main.invoke(null, "true")); assertEquals(10, main.invoke(null, "false")); } public void testForInRange() throws Exception { loadText("fun foo(sb: StringBuilder) { for(x in 1..4) sb.append(x) }"); Method main = generateFunction(); StringBuilder stringBuilder = new StringBuilder(); main.invoke(null, stringBuilder); assertEquals("1234", stringBuilder.toString()); } public void testThrowCheckedException() throws Exception { loadText("fun foo() { throw Exception(); }"); Method main = generateFunction(); assertThrows(main, Exception.class, null); } public void testCompareToZero() throws Exception { loadText("fun foo(a: Int, b: Int): Boolean = a == 0 && b != 0 && 0 == a && 0 != b"); String text = generateToText(); /* * Check that the we generate optimized byte-code! */ assertTrue(text.contains("IFEQ")); assertTrue(text.contains("IFNE")); assertFalse(text.contains("IF_ICMPEQ")); assertFalse(text.contains("IF_ICMPNE")); Method main = generateFunction(); assertEquals(true, main.invoke(null, 0, 1)); assertEquals(false, main.invoke(null, 1, 0)); } public void testCompareToNull() throws Exception { loadText("fun foo(a: String?, b: String?): Boolean = a == null && b !== null && null == a && null !== b"); String text = generateToText(); assertTrue(!text.contains("java/lang/Object.equals")); Method main = generateFunction(); assertEquals(true, main.invoke(null, null, "lala")); assertEquals(false, main.invoke(null, null, null)); } public void testCompareToNonnullableEq() throws Exception { loadText("fun foo(a: String?, b: String): Boolean = a == b || b == a"); Method main = generateFunction(); assertEquals(false, main.invoke(null, null, "lala")); assertEquals(true, main.invoke(null, "papa", "papa")); } public void testCompareToNonnullableNotEq() throws Exception { loadText("fun foo(a: String?, b: String): Boolean = a != b"); String text = generateToText(); assertTrue(text.contains("IXOR")); Method main = generateFunction(); assertEquals(true, main.invoke(null, null, "lala")); assertEquals(false, main.invoke(null, "papa", "papa")); } }